jack2 codebase
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

199 lines
7.1KB

  1. /*
  2. Copyright (C) 2008 Romain Moret at Grame
  3. This program is free software; you can redistribute it and/or modify
  4. it under the terms of the GNU General Public License as published by
  5. the Free Software Foundation; either version 2 of the License, or
  6. (at your option) any later version.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. GNU General Public License for more details.
  11. You should have received a copy of the GNU General Public License
  12. along with this program; if not, write to the Free Software
  13. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  14. */
  15. #include "JackConstants.h"
  16. #include "JackMidiPort.h"
  17. #include "JackExports.h"
  18. #include "JackError.h"
  19. #include "JackTools.h"
  20. #include "JackPlatformNetSocket.h"
  21. #include "types.h"
  22. #include <cmath>
  23. using namespace std;
  24. namespace Jack
  25. {
  26. typedef struct _session_params session_params_t;
  27. typedef struct _packet_header packet_header_t;
  28. typedef struct _net_transport_data net_transport_data_t;
  29. typedef struct sockaddr socket_address_t;
  30. typedef struct in_addr address_t;
  31. typedef jack_default_audio_sample_t sample_t;
  32. //session params ******************************************************************************
  33. struct _session_params
  34. {
  35. char fPacketType[7]; //packet type ('param')
  36. char fProtocolVersion; //version
  37. uint32_t fPacketID; //indicates the packet type
  38. char fMasterNetName[256]; //master hostname (network)
  39. char fSlaveNetName[256]; //slave hostname (network)
  40. uint32_t fMtu; //connection mtu
  41. uint32_t fID; //slave's ID
  42. uint32_t fTransportSync; //is the transport synced ?
  43. uint32_t fSendAudioChannels; //number of master->slave channels
  44. uint32_t fReturnAudioChannels; //number of slave->master channels
  45. uint32_t fSendMidiChannels; //number of master->slave midi channels
  46. uint32_t fReturnMidiChannels; //number of slave->master midi channels
  47. uint32_t fSampleRate; //session sample rate
  48. uint32_t fPeriodSize; //period size
  49. uint32_t fFramesPerPacket; //complete frames per packet
  50. uint32_t fBitdepth; //samples bitdepth (unused)
  51. char fName[JACK_CLIENT_NAME_SIZE]; //slave's name
  52. };
  53. //net status **********************************************************************************
  54. enum _net_status
  55. {
  56. NET_SOCKET_ERROR = 0,
  57. NET_CONNECT_ERROR,
  58. NET_ERROR,
  59. NET_SEND_ERROR,
  60. NET_RECV_ERROR,
  61. NET_CONNECTED,
  62. NET_ROLLING
  63. };
  64. typedef enum _net_status net_status_t;
  65. //sync packet type ****************************************************************************
  66. enum _sync_packet_type
  67. {
  68. INVALID = 0, //...
  69. SLAVE_AVAILABLE, //a slave is available
  70. SLAVE_SETUP, //slave configuration
  71. START_MASTER, //slave is ready, start master
  72. START_SLAVE, //master is ready, activate slave
  73. KILL_MASTER //master must stop
  74. };
  75. typedef enum _sync_packet_type sync_packet_type_t;
  76. //packet header *******************************************************************************
  77. struct _packet_header
  78. {
  79. char fPacketType[7]; //packet type ( 'headr' )
  80. char fDataType; //a for audio, m for midi
  81. char fDataStream; //s for send, r for return
  82. uint32_t fID; //to identify the slave
  83. uint32_t fBitdepth; //bitdepth of the data samples
  84. uint32_t fMidiDataSize; //size of midi data (if packet is 'midi typed') in bytes
  85. uint32_t fNMidiPckt; //number of midi packets of the cycle
  86. uint32_t fCycle; //process cycle counter
  87. uint32_t fSubCycle; //midi/audio subcycle counter
  88. char fIsLastPckt; //is it the last packet of a given cycle ('y' or 'n')
  89. char fFree[13]; //unused
  90. };
  91. //transport data ******************************************************************************
  92. struct _net_transport_data
  93. {
  94. char fTransportType[10]; //test value ('transport')
  95. jack_position_t fCurPos;
  96. jack_transport_state_t fCurState;
  97. };
  98. //midi data ***********************************************************************************
  99. class EXPORT NetMidiBuffer
  100. {
  101. private:
  102. int fNPorts;
  103. size_t fMaxBufsize;
  104. int fMaxPcktSize;
  105. char* fBuffer;
  106. char* fNetBuffer;
  107. JackMidiBuffer** fPortBuffer;
  108. public:
  109. NetMidiBuffer ( session_params_t* params, uint32_t nports, char* net_buffer );
  110. ~NetMidiBuffer();
  111. void Reset();
  112. size_t GetSize();
  113. //utility
  114. void DisplayEvents();
  115. //jack<->buffer
  116. int RenderFromJackPorts();
  117. int RenderToJackPorts();
  118. //network<->buffer
  119. int RenderFromNetwork ( int subcycle, size_t copy_size );
  120. int RenderToNetwork ( int subcycle, size_t total_size );
  121. void SetBuffer(int index, JackMidiBuffer* buffer);
  122. };
  123. // audio data *********************************************************************************
  124. class EXPORT NetAudioBuffer
  125. {
  126. private:
  127. int fNPorts;
  128. jack_nframes_t fPeriodSize;
  129. jack_nframes_t fSubPeriodSize;
  130. size_t fSubPeriodBytesSize;
  131. char* fNetBuffer;
  132. sample_t** fPortBuffer;
  133. public:
  134. NetAudioBuffer ( session_params_t* params, uint32_t nports, char* net_buffer );
  135. ~NetAudioBuffer();
  136. size_t GetSize();
  137. //jack<->buffer
  138. void RenderFromJackPorts ( int subcycle );
  139. void RenderToJackPorts ( int subcycle );
  140. void SetBuffer(int index, sample_t* buffer);
  141. };
  142. //utility *************************************************************************************
  143. //socket API management
  144. EXPORT int SocketAPIInit();
  145. EXPORT int SocketAPIEnd();
  146. //n<-->h functions
  147. EXPORT void SessionParamsHToN ( session_params_t* params );
  148. EXPORT void SessionParamsNToH ( session_params_t* params );
  149. EXPORT void PacketHeaderHToN ( packet_header_t* header );
  150. EXPORT void PacketHeaderNToH ( packet_header_t* header );
  151. //display session parameters
  152. EXPORT void SessionParamsDisplay ( session_params_t* params );
  153. //display packet header
  154. EXPORT void PacketHeaderDisplay ( packet_header_t* header );
  155. //get the packet type from a sesion parameters
  156. EXPORT sync_packet_type_t GetPacketType ( session_params_t* params );
  157. //set the packet type in a session parameters
  158. EXPORT int SetPacketType ( session_params_t* params, sync_packet_type_t packet_type );
  159. //step of network initialization
  160. EXPORT jack_nframes_t SetFramesPerPacket ( session_params_t* params );
  161. //get the midi packet number for a given cycle
  162. EXPORT int GetNMidiPckt ( session_params_t* params, size_t data_size );
  163. //set the recv timeout on a socket
  164. EXPORT int SetRxTimeout ( JackNetSocket* socket, session_params_t* params );
  165. //check if 'next' packet is really the next after 'previous'
  166. EXPORT bool IsNextPacket ( packet_header_t* previous, packet_header_t* next, uint subcycles );
  167. }