00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "JackMidiPort.h"
00021 #include "JackTools.h"
00022 #include "types.h"
00023 #include "transport.h"
00024 #ifndef WIN32
00025 #include <netinet/in.h>
00026 #endif
00027 #include <cmath>
00028
00029 using namespace std;
00030
00031 #ifndef htonll
00032 #ifdef __BIG_ENDIAN__
00033 #define htonll(x) (x)
00034 #define ntohll(x) (x)
00035 #else
00036 #define htonll(x) ((((uint64_t)htonl(x)) << 32) + htonl(x >> 32))
00037 #define ntohll(x) ((((uint64_t)ntohl(x)) << 32) + ntohl(x >> 32))
00038 #endif
00039 #endif
00040
00041 #define NETWORK_PROTOCOL 8
00042
00043 #define NET_SYNCHING 0
00044 #define SYNC_PACKET_ERROR -2
00045 #define DATA_PACKET_ERROR -3
00046
00047 #define OPTIMIZED_PROTOCOL 1
00048
00049 #define HEADER_SIZE (sizeof(packet_header_t))
00050 #define PACKET_AVAILABLE_SIZE(params) ((params)->fMtu - sizeof(packet_header_t))
00051
00052 namespace Jack
00053 {
00054 typedef struct _session_params session_params_t;
00055 typedef struct _packet_header packet_header_t;
00056 typedef struct _net_transport_data net_transport_data_t;
00057 typedef struct sockaddr socket_address_t;
00058 typedef struct in_addr address_t;
00059 typedef jack_default_audio_sample_t sample_t;
00060
00061 enum JackNetEncoder {
00062
00063 JackFloatEncoder = 0,
00064 JackIntEncoder = 1,
00065 JackCeltEncoder = 2,
00066 JackOpusEncoder = 3,
00067 };
00068
00069
00070
00088 PRE_PACKED_STRUCTURE
00089 struct _session_params
00090 {
00091 char fPacketType[8];
00092 uint32_t fProtocolVersion;
00093 int32_t fPacketID;
00094 char fName[JACK_CLIENT_NAME_SIZE];
00095 char fMasterNetName[JACK_SERVER_NAME_SIZE];
00096 char fSlaveNetName[JACK_SERVER_NAME_SIZE];
00097 uint32_t fMtu;
00098 uint32_t fID;
00099 uint32_t fTransportSync;
00100 int32_t fSendAudioChannels;
00101 int32_t fReturnAudioChannels;
00102 int32_t fSendMidiChannels;
00103 int32_t fReturnMidiChannels;
00104 uint32_t fSampleRate;
00105 uint32_t fPeriodSize;
00106 uint32_t fSampleEncoder;
00107 uint32_t fKBps;
00108 uint32_t fSlaveSyncMode;
00109 uint32_t fNetworkLatency;
00110 } POST_PACKED_STRUCTURE;
00111
00112
00113
00118 enum _net_status
00119 {
00120 NET_SOCKET_ERROR = 0,
00121 NET_CONNECT_ERROR,
00122 NET_ERROR,
00123 NET_SEND_ERROR,
00124 NET_RECV_ERROR,
00125 NET_CONNECTED,
00126 NET_ROLLING
00127 };
00128
00129 typedef enum _net_status net_status_t;
00130
00131
00132
00137 enum _sync_packet_type
00138 {
00139 INVALID = 0,
00140 SLAVE_AVAILABLE,
00141 SLAVE_SETUP,
00142 START_MASTER,
00143 START_SLAVE,
00144 KILL_MASTER
00145 };
00146
00147 typedef enum _sync_packet_type sync_packet_type_t;
00148
00149
00150
00151
00171 PRE_PACKED_STRUCTURE
00172 struct _packet_header
00173 {
00174 char fPacketType[8];
00175 uint32_t fDataType;
00176 uint32_t fDataStream;
00177 uint32_t fID;
00178 uint32_t fNumPacket;
00179 uint32_t fPacketSize;
00180 uint32_t fActivePorts;
00181 uint32_t fCycle;
00182 uint32_t fSubCycle;
00183 int32_t fFrames;
00184 uint32_t fIsLastPckt;
00185 } POST_PACKED_STRUCTURE;
00186
00187
00188
00193 enum _net_timebase_master
00194 {
00195 NO_CHANGE = 0,
00196 RELEASE_TIMEBASEMASTER = 1,
00197 TIMEBASEMASTER = 2,
00198 CONDITIONAL_TIMEBASEMASTER = 3
00199 };
00200
00201 typedef enum _net_timebase_master net_timebase_master_t;
00202
00203
00204
00205
00210 PRE_PACKED_STRUCTURE
00211 struct _net_transport_data
00212 {
00213 uint32_t fNewState;
00214 uint32_t fTimebaseMaster;
00215 int32_t fState;
00216 jack_position_t fPosition;
00217 } POST_PACKED_STRUCTURE;
00218
00219
00220
00236 class SERVER_EXPORT NetMidiBuffer
00237 {
00238 private:
00239
00240 int fNPorts;
00241 size_t fMaxBufsize;
00242 int fMaxPcktSize;
00243
00244 char* fBuffer;
00245 char* fNetBuffer;
00246 JackMidiBuffer** fPortBuffer;
00247
00248 size_t fCycleBytesSize;
00249
00250 public:
00251
00252 NetMidiBuffer(session_params_t* params, uint32_t nports, char* net_buffer);
00253 ~NetMidiBuffer();
00254
00255 void Reset();
00256
00257
00258 size_t GetCycleSize();
00259 int GetNumPackets(int data_sizen, int max_size);
00260
00261 void SetBuffer(int index, JackMidiBuffer* buffer);
00262 JackMidiBuffer* GetBuffer(int index);
00263
00264
00265 void DisplayEvents();
00266
00267
00268 int RenderFromJackPorts();
00269 void RenderToJackPorts();
00270
00271
00272 void RenderFromNetwork(int sub_cycle, size_t copy_size);
00273 int RenderToNetwork(int sub_cycle, size_t total_size);
00274
00275 };
00276
00277
00278
00279 class SERVER_EXPORT NetAudioBuffer
00280 {
00281
00282 protected:
00283
00284 int fNPorts;
00285 int fLastSubCycle;
00286 int fNumPackets;
00287
00288 char* fNetBuffer;
00289 sample_t** fPortBuffer;
00290 bool* fConnectedPorts;
00291
00292 jack_nframes_t fPeriodSize;
00293 jack_nframes_t fSubPeriodSize;
00294 size_t fSubPeriodBytesSize;
00295
00296 float fCycleDuration;
00297 size_t fCycleBytesSize;
00298
00299 int CheckPacket(int cycle, int sub_cycle);
00300 void NextCycle();
00301 void Cleanup();
00302
00303 public:
00304
00305 NetAudioBuffer(session_params_t* params, uint32_t nports, char* net_buffer);
00306 virtual ~NetAudioBuffer();
00307
00308 bool GetConnected(int port_index) { return fConnectedPorts[port_index]; }
00309 void SetConnected(int port_index, bool state) { fConnectedPorts[port_index] = state; }
00310
00311
00312 virtual size_t GetCycleSize() = 0;
00313
00314
00315 virtual float GetCycleDuration() = 0;
00316
00317 virtual int GetNumPackets(int active_ports) = 0;
00318
00319 virtual void SetBuffer(int index, sample_t* buffer);
00320 virtual sample_t* GetBuffer(int index);
00321
00322
00323 virtual int RenderFromJackPorts(int nframes);
00324 virtual void RenderToJackPorts(int nframes);
00325
00326
00327 virtual int RenderFromNetwork(int cycle, int sub_cycle, uint32_t port_num) = 0;
00328 virtual int RenderToNetwork(int sub_cycle, uint32_t port_num) = 0;
00329
00330 virtual int ActivePortsToNetwork(char* net_buffer);
00331 virtual void ActivePortsFromNetwork(char* net_buffer, uint32_t port_num);
00332
00333 };
00334
00335 class SERVER_EXPORT NetFloatAudioBuffer : public NetAudioBuffer
00336 {
00337
00338 private:
00339
00340 int fPacketSize;
00341
00342 void UpdateParams(int active_ports);
00343
00344
00345 void RenderFromNetwork(char* net_buffer, int active_port, int sub_cycle);
00346 void RenderToNetwork(char* net_buffer, int active_port, int sub_cycle);
00347
00348 public:
00349
00350 NetFloatAudioBuffer(session_params_t* params, uint32_t nports, char* net_buffer);
00351 virtual ~NetFloatAudioBuffer();
00352
00353
00354 size_t GetCycleSize();
00355
00356
00357 float GetCycleDuration();
00358 int GetNumPackets(int active_ports);
00359
00360
00361 int RenderFromNetwork(int cycle, int sub_cycle, uint32_t port_num);
00362 int RenderToNetwork(int sub_cycle, uint32_t port_num);
00363
00364 };
00365
00366 #if HAVE_CELT
00367
00368 #include <celt/celt.h>
00369
00370 class SERVER_EXPORT NetCeltAudioBuffer : public NetAudioBuffer
00371 {
00372 private:
00373
00374 CELTMode** fCeltMode;
00375 CELTEncoder** fCeltEncoder;
00376 CELTDecoder** fCeltDecoder;
00377
00378 int fCompressedSizeByte;
00379 unsigned char** fCompressedBuffer;
00380
00381 size_t fLastSubPeriodBytesSize;
00382
00383 void FreeCelt();
00384
00385 public:
00386
00387 NetCeltAudioBuffer(session_params_t* params, uint32_t nports, char* net_buffer, int kbps);
00388 virtual ~NetCeltAudioBuffer();
00389
00390
00391 size_t GetCycleSize();
00392
00393
00394 float GetCycleDuration();
00395 int GetNumPackets(int active_ports);
00396
00397
00398 int RenderFromJackPorts(int nframes);
00399 void RenderToJackPorts(int nframes);
00400
00401
00402 int RenderFromNetwork(int cycle, int sub_cycle, uint32_t port_num);
00403 int RenderToNetwork(int sub_cycle, uint32_t port_num);
00404 };
00405
00406 #endif
00407
00408 #if HAVE_OPUS
00409
00410 #include <opus/opus.h>
00411 #include <opus/opus_custom.h>
00412
00413 class SERVER_EXPORT NetOpusAudioBuffer : public NetAudioBuffer
00414 {
00415 private:
00416
00417 OpusCustomMode** fOpusMode;
00418 OpusCustomEncoder** fOpusEncoder;
00419 OpusCustomDecoder** fOpusDecoder;
00420
00421 int fCompressedMaxSizeByte;
00422 unsigned short* fCompressedSizesByte;
00423
00424 size_t fLastSubPeriodBytesSize;
00425
00426 unsigned char** fCompressedBuffer;
00427 void FreeOpus();
00428
00429 public:
00430
00431 NetOpusAudioBuffer(session_params_t* params, uint32_t nports, char* net_buffer, int kbps);
00432 virtual ~NetOpusAudioBuffer();
00433
00434
00435 size_t GetCycleSize();
00436
00437
00438 float GetCycleDuration();
00439 int GetNumPackets(int active_ports);
00440
00441
00442 int RenderFromJackPorts(int nframes);
00443 void RenderToJackPorts(int nframes);
00444
00445
00446 int RenderFromNetwork(int cycle, int sub_cycle, uint32_t port_num);
00447 int RenderToNetwork(int sub_cycle, uint32_t port_num);
00448 };
00449
00450 #endif
00451
00452 class SERVER_EXPORT NetIntAudioBuffer : public NetAudioBuffer
00453 {
00454 private:
00455
00456 int fCompressedSizeByte;
00457
00458 size_t fLastSubPeriodBytesSize;
00459
00460 short** fIntBuffer;
00461
00462 public:
00463
00464 NetIntAudioBuffer(session_params_t* params, uint32_t nports, char* net_buffer);
00465 virtual ~NetIntAudioBuffer();
00466
00467
00468 size_t GetCycleSize();
00469
00470
00471 float GetCycleDuration();
00472 int GetNumPackets(int active_ports);
00473
00474
00475 int RenderFromJackPorts(int nframes);
00476 void RenderToJackPorts(int nframes);
00477
00478
00479 int RenderFromNetwork(int cycle, int sub_cycle, uint32_t port_num);
00480 int RenderToNetwork(int sub_cycle, uint32_t port_num);
00481 };
00482
00483
00484
00485
00486 SERVER_EXPORT int SocketAPIInit();
00487 SERVER_EXPORT int SocketAPIEnd();
00488
00489 SERVER_EXPORT void SessionParamsHToN(session_params_t* src_params, session_params_t* dst_params);
00490 SERVER_EXPORT void SessionParamsNToH(session_params_t* src_params, session_params_t* dst_params);
00491 SERVER_EXPORT void PacketHeaderHToN(packet_header_t* src_header, packet_header_t* dst_header);
00492 SERVER_EXPORT void PacketHeaderNToH(packet_header_t* src_header, packet_header_t* dst_header);
00493 SERVER_EXPORT void MidiBufferHToN(JackMidiBuffer* src_buffer, JackMidiBuffer* dst_buffer);
00494 SERVER_EXPORT void MidiBufferNToH(JackMidiBuffer* src_buffer, JackMidiBuffer* dst_buffer);
00495 SERVER_EXPORT void TransportDataHToN(net_transport_data_t* src_params, net_transport_data_t* dst_params);
00496 SERVER_EXPORT void TransportDataNToH(net_transport_data_t* src_params, net_transport_data_t* dst_params);
00497
00498 SERVER_EXPORT void SessionParamsDisplay(session_params_t* params);
00499
00500 SERVER_EXPORT void PacketHeaderDisplay(packet_header_t* header);
00501
00502 SERVER_EXPORT sync_packet_type_t GetPacketType(session_params_t* params);
00503
00504 SERVER_EXPORT int SetPacketType(session_params_t* params, sync_packet_type_t packet_type);
00505
00506 SERVER_EXPORT const char* GetTransportState(int transport_state);
00507 SERVER_EXPORT void NetTransportDataDisplay(net_transport_data_t* data);
00508 }