00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef __JackNetInterface__
00022 #define __JackNetInterface__
00023
00024 #include "JackNetTool.h"
00025
00026 namespace Jack
00027 {
00032 class SERVER_EXPORT JackNetInterface
00033 {
00034 protected:
00035 session_params_t fParams;
00036 JackNetSocket fSocket;
00037 char* fMulticastIP;
00038 uint fNSubProcess;
00039
00040
00041 packet_header_t fTxHeader;
00042 packet_header_t fRxHeader;
00043
00044
00045 char* fTxBuffer;
00046 char* fRxBuffer;
00047 char* fTxData;
00048 char* fRxData;
00049
00050
00051 NetMidiBuffer* fNetMidiCaptureBuffer;
00052 NetMidiBuffer* fNetMidiPlaybackBuffer;
00053 NetAudioBuffer* fNetAudioCaptureBuffer;
00054 NetAudioBuffer* fNetAudioPlaybackBuffer;
00055
00056
00057 int fAudioRxLen;
00058 int fAudioTxLen;
00059 int fPayloadSize;
00060
00061
00062 void SetFramesPerPacket();
00063 int SetNetBufferSize();
00064 int GetNMidiPckt();
00065 bool IsNextPacket();
00066
00067
00068 virtual void SetParams();
00069 virtual bool Init() = 0;
00070
00071
00072 virtual int EncodeTransportData() = 0;
00073 virtual int DecodeTransportData() = 0;
00074
00075
00076 virtual int EncodeSyncPacket() = 0;
00077 virtual int DecodeSyncPacket() = 0;
00078
00079 virtual int SyncRecv() = 0;
00080 virtual int SyncSend() = 0;
00081 virtual int DataRecv() = 0;
00082 virtual int DataSend() = 0;
00083
00084 virtual int Send ( size_t size, int flags ) = 0;
00085 virtual int Recv ( size_t size, int flags ) = 0;
00086
00087 JackNetInterface();
00088 JackNetInterface ( const char* multicast_ip, int port );
00089 JackNetInterface ( session_params_t& params, JackNetSocket& socket, const char* multicast_ip );
00090
00091 public:
00092 virtual ~JackNetInterface();
00093 };
00094
00099 class SERVER_EXPORT JackNetMasterInterface : public JackNetInterface
00100 {
00101 protected:
00102 bool fRunning;
00103 int fCycleOffset;
00104
00105 bool Init();
00106 int SetRxTimeout();
00107 void SetParams();
00108 void Exit();
00109 int SyncRecv();
00110 int SyncSend();
00111 int DataRecv();
00112 int DataSend();
00113
00114 int Send ( size_t size, int flags );
00115 int Recv ( size_t size, int flags );
00116
00117 bool IsSynched();
00118
00119 public:
00120 JackNetMasterInterface() : JackNetInterface(), fRunning(false), fCycleOffset(0)
00121 {}
00122 JackNetMasterInterface ( session_params_t& params, JackNetSocket& socket, const char* multicast_ip )
00123 : JackNetInterface ( params, socket, multicast_ip )
00124 {}
00125 ~JackNetMasterInterface()
00126 {}
00127 };
00128
00133 class SERVER_EXPORT JackNetSlaveInterface : public JackNetInterface
00134 {
00135 protected:
00136 static uint fSlaveCounter;
00137
00138 bool Init();
00139 net_status_t GetNetMaster();
00140 net_status_t SendStartToMaster();
00141 void SetParams();
00142 int SyncRecv();
00143 int SyncSend();
00144 int DataRecv();
00145 int DataSend();
00146
00147 int Recv ( size_t size, int flags );
00148 int Send ( size_t size, int flags );
00149
00150 public:
00151 JackNetSlaveInterface() : JackNetInterface()
00152 {
00153
00154 if ( fSlaveCounter++ == 0 )
00155 {
00156 if ( SocketAPIInit() < 0 )
00157 {
00158 jack_error ( "Can't init Socket API, exiting..." );
00159 throw -1;
00160 }
00161 }
00162 }
00163 JackNetSlaveInterface ( const char* ip, int port ) : JackNetInterface ( ip, port )
00164 {
00165
00166 if ( fSlaveCounter++ == 0 )
00167 {
00168 if ( SocketAPIInit() < 0 )
00169 {
00170 jack_error ( "Can't init Socket API, exiting..." );
00171 throw -1;
00172 }
00173 }
00174 }
00175 ~JackNetSlaveInterface()
00176 {
00177
00178 if ( --fSlaveCounter == 0 )
00179 SocketAPIEnd();
00180 }
00181 };
00182 }
00183
00184 #define DEFAULT_MULTICAST_IP "225.3.19.154"
00185 #define DEFAULT_PORT 19000
00186
00187 #define SLAVE_SETUP_RETRY 5
00188
00189 #define MASTER_INIT_TIMEOUT 1000000 // in usec
00190 #define SLAVE_INIT_TIMEOUT 2000000 // in usec
00191
00192 #define MAX_LATENCY 6
00193
00194 #endif