CLAM-Development
1.1
|
00001 #ifndef JACKNetworkPlayer_hxx 00002 #define JACKNetworkPlayer_hxx 00003 00004 #include <iostream> 00005 #include <string> 00006 #include "NetworkPlayer.hxx" 00007 #include "Network.hxx" 00008 #include <jack/jack.h> 00009 00010 namespace CLAM 00011 { 00012 class JACKNetworkPlayer : public NetworkPlayer 00013 { 00014 private: 00015 //Structures to keep information about every external input and output processing 00016 struct SourceJackBinding //TODO use mAudioSources/Sinks in the parent class instead. 00017 { 00018 const char* PortName() 00019 { 00020 return jack_port_name(jackPort); 00021 } 00022 jack_port_t* jackPort; 00023 AudioSource* source; 00024 }; 00025 00026 struct SinkJackBinding 00027 { 00028 const char* PortName() 00029 { 00030 return jack_port_name(jackPort); 00031 } 00032 jack_port_t* jackPort; 00033 AudioSink* sink; 00034 }; 00035 typedef std::vector<SourceJackBinding> SourceJackBindings; 00036 typedef std::vector<SinkJackBinding> SinkJackBindings; 00037 struct JackConnection 00038 { 00039 std::string processingName; 00040 const char ** outsideConnections; 00041 }; 00042 typedef std::list<JackConnection> JackConnections; 00043 private: 00044 int _jackSampleRate; 00045 int _jackBufferSize; 00046 bool _autoConnect; 00047 00048 JackConnections _incomingJackConnections; 00049 JackConnections _outgoingJackConnections; 00050 00051 SourceJackBindings _sourceJackBindings; 00052 SinkJackBindings _sinkJackBindings; 00053 00054 std::string _jackOutPortAutoConnectList; 00055 std::string _jackInPortAutoConnectList; 00056 00057 //JACK CODE 00058 jack_client_t * _jackClient; 00059 std::string _jackClientName; 00060 00061 public: 00062 JACKNetworkPlayer(const std::string & name="CLAM network player"); 00063 virtual ~JACKNetworkPlayer(); 00064 00065 void InitClient(); 00066 bool IsWorking() const; 00067 std::string NonWorkingReason() const; 00068 00069 //JACK sever (un)registration methods 00070 void RegisterPorts(); 00071 void RegisterInputPorts(const Network& net); 00072 void RegisterOutputPorts(const Network& net); 00073 void UnRegisterPorts(); 00074 void OnShutdown(); 00075 00076 //Buffer copying methods 00077 void CopyJackBuffersToGenerators(const jack_nframes_t nframes); 00078 void CopySinksToJackBuffers(const jack_nframes_t nframes); 00079 00080 virtual void Start(); 00081 virtual void Stop(); 00082 virtual void Init(); 00083 virtual unsigned BackendBufferSize() 00084 { 00085 std::cout << "JACKNetworkPlayer::BackendBufferSize" << std::endl; 00086 return _jackBufferSize; 00087 } 00088 virtual unsigned BackendSampleRate() { return _jackSampleRate; } 00089 00090 void Do(const jack_nframes_t nframes); 00091 00092 //Saves/loads the connections made to our local in/out jack ports 00093 void StoreConnections(); 00094 void RestoreConnections(); 00095 00096 00097 void AutoConnectPorts(); 00098 }; 00099 } //namespace CLAM 00100 00101 #endif 00102