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.

1009 lines
35KB

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