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.

1026 lines
40KB

  1. /*
  2. Copyright (C) 2001 Paul Davis
  3. Copyright (C) 2008 Romain Moret at Grame
  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. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. GNU General Public License for more details.
  12. You should have received a copy of the GNU General Public License
  13. along with this program; if not, write to the Free Software
  14. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  15. */
  16. #include "JackNetInterface.h"
  17. #include "JackException.h"
  18. #include "JackPlatformPlug.h"
  19. #include <assert.h>
  20. using namespace std;
  21. #define PACKET_AVAILABLE_SIZE (fParams.fMtu - sizeof(packet_header_t))
  22. /*
  23. TODO : since midi buffers now uses up to BUFFER_SIZE_MAX frames,
  24. probably also use BUFFER_SIZE_MAX in everything related to MIDI events
  25. handling (see MidiBufferInit in JackMidiPort.cpp)
  26. */
  27. namespace Jack
  28. {
  29. // JackNetInterface*******************************************
  30. JackNetInterface::JackNetInterface() : fSocket()
  31. {
  32. fTxBuffer = NULL;
  33. fRxBuffer = NULL;
  34. fNetAudioCaptureBuffer = NULL;
  35. fNetAudioPlaybackBuffer = NULL;
  36. fNetMidiCaptureBuffer = NULL;
  37. fNetMidiPlaybackBuffer = NULL;
  38. memset(&fSendTransportData, 0, sizeof(net_transport_data_t));
  39. memset(&fReturnTransportData, 0, sizeof(net_transport_data_t));
  40. }
  41. JackNetInterface::JackNetInterface ( const char* multicast_ip, int port ) : fSocket ( multicast_ip, port )
  42. {
  43. strcpy(fMulticastIP, multicast_ip);
  44. fTxBuffer = NULL;
  45. fRxBuffer = NULL;
  46. fNetAudioCaptureBuffer = NULL;
  47. fNetAudioPlaybackBuffer = NULL;
  48. fNetMidiCaptureBuffer = NULL;
  49. fNetMidiPlaybackBuffer = NULL;
  50. memset(&fSendTransportData, 0, sizeof(net_transport_data_t));
  51. memset(&fReturnTransportData, 0, sizeof(net_transport_data_t));
  52. }
  53. JackNetInterface::JackNetInterface ( session_params_t& params, JackNetSocket& socket, const char* multicast_ip ) : fSocket ( socket )
  54. {
  55. jack_log("JackNetInterface ( session_params_t& params...)");
  56. fParams = params;
  57. strcpy(fMulticastIP, multicast_ip);
  58. fTxBuffer = NULL;
  59. fRxBuffer = NULL;
  60. fNetAudioCaptureBuffer = NULL;
  61. fNetAudioPlaybackBuffer = NULL;
  62. fNetMidiCaptureBuffer = NULL;
  63. fNetMidiPlaybackBuffer = NULL;
  64. memset(&fSendTransportData, 0, sizeof(net_transport_data_t));
  65. memset(&fReturnTransportData, 0, sizeof(net_transport_data_t));
  66. }
  67. JackNetInterface::~JackNetInterface()
  68. {
  69. jack_log ( "JackNetInterface::~JackNetInterface" );
  70. fSocket.Close();
  71. delete[] fTxBuffer;
  72. delete[] fRxBuffer;
  73. delete fNetAudioCaptureBuffer;
  74. delete fNetAudioPlaybackBuffer;
  75. delete fNetMidiCaptureBuffer;
  76. delete fNetMidiPlaybackBuffer;
  77. }
  78. void JackNetInterface::SetFramesPerPacket()
  79. {
  80. jack_log ( "JackNetInterface::SetFramesPerPacket" );
  81. if (fParams.fSendAudioChannels == 0 && fParams.fReturnAudioChannels == 0) {
  82. fParams.fFramesPerPacket = fParams.fPeriodSize;
  83. } else {
  84. jack_nframes_t period = ( int ) powf ( 2.f, ( int ) ( log (float (PACKET_AVAILABLE_SIZE)
  85. / ( max ( fParams.fReturnAudioChannels, fParams.fSendAudioChannels ) * sizeof ( sample_t ) ) ) / log ( 2. ) ) );
  86. fParams.fFramesPerPacket = ( period > fParams.fPeriodSize ) ? fParams.fPeriodSize : period;
  87. }
  88. }
  89. int JackNetInterface::SetNetBufferSize()
  90. {
  91. jack_log ( "JackNetInterface::SetNetBufferSize" );
  92. float audio_size, midi_size;
  93. int bufsize;
  94. //audio
  95. audio_size = fParams.fMtu * ( fParams.fPeriodSize / fParams.fFramesPerPacket );
  96. //midi
  97. midi_size = fParams.fMtu * ( max ( fParams.fSendMidiChannels, fParams.fReturnMidiChannels ) *
  98. fParams.fPeriodSize * sizeof(sample_t) / PACKET_AVAILABLE_SIZE);
  99. //bufsize = sync + audio + midi
  100. bufsize = MAX_LATENCY * (fParams.fMtu + ( int ) audio_size + ( int ) midi_size);
  101. jack_info("SetNetBufferSize bufsize = %d", bufsize);
  102. //tx buffer
  103. if ( fSocket.SetOption ( SOL_SOCKET, SO_SNDBUF, &bufsize, sizeof ( bufsize ) ) == SOCKET_ERROR )
  104. return SOCKET_ERROR;
  105. //rx buffer
  106. if ( fSocket.SetOption ( SOL_SOCKET, SO_RCVBUF, &bufsize, sizeof ( bufsize ) ) == SOCKET_ERROR )
  107. return SOCKET_ERROR;
  108. return 0;
  109. }
  110. int JackNetInterface::GetNMidiPckt()
  111. {
  112. //even if there is no midi data, jack need an empty buffer to know there is no event to read
  113. //99% of the cases : all data in one packet
  114. if (fTxHeader.fMidiDataSize <= PACKET_AVAILABLE_SIZE) {
  115. return 1;
  116. } else { //get the number of needed packets (simply slice the biiig buffer)
  117. return (fTxHeader.fMidiDataSize % PACKET_AVAILABLE_SIZE)
  118. ? (fTxHeader.fMidiDataSize / PACKET_AVAILABLE_SIZE + 1)
  119. : fTxHeader.fMidiDataSize / PACKET_AVAILABLE_SIZE;
  120. }
  121. }
  122. bool JackNetInterface::IsNextPacket()
  123. {
  124. packet_header_t* rx_head = reinterpret_cast<packet_header_t*> ( fRxBuffer );
  125. //ignore first cycle
  126. if ( fRxHeader.fCycle <= 1 ) {
  127. return true;
  128. }
  129. //same PcktID (cycle), next SubPcktID (subcycle)
  130. if ( ( fRxHeader.fSubCycle < ( fNSubProcess - 1 ) ) && ( rx_head->fCycle == fRxHeader.fCycle ) && ( rx_head->fSubCycle == ( fRxHeader.fSubCycle + 1 ) ) ) {
  131. return true;
  132. }
  133. //next PcktID (cycle), SubPcktID reset to 0 (first subcyle)
  134. if ( ( rx_head->fCycle == ( fRxHeader.fCycle + 1 ) ) && ( fRxHeader.fSubCycle == ( fNSubProcess - 1 ) ) && ( rx_head->fSubCycle == 0 ) ) {
  135. return true;
  136. }
  137. //else, packet(s) missing, return false
  138. return false;
  139. }
  140. void JackNetInterface::SetParams()
  141. {
  142. //number of audio subcycles (packets)
  143. fNSubProcess = fParams.fPeriodSize / fParams.fFramesPerPacket;
  144. //payload size
  145. fPayloadSize = PACKET_AVAILABLE_SIZE;
  146. //TX header init
  147. strcpy ( fTxHeader.fPacketType, "header" );
  148. fTxHeader.fID = fParams.fID;
  149. fTxHeader.fCycle = 0;
  150. fTxHeader.fSubCycle = 0;
  151. fTxHeader.fMidiDataSize = 0;
  152. fTxHeader.fBitdepth = fParams.fBitdepth;
  153. fTxHeader.fIsLastPckt = 0;
  154. //RX header init
  155. strcpy ( fRxHeader.fPacketType, "header" );
  156. fRxHeader.fID = fParams.fID;
  157. fRxHeader.fCycle = 0;
  158. fRxHeader.fSubCycle = 0;
  159. fRxHeader.fMidiDataSize = 0;
  160. fRxHeader.fBitdepth = fParams.fBitdepth;
  161. fRxHeader.fIsLastPckt = 0;
  162. //network buffers
  163. fTxBuffer = new char[fParams.fMtu];
  164. fRxBuffer = new char[fParams.fMtu];
  165. assert ( fTxBuffer );
  166. assert ( fRxBuffer );
  167. //net audio/midi buffers'addresses
  168. fTxData = fTxBuffer + sizeof ( packet_header_t );
  169. fRxData = fRxBuffer + sizeof ( packet_header_t );
  170. }
  171. // JackNetMasterInterface ************************************************************************************
  172. bool JackNetMasterInterface::Init()
  173. {
  174. jack_log ( "JackNetMasterInterface::Init, ID %u.", fParams.fID );
  175. session_params_t host_params;
  176. uint attempt = 0;
  177. int rx_bytes = 0;
  178. //socket
  179. if ( fSocket.NewSocket() == SOCKET_ERROR ) {
  180. jack_error ( "Can't create socket : %s", StrError ( NET_ERROR_CODE ) );
  181. return false;
  182. }
  183. //timeout on receive (for init)
  184. if ( fSocket.SetTimeOut ( MASTER_INIT_TIMEOUT ) < 0 )
  185. jack_error ( "Can't set timeout : %s", StrError ( NET_ERROR_CODE ) );
  186. //connect
  187. if ( fSocket.Connect() == SOCKET_ERROR ) {
  188. jack_error ( "Can't connect : %s", StrError ( NET_ERROR_CODE ) );
  189. return false;
  190. }
  191. //set the number of complete audio frames we can put in a packet
  192. SetFramesPerPacket();
  193. //send 'SLAVE_SETUP' until 'START_MASTER' received
  194. jack_info ( "Sending parameters to %s ...", fParams.fSlaveNetName );
  195. do
  196. {
  197. session_params_t net_params;
  198. memset(&net_params, 0, sizeof ( session_params_t ));
  199. SetPacketType ( &fParams, SLAVE_SETUP );
  200. SessionParamsHToN(&fParams, &net_params);
  201. if ( fSocket.Send ( &net_params, sizeof ( session_params_t ), 0 ) == SOCKET_ERROR )
  202. jack_error ( "Error in send : ", StrError ( NET_ERROR_CODE ) );
  203. memset(&net_params, 0, sizeof ( session_params_t ));
  204. if ( ( ( rx_bytes = fSocket.Recv ( &net_params, sizeof ( session_params_t ), 0 ) ) == SOCKET_ERROR ) && ( fSocket.GetError() != NET_NO_DATA ) )
  205. {
  206. jack_error ( "Problem with network." );
  207. return false;
  208. }
  209. SessionParamsNToH(&net_params, &host_params);
  210. }
  211. while ( ( GetPacketType ( &host_params ) != START_MASTER ) && ( ++attempt < SLAVE_SETUP_RETRY ) );
  212. if ( attempt == SLAVE_SETUP_RETRY ) {
  213. jack_error ( "Slave doesn't respond, exiting." );
  214. return false;
  215. }
  216. //set the new timeout for the socket
  217. if ( SetRxTimeout() == SOCKET_ERROR ) {
  218. jack_error ( "Can't set rx timeout : %s", StrError ( NET_ERROR_CODE ) );
  219. return false;
  220. }
  221. //set the new rx buffer size
  222. if ( SetNetBufferSize() == SOCKET_ERROR ) {
  223. jack_error ( "Can't set net buffer sizes : %s", StrError ( NET_ERROR_CODE ) );
  224. return false;
  225. }
  226. return true;
  227. }
  228. int JackNetMasterInterface::SetRxTimeout()
  229. {
  230. jack_log ( "JackNetMasterInterface::SetRxTimeout" );
  231. float time = 0;
  232. //slow or normal mode, short timeout on recv (2 audio subcycles)
  233. if ( ( fParams.fNetworkMode == 's' ) || ( fParams.fNetworkMode == 'n' ) )
  234. time = 2000000.f * ( static_cast<float> ( fParams.fFramesPerPacket ) / static_cast<float> ( fParams.fSampleRate ) );
  235. //fast mode, wait for 75% of the entire cycle duration
  236. else if ( fParams.fNetworkMode == 'f' )
  237. time = 750000.f * ( static_cast<float> ( fParams.fPeriodSize ) / static_cast<float> ( fParams.fSampleRate ) );
  238. return fSocket.SetTimeOut ( static_cast<int> ( time ) );
  239. }
  240. void JackNetMasterInterface::SetParams()
  241. {
  242. jack_log ( "JackNetMasterInterface::SetParams" );
  243. JackNetInterface::SetParams();
  244. fTxHeader.fDataStream = 's';
  245. fRxHeader.fDataStream = 'r';
  246. //midi net buffers
  247. fNetMidiCaptureBuffer = new NetMidiBuffer ( &fParams, fParams.fSendMidiChannels, fTxData );
  248. fNetMidiPlaybackBuffer = new NetMidiBuffer ( &fParams, fParams.fReturnMidiChannels, fRxData );
  249. assert ( fNetMidiCaptureBuffer );
  250. assert ( fNetMidiPlaybackBuffer );
  251. //audio net buffers
  252. fNetAudioCaptureBuffer = new NetSingleAudioBuffer ( &fParams, fParams.fSendAudioChannels, fTxData );
  253. fNetAudioPlaybackBuffer = new NetSingleAudioBuffer ( &fParams, fParams.fReturnAudioChannels, fRxData );
  254. //fNetAudioCaptureBuffer = new NetBufferedAudioBuffer ( &fParams, fParams.fSendAudioChannels, fTxData );
  255. //fNetAudioPlaybackBuffer = new NetBufferedAudioBuffer ( &fParams, fParams.fReturnAudioChannels, fRxData );
  256. assert ( fNetAudioCaptureBuffer );
  257. assert ( fNetAudioPlaybackBuffer );
  258. //audio netbuffer length
  259. fAudioTxLen = sizeof ( packet_header_t ) + fNetAudioCaptureBuffer->GetSize();
  260. fAudioRxLen = sizeof ( packet_header_t ) + fNetAudioPlaybackBuffer->GetSize();
  261. }
  262. void JackNetMasterInterface::Exit()
  263. {
  264. jack_log ( "JackNetMasterInterface::Exit, ID %u", fParams.fID );
  265. //stop process
  266. fRunning = false;
  267. //send a 'multicast euthanasia request' - new socket is required on macosx
  268. jack_info ( "Exiting '%s'", fParams.fName );
  269. SetPacketType ( &fParams, KILL_MASTER );
  270. JackNetSocket mcast_socket ( fMulticastIP, fSocket.GetPort() );
  271. session_params_t net_params;
  272. memset(&net_params, 0, sizeof ( session_params_t ));
  273. SessionParamsHToN(&fParams, &net_params);
  274. if ( mcast_socket.NewSocket() == SOCKET_ERROR )
  275. jack_error ( "Can't create socket : %s", StrError ( NET_ERROR_CODE ) );
  276. if ( mcast_socket.SendTo ( &net_params, sizeof ( session_params_t ), 0, fMulticastIP ) == SOCKET_ERROR )
  277. jack_error ( "Can't send suicide request : %s", StrError ( NET_ERROR_CODE ) );
  278. mcast_socket.Close();
  279. }
  280. int JackNetMasterInterface::Recv ( size_t size, int flags )
  281. {
  282. int rx_bytes;
  283. if ( ( ( rx_bytes = fSocket.Recv ( fRxBuffer, size, flags ) ) == SOCKET_ERROR ) && fRunning )
  284. {
  285. net_error_t error = fSocket.GetError();
  286. //no data isn't really a network error, so just return 0 avalaible read bytes
  287. if ( error == NET_NO_DATA )
  288. return 0;
  289. else if ( error == NET_CONN_ERROR )
  290. {
  291. //fatal connection issue, exit
  292. jack_error ( "'%s' : %s, exiting.", fParams.fName, StrError ( NET_ERROR_CODE ) );
  293. //ask to the manager to properly remove the master
  294. Exit();
  295. // UGLY temporary way to be sure the thread does not call code possibly causing a deadlock in JackEngine.
  296. ThreadExit();
  297. }
  298. else
  299. jack_error ( "Error in master receive : %s", StrError ( NET_ERROR_CODE ) );
  300. }
  301. packet_header_t* header = reinterpret_cast<packet_header_t*>(fRxBuffer);
  302. PacketHeaderNToH(header, header);
  303. return rx_bytes;
  304. }
  305. int JackNetMasterInterface::Send ( size_t size, int flags )
  306. {
  307. int tx_bytes;
  308. packet_header_t* header = reinterpret_cast<packet_header_t*>(fTxBuffer);
  309. PacketHeaderHToN(header, header);
  310. if ( ( ( tx_bytes = fSocket.Send ( fTxBuffer, size, flags ) ) == SOCKET_ERROR ) && fRunning )
  311. {
  312. net_error_t error = fSocket.GetError();
  313. if ( error == NET_CONN_ERROR )
  314. {
  315. //fatal connection issue, exit
  316. jack_error ( "'%s' : %s, exiting.", fParams.fName, StrError ( NET_ERROR_CODE ) );
  317. Exit();
  318. // UGLY temporary way to be sure the thread does not call code possibly causing a deadlock in JackEngine.
  319. ThreadExit();
  320. }
  321. else
  322. jack_error ( "Error in master send : %s", StrError ( NET_ERROR_CODE ) );
  323. }
  324. return tx_bytes;
  325. }
  326. bool JackNetMasterInterface::IsSynched()
  327. {
  328. if (fParams.fNetworkMode == 's') {
  329. return (fCycleOffset < (CYCLE_OFFSET_SLOW + 1));
  330. } else {
  331. return true;
  332. }
  333. }
  334. int JackNetMasterInterface::SyncSend()
  335. {
  336. fTxHeader.fCycle++;
  337. fTxHeader.fSubCycle = 0;
  338. fTxHeader.fDataType = 's';
  339. fTxHeader.fIsLastPckt = ( fParams.fSendMidiChannels == 0 && fParams.fSendAudioChannels == 0) ? 1 : 0;
  340. fTxHeader.fPacketSize = fParams.fMtu;
  341. memcpy ( fTxBuffer, &fTxHeader, sizeof ( packet_header_t ) );
  342. return Send ( fTxHeader.fPacketSize, 0 );
  343. }
  344. int JackNetMasterInterface::DataSend()
  345. {
  346. uint subproc;
  347. //midi
  348. if ( fParams.fSendMidiChannels > 0)
  349. {
  350. //set global header fields and get the number of midi packets
  351. fTxHeader.fDataType = 'm';
  352. fTxHeader.fMidiDataSize = fNetMidiCaptureBuffer->RenderFromJackPorts();
  353. fTxHeader.fNMidiPckt = GetNMidiPckt();
  354. for ( subproc = 0; subproc < fTxHeader.fNMidiPckt; subproc++ )
  355. {
  356. fTxHeader.fSubCycle = subproc;
  357. fTxHeader.fIsLastPckt = ( ( subproc == ( fTxHeader.fNMidiPckt - 1 ) ) && (fParams.fSendAudioChannels == 0)) ? 1 : 0;
  358. fTxHeader.fPacketSize = sizeof ( packet_header_t ) + fNetMidiCaptureBuffer->RenderToNetwork ( subproc, fTxHeader.fMidiDataSize );
  359. memcpy ( fTxBuffer, &fTxHeader, sizeof ( packet_header_t ) );
  360. if ( Send ( fTxHeader.fPacketSize, 0 ) == SOCKET_ERROR )
  361. return SOCKET_ERROR;
  362. }
  363. }
  364. //audio
  365. if ( fParams.fSendAudioChannels > 0)
  366. {
  367. fTxHeader.fDataType = 'a';
  368. fTxHeader.fMidiDataSize = 0;
  369. fTxHeader.fNMidiPckt = 0;
  370. for ( subproc = 0; subproc < fNSubProcess; subproc++ )
  371. {
  372. fTxHeader.fSubCycle = subproc;
  373. fTxHeader.fIsLastPckt = ( subproc == ( fNSubProcess - 1 ) ) ? 1 : 0;
  374. fTxHeader.fPacketSize = fAudioTxLen;
  375. memcpy ( fTxBuffer, &fTxHeader, sizeof ( packet_header_t ) );
  376. fNetAudioCaptureBuffer->RenderFromJackPorts ( subproc );
  377. if ( Send ( fTxHeader.fPacketSize, 0 ) == SOCKET_ERROR )
  378. return SOCKET_ERROR;
  379. }
  380. }
  381. return 0;
  382. }
  383. int JackNetMasterInterface::SyncRecv()
  384. {
  385. packet_header_t* rx_head = reinterpret_cast<packet_header_t*> ( fRxBuffer );
  386. int rx_bytes = Recv ( fParams.fMtu, MSG_PEEK );
  387. if ( ( rx_bytes == 0 ) || ( rx_bytes == SOCKET_ERROR ) )
  388. return rx_bytes;
  389. fCycleOffset = fTxHeader.fCycle - rx_head->fCycle;
  390. switch ( fParams.fNetworkMode )
  391. {
  392. case 's' :
  393. //slow mode : allow to use full bandwidth and heavy process on the slave
  394. // - extra latency is set to two cycles, one cycle for send/receive operations + one cycle for heavy process on the slave
  395. // - if the network is two fast, just wait the next cycle, this mode allows a shorter cycle duration for the master
  396. // - this mode will skip the two first cycles, thus it lets time for data to be processed and queued on the socket rx buffer
  397. //the slow mode is the safest mode because it wait twice the bandwidth relative time (send/return + process)
  398. if (fCycleOffset < CYCLE_OFFSET_SLOW) {
  399. return 0;
  400. } else {
  401. rx_bytes = Recv ( rx_head->fPacketSize, 0 );
  402. }
  403. if (fCycleOffset > CYCLE_OFFSET_SLOW) {
  404. jack_info("Warning : '%s' runs in slow network mode, but data received too late (%d cycle(s) offset)", fParams.fName, fCycleOffset);
  405. }
  406. break;
  407. case 'n' :
  408. //normal use of the network :
  409. // - extra latency is set to one cycle, what is the time needed to receive streams using full network bandwidth
  410. // - if the network is too fast, just wait the next cycle, the benefit here is the master's cycle is shorter
  411. // - indeed, data is supposed to be on the network rx buffer, so we don't have to wait for it
  412. if (fCycleOffset < 1) {
  413. return 0;
  414. } else {
  415. rx_bytes = Recv ( rx_head->fPacketSize, 0 );
  416. }
  417. if (fCycleOffset != 1) {
  418. jack_info("'%s' can't run in normal network mode, data received too late (%d cycle(s) offset)", fParams.fName, fCycleOffset);
  419. }
  420. break;
  421. case 'f' :
  422. //fast mode suppose the network bandwith is larger than required for the transmission (only a few channels for example)
  423. // - packets can be quickly received, quickly is here relative to the cycle duration
  424. // - here, receive data, we can't keep it queued on the rx buffer,
  425. // - but if there is a cycle offset, tell the user, that means we're not in fast mode anymore, network is too slow
  426. rx_bytes = Recv ( rx_head->fPacketSize, 0 );
  427. if (fCycleOffset != 0) {
  428. jack_info("'%s' can't run in fast network mode, data received too late (%d cycle(s) offset)", fParams.fName, fCycleOffset);
  429. }
  430. break;
  431. }
  432. fRxHeader.fIsLastPckt = rx_head->fIsLastPckt;
  433. return rx_bytes;
  434. }
  435. int JackNetMasterInterface::DataRecv()
  436. {
  437. int rx_bytes = 0;
  438. uint jumpcnt = 0;
  439. uint recvd_midi_pckt = 0;
  440. uint recvd_audio_pckt = 0;
  441. int last_cycle = 0;
  442. packet_header_t* rx_head = reinterpret_cast<packet_header_t*> ( fRxBuffer );
  443. while ( !fRxHeader.fIsLastPckt )
  444. {
  445. //how much data is queued on the rx buffer ?
  446. rx_bytes = Recv ( fParams.fMtu, MSG_PEEK );
  447. if ( rx_bytes == SOCKET_ERROR )
  448. return rx_bytes;
  449. //if no data
  450. if ( ( rx_bytes == 0 ) && ( ++jumpcnt == fNSubProcess ) )
  451. {
  452. jack_error ( "No data from %s...", fParams.fName );
  453. jumpcnt = 0;
  454. }
  455. //else if data is valid,
  456. if ( rx_bytes && ( rx_head->fDataStream == 'r' ) && ( rx_head->fID == fParams.fID ) )
  457. {
  458. //read data
  459. switch ( rx_head->fDataType )
  460. {
  461. case 'm': //midi
  462. rx_bytes = Recv ( rx_head->fPacketSize, 0 );
  463. fRxHeader.fCycle = rx_head->fCycle;
  464. fRxHeader.fIsLastPckt = rx_head->fIsLastPckt;
  465. fNetMidiPlaybackBuffer->RenderFromNetwork ( rx_head->fSubCycle, rx_bytes - sizeof ( packet_header_t ) );
  466. if ( ++recvd_midi_pckt == rx_head->fNMidiPckt )
  467. fNetMidiPlaybackBuffer->RenderToJackPorts();
  468. jumpcnt = 0;
  469. break;
  470. case 'a': //audio
  471. rx_bytes = Recv ( rx_head->fPacketSize, 0 );
  472. if (recvd_audio_pckt++ != rx_head->fSubCycle) {
  473. jack_error("Packet(s) missing from '%s'...", fParams.fSlaveNetName);
  474. }
  475. fRxHeader.fCycle = rx_head->fCycle;
  476. fRxHeader.fSubCycle = rx_head->fSubCycle;
  477. fRxHeader.fIsLastPckt = rx_head->fIsLastPckt;
  478. fNetAudioPlaybackBuffer->RenderToJackPorts ( rx_head->fCycle, rx_head->fSubCycle);
  479. jumpcnt = 0;
  480. last_cycle = rx_head->fCycle;
  481. break;
  482. case 's': //sync
  483. jack_info("NetMaster : overloaded, skipping receive from '%s'", fParams.fName);
  484. // Finish rendering (copy to JACK ports)
  485. fNetAudioPlaybackBuffer->FinishRenderToJackPorts(last_cycle);
  486. return 0;
  487. }
  488. }
  489. }
  490. // Finish rendering (copy to JACK ports)
  491. fNetAudioPlaybackBuffer->FinishRenderToJackPorts(last_cycle);
  492. return rx_bytes;
  493. }
  494. void JackNetMasterInterface::EncodeSyncPacket()
  495. {
  496. //this method contains every step of sync packet informations coding
  497. //first of all, reset sync packet
  498. memset ( fTxData, 0, fPayloadSize );
  499. //then, first step : transport
  500. if (fParams.fTransportSync) {
  501. EncodeTransportData();
  502. TransportDataHToN( &fSendTransportData, &fSendTransportData);
  503. //copy to TxBuffer
  504. memcpy ( fTxData, &fSendTransportData, sizeof ( net_transport_data_t ) );
  505. }
  506. //then others (freewheel etc.)
  507. //...
  508. }
  509. void JackNetMasterInterface::DecodeSyncPacket()
  510. {
  511. //this method contains every step of sync packet informations decoding process
  512. //first : transport
  513. if (fParams.fTransportSync) {
  514. //copy received transport data to transport data structure
  515. memcpy ( &fReturnTransportData, fRxData, sizeof ( net_transport_data_t ) );
  516. TransportDataNToH( &fReturnTransportData, &fReturnTransportData);
  517. DecodeTransportData();
  518. }
  519. //then others
  520. //...
  521. }
  522. // JackNetSlaveInterface ************************************************************************************************
  523. uint JackNetSlaveInterface::fSlaveCounter = 0;
  524. bool JackNetSlaveInterface::Init()
  525. {
  526. jack_log ( "JackNetSlaveInterface::Init()" );
  527. //set the parameters to send
  528. strcpy ( fParams.fPacketType, "params" );
  529. fParams.fProtocolVersion = SLAVE_PROTOCOL;
  530. SetPacketType ( &fParams, SLAVE_AVAILABLE );
  531. //init loop : get a master and start, do it until connection is ok
  532. net_status_t status;
  533. do
  534. {
  535. //first, get a master, do it until a valid connection is running
  536. do
  537. {
  538. status = SendAvailableToMaster();
  539. if ( status == NET_SOCKET_ERROR )
  540. return false;
  541. }
  542. while ( status != NET_CONNECTED );
  543. //then tell the master we are ready
  544. jack_info ( "Initializing connection with %s...", fParams.fMasterNetName );
  545. status = SendStartToMaster();
  546. if ( status == NET_ERROR )
  547. return false;
  548. }
  549. while ( status != NET_ROLLING );
  550. return true;
  551. }
  552. // Separate the connection protocol into two separated step
  553. bool JackNetSlaveInterface::InitConnection()
  554. {
  555. jack_log ( "JackNetSlaveInterface::InitConnection()" );
  556. //set the parameters to send
  557. strcpy (fParams.fPacketType, "params");
  558. fParams.fProtocolVersion = SLAVE_PROTOCOL;
  559. SetPacketType (&fParams, SLAVE_AVAILABLE);
  560. net_status_t status;
  561. do
  562. {
  563. //get a master
  564. status = SendAvailableToMaster();
  565. if (status == NET_SOCKET_ERROR)
  566. return false;
  567. }
  568. while (status != NET_CONNECTED);
  569. return true;
  570. }
  571. bool JackNetSlaveInterface::InitRendering()
  572. {
  573. jack_log("JackNetSlaveInterface::InitRendering()");
  574. net_status_t status;
  575. do
  576. {
  577. //then tell the master we are ready
  578. jack_info("Initializing connection with %s...", fParams.fMasterNetName);
  579. status = SendStartToMaster();
  580. if (status == NET_ERROR)
  581. return false;
  582. }
  583. while (status != NET_ROLLING);
  584. return true;
  585. }
  586. net_status_t JackNetSlaveInterface::SendAvailableToMaster()
  587. {
  588. jack_log ( "JackNetSlaveInterface::SendAvailableToMaster()" );
  589. //utility
  590. session_params_t host_params;
  591. int rx_bytes = 0;
  592. jack_log ( "sizeof (session_params_t) %d", sizeof (session_params_t) );
  593. //socket
  594. if ( fSocket.NewSocket() == SOCKET_ERROR ) {
  595. jack_error ( "Fatal error : network unreachable - %s", StrError ( NET_ERROR_CODE ) );
  596. return NET_SOCKET_ERROR;
  597. }
  598. //bind the socket
  599. if ( fSocket.Bind() == SOCKET_ERROR ) {
  600. jack_error ( "Can't bind the socket : %s", StrError ( NET_ERROR_CODE ) );
  601. return NET_SOCKET_ERROR;
  602. }
  603. //timeout on receive
  604. if ( fSocket.SetTimeOut ( SLAVE_INIT_TIMEOUT ) == SOCKET_ERROR )
  605. jack_error ( "Can't set timeout : %s", StrError ( NET_ERROR_CODE ) );
  606. //disable local loop
  607. if ( fSocket.SetLocalLoop() == SOCKET_ERROR )
  608. jack_error ( "Can't disable multicast loop : %s", StrError ( NET_ERROR_CODE ) );
  609. //send 'AVAILABLE' until 'SLAVE_SETUP' received
  610. jack_info ( "Waiting for a master..." );
  611. do
  612. {
  613. //send 'available'
  614. session_params_t net_params;
  615. memset(&net_params, 0, sizeof ( session_params_t ));
  616. SessionParamsHToN(&fParams, &net_params);
  617. if ( fSocket.SendTo ( &net_params, sizeof ( session_params_t ), 0, fMulticastIP ) == SOCKET_ERROR )
  618. jack_error ( "Error in data send : %s", StrError ( NET_ERROR_CODE ) );
  619. //filter incoming packets : don't exit while no error is detected
  620. memset(&net_params, 0, sizeof ( session_params_t ));
  621. rx_bytes = fSocket.CatchHost ( &net_params, sizeof ( session_params_t ), 0 );
  622. SessionParamsDisplay(&net_params);
  623. jack_error ( "rx_bytes %d %d", rx_bytes, errno );
  624. SessionParamsNToH(&net_params, &host_params);
  625. if ( ( rx_bytes == SOCKET_ERROR ) && ( fSocket.GetError() != NET_NO_DATA ) )
  626. {
  627. jack_error ( "Can't receive : %s", StrError ( NET_ERROR_CODE ) );
  628. return NET_RECV_ERROR;
  629. }
  630. for (int i = 0; i < 7; i++) {
  631. jack_info ( " fPacketType %d", host_params.fPacketType[i]);
  632. }
  633. jack_info ( " received... host_params param %s %s %d %d", net_params.fPacketType, fParams.fPacketType, net_params.fPacketID, GetPacketType ( &host_params ));
  634. SessionParamsDisplay(&host_params);
  635. }
  636. while ( strcmp ( host_params.fPacketType, fParams.fPacketType ) && ( GetPacketType ( &host_params ) != SLAVE_SETUP ) );
  637. jack_info ( "SLAVE_SETUP received..." );
  638. //everything is OK, copy parameters
  639. fParams = host_params;
  640. //set the new buffer sizes
  641. if ( SetNetBufferSize() == SOCKET_ERROR ) {
  642. jack_error ( "Can't set net buffer sizes : %s", StrError ( NET_ERROR_CODE ) );
  643. return NET_SOCKET_ERROR;
  644. }
  645. //connect the socket
  646. if ( fSocket.Connect() == SOCKET_ERROR ) {
  647. jack_error ( "Error in connect : %s", StrError ( NET_ERROR_CODE ) );
  648. return NET_CONNECT_ERROR;
  649. }
  650. return NET_CONNECTED;
  651. }
  652. net_status_t JackNetSlaveInterface::SendStartToMaster()
  653. {
  654. jack_log ( "JackNetSlaveInterface::SendStartToMaster" );
  655. //tell the master to start
  656. session_params_t net_params;
  657. memset(&net_params, 0, sizeof ( session_params_t ));
  658. SetPacketType ( &fParams, START_MASTER );
  659. SessionParamsHToN(&fParams, &net_params);
  660. if ( fSocket.Send ( &net_params, sizeof ( session_params_t ), 0 ) == SOCKET_ERROR )
  661. {
  662. jack_error ( "Error in send : %s", StrError ( NET_ERROR_CODE ) );
  663. return ( fSocket.GetError() == NET_CONN_ERROR ) ? NET_ERROR : NET_SEND_ERROR;
  664. }
  665. return NET_ROLLING;
  666. }
  667. void JackNetSlaveInterface::SetParams()
  668. {
  669. jack_log ( "JackNetSlaveInterface::SetParams" );
  670. JackNetInterface::SetParams();
  671. fTxHeader.fDataStream = 'r';
  672. fRxHeader.fDataStream = 's';
  673. //midi net buffers
  674. fNetMidiCaptureBuffer = new NetMidiBuffer ( &fParams, fParams.fSendMidiChannels, fRxData );
  675. fNetMidiPlaybackBuffer = new NetMidiBuffer ( &fParams, fParams.fReturnMidiChannels, fTxData );
  676. //audio net buffers
  677. fNetAudioCaptureBuffer = new NetSingleAudioBuffer ( &fParams, fParams.fSendAudioChannels, fRxData );
  678. fNetAudioPlaybackBuffer = new NetSingleAudioBuffer ( &fParams, fParams.fReturnAudioChannels, fTxData );
  679. //fNetAudioCaptureBuffer = new NetBufferedAudioBuffer ( &fParams, fParams.fSendAudioChannels, fRxData );
  680. //fNetAudioPlaybackBuffer = new NetBufferedAudioBuffer ( &fParams, fParams.fReturnAudioChannels, fTxData );
  681. //audio netbuffer length
  682. fAudioTxLen = sizeof ( packet_header_t ) + fNetAudioPlaybackBuffer->GetSize();
  683. fAudioRxLen = sizeof ( packet_header_t ) + fNetAudioCaptureBuffer->GetSize();
  684. }
  685. int JackNetSlaveInterface::Recv ( size_t size, int flags )
  686. {
  687. int rx_bytes = fSocket.Recv ( fRxBuffer, size, flags );
  688. //handle errors
  689. if ( rx_bytes == SOCKET_ERROR )
  690. {
  691. net_error_t error = fSocket.GetError();
  692. //no data isn't really an error in realtime processing, so just return 0
  693. if ( error == NET_NO_DATA ) {
  694. jack_error ( "No data, is the master still running ?" );
  695. //if a network error occurs, this exception will restart the driver
  696. } else if ( error == NET_CONN_ERROR ) {
  697. jack_error ( "Connection lost." );
  698. throw JackNetException();
  699. } else {
  700. jack_error ( "Fatal error in slave receive : %s", StrError ( NET_ERROR_CODE ) );
  701. }
  702. }
  703. packet_header_t* header = reinterpret_cast<packet_header_t*>(fRxBuffer);
  704. PacketHeaderNToH(header, header);
  705. return rx_bytes;
  706. }
  707. int JackNetSlaveInterface::Send ( size_t size, int flags )
  708. {
  709. packet_header_t* header = reinterpret_cast<packet_header_t*>(fTxBuffer);
  710. PacketHeaderHToN(header, header);
  711. int tx_bytes = fSocket.Send ( fTxBuffer, size, flags );
  712. //handle errors
  713. if ( tx_bytes == SOCKET_ERROR )
  714. {
  715. net_error_t error = fSocket.GetError();
  716. //if a network error occurs, this exception will restart the driver
  717. if ( error == NET_CONN_ERROR ) {
  718. jack_error ( "Connection lost." );
  719. throw JackNetException();
  720. } else {
  721. jack_error ( "Fatal error in slave send : %s", StrError ( NET_ERROR_CODE ) );
  722. }
  723. }
  724. return tx_bytes;
  725. }
  726. int JackNetSlaveInterface::SyncRecv()
  727. {
  728. int rx_bytes = 0;
  729. packet_header_t* rx_head = reinterpret_cast<packet_header_t*> ( fRxBuffer );
  730. //receive sync (launch the cycle)
  731. do
  732. {
  733. rx_bytes = Recv ( fParams.fMtu, 0 );
  734. //connection issue, send will detect it, so don't skip the cycle (return 0)
  735. if ( rx_bytes == SOCKET_ERROR )
  736. return rx_bytes;
  737. }
  738. while ((strcmp(rx_head->fPacketType, "header") != 0) && (rx_head->fDataType != 's'));
  739. fRxHeader.fIsLastPckt = rx_head->fIsLastPckt;
  740. return rx_bytes;
  741. }
  742. int JackNetSlaveInterface::DataRecv()
  743. {
  744. uint recvd_midi_pckt = 0;
  745. uint recvd_audio_pckt = 0;
  746. int rx_bytes = 0;
  747. int last_cycle = 0;
  748. packet_header_t* rx_head = reinterpret_cast<packet_header_t*> ( fRxBuffer );
  749. while ( !fRxHeader.fIsLastPckt )
  750. {
  751. rx_bytes = Recv ( fParams.fMtu, MSG_PEEK );
  752. //error here, problem with recv, just skip the cycle (return -1)
  753. if ( rx_bytes == SOCKET_ERROR )
  754. return rx_bytes;
  755. if ( rx_bytes && ( rx_head->fDataStream == 's' ) && ( rx_head->fID == fParams.fID ) )
  756. {
  757. switch ( rx_head->fDataType )
  758. {
  759. case 'm': //midi
  760. rx_bytes = Recv ( rx_head->fPacketSize, 0 );
  761. fRxHeader.fCycle = rx_head->fCycle;
  762. fRxHeader.fIsLastPckt = rx_head->fIsLastPckt;
  763. fNetMidiCaptureBuffer->RenderFromNetwork ( rx_head->fSubCycle, rx_bytes - sizeof ( packet_header_t ) );
  764. // Last midi packet is received, so finish rendering...
  765. if ( ++recvd_midi_pckt == rx_head->fNMidiPckt )
  766. fNetMidiCaptureBuffer->RenderToJackPorts();
  767. break;
  768. case 'a': //audio
  769. rx_bytes = Recv ( rx_head->fPacketSize, 0 );
  770. if (recvd_audio_pckt++ != rx_head->fSubCycle) {
  771. jack_error("Packet(s) missing from '%s'...", fParams.fMasterNetName);
  772. }
  773. fRxHeader.fCycle = rx_head->fCycle;
  774. fRxHeader.fSubCycle = rx_head->fSubCycle;
  775. fRxHeader.fIsLastPckt = rx_head->fIsLastPckt;
  776. fNetAudioCaptureBuffer->RenderToJackPorts ( rx_head->fCycle, rx_head->fSubCycle);
  777. last_cycle = rx_head->fCycle;
  778. break;
  779. case 's': //sync
  780. jack_info ( "NetSlave : overloaded, skipping receive." );
  781. // Finish rendering (copy to JACK ports)
  782. fNetAudioCaptureBuffer->FinishRenderToJackPorts(last_cycle);
  783. return 0;
  784. }
  785. }
  786. }
  787. // Finish rendering (copy to JACK ports)
  788. fNetAudioCaptureBuffer->FinishRenderToJackPorts(last_cycle);
  789. fRxHeader.fCycle = rx_head->fCycle;
  790. return 0;
  791. }
  792. int JackNetSlaveInterface::SyncSend()
  793. {
  794. //tx header
  795. if ( fParams.fSlaveSyncMode )
  796. fTxHeader.fCycle = fRxHeader.fCycle;
  797. else
  798. fTxHeader.fCycle++;
  799. fTxHeader.fSubCycle = 0;
  800. fTxHeader.fDataType = 's';
  801. fTxHeader.fIsLastPckt = ( fParams.fReturnMidiChannels == 0 && fParams.fReturnAudioChannels == 0) ? 1 : 0;
  802. fTxHeader.fPacketSize = fParams.fMtu;
  803. memcpy ( fTxBuffer, &fTxHeader, sizeof ( packet_header_t ) );
  804. return Send ( fTxHeader.fPacketSize, 0 );
  805. }
  806. int JackNetSlaveInterface::DataSend()
  807. {
  808. uint subproc;
  809. //midi
  810. if ( fParams.fReturnMidiChannels > 0)
  811. {
  812. fTxHeader.fDataType = 'm';
  813. fTxHeader.fMidiDataSize = fNetMidiPlaybackBuffer->RenderFromJackPorts();
  814. fTxHeader.fNMidiPckt = GetNMidiPckt();
  815. for ( subproc = 0; subproc < fTxHeader.fNMidiPckt; subproc++ )
  816. {
  817. fTxHeader.fSubCycle = subproc;
  818. fTxHeader.fIsLastPckt = ( ( subproc == ( fTxHeader.fNMidiPckt - 1 ) ) && !fParams.fReturnAudioChannels ) ? 1 : 0;
  819. fTxHeader.fPacketSize = sizeof ( packet_header_t ) + fNetMidiPlaybackBuffer->RenderToNetwork ( subproc, fTxHeader.fMidiDataSize );
  820. memcpy ( fTxBuffer, &fTxHeader, sizeof ( packet_header_t ) );
  821. if ( Send ( fTxHeader.fPacketSize, 0 ) == SOCKET_ERROR )
  822. return SOCKET_ERROR;
  823. }
  824. }
  825. //audio
  826. if ( fParams.fReturnAudioChannels > 0)
  827. {
  828. fTxHeader.fDataType = 'a';
  829. fTxHeader.fMidiDataSize = 0;
  830. fTxHeader.fNMidiPckt = 0;
  831. for ( subproc = 0; subproc < fNSubProcess; subproc++ )
  832. {
  833. fTxHeader.fSubCycle = subproc;
  834. fTxHeader.fIsLastPckt = ( subproc == ( fNSubProcess - 1 ) ) ? 1 : 0;
  835. fTxHeader.fPacketSize = fAudioTxLen;
  836. memcpy ( fTxBuffer, &fTxHeader, sizeof ( packet_header_t ) );
  837. fNetAudioPlaybackBuffer->RenderFromJackPorts ( subproc );
  838. if ( Send ( fTxHeader.fPacketSize, 0 ) == SOCKET_ERROR )
  839. return SOCKET_ERROR;
  840. }
  841. }
  842. return 0;
  843. }
  844. //network sync------------------------------------------------------------------------
  845. void JackNetSlaveInterface::EncodeSyncPacket()
  846. {
  847. //this method contains every step of sync packet informations coding
  848. //first of all, reset sync packet
  849. memset ( fTxData, 0, fPayloadSize );
  850. //then first step : transport
  851. if (fParams.fTransportSync) {
  852. EncodeTransportData();
  853. TransportDataHToN( &fReturnTransportData, &fReturnTransportData);
  854. //copy to TxBuffer
  855. memcpy ( fTxData, &fReturnTransportData, sizeof ( net_transport_data_t ) );
  856. }
  857. //then others
  858. //...
  859. }
  860. void JackNetSlaveInterface::DecodeSyncPacket()
  861. {
  862. //this method contains every step of sync packet informations decoding process
  863. //first : transport
  864. if (fParams.fTransportSync) {
  865. //copy received transport data to transport data structure
  866. memcpy ( &fSendTransportData, fRxData, sizeof ( net_transport_data_t ) );
  867. TransportDataNToH( &fSendTransportData, &fSendTransportData);
  868. DecodeTransportData();
  869. }
  870. //then others
  871. //...
  872. }
  873. }