00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef __JACKNETMANAGER_H__
00021 #define __JACKNETMANAGER_H__
00022
00023 #include "JackNetInterface.h"
00024 #include "thread.h"
00025 #include "jack.h"
00026 #include "jslist.h"
00027 #include <list>
00028
00029 namespace Jack
00030 {
00031 class JackNetMasterManager;
00032
00037 class JackNetMaster : public JackNetMasterInterface
00038 {
00039 friend class JackNetMasterManager;
00040 private:
00041 static int SetProcess ( jack_nframes_t nframes, void* arg );
00042 static void SetTimebaseCallback ( jack_transport_state_t state, jack_nframes_t nframes, jack_position_t* pos, int new_pos, void* arg );
00043
00044
00045 jack_client_t* fJackClient;
00046 const char* fClientName;
00047
00048
00049 jack_port_t** fAudioCapturePorts;
00050 jack_port_t** fAudioPlaybackPorts;
00051 jack_port_t** fMidiCapturePorts;
00052 jack_port_t** fMidiPlaybackPorts;
00053
00054
00055 int fLastTransportState;
00056 net_transport_data_t fSendTransportData;
00057 net_transport_data_t fReturnTransportData;
00058
00059
00060 #ifdef JACK_MONITOR
00061 jack_time_t fPeriodUsecs;
00062 JackGnuPlotMonitor<float>* fNetTimeMon;
00063 #endif
00064
00065 bool Init();
00066 int AllocPorts();
00067 void FreePorts();
00068 void Exit();
00069
00070
00071 int EncodeTransportData();
00072 int DecodeTransportData();
00073
00074
00075 int EncodeSyncPacket();
00076 int DecodeSyncPacket();
00077
00078 int Process();
00079 void TimebaseCallback ( jack_position_t* pos );
00080
00081 public:
00082 JackNetMaster ( JackNetSocket& socket, session_params_t& params, const char* multicast_ip );
00083 ~JackNetMaster ();
00084
00085 bool IsSlaveReadyToRoll();
00086 };
00087
00088 typedef std::list<JackNetMaster*> master_list_t;
00089 typedef master_list_t::iterator master_list_it_t;
00090
00095 class JackNetMasterManager
00096 {
00097 friend class JackNetMaster;
00098 private:
00099 static int SetSyncCallback ( jack_transport_state_t state, jack_position_t* pos, void* arg );
00100 static void* NetManagerThread ( void* arg );
00101
00102 jack_client_t* fManagerClient;
00103 const char* fManagerName;
00104 const char* fMulticastIP;
00105 JackNetSocket fSocket;
00106 pthread_t fManagerThread;
00107 master_list_t fMasterList;
00108 uint32_t fGlobalID;
00109 bool fRunning;
00110
00111 void Run();
00112 JackNetMaster* MasterInit ( session_params_t& params );
00113 master_list_it_t FindMaster ( uint32_t client_id );
00114 int KillMaster ( session_params_t* params );
00115 void SetSlaveName ( session_params_t& params );
00116
00117 int SyncCallback ( jack_transport_state_t state, jack_position_t* pos );
00118 public:
00119 JackNetMasterManager ( jack_client_t* jack_client, const JSList* params );
00120 ~JackNetMasterManager();
00121 };
00122 }
00123
00124 #endif