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.

884 lines
35KB

  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. #if defined(HAVE_CONFIG_H)
  16. #include "config.h"
  17. #endif
  18. #include "JackNetManager.h"
  19. #define DEFAULT_MULTICAST_IP "225.3.19.154"
  20. #define DEFAULT_PORT 19000
  21. using namespace std;
  22. namespace Jack
  23. {
  24. //JackNetMaster******************************************************************************************************
  25. JackNetMaster::JackNetMaster ( JackNetMasterManager* manager, session_params_t& params ) : fSocket()
  26. {
  27. jack_log ( "JackNetMaster::JackNetMaster" );
  28. //settings
  29. fMasterManager = manager;
  30. fParams = params;
  31. fSocket.CopyParams ( &fMasterManager->fSocket );
  32. fNSubProcess = fParams.fPeriodSize / fParams.fFramesPerPacket;
  33. fClientName = const_cast<char*> ( fParams.fName );
  34. fJackClient = NULL;
  35. fRunning = false;
  36. fSyncState = 1;
  37. uint port_index;
  38. //jack audio ports
  39. fAudioCapturePorts = new jack_port_t* [fParams.fSendAudioChannels];
  40. for ( port_index = 0; port_index < fParams.fSendAudioChannels; port_index++ )
  41. fAudioCapturePorts[port_index] = NULL;
  42. fAudioPlaybackPorts = new jack_port_t* [fParams.fReturnAudioChannels];
  43. for ( port_index = 0; port_index < fParams.fReturnAudioChannels; port_index++ )
  44. fAudioPlaybackPorts[port_index] = NULL;
  45. //jack midi ports
  46. fMidiCapturePorts = new jack_port_t* [fParams.fSendMidiChannels];
  47. for ( port_index = 0; port_index < fParams.fSendMidiChannels; port_index++ )
  48. fMidiCapturePorts[port_index] = NULL;
  49. fMidiPlaybackPorts = new jack_port_t* [fParams.fReturnMidiChannels];
  50. for ( port_index = 0; port_index < fParams.fReturnMidiChannels; port_index++ )
  51. fMidiPlaybackPorts[port_index] = NULL;
  52. //TX header init
  53. strcpy ( fTxHeader.fPacketType, "header" );
  54. fTxHeader.fDataStream = 's';
  55. fTxHeader.fID = fParams.fID;
  56. fTxHeader.fCycle = 0;
  57. fTxHeader.fSubCycle = 0;
  58. fTxHeader.fMidiDataSize = 0;
  59. fTxHeader.fBitdepth = fParams.fBitdepth;
  60. //RX header init
  61. strcpy ( fRxHeader.fPacketType, "header" );
  62. fRxHeader.fDataStream = 'r';
  63. fRxHeader.fID = fParams.fID;
  64. fRxHeader.fCycle = 0;
  65. fRxHeader.fSubCycle = 0;
  66. fRxHeader.fMidiDataSize = 0;
  67. fRxHeader.fBitdepth = fParams.fBitdepth;
  68. //network buffers
  69. fTxBuffer = new char [fParams.fMtu];
  70. fRxBuffer = new char [fParams.fMtu];
  71. //net audio buffers
  72. fTxData = fTxBuffer + sizeof ( packet_header_t );
  73. fRxData = fRxBuffer + sizeof ( packet_header_t );
  74. //midi net buffers
  75. fNetMidiCaptureBuffer = new NetMidiBuffer ( &fParams, fParams.fSendMidiChannels, fTxData );
  76. fNetMidiPlaybackBuffer = new NetMidiBuffer ( &fParams, fParams.fReturnMidiChannels, fRxData );
  77. //audio net buffers
  78. fNetAudioCaptureBuffer = new NetAudioBuffer ( &fParams, fParams.fSendAudioChannels, fTxData );
  79. fNetAudioPlaybackBuffer = new NetAudioBuffer ( &fParams, fParams.fReturnAudioChannels, fRxData );
  80. //audio netbuffer length
  81. fAudioTxLen = sizeof ( packet_header_t ) + fNetAudioCaptureBuffer->GetSize();
  82. fAudioRxLen = sizeof ( packet_header_t ) + fNetAudioPlaybackBuffer->GetSize();
  83. //payload size
  84. fPayloadSize = fParams.fMtu - sizeof ( packet_header_t );
  85. //monitor
  86. #ifdef JACK_MONITOR
  87. fPeriodUsecs = ( int ) ( 1000000.f * ( ( float ) fParams.fPeriodSize / ( float ) fParams.fSampleRate ) );
  88. string plot_name;
  89. plot_name = string ( fParams.fName );
  90. plot_name += string ( "_master" );
  91. plot_name += string ( ( fParams.fSlaveSyncMode ) ? "_sync" : "_async" );
  92. plot_name += ( fParams.fNetworkMode == 'f' ) ? string ( "_fast-network" ) : string ( "" );
  93. fNetTimeMon = new JackGnuPlotMonitor<float> ( 128, 4, plot_name );
  94. fNetTimeMeasure = new float[4];
  95. string net_time_mon_fields[] =
  96. {
  97. string ( "sync send" ),
  98. string ( "end of send" ),
  99. string ( "sync recv" ),
  100. string ( "end of cycle" )
  101. };
  102. string net_time_mon_options[] =
  103. {
  104. string ( "set xlabel \"audio cycles\"" ),
  105. string ( "set ylabel \"% of audio cycle\"" )
  106. };
  107. fNetTimeMon->SetPlotFile ( net_time_mon_options, 2, net_time_mon_fields, 4 );
  108. #endif
  109. }
  110. JackNetMaster::~JackNetMaster()
  111. {
  112. jack_log ( "JackNetMaster::~JackNetMaster, ID %u.", fParams.fID );
  113. if ( fJackClient )
  114. {
  115. jack_deactivate ( fJackClient );
  116. FreePorts();
  117. jack_client_close ( fJackClient );
  118. }
  119. fSocket.Close();
  120. delete fNetAudioCaptureBuffer;
  121. delete fNetAudioPlaybackBuffer;
  122. delete fNetMidiCaptureBuffer;
  123. delete fNetMidiPlaybackBuffer;
  124. delete[] fAudioCapturePorts;
  125. delete[] fAudioPlaybackPorts;
  126. delete[] fMidiCapturePorts;
  127. delete[] fMidiPlaybackPorts;
  128. delete[] fTxBuffer;
  129. delete[] fRxBuffer;
  130. #ifdef JACK_MONITOR
  131. fNetTimeMon->Save();
  132. delete[] fNetTimeMeasure;
  133. delete fNetTimeMon;
  134. #endif
  135. }
  136. bool JackNetMaster::Init()
  137. {
  138. jack_log ( "JackNetMaster::Init, ID %u.", fParams.fID );
  139. session_params_t params;
  140. int usec_timeout = 1000000;
  141. uint attempt = 0;
  142. int rx_bytes = 0;
  143. int rx_bufsize = 0;
  144. //socket
  145. if ( fSocket.NewSocket() == SOCKET_ERROR )
  146. {
  147. jack_error ( "Can't create socket : %s", StrError ( NET_ERROR_CODE ) );
  148. return false;
  149. }
  150. //timeout on receive (for init)
  151. if ( fSocket.SetTimeOut ( usec_timeout ) < 0 )
  152. jack_error ( "Can't set timeout : %s", StrError ( NET_ERROR_CODE ) );
  153. //connect
  154. if ( fSocket.Connect() == SOCKET_ERROR )
  155. {
  156. jack_error ( "Can't connect : %s", StrError ( NET_ERROR_CODE ) );
  157. return false;
  158. }
  159. //send 'SLAVE_SETUP' until 'START_MASTER' received
  160. jack_info ( "Sending parameters to %s ...", fParams.fSlaveNetName );
  161. do
  162. {
  163. SetPacketType ( &fParams, SLAVE_SETUP );
  164. if ( fSocket.Send ( &fParams, sizeof ( session_params_t ), 0 ) == SOCKET_ERROR )
  165. jack_error ( "Error in send : ", StrError ( NET_ERROR_CODE ) );
  166. if ( ( ( rx_bytes = fSocket.Recv ( &params, sizeof ( session_params_t ), 0 ) ) == SOCKET_ERROR ) && ( fSocket.GetError() != NET_NO_DATA ) )
  167. {
  168. jack_error ( "Problem with network." );
  169. return false;
  170. }
  171. }
  172. while ( ( GetPacketType ( &params ) != START_MASTER ) && ( ++attempt < 5 ) );
  173. if ( attempt == 5 )
  174. {
  175. jack_error ( "Slave doesn't respond, exiting." );
  176. return false;
  177. }
  178. //set the new timeout for the socket
  179. if ( SetRxTimeout ( &fSocket, &fParams ) == SOCKET_ERROR )
  180. {
  181. jack_error ( "Can't set rx timeout : %s", StrError ( NET_ERROR_CODE ) );
  182. return false;
  183. }
  184. //set the new rx buffer size
  185. rx_bufsize = GetNetBufferSize ( &fParams );
  186. if ( fSocket.SetOption ( SOL_SOCKET, SO_RCVBUF, &rx_bufsize, sizeof ( rx_bufsize ) ) == SOCKET_ERROR )
  187. {
  188. jack_error ( "Can't set rx buffer size : %s", StrError ( NET_ERROR_CODE ) );
  189. return false;
  190. }
  191. //jack client and process
  192. jack_status_t status;
  193. jack_options_t options = JackNullOption;
  194. if ( ( fJackClient = jack_client_open ( fClientName, options, &status, NULL ) ) == NULL )
  195. {
  196. jack_error ( "Can't open a new jack client." );
  197. return false;
  198. }
  199. jack_set_process_callback ( fJackClient, SetProcess, this );
  200. //port registering
  201. uint i;
  202. char name[24];
  203. jack_nframes_t port_latency = jack_get_buffer_size ( fJackClient );
  204. unsigned long port_flags;
  205. //audio
  206. port_flags = JackPortIsInput | JackPortIsPhysical | JackPortIsTerminal;
  207. for ( i = 0; i < fParams.fSendAudioChannels; i++ )
  208. {
  209. sprintf ( name, "to_slave_%d", i+1 );
  210. if ( ( fAudioCapturePorts[i] = jack_port_register ( fJackClient, name, JACK_DEFAULT_AUDIO_TYPE, port_flags, 0 ) ) == NULL )
  211. goto fail;
  212. jack_port_set_latency ( fAudioCapturePorts[i], 0 );
  213. }
  214. port_flags = JackPortIsOutput | JackPortIsPhysical | JackPortIsTerminal;
  215. for ( i = 0; i < fParams.fReturnAudioChannels; i++ )
  216. {
  217. sprintf ( name, "from_slave_%d", i+1 );
  218. if ( ( fAudioPlaybackPorts[i] = jack_port_register ( fJackClient, name, JACK_DEFAULT_AUDIO_TYPE, port_flags, 0 ) ) == NULL )
  219. goto fail;
  220. jack_port_set_latency ( fAudioPlaybackPorts[i], ( fParams.fNetworkMode == 'f' ) ? 0 : port_latency + ( fParams.fSlaveSyncMode ) ? 0 : port_latency );
  221. }
  222. //midi
  223. port_flags = JackPortIsInput | JackPortIsPhysical | JackPortIsTerminal;
  224. for ( i = 0; i < fParams.fSendMidiChannels; i++ )
  225. {
  226. sprintf ( name, "midi_to_slave_%d", i+1 );
  227. if ( ( fMidiCapturePorts[i] = jack_port_register ( fJackClient, name, JACK_DEFAULT_MIDI_TYPE, port_flags, 0 ) ) == NULL )
  228. goto fail;
  229. jack_port_set_latency ( fMidiCapturePorts[i], 0 );
  230. }
  231. port_flags = JackPortIsOutput | JackPortIsPhysical | JackPortIsTerminal;
  232. for ( i = 0; i < fParams.fReturnMidiChannels; i++ )
  233. {
  234. sprintf ( name, "midi_from_slave_%d", i+1 );
  235. if ( ( fMidiPlaybackPorts[i] = jack_port_register ( fJackClient, name, JACK_DEFAULT_MIDI_TYPE, port_flags, 0 ) ) == NULL )
  236. goto fail;
  237. jack_port_set_latency ( fMidiPlaybackPorts[i], ( fParams.fNetworkMode == 'f' ) ? 0 : port_latency + ( fParams.fSlaveSyncMode ) ? 0 : port_latency );
  238. }
  239. fRunning = true;
  240. //finally activate jack client
  241. if ( jack_activate ( fJackClient ) != 0 )
  242. {
  243. jack_error ( "Can't activate jack client." );
  244. goto fail;
  245. }
  246. jack_info ( "NetJack new master started." );
  247. return true;
  248. fail:
  249. FreePorts();
  250. jack_client_close ( fJackClient );
  251. fJackClient = NULL;
  252. return false;
  253. }
  254. void JackNetMaster::FreePorts()
  255. {
  256. jack_log ( "JackNetMaster::FreePorts, ID %u", fParams.fID );
  257. uint port_index;
  258. for ( port_index = 0; port_index < fParams.fSendAudioChannels; port_index++ )
  259. if ( fAudioCapturePorts[port_index] )
  260. jack_port_unregister ( fJackClient, fAudioCapturePorts[port_index] );
  261. for ( port_index = 0; port_index < fParams.fReturnAudioChannels; port_index++ )
  262. if ( fAudioPlaybackPorts[port_index] )
  263. jack_port_unregister ( fJackClient, fAudioPlaybackPorts[port_index] );
  264. for ( port_index = 0; port_index < fParams.fSendMidiChannels; port_index++ )
  265. if ( fMidiCapturePorts[port_index] )
  266. jack_port_unregister ( fJackClient, fMidiCapturePorts[port_index] );
  267. for ( port_index = 0; port_index < fParams.fReturnMidiChannels; port_index++ )
  268. if ( fMidiPlaybackPorts[port_index] )
  269. jack_port_unregister ( fJackClient, fMidiPlaybackPorts[port_index] );
  270. }
  271. void JackNetMaster::Exit()
  272. {
  273. jack_log ( "JackNetMaster::Exit, ID %u", fParams.fID );
  274. //stop process
  275. fRunning = false;
  276. //send a 'multicast euthanasia request' - new socket is required on macosx
  277. jack_info ( "Exiting '%s'", fParams.fName );
  278. SetPacketType ( &fParams, KILL_MASTER );
  279. JackNetSocket mcast_socket ( fMasterManager->fMulticastIP, fSocket.GetPort() );
  280. if ( mcast_socket.NewSocket() == SOCKET_ERROR )
  281. jack_error ( "Can't create socket : %s", StrError ( NET_ERROR_CODE ) );
  282. if ( mcast_socket.SendTo ( &fParams, sizeof ( session_params_t ), 0, fMasterManager->fMulticastIP ) == SOCKET_ERROR )
  283. jack_error ( "Can't send suicide request : %s", StrError ( NET_ERROR_CODE ) );
  284. mcast_socket.Close();
  285. }
  286. int JackNetMaster::SetSyncPacket()
  287. {
  288. if ( fParams.fTransportSync )
  289. {
  290. //TODO : set the TransportData
  291. //copy to TxBuffer
  292. memcpy ( fTxData, &fTransportData, sizeof ( net_transport_data_t ) );
  293. }
  294. return 0;
  295. }
  296. int JackNetMaster::Send ( char* buffer, size_t size, int flags )
  297. {
  298. int tx_bytes;
  299. if ( ( tx_bytes = fSocket.Send ( buffer, size, flags ) ) == SOCKET_ERROR )
  300. {
  301. net_error_t error = fSocket.GetError();
  302. if ( fRunning && ( error == NET_CONN_ERROR ) )
  303. {
  304. //fatal connection issue, exit
  305. jack_error ( "'%s' : %s, please check network connection with '%s'.",
  306. fParams.fName, StrError ( NET_ERROR_CODE ), fParams.fSlaveNetName );
  307. Exit();
  308. }
  309. else if ( fRunning )
  310. jack_error ( "Error in send : %s", StrError ( NET_ERROR_CODE ) );
  311. }
  312. return tx_bytes;
  313. }
  314. int JackNetMaster::Recv ( size_t size, int flags )
  315. {
  316. int rx_bytes;
  317. if ( ( rx_bytes = fSocket.Recv ( fRxBuffer, size, flags ) ) == SOCKET_ERROR )
  318. {
  319. net_error_t error = fSocket.GetError();
  320. //no data isn't really a network error, so just return 0 avalaible read bytes
  321. if ( error == NET_NO_DATA )
  322. return 0;
  323. else if ( fRunning && ( error == NET_CONN_ERROR ) )
  324. {
  325. //fatal connection issue, exit
  326. jack_error ( "'%s' : %s, network connection with '%s' broken, exiting.",
  327. fParams.fName, StrError ( NET_ERROR_CODE ), fParams.fSlaveNetName );
  328. //ask to the manager to properly remove the master
  329. Exit();
  330. }
  331. else if ( fRunning )
  332. jack_error ( "Error in receive : %s", StrError ( NET_ERROR_CODE ) );
  333. }
  334. return rx_bytes;
  335. }
  336. int JackNetMaster::SetProcess ( jack_nframes_t nframes, void* arg )
  337. {
  338. JackNetMaster* master = static_cast<JackNetMaster*> ( arg );
  339. return master->Process();
  340. }
  341. int JackNetMaster::Process()
  342. {
  343. if ( !fRunning )
  344. return 0;
  345. int tx_bytes = 0;
  346. int rx_bytes = 0;
  347. uint midi_recvd_pckt = 0;
  348. uint jumpcnt = 0;
  349. int cycle_offset = 0;
  350. fTxHeader.fCycle++;
  351. fTxHeader.fSubCycle = 0;
  352. fTxHeader.fIsLastPckt = 'n';
  353. packet_header_t* rx_head = reinterpret_cast<packet_header_t*> ( fRxBuffer );
  354. #ifdef JACK_MONITOR
  355. jack_time_t begin_time = jack_get_time();
  356. fNetTimeMeasureId = 0;
  357. #endif
  358. //buffers
  359. uint port_index;
  360. for ( port_index = 0; port_index < fParams.fSendMidiChannels; port_index++ )
  361. fNetMidiCaptureBuffer->SetBuffer ( port_index,
  362. static_cast<JackMidiBuffer*> ( jack_port_get_buffer ( fMidiCapturePorts[port_index],
  363. fParams.fPeriodSize ) ) );
  364. for ( port_index = 0; port_index < fParams.fSendAudioChannels; port_index++ )
  365. fNetAudioCaptureBuffer->SetBuffer ( port_index,
  366. static_cast<sample_t*> ( jack_port_get_buffer ( fAudioCapturePorts[port_index],
  367. fParams.fPeriodSize ) ) );
  368. for ( port_index = 0; port_index < fParams.fReturnMidiChannels; port_index++ )
  369. fNetMidiPlaybackBuffer->SetBuffer ( port_index,
  370. static_cast<JackMidiBuffer*> ( jack_port_get_buffer ( fMidiPlaybackPorts[port_index],
  371. fParams.fPeriodSize ) ) );
  372. for ( port_index = 0; port_index < fParams.fReturnAudioChannels; port_index++ )
  373. fNetAudioPlaybackBuffer->SetBuffer ( port_index,
  374. static_cast<sample_t*> ( jack_port_get_buffer ( fAudioPlaybackPorts[port_index],
  375. fParams.fPeriodSize ) ) );
  376. //send ------------------------------------------------------------------------------------------------------------------
  377. //sync : first set header
  378. fTxHeader.fDataType = 's';
  379. if ( !fParams.fSendMidiChannels && !fParams.fSendAudioChannels )
  380. fTxHeader.fIsLastPckt = 'y';
  381. fTxHeader.fPacketSize = fParams.fMtu;
  382. memcpy ( fTxBuffer, &fTxHeader, sizeof ( packet_header_t ) );
  383. //sync : then fill auxiliary data
  384. memset ( fTxData, 0, fPayloadSize );
  385. SetSyncPacket();
  386. //sync : and send
  387. tx_bytes = Send ( fTxBuffer, fTxHeader.fPacketSize, 0 );
  388. if ( tx_bytes == SOCKET_ERROR )
  389. return tx_bytes;
  390. #ifdef JACK_MONITOR
  391. fNetTimeMeasure[fNetTimeMeasureId++] = ( ( ( float ) ( jack_get_time() - begin_time ) ) / ( float ) fPeriodUsecs ) * 100.f;
  392. #endif
  393. //midi
  394. if ( fParams.fSendMidiChannels )
  395. {
  396. //set global header fields and get the number of midi packets
  397. fTxHeader.fDataType = 'm';
  398. fTxHeader.fMidiDataSize = fNetMidiCaptureBuffer->RenderFromJackPorts();
  399. fTxHeader.fNMidiPckt = GetNMidiPckt ( &fParams, fTxHeader.fMidiDataSize );
  400. for ( uint subproc = 0; subproc < fTxHeader.fNMidiPckt; subproc++ )
  401. {
  402. //fill the packet header fields
  403. fTxHeader.fSubCycle = subproc;
  404. if ( ( subproc == ( fTxHeader.fNMidiPckt - 1 ) ) && !fParams.fSendAudioChannels )
  405. fTxHeader.fIsLastPckt = 'y';
  406. //get the data from buffer
  407. fTxHeader.fPacketSize = fNetMidiCaptureBuffer->RenderToNetwork ( subproc, fTxHeader.fMidiDataSize );
  408. fTxHeader.fPacketSize += sizeof ( packet_header_t );
  409. memcpy ( fTxBuffer, &fTxHeader, sizeof ( packet_header_t ) );
  410. //and send
  411. tx_bytes = Send ( fTxBuffer, fTxHeader.fPacketSize, 0 );
  412. if ( tx_bytes == SOCKET_ERROR )
  413. return tx_bytes;
  414. }
  415. }
  416. //audio
  417. if ( fParams.fSendAudioChannels )
  418. {
  419. fTxHeader.fDataType = 'a';
  420. for ( uint subproc = 0; subproc < fNSubProcess; subproc++ )
  421. {
  422. //set the header
  423. fTxHeader.fSubCycle = subproc;
  424. if ( subproc == ( fNSubProcess - 1 ) )
  425. fTxHeader.fIsLastPckt = 'y';
  426. fTxHeader.fPacketSize = fAudioTxLen;
  427. memcpy ( fTxBuffer, &fTxHeader, sizeof ( packet_header_t ) );
  428. //get the data
  429. fNetAudioCaptureBuffer->RenderFromJackPorts ( subproc );
  430. //and send
  431. tx_bytes = Send ( fTxBuffer, fTxHeader.fPacketSize, 0 );
  432. if ( tx_bytes == SOCKET_ERROR )
  433. return tx_bytes;
  434. }
  435. }
  436. #ifdef JACK_MONITOR
  437. fNetTimeMeasure[fNetTimeMeasureId++] = ( ( ( float ) ( jack_get_time() - begin_time ) ) / ( float ) fPeriodUsecs ) * 100.f;
  438. #endif
  439. //receive --------------------------------------------------------------------------------------------------------------------
  440. //sync : how much data is available ?
  441. rx_bytes = Recv ( fParams.fMtu, MSG_PEEK );
  442. if ( ( rx_bytes == 0 ) || ( rx_bytes == SOCKET_ERROR ) )
  443. return rx_bytes;
  444. cycle_offset = fTxHeader.fCycle - rx_head->fCycle;
  445. switch ( fParams.fNetworkMode )
  446. {
  447. case 'n' :
  448. //normal use of the network : allow to use full bandwith
  449. // - extra latency is set to one cycle, what is the time needed to receive streams using full network bandwith
  450. // - if the network is too fast, just wait the next cycle, the benefit here is the master's cycle is shorter
  451. // - indeed, data is supposed to be on the network rx buffer, so we don't have to wait for it
  452. if ( cycle_offset == 0 )
  453. return 0;
  454. else
  455. rx_bytes = Recv ( rx_head->fPacketSize, 0 );
  456. break;
  457. case 'f' :
  458. //fast mode suppose the network bandwith is larger than required for the transmission (only a few channels for example)
  459. // - packets can be quickly received, quickly is here relative to the cycle duration
  460. // - here, receive data, we can't keep it queued on the rx buffer,
  461. // - but if there is a cycle offset, tell the user, that means we're not in fast mode anymore, network is too slow
  462. rx_bytes = Recv ( rx_head->fPacketSize, 0 );
  463. if ( cycle_offset )
  464. jack_error ( "'%s' can't run in fast network mode, data received too late (%d cycle(s) offset)", fParams.fName, cycle_offset );
  465. break;
  466. }
  467. #ifdef JACK_MONITOR
  468. fNetTimeMeasure[fNetTimeMeasureId++] = ( ( ( float ) ( jack_get_time() - begin_time ) ) / ( float ) fPeriodUsecs ) * 100.f;
  469. #endif
  470. if ( fParams.fReturnMidiChannels || fParams.fReturnAudioChannels )
  471. {
  472. do
  473. {
  474. //how much data is queued on the rx buffer ?
  475. rx_bytes = Recv ( fParams.fMtu, MSG_PEEK );
  476. if ( rx_bytes == SOCKET_ERROR )
  477. return rx_bytes;
  478. //if no data,
  479. if ( ( rx_bytes == 0 ) && ( ++jumpcnt == fNSubProcess ) )
  480. {
  481. jack_error ( "No data from %s...", fParams.fName );
  482. jumpcnt = 0;
  483. }
  484. //else if data is valid,
  485. if ( rx_bytes && ( rx_head->fDataStream == 'r' ) && ( rx_head->fID == fParams.fID ) )
  486. {
  487. //read data
  488. switch ( rx_head->fDataType )
  489. {
  490. case 'm': //midi
  491. Recv ( rx_head->fPacketSize, 0 );
  492. fRxHeader.fCycle = rx_head->fCycle;
  493. fRxHeader.fIsLastPckt = rx_head->fIsLastPckt;
  494. fNetMidiPlaybackBuffer->RenderFromNetwork ( rx_head->fSubCycle, rx_bytes - sizeof ( packet_header_t ) );
  495. if ( ++midi_recvd_pckt == rx_head->fNMidiPckt )
  496. fNetMidiPlaybackBuffer->RenderToJackPorts();
  497. jumpcnt = 0;
  498. break;
  499. case 'a': //audio
  500. Recv ( rx_head->fPacketSize, 0 );
  501. if ( !IsNextPacket ( &fRxHeader, rx_head, fNSubProcess ) )
  502. jack_error ( "Packet(s) missing from '%s'...", fParams.fName );
  503. fRxHeader.fCycle = rx_head->fCycle;
  504. fRxHeader.fSubCycle = rx_head->fSubCycle;
  505. fRxHeader.fIsLastPckt = rx_head->fIsLastPckt;
  506. fNetAudioPlaybackBuffer->RenderToJackPorts ( rx_head->fSubCycle );
  507. jumpcnt = 0;
  508. break;
  509. case 's': //sync
  510. if ( rx_head->fCycle == fTxHeader.fCycle )
  511. return 0;
  512. }
  513. }
  514. }
  515. while ( fRxHeader.fIsLastPckt != 'y' );
  516. }
  517. #ifdef JACK_MONITOR
  518. fNetTimeMeasure[fNetTimeMeasureId++] = ( ( ( float ) ( jack_get_time() - begin_time ) ) / ( float ) fPeriodUsecs ) * 100.f;
  519. fNetTimeMon->Write ( fNetTimeMeasure );
  520. #endif
  521. return 0;
  522. }
  523. //JackNetMasterManager***********************************************************************************************
  524. JackNetMasterManager::JackNetMasterManager ( jack_client_t* client, const JSList* params ) : fSocket()
  525. {
  526. jack_log ( "JackNetMasterManager::JackNetMasterManager" );
  527. fManagerClient = client;
  528. fManagerName = jack_get_client_name ( fManagerClient );
  529. fMulticastIP = DEFAULT_MULTICAST_IP;
  530. fSocket.SetPort ( DEFAULT_PORT );
  531. fGlobalID = 0;
  532. fRunning = true;
  533. const JSList* node;
  534. const jack_driver_param_t* param;
  535. for ( node = params; node; node = jack_slist_next ( node ) )
  536. {
  537. param = ( const jack_driver_param_t* ) node->data;
  538. switch ( param->character )
  539. {
  540. case 'a' :
  541. fMulticastIP = strdup ( param->value.str );
  542. break;
  543. case 'p':
  544. fSocket.SetPort ( param->value.ui );
  545. }
  546. }
  547. //set sync callback
  548. jack_set_sync_callback ( fManagerClient, SetSyncCallback, this );
  549. //activate the client (for sync callback)
  550. if ( jack_activate ( fManagerClient ) != 0 )
  551. jack_error ( "Can't activate the network manager client, transport disabled." );
  552. //launch the manager thread
  553. if ( jack_client_create_thread ( fManagerClient, &fManagerThread, 0, 0, NetManagerThread, this ) )
  554. jack_error ( "Can't create the network manager control thread." );
  555. }
  556. JackNetMasterManager::~JackNetMasterManager()
  557. {
  558. jack_log ( "JackNetMasterManager::~JackNetMasterManager" );
  559. Exit();
  560. master_list_t::iterator it;
  561. for ( it = fMasterList.begin(); it != fMasterList.end(); it++ )
  562. delete ( *it );
  563. fSocket.Close();
  564. SocketAPIEnd();
  565. }
  566. int JackNetMasterManager::SetSyncCallback ( jack_transport_state_t state, jack_position_t* pos, void* arg )
  567. {
  568. JackNetMasterManager* master_manager = static_cast<JackNetMasterManager*> ( arg );
  569. return master_manager->SyncCallback ( state, pos );
  570. }
  571. int JackNetMasterManager::SyncCallback ( jack_transport_state_t state, jack_position_t* pos )
  572. {
  573. //check sync state for every master in the list
  574. int ret = 1;
  575. master_list_it_t it;
  576. for ( it = fMasterList.begin(); it != fMasterList.end(); it++ )
  577. if ( ( *it )->fSyncState == 0 )
  578. ret = 0;
  579. jack_log ( "JackNetMasterManager::SyncCallback returns '%s'", ( ret ) ? "true" : "false" );
  580. return ret;
  581. }
  582. void* JackNetMasterManager::NetManagerThread ( void* arg )
  583. {
  584. JackNetMasterManager* master_manager = static_cast<JackNetMasterManager*> ( arg );
  585. jack_info ( "Starting Jack Network Manager." );
  586. jack_info ( "Listening on '%s:%d'", master_manager->fMulticastIP, master_manager->fSocket.GetPort() );
  587. master_manager->Run();
  588. return NULL;
  589. }
  590. void JackNetMasterManager::Run()
  591. {
  592. jack_log ( "JackNetMasterManager::Run" );
  593. //utility variables
  594. int usec_timeout = 2000000;
  595. int attempt = 0;
  596. //data
  597. session_params_t params;
  598. int rx_bytes = 0;
  599. JackNetMaster* net_master;
  600. //init socket API (win32)
  601. if ( SocketAPIInit() < 0 )
  602. {
  603. jack_error ( "Can't init Socket API, exiting..." );
  604. return;
  605. }
  606. //socket
  607. if ( fSocket.NewSocket() == SOCKET_ERROR )
  608. {
  609. jack_error ( "Can't create the network management input socket : %s", StrError ( NET_ERROR_CODE ) );
  610. return;
  611. }
  612. //bind the socket to the local port
  613. if ( fSocket.Bind () == SOCKET_ERROR )
  614. {
  615. jack_error ( "Can't bind the network manager socket : %s", StrError ( NET_ERROR_CODE ) );
  616. fSocket.Close();
  617. return;
  618. }
  619. //join multicast group
  620. if ( fSocket.JoinMCastGroup ( fMulticastIP ) == SOCKET_ERROR )
  621. jack_error ( "Can't join multicast group : %s", StrError ( NET_ERROR_CODE ) );
  622. //local loop
  623. if ( fSocket.SetLocalLoop() == SOCKET_ERROR )
  624. jack_error ( "Can't set local loop : %s", StrError ( NET_ERROR_CODE ) );
  625. //set a timeout on the multicast receive (the thread can now be cancelled)
  626. if ( fSocket.SetTimeOut ( usec_timeout ) == SOCKET_ERROR )
  627. jack_error ( "Can't set timeout : %s", StrError ( NET_ERROR_CODE ) );
  628. jack_info ( "Waiting for a slave..." );
  629. //main loop, wait for data, deal with it and wait again
  630. do
  631. {
  632. rx_bytes = fSocket.CatchHost ( &params, sizeof ( session_params_t ), 0 );
  633. if ( ( rx_bytes == SOCKET_ERROR ) && ( fSocket.GetError() != NET_NO_DATA ) )
  634. {
  635. jack_error ( "Error in receive : %s", StrError ( NET_ERROR_CODE ) );
  636. if ( ++attempt == 10 )
  637. {
  638. jack_error ( "Can't receive on the socket, exiting net manager." );
  639. return;
  640. }
  641. }
  642. if ( rx_bytes == sizeof ( session_params_t ) )
  643. {
  644. switch ( GetPacketType ( &params ) )
  645. {
  646. case SLAVE_AVAILABLE:
  647. if ( ( net_master = MasterInit ( params ) ) )
  648. SessionParamsDisplay ( &net_master->fParams );
  649. else
  650. jack_error ( "Can't init new net master..." );
  651. jack_info ( "Waiting for a slave..." );
  652. break;
  653. case KILL_MASTER:
  654. if ( KillMaster ( &params ) )
  655. jack_info ( "Waiting for a slave..." );
  656. break;
  657. default:
  658. break;
  659. }
  660. }
  661. }
  662. while ( fRunning );
  663. }
  664. void JackNetMasterManager::Exit()
  665. {
  666. jack_log ( "JackNetMasterManager::Exit" );
  667. fRunning = false;
  668. jack_client_stop_thread ( fManagerClient, fManagerThread );
  669. jack_info ( "Exiting net manager..." );
  670. }
  671. JackNetMaster* JackNetMasterManager::MasterInit ( session_params_t& params )
  672. {
  673. jack_log ( "JackNetMasterManager::MasterInit, Slave : %s", params.fName );
  674. //settings
  675. fSocket.GetName ( params.fMasterNetName );
  676. params.fID = ++fGlobalID;
  677. params.fSampleRate = jack_get_sample_rate ( fManagerClient );
  678. params.fPeriodSize = jack_get_buffer_size ( fManagerClient );
  679. params.fBitdepth = 0;
  680. SetFramesPerPacket ( &params );
  681. SetSlaveName ( params );
  682. //create a new master and add it to the list
  683. JackNetMaster* master = new JackNetMaster ( this, params );
  684. if ( master->Init() )
  685. {
  686. fMasterList.push_back ( master );
  687. return master;
  688. }
  689. delete master;
  690. return NULL;
  691. }
  692. void JackNetMasterManager::SetSlaveName ( session_params_t& params )
  693. {
  694. jack_log ( "JackNetMasterManager::SetSlaveName" );
  695. master_list_it_t it;
  696. for ( it = fMasterList.begin(); it != fMasterList.end(); it++ )
  697. if ( strcmp ( ( *it )->fParams.fName, params.fName ) == 0 )
  698. sprintf ( params.fName, "%s-%u", params.fName, params.fID );
  699. }
  700. master_list_it_t JackNetMasterManager::FindMaster ( uint32_t id )
  701. {
  702. jack_log ( "JackNetMasterManager::FindMaster, ID %u.", id );
  703. master_list_it_t it;
  704. for ( it = fMasterList.begin(); it != fMasterList.end(); it++ )
  705. if ( ( *it )->fParams.fID == id )
  706. return it;
  707. return it;
  708. }
  709. int JackNetMasterManager::KillMaster ( session_params_t* params )
  710. {
  711. jack_log ( "JackNetMasterManager::KillMaster, ID %u.", params->fID );
  712. master_list_it_t master = FindMaster ( params->fID );
  713. if ( master != fMasterList.end() )
  714. {
  715. fMasterList.erase ( master );
  716. delete *master;
  717. return 1;
  718. }
  719. return 0;
  720. }
  721. }//namespace
  722. static Jack::JackNetMasterManager* master_manager = NULL;
  723. #ifdef __cplusplus
  724. extern "C"
  725. {
  726. #endif
  727. EXPORT jack_driver_desc_t* jack_get_descriptor()
  728. {
  729. jack_driver_desc_t *desc;
  730. desc = ( jack_driver_desc_t* ) calloc ( 1, sizeof ( jack_driver_desc_t ) );
  731. strcpy ( desc->name, "netmanager" );
  732. desc->nparams = 2;
  733. desc->params = ( jack_driver_param_desc_t* ) calloc ( desc->nparams, sizeof ( jack_driver_param_desc_t ) );
  734. int i = 0;
  735. strcpy ( desc->params[i].name, "multicast_ip" );
  736. desc->params[i].character = 'a';
  737. desc->params[i].type = JackDriverParamString;
  738. strcpy ( desc->params[i].value.str, DEFAULT_MULTICAST_IP );
  739. strcpy ( desc->params[i].short_desc, "Multicast Address" );
  740. strcpy ( desc->params[i].long_desc, desc->params[i].short_desc );
  741. i++;
  742. strcpy ( desc->params[i].name, "udp_net_port" );
  743. desc->params[i].character = 'p';
  744. desc->params[i].type = JackDriverParamInt;
  745. desc->params[i].value.i = DEFAULT_PORT;
  746. strcpy ( desc->params[i].short_desc, "UDP port" );
  747. strcpy ( desc->params[i].long_desc, desc->params[i].short_desc );
  748. return desc;
  749. }
  750. EXPORT int jack_internal_initialize ( jack_client_t* jack_client, const JSList* params )
  751. {
  752. if ( master_manager )
  753. {
  754. jack_error ( "Master Manager already loaded" );
  755. return 1;
  756. }
  757. else
  758. {
  759. jack_log ( "Loading Master Manager" );
  760. master_manager = new Jack::JackNetMasterManager ( jack_client, params );
  761. return ( master_manager ) ? 0 : 1;
  762. }
  763. }
  764. EXPORT int jack_initialize ( jack_client_t* jack_client, const char* load_init )
  765. {
  766. JSList* params = NULL;
  767. jack_driver_desc_t* desc = jack_get_descriptor();
  768. Jack::JackArgParser parser ( load_init );
  769. if ( parser.GetArgc() > 0 )
  770. {
  771. if ( parser.ParseParams ( desc, &params ) < 0 )
  772. jack_error ( "Internal client JackArgParser::ParseParams error." );
  773. }
  774. return jack_internal_initialize ( jack_client, params );
  775. }
  776. EXPORT void jack_finish ( void* arg )
  777. {
  778. if ( master_manager )
  779. {
  780. jack_log ( "Unloading Master Manager" );
  781. delete master_manager;
  782. master_manager = NULL;
  783. }
  784. }
  785. #ifdef __cplusplus
  786. }
  787. #endif