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.

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