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
00016 struct SourceJackBinding
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
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
00070 void RegisterPorts();
00071 void RegisterInputPorts(const Network& net);
00072 void RegisterOutputPorts(const Network& net);
00073 void UnRegisterPorts();
00074 void OnShutdown();
00075
00076
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
00093 void StoreConnections();
00094 void RestoreConnections();
00095
00096
00097 void AutoConnectPorts();
00098 };
00099 }
00100
00101 #endif
00102