1 /* 2 Copyright (C) 2008-2011 Romain Moret at Grame 3 4 This program is free software; you can redistribute it and/or modify 5 it under the terms of the GNU General Public License as published by 6 the Free Software Foundation; either version 2 of the License, or 7 (at your option) any later version. 8 9 This program is distributed in the hope that it will be useful, 10 but WITHOUT ANY WARRANTY; without even the implied warranty of 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 GNU General Public License for more details. 13 14 You should have received a copy of the GNU General Public License 15 along with this program; if not, write to the Free Software 16 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 17 18 */ 19 20 #ifndef __JackNetInterface__ 21 #define __JackNetInterface__ 22 23 #include "JackNetTool.h" 24 #include <limits.h> 25 26 namespace Jack 27 { 28 29 #define DEFAULT_MULTICAST_IP "225.3.19.154" 30 #define DEFAULT_PORT 19000 31 #define DEFAULT_MTU 1500 32 #define MAX_MTU 9000 33 34 #define SLAVE_SETUP_RETRY 5 35 36 #define MANAGER_INIT_TIMEOUT 1000000 * 2 // in usec 37 #define MASTER_INIT_TIMEOUT 1000000 * 10 // in usec 38 #define SLAVE_INIT_TIMEOUT 1000000 * 1 // in usec 39 #define PACKET_TIMEOUT 1000000 // in usec 40 41 #define NETWORK_DEFAULT_LATENCY 2 42 #define NETWORK_MAX_LATENCY 30 // maximum possible latency in network master/slave loop 43 44 /** 45 \Brief This class describes the basic Net Interface, used by both master and slave. 46 */ 47 48 class SERVER_EXPORT JackNetInterface 49 { 50 51 friend class JackNetExt; 52 53 protected: 54 55 bool fSetTimeOut; 56 int fPacketTimeOut; 57 58 void Initialize(); 59 60 session_params_t fParams; 61 JackNetSocket fSocket; 62 char fMulticastIP[32]; 63 64 // headers 65 packet_header_t fTxHeader; 66 packet_header_t fRxHeader; 67 68 // transport 69 net_transport_data_t fSendTransportData; 70 net_transport_data_t fReturnTransportData; 71 72 // network buffers 73 char* fTxBuffer; 74 char* fRxBuffer; 75 char* fTxData; 76 char* fRxData; 77 78 // JACK buffers 79 NetMidiBuffer* fNetMidiCaptureBuffer; 80 NetMidiBuffer* fNetMidiPlaybackBuffer; 81 NetAudioBuffer* fNetAudioCaptureBuffer; 82 NetAudioBuffer* fNetAudioPlaybackBuffer; 83 84 // utility methods 85 int SetNetBufferSize(); 86 void FreeNetworkBuffers(); 87 88 // virtual methods : depends on the sub class master/slave 89 virtual bool SetParams(); 90 virtual bool Init() = 0; 91 92 // transport 93 virtual void EncodeTransportData() = 0; 94 virtual void DecodeTransportData() = 0; 95 96 // sync packet 97 virtual void EncodeSyncPacket(int frames = -1) = 0; 98 virtual void DecodeSyncPacket(int& frames) = 0; 99 100 virtual int SyncRecv() = 0; 101 virtual int SyncSend() = 0; 102 virtual int DataRecv() = 0; 103 virtual int DataSend() = 0; 104 105 virtual int Send(size_t size, int flags) = 0; 106 virtual int Recv(size_t size, int flags) = 0; 107 108 virtual void FatalRecvError() = 0; 109 virtual void FatalSendError() = 0; 110 111 int MidiSend(NetMidiBuffer* buffer, int midi_channnels, int audio_channels); 112 int AudioSend(NetAudioBuffer* buffer, int audio_channels); 113 114 int MidiRecv(packet_header_t* rx_head, NetMidiBuffer* buffer, uint& recvd_midi_pckt); 115 int AudioRecv(packet_header_t* rx_head, NetAudioBuffer* buffer); 116 117 int FinishRecv(NetAudioBuffer* buffer); 118 119 void SetRcvTimeOut(); SetPacketTimeOut(int time_out)120 void SetPacketTimeOut(int time_out) 121 { 122 // New time out 123 fPacketTimeOut = time_out; 124 fSetTimeOut = false; 125 } 126 127 NetAudioBuffer* AudioBufferFactory(int nports, char* buffer); 128 129 public: 130 131 JackNetInterface(); 132 JackNetInterface(const char* multicast_ip, int port); 133 JackNetInterface(session_params_t& params, JackNetSocket& socket, const char* multicast_ip); 134 135 virtual ~JackNetInterface(); 136 137 }; 138 139 /** 140 \Brief This class describes the Net Interface for masters (NetMaster) 141 */ 142 143 class SERVER_EXPORT JackNetMasterInterface : public JackNetInterface 144 { 145 146 protected: 147 148 bool fRunning; 149 int fCurrentCycleOffset; 150 int fMaxCycleOffset; 151 bool fSynched; 152 153 bool Init(); 154 bool SetParams(); 155 156 void Exit(); 157 158 int SyncRecv(); 159 int SyncSend(); 160 161 int DataRecv(); 162 int DataSend(); 163 164 // sync packet 165 void EncodeSyncPacket(int frames = -1); 166 void DecodeSyncPacket(int& frames); 167 168 int Send(size_t size, int flags); 169 int Recv(size_t size, int flags); 170 171 void FatalRecvError(); 172 void FatalSendError(); 173 174 public: 175 JackNetMasterInterface()176 JackNetMasterInterface() 177 : JackNetInterface(), 178 fRunning(false), 179 fCurrentCycleOffset(0), 180 fMaxCycleOffset(0), 181 fSynched(false) 182 {} JackNetMasterInterface(session_params_t & params,JackNetSocket & socket,const char * multicast_ip)183 JackNetMasterInterface(session_params_t& params, JackNetSocket& socket, const char* multicast_ip) 184 : JackNetInterface(params, socket, multicast_ip), 185 fRunning(false), 186 fCurrentCycleOffset(0), 187 fMaxCycleOffset(0), 188 fSynched(false) 189 {} 190 ~JackNetMasterInterface()191 virtual~JackNetMasterInterface() 192 {} 193 }; 194 195 /** 196 \Brief This class describes the Net Interface for slaves (NetDriver and NetAdapter) 197 */ 198 199 class SERVER_EXPORT JackNetSlaveInterface : public JackNetInterface 200 { 201 202 protected: 203 204 static uint fSlaveCounter; 205 206 bool Init(); 207 bool InitConnection(int time_out_sec); 208 bool InitRendering(); 209 210 net_status_t SendAvailableToMaster(int count = INT_MAX); 211 net_status_t SendStartToMaster(); 212 213 bool SetParams(); 214 215 int SyncRecv(); 216 int SyncSend(); 217 218 int DataRecv(); 219 int DataSend(); 220 221 // sync packet 222 void EncodeSyncPacket(int frames = -1); 223 void DecodeSyncPacket(int& frames); 224 225 int Recv(size_t size, int flags); 226 int Send(size_t size, int flags); 227 228 void FatalRecvError(); 229 void FatalSendError(); 230 231 void InitAPI(); 232 233 public: 234 JackNetSlaveInterface()235 JackNetSlaveInterface() : JackNetInterface() 236 { 237 InitAPI(); 238 } 239 JackNetSlaveInterface(const char * ip,int port)240 JackNetSlaveInterface(const char* ip, int port) : JackNetInterface(ip, port) 241 { 242 InitAPI(); 243 } 244 ~JackNetSlaveInterface()245 virtual ~JackNetSlaveInterface() 246 { 247 // close Socket API with the last slave 248 if (--fSlaveCounter == 0) { 249 SocketAPIEnd(); 250 } 251 } 252 }; 253 } 254 255 #endif 256