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.

1138 lines
37KB

  1. /*
  2. Copyright (C) 2001 Paul Davis
  3. Copyright (C) 2008 Romain Moret at Grame
  4. This program is free software; you can redistribute it and/or modify
  5. it under the terms of the GNU General Public License as published by
  6. the Free Software Foundation; either version 2 of the License, or
  7. (at your option) any later version.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. GNU General Public License for more details.
  12. You should have received a copy of the GNU General Public License
  13. along with this program; if not, write to the Free Software
  14. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  15. */
  16. //#define HAVE_CELT 1
  17. #ifdef WIN32
  18. #include <malloc.h>
  19. #endif
  20. #include "JackNetOneDriver.h"
  21. #include "JackEngineControl.h"
  22. #include "JackGraphManager.h"
  23. #include "JackWaitThreadedDriver.h"
  24. #include "JackTools.h"
  25. #include "driver_interface.h"
  26. #include "netjack.h"
  27. #include "netjack_packet.h"
  28. #if HAVE_SAMPLERATE
  29. #include "samplerate.h"
  30. #endif
  31. #if HAVE_CELT
  32. #include "celt/celt.h"
  33. #endif
  34. #define MIN(x,y) ((x)<(y) ? (x) : (y))
  35. using namespace std;
  36. namespace Jack
  37. {
  38. JackNetOneDriver::JackNetOneDriver ( const char* name, const char* alias, JackLockedEngine* engine, JackSynchro* table,
  39. int port, int mtu, int capture_ports, int playback_ports, int midi_input_ports, int midi_output_ports,
  40. int sample_rate, int period_size, int resample_factor,
  41. const char* net_name, uint transport_sync, int bitdepth, int use_autoconfig,
  42. int latency, int redundancy, int dont_htonl_floats, int always_deadline, int jitter_val )
  43. : JackAudioDriver ( name, alias, engine, table )
  44. {
  45. jack_log ( "JackNetOneDriver::JackNetOneDriver port %d", port );
  46. #ifdef WIN32
  47. WSADATA wsa;
  48. int rc = WSAStartup(MAKEWORD(2,0),&wsa);
  49. #endif
  50. netjack_init( & (this->netj),
  51. NULL, // client
  52. name,
  53. capture_ports,
  54. playback_ports,
  55. midi_input_ports,
  56. midi_output_ports,
  57. sample_rate,
  58. period_size,
  59. port,
  60. transport_sync,
  61. resample_factor,
  62. 0,
  63. bitdepth,
  64. use_autoconfig,
  65. latency,
  66. redundancy,
  67. dont_htonl_floats,
  68. always_deadline,
  69. jitter_val);
  70. }
  71. JackNetOneDriver::~JackNetOneDriver()
  72. {
  73. // No destructor yet.
  74. }
  75. //open, close, attach and detach------------------------------------------------------
  76. int JackNetOneDriver::Open ( jack_nframes_t buffer_size, jack_nframes_t samplerate, bool capturing, bool playing,
  77. int inchannels, int outchannels, bool monitor,
  78. const char* capture_driver_name, const char* playback_driver_name,
  79. jack_nframes_t capture_latency, jack_nframes_t playback_latency )
  80. {
  81. if ( JackAudioDriver::Open ( buffer_size,
  82. samplerate,
  83. capturing,
  84. playing,
  85. inchannels,
  86. outchannels,
  87. monitor,
  88. capture_driver_name,
  89. playback_driver_name,
  90. capture_latency,
  91. playback_latency ) == 0 )
  92. {
  93. fEngineControl->fPeriod = 0;
  94. fEngineControl->fComputation = 500 * 1000;
  95. fEngineControl->fConstraint = 500 * 1000;
  96. return 0;
  97. }
  98. else
  99. {
  100. jack_error( "open fail" );
  101. return -1;
  102. }
  103. }
  104. int JackNetOneDriver::Close()
  105. {
  106. FreePorts();
  107. netjack_release( &netj );
  108. return JackDriver::Close();
  109. }
  110. int JackNetOneDriver::Attach()
  111. {
  112. return 0;
  113. }
  114. int JackNetOneDriver::Detach()
  115. {
  116. return 0;
  117. }
  118. int JackNetOneDriver::AllocPorts()
  119. {
  120. jack_port_id_t port_id;
  121. char buf[64];
  122. unsigned int chn;
  123. //if (netj.handle_transport_sync)
  124. // jack_set_sync_callback(netj.client, (JackSyncCallback) net_driver_sync_cb, NULL);
  125. for (chn = 0; chn < netj.capture_channels_audio; chn++) {
  126. snprintf (buf, sizeof(buf) - 1, "system:capture_%u", chn + 1);
  127. if ( ( port_id = fGraphManager->AllocatePort ( fClientControl.fRefNum, buf, JACK_DEFAULT_AUDIO_TYPE,
  128. CaptureDriverFlags, fEngineControl->fBufferSize ) ) == NO_PORT )
  129. {
  130. jack_error ( "driver: cannot register port for %s", buf );
  131. return -1;
  132. }
  133. //port = fGraphManager->GetPort ( port_id );
  134. netj.capture_ports =
  135. jack_slist_append (netj.capture_ports, (void *)(intptr_t)port_id);
  136. if( netj.bitdepth == CELT_MODE ) {
  137. #if HAVE_CELT
  138. #if HAVE_CELT_API_0_7
  139. celt_int32 lookahead;
  140. CELTMode *celt_mode = celt_mode_create( netj.sample_rate, netj.period_size, NULL );
  141. netj.capture_srcs = jack_slist_append(netj.capture_srcs, celt_decoder_create( celt_mode, 1, NULL ) );
  142. #else
  143. celt_int32_t lookahead;
  144. CELTMode *celt_mode = celt_mode_create( netj.sample_rate, 1, netj.period_size, NULL );
  145. netj.capture_srcs = jack_slist_append(netj.capture_srcs, celt_decoder_create( celt_mode ) );
  146. #endif
  147. celt_mode_info( celt_mode, CELT_GET_LOOKAHEAD, &lookahead );
  148. netj.codec_latency = 2*lookahead;
  149. #endif
  150. } else {
  151. #if HAVE_SAMPLERATE
  152. netj.capture_srcs = jack_slist_append(netj.capture_srcs, (void *)src_new(SRC_LINEAR, 1, NULL));
  153. #endif
  154. }
  155. }
  156. for (chn = netj.capture_channels_audio; chn < netj.capture_channels; chn++) {
  157. snprintf (buf, sizeof(buf) - 1, "system:capture_%u", chn + 1);
  158. if ( ( port_id = fGraphManager->AllocatePort ( fClientControl.fRefNum, buf, JACK_DEFAULT_MIDI_TYPE,
  159. CaptureDriverFlags, fEngineControl->fBufferSize ) ) == NO_PORT )
  160. {
  161. jack_error ( "driver: cannot register port for %s", buf );
  162. return -1;
  163. }
  164. //port = fGraphManager->GetPort ( port_id );
  165. netj.capture_ports =
  166. jack_slist_append (netj.capture_ports, (void *)(intptr_t)port_id);
  167. }
  168. for (chn = 0; chn < netj.playback_channels_audio; chn++) {
  169. snprintf (buf, sizeof(buf) - 1, "system:playback_%u", chn + 1);
  170. if ( ( port_id = fGraphManager->AllocatePort ( fClientControl.fRefNum, buf, JACK_DEFAULT_AUDIO_TYPE,
  171. PlaybackDriverFlags, fEngineControl->fBufferSize ) ) == NO_PORT )
  172. {
  173. jack_error ( "driver: cannot register port for %s", buf );
  174. return -1;
  175. }
  176. //port = fGraphManager->GetPort ( port_id );
  177. netj.playback_ports =
  178. jack_slist_append (netj.playback_ports, (void *)(intptr_t)port_id);
  179. if( netj.bitdepth == CELT_MODE ) {
  180. #if HAVE_CELT
  181. #if HAVE_CELT_API_0_7
  182. CELTMode *celt_mode = celt_mode_create( netj.sample_rate, netj.period_size, NULL );
  183. netj.playback_srcs = jack_slist_append(netj.playback_srcs, celt_encoder_create( celt_mode, 1, NULL ) );
  184. #else
  185. CELTMode *celt_mode = celt_mode_create( netj.sample_rate, 1, netj.period_size, NULL );
  186. netj.playback_srcs = jack_slist_append(netj.playback_srcs, celt_encoder_create( celt_mode ) );
  187. #endif
  188. #endif
  189. } else {
  190. #if HAVE_SAMPLERATE
  191. netj.playback_srcs = jack_slist_append(netj.playback_srcs, (void *)src_new(SRC_LINEAR, 1, NULL));
  192. #endif
  193. }
  194. }
  195. for (chn = netj.playback_channels_audio; chn < netj.playback_channels; chn++) {
  196. snprintf (buf, sizeof(buf) - 1, "system:playback_%u", chn + 1);
  197. if ( ( port_id = fGraphManager->AllocatePort ( fClientControl.fRefNum, buf, JACK_DEFAULT_MIDI_TYPE,
  198. PlaybackDriverFlags, fEngineControl->fBufferSize ) ) == NO_PORT )
  199. {
  200. jack_error ( "driver: cannot register port for %s", buf );
  201. return -1;
  202. }
  203. //port = fGraphManager->GetPort ( port_id );
  204. netj.playback_ports =
  205. jack_slist_append (netj.playback_ports, (void *)(intptr_t)port_id);
  206. }
  207. return 0;
  208. }
  209. //init and restart--------------------------------------------------------------------
  210. bool JackNetOneDriver::Initialize()
  211. {
  212. jack_log ( "JackNetOneDriver::Init()" );
  213. if( global_packcache != NULL ) {
  214. FreePorts();
  215. netjack_release( &netj );
  216. }
  217. //display some additional infos
  218. jack_info ( "NetOne driver started" );
  219. if( netjack_startup( &netj ) ) {
  220. return false;
  221. }
  222. //register jack ports
  223. if ( AllocPorts() != 0 )
  224. {
  225. jack_error ( "Can't allocate ports." );
  226. return false;
  227. }
  228. //monitor
  229. //driver parametering
  230. JackAudioDriver::SetBufferSize ( netj.period_size );
  231. JackAudioDriver::SetSampleRate ( netj.sample_rate );
  232. JackDriver::NotifyBufferSize ( netj.period_size );
  233. JackDriver::NotifySampleRate ( netj.sample_rate );
  234. //transport engine parametering
  235. fEngineControl->fTransport.SetNetworkSync ( true );
  236. return true;
  237. }
  238. //jack ports and buffers--------------------------------------------------------------
  239. //driver processes--------------------------------------------------------------------
  240. int JackNetOneDriver::Read()
  241. {
  242. int delay;
  243. delay = netjack_wait( &netj );
  244. if( delay ) {
  245. NotifyXRun(fBeginDateUst, (float) delay);
  246. jack_error( "netxruns... duration: %dms", delay/1000 );
  247. }
  248. if( (netj.num_lost_packets * netj.period_size / netj.sample_rate) > 2 )
  249. JackTools::ThrowJackNetException();
  250. //netjack_read( &netj, netj.period_size );
  251. JackDriver::CycleTakeBeginTime();
  252. jack_position_t local_trans_pos;
  253. jack_transport_state_t local_trans_state;
  254. unsigned int *packet_buf, *packet_bufX;
  255. if( ! netj.packet_data_valid ) {
  256. jack_log( "data not valid" );
  257. render_payload_to_jack_ports (netj.bitdepth, NULL, netj.net_period_down, netj.capture_ports, netj.capture_srcs, netj.period_size, netj.dont_htonl_floats );
  258. return 0;
  259. }
  260. packet_buf = netj.rx_buf;
  261. jacknet_packet_header *pkthdr = (jacknet_packet_header *)packet_buf;
  262. packet_bufX = packet_buf + sizeof(jacknet_packet_header) / sizeof(jack_default_audio_sample_t);
  263. netj.reply_port = pkthdr->reply_port;
  264. netj.latency = pkthdr->latency;
  265. // Special handling for latency=0
  266. if( netj.latency == 0 )
  267. netj.resync_threshold = 0;
  268. else
  269. netj.resync_threshold = MIN( 15, pkthdr->latency-1 );
  270. // check whether, we should handle the transport sync stuff, or leave trnasports untouched.
  271. if (netj.handle_transport_sync) {
  272. #if 1
  273. unsigned int compensated_tranport_pos = (pkthdr->transport_frame + (pkthdr->latency * netj.period_size) + netj.codec_latency);
  274. // read local transport info....
  275. //local_trans_state = jack_transport_query(netj.client, &local_trans_pos);
  276. local_trans_state = fEngineControl->fTransport.Query ( &local_trans_pos );
  277. // Now check if we have to start or stop local transport to sync to remote...
  278. switch (pkthdr->transport_state) {
  279. case JackTransportStarting:
  280. // the master transport is starting... so we set our reply to the sync_callback;
  281. if (local_trans_state == JackTransportStopped) {
  282. fEngineControl->fTransport.SetCommand ( TransportCommandStart );
  283. //jack_transport_start(netj.client);
  284. //last_transport_state = JackTransportStopped;
  285. netj.sync_state = 0;
  286. jack_info("locally stopped... starting...");
  287. }
  288. if (local_trans_pos.frame != compensated_tranport_pos)
  289. {
  290. jack_position_t new_pos = local_trans_pos;
  291. new_pos.frame = compensated_tranport_pos + 2*netj.period_size;
  292. new_pos.valid = (jack_position_bits_t) 0;
  293. fEngineControl->fTransport.RequestNewPos ( &new_pos );
  294. //jack_transport_locate(netj.client, compensated_tranport_pos);
  295. //last_transport_state = JackTransportRolling;
  296. netj.sync_state = 0;
  297. jack_info("starting locate to %d", compensated_tranport_pos );
  298. }
  299. break;
  300. case JackTransportStopped:
  301. netj.sync_state = 1;
  302. if (local_trans_pos.frame != (pkthdr->transport_frame)) {
  303. jack_position_t new_pos = local_trans_pos;
  304. new_pos.frame = pkthdr->transport_frame;
  305. new_pos.valid = (jack_position_bits_t)0;
  306. fEngineControl->fTransport.RequestNewPos ( &new_pos );
  307. //jack_transport_locate(netj.client, (pkthdr->transport_frame));
  308. jack_info("transport is stopped locate to %d", pkthdr->transport_frame);
  309. }
  310. if (local_trans_state != JackTransportStopped)
  311. //jack_transport_stop(netj.client);
  312. fEngineControl->fTransport.SetCommand ( TransportCommandStop );
  313. break;
  314. case JackTransportRolling:
  315. netj.sync_state = 1;
  316. // if(local_trans_pos.frame != (pkthdr->transport_frame + (pkthdr->latency) * netj.period_size)) {
  317. // jack_transport_locate(netj.client, (pkthdr->transport_frame + (pkthdr->latency + 2) * netj.period_size));
  318. // jack_info("running locate to %d", pkthdr->transport_frame + (pkthdr->latency)*netj.period_size);
  319. // }
  320. if (local_trans_state != JackTransportRolling)
  321. fEngineControl->fTransport.SetState ( JackTransportRolling );
  322. break;
  323. case JackTransportLooping:
  324. break;
  325. }
  326. #endif
  327. }
  328. render_payload_to_jack_ports (netj.bitdepth, packet_bufX, netj.net_period_down, netj.capture_ports, netj.capture_srcs, netj.period_size, netj.dont_htonl_floats );
  329. packet_cache_release_packet(global_packcache, netj.expected_framecnt );
  330. return 0;
  331. }
  332. int JackNetOneDriver::Write()
  333. {
  334. int syncstate = netj.sync_state | ((fEngineControl->fTransport.GetState() == JackTransportNetStarting) ? 1 : 0 );
  335. uint32_t *packet_buf, *packet_bufX;
  336. int packet_size = get_sample_size(netj.bitdepth) * netj.playback_channels * netj.net_period_up + sizeof(jacknet_packet_header);
  337. jacknet_packet_header *pkthdr;
  338. packet_buf = (uint32_t *) alloca(packet_size);
  339. pkthdr = (jacknet_packet_header *)packet_buf;
  340. if( netj.running_free ) {
  341. return 0;
  342. }
  343. // offset packet_bufX by the packetheader.
  344. packet_bufX = packet_buf + sizeof(jacknet_packet_header) / sizeof(jack_default_audio_sample_t);
  345. pkthdr->sync_state = syncstate;;
  346. pkthdr->latency = netj.time_to_deadline;
  347. //printf( "time to deadline = %d goodness=%d\n", (int)netj.time_to_deadline, netj.deadline_goodness );
  348. pkthdr->framecnt = netj.expected_framecnt;
  349. render_jack_ports_to_payload(netj.bitdepth, netj.playback_ports, netj.playback_srcs, netj.period_size, packet_bufX, netj.net_period_up, netj.dont_htonl_floats );
  350. packet_header_hton(pkthdr);
  351. if (netj.srcaddress_valid)
  352. {
  353. unsigned int r;
  354. #ifdef __APPLE__
  355. static const int flag = 0;
  356. #else
  357. static const int flag = 0;
  358. #endif
  359. if (netj.reply_port)
  360. netj.syncsource_address.sin_port = htons(netj.reply_port);
  361. for( r=0; r<netj.redundancy; r++ )
  362. netjack_sendto(netj.sockfd, (char *)packet_buf, packet_size,
  363. flag, (struct sockaddr*)&(netj.syncsource_address), sizeof(struct sockaddr_in), netj.mtu);
  364. }
  365. return 0;
  366. }
  367. void
  368. JackNetOneDriver::FreePorts ()
  369. {
  370. JSList *node = netj.capture_ports;
  371. while( node != NULL ) {
  372. JSList *this_node = node;
  373. jack_port_id_t port_id = (jack_port_id_t)(intptr_t) node->data;
  374. node = jack_slist_remove_link( node, this_node );
  375. jack_slist_free_1( this_node );
  376. fGraphManager->ReleasePort( fClientControl.fRefNum, port_id );
  377. }
  378. netj.capture_ports = NULL;
  379. node = netj.playback_ports;
  380. while( node != NULL ) {
  381. JSList *this_node = node;
  382. jack_port_id_t port_id = (jack_port_id_t)(intptr_t) node->data;
  383. node = jack_slist_remove_link( node, this_node );
  384. jack_slist_free_1( this_node );
  385. fGraphManager->ReleasePort( fClientControl.fRefNum, port_id );
  386. }
  387. netj.playback_ports = NULL;
  388. if( netj.bitdepth == CELT_MODE ) {
  389. #if HAVE_CELT
  390. node = netj.playback_srcs;
  391. while( node != NULL ) {
  392. JSList *this_node = node;
  393. CELTEncoder *enc = (CELTEncoder *) node->data;
  394. node = jack_slist_remove_link( node, this_node );
  395. jack_slist_free_1( this_node );
  396. celt_encoder_destroy( enc );
  397. }
  398. netj.playback_srcs = NULL;
  399. node = netj.capture_srcs;
  400. while( node != NULL ) {
  401. JSList *this_node = node;
  402. CELTDecoder *dec = (CELTDecoder *) node->data;
  403. node = jack_slist_remove_link( node, this_node );
  404. jack_slist_free_1( this_node );
  405. celt_decoder_destroy( dec );
  406. }
  407. netj.capture_srcs = NULL;
  408. #endif
  409. } else {
  410. #if HAVE_SAMPLERATE
  411. node = netj.playback_srcs;
  412. while( node != NULL ) {
  413. JSList *this_node = node;
  414. SRC_STATE *state = (SRC_STATE *) node->data;
  415. node = jack_slist_remove_link( node, this_node );
  416. jack_slist_free_1( this_node );
  417. src_delete( state );
  418. }
  419. netj.playback_srcs = NULL;
  420. node = netj.capture_srcs;
  421. while( node != NULL ) {
  422. JSList *this_node = node;
  423. SRC_STATE *state = (SRC_STATE *) node->data;
  424. node = jack_slist_remove_link( node, this_node );
  425. jack_slist_free_1( this_node );
  426. src_delete( state );
  427. }
  428. netj.capture_srcs = NULL;
  429. #endif
  430. }
  431. }
  432. //Render functions--------------------------------------------------------------------
  433. // render functions for float
  434. void
  435. JackNetOneDriver::render_payload_to_jack_ports_float ( void *packet_payload, jack_nframes_t net_period_down, JSList *capture_ports, JSList *capture_srcs, jack_nframes_t nframes, int dont_htonl_floats)
  436. {
  437. uint32_t chn = 0;
  438. JSList *node = capture_ports;
  439. #if HAVE_SAMPLERATE
  440. JSList *src_node = capture_srcs;
  441. #endif
  442. uint32_t *packet_bufX = (uint32_t *)packet_payload;
  443. if( !packet_payload )
  444. return;
  445. while (node != NULL)
  446. {
  447. unsigned int i;
  448. int_float_t val;
  449. #if HAVE_SAMPLERATE
  450. SRC_DATA src;
  451. #endif
  452. jack_port_id_t port_id = (jack_port_id_t)(intptr_t) node->data;
  453. JackPort *port = fGraphManager->GetPort( port_id );
  454. jack_default_audio_sample_t* buf =
  455. (jack_default_audio_sample_t*)fGraphManager->GetBuffer(port_id, fEngineControl->fBufferSize);
  456. const char *porttype = port->GetType();
  457. if (strncmp (porttype, JACK_DEFAULT_AUDIO_TYPE, jack_port_type_size()) == 0)
  458. {
  459. #if HAVE_SAMPLERATE
  460. // audio port, resample if necessary
  461. if (net_period_down != nframes)
  462. {
  463. SRC_STATE *src_state = (SRC_STATE *)src_node->data;
  464. for (i = 0; i < net_period_down; i++)
  465. {
  466. packet_bufX[i] = ntohl (packet_bufX[i]);
  467. }
  468. src.data_in = (float *) packet_bufX;
  469. src.input_frames = net_period_down;
  470. src.data_out = buf;
  471. src.output_frames = nframes;
  472. src.src_ratio = (float) nframes / (float) net_period_down;
  473. src.end_of_input = 0;
  474. src_set_ratio (src_state, src.src_ratio);
  475. src_process (src_state, &src);
  476. src_node = jack_slist_next (src_node);
  477. }
  478. else
  479. #endif
  480. {
  481. if( dont_htonl_floats )
  482. {
  483. memcpy( buf, packet_bufX, net_period_down*sizeof(jack_default_audio_sample_t));
  484. }
  485. else
  486. {
  487. for (i = 0; i < net_period_down; i++)
  488. {
  489. val.i = packet_bufX[i];
  490. val.i = ntohl (val.i);
  491. buf[i] = val.f;
  492. }
  493. }
  494. }
  495. }
  496. else if (strncmp (porttype, JACK_DEFAULT_MIDI_TYPE, jack_port_type_size()) == 0)
  497. {
  498. // midi port, decode midi events
  499. // convert the data buffer to a standard format (uint32_t based)
  500. unsigned int buffer_size_uint32 = net_period_down;
  501. uint32_t * buffer_uint32 = (uint32_t*)packet_bufX;
  502. decode_midi_buffer (buffer_uint32, buffer_size_uint32, buf);
  503. }
  504. packet_bufX = (packet_bufX + net_period_down);
  505. node = jack_slist_next (node);
  506. chn++;
  507. }
  508. }
  509. void
  510. JackNetOneDriver::render_jack_ports_to_payload_float (JSList *playback_ports, JSList *playback_srcs, jack_nframes_t nframes, void *packet_payload, jack_nframes_t net_period_up, int dont_htonl_floats )
  511. {
  512. uint32_t chn = 0;
  513. JSList *node = playback_ports;
  514. #if HAVE_SAMPLERATE
  515. JSList *src_node = playback_srcs;
  516. #endif
  517. uint32_t *packet_bufX = (uint32_t *) packet_payload;
  518. while (node != NULL)
  519. {
  520. #if HAVE_SAMPLERATE
  521. SRC_DATA src;
  522. #endif
  523. unsigned int i;
  524. int_float_t val;
  525. jack_port_id_t port_id = (jack_port_id_t)(intptr_t) node->data;
  526. JackPort *port = fGraphManager->GetPort( port_id );
  527. jack_default_audio_sample_t* buf =
  528. (jack_default_audio_sample_t*)fGraphManager->GetBuffer(port_id, fEngineControl->fBufferSize);
  529. const char *porttype = port->GetType();
  530. if (strncmp (porttype, JACK_DEFAULT_AUDIO_TYPE, jack_port_type_size()) == 0)
  531. {
  532. // audio port, resample if necessary
  533. #if HAVE_SAMPLERATE
  534. if (net_period_up != nframes) {
  535. SRC_STATE *src_state = (SRC_STATE *) src_node->data;
  536. src.data_in = buf;
  537. src.input_frames = nframes;
  538. src.data_out = (float *) packet_bufX;
  539. src.output_frames = net_period_up;
  540. src.src_ratio = (float) net_period_up / (float) nframes;
  541. src.end_of_input = 0;
  542. src_set_ratio (src_state, src.src_ratio);
  543. src_process (src_state, &src);
  544. for (i = 0; i < net_period_up; i++)
  545. {
  546. packet_bufX[i] = htonl (packet_bufX[i]);
  547. }
  548. src_node = jack_slist_next (src_node);
  549. }
  550. else
  551. #endif
  552. {
  553. if( dont_htonl_floats )
  554. {
  555. memcpy( packet_bufX, buf, net_period_up*sizeof(jack_default_audio_sample_t) );
  556. }
  557. else
  558. {
  559. for (i = 0; i < net_period_up; i++)
  560. {
  561. val.f = buf[i];
  562. val.i = htonl (val.i);
  563. packet_bufX[i] = val.i;
  564. }
  565. }
  566. }
  567. }
  568. else if (strncmp(porttype, JACK_DEFAULT_MIDI_TYPE, jack_port_type_size()) == 0)
  569. {
  570. // encode midi events from port to packet
  571. // convert the data buffer to a standard format (uint32_t based)
  572. unsigned int buffer_size_uint32 = net_period_up;
  573. uint32_t * buffer_uint32 = (uint32_t*) packet_bufX;
  574. encode_midi_buffer (buffer_uint32, buffer_size_uint32, buf);
  575. }
  576. packet_bufX = (packet_bufX + net_period_up);
  577. node = jack_slist_next (node);
  578. chn++;
  579. }
  580. }
  581. #if HAVE_CELT
  582. // render functions for celt.
  583. void
  584. JackNetOneDriver::render_payload_to_jack_ports_celt (void *packet_payload, jack_nframes_t net_period_down, JSList *capture_ports, JSList *capture_srcs, jack_nframes_t nframes)
  585. {
  586. uint32_t chn = 0;
  587. JSList *node = capture_ports;
  588. JSList *src_node = capture_srcs;
  589. unsigned char *packet_bufX = (unsigned char *)packet_payload;
  590. while (node != NULL)
  591. {
  592. jack_port_id_t port_id = (jack_port_id_t) (intptr_t)node->data;
  593. JackPort *port = fGraphManager->GetPort( port_id );
  594. jack_default_audio_sample_t* buf =
  595. (jack_default_audio_sample_t*)fGraphManager->GetBuffer(port_id, fEngineControl->fBufferSize);
  596. const char *portname = port->GetType();
  597. if (strncmp(portname, JACK_DEFAULT_AUDIO_TYPE, jack_port_type_size()) == 0)
  598. {
  599. // audio port, decode celt data.
  600. CELTDecoder *decoder = (CELTDecoder *)src_node->data;
  601. if( !packet_payload )
  602. celt_decode_float( decoder, NULL, net_period_down, buf );
  603. else
  604. celt_decode_float( decoder, packet_bufX, net_period_down, buf );
  605. src_node = jack_slist_next (src_node);
  606. }
  607. else if (strncmp(portname, JACK_DEFAULT_MIDI_TYPE, jack_port_type_size()) == 0)
  608. {
  609. // midi port, decode midi events
  610. // convert the data buffer to a standard format (uint32_t based)
  611. unsigned int buffer_size_uint32 = net_period_down / 2;
  612. uint32_t * buffer_uint32 = (uint32_t*) packet_bufX;
  613. if( packet_payload )
  614. decode_midi_buffer (buffer_uint32, buffer_size_uint32, buf);
  615. }
  616. packet_bufX = (packet_bufX + net_period_down);
  617. node = jack_slist_next (node);
  618. chn++;
  619. }
  620. }
  621. void
  622. JackNetOneDriver::render_jack_ports_to_payload_celt (JSList *playback_ports, JSList *playback_srcs, jack_nframes_t nframes, void *packet_payload, jack_nframes_t net_period_up)
  623. {
  624. uint32_t chn = 0;
  625. JSList *node = playback_ports;
  626. JSList *src_node = playback_srcs;
  627. unsigned char *packet_bufX = (unsigned char *)packet_payload;
  628. while (node != NULL)
  629. {
  630. jack_port_id_t port_id = (jack_port_id_t) (intptr_t) node->data;
  631. JackPort *port = fGraphManager->GetPort( port_id );
  632. jack_default_audio_sample_t* buf =
  633. (jack_default_audio_sample_t*)fGraphManager->GetBuffer(port_id, fEngineControl->fBufferSize);
  634. const char *portname = port->GetType();
  635. if (strncmp (portname, JACK_DEFAULT_AUDIO_TYPE, jack_port_type_size()) == 0)
  636. {
  637. // audio port, encode celt data.
  638. int encoded_bytes;
  639. float *floatbuf = (float *)alloca (sizeof(float) * nframes );
  640. memcpy( floatbuf, buf, nframes*sizeof(float) );
  641. CELTEncoder *encoder = (CELTEncoder *)src_node->data;
  642. encoded_bytes = celt_encode_float( encoder, floatbuf, NULL, packet_bufX, net_period_up );
  643. if( encoded_bytes != (int)net_period_up )
  644. jack_error( "something in celt changed. netjack needs to be changed to handle this." );
  645. src_node = jack_slist_next( src_node );
  646. }
  647. else if (strncmp(portname, JACK_DEFAULT_MIDI_TYPE, jack_port_type_size()) == 0)
  648. {
  649. // encode midi events from port to packet
  650. // convert the data buffer to a standard format (uint32_t based)
  651. unsigned int buffer_size_uint32 = net_period_up / 2;
  652. uint32_t * buffer_uint32 = (uint32_t*) packet_bufX;
  653. encode_midi_buffer (buffer_uint32, buffer_size_uint32, buf);
  654. }
  655. packet_bufX = (packet_bufX + net_period_up);
  656. node = jack_slist_next (node);
  657. chn++;
  658. }
  659. }
  660. #endif
  661. /* Wrapper functions with bitdepth argument... */
  662. void
  663. JackNetOneDriver::render_payload_to_jack_ports (int bitdepth, void *packet_payload, jack_nframes_t net_period_down, JSList *capture_ports, JSList *capture_srcs, jack_nframes_t nframes, int dont_htonl_floats)
  664. {
  665. #if HAVE_CELT
  666. if (bitdepth == CELT_MODE)
  667. render_payload_to_jack_ports_celt (packet_payload, net_period_down, capture_ports, capture_srcs, nframes);
  668. else
  669. #endif
  670. render_payload_to_jack_ports_float (packet_payload, net_period_down, capture_ports, capture_srcs, nframes, dont_htonl_floats);
  671. }
  672. void
  673. JackNetOneDriver::render_jack_ports_to_payload (int bitdepth, JSList *playback_ports, JSList *playback_srcs, jack_nframes_t nframes, void *packet_payload, jack_nframes_t net_period_up, int dont_htonl_floats)
  674. {
  675. #if HAVE_CELT
  676. if (bitdepth == CELT_MODE)
  677. render_jack_ports_to_payload_celt (playback_ports, playback_srcs, nframes, packet_payload, net_period_up);
  678. else
  679. #endif
  680. render_jack_ports_to_payload_float (playback_ports, playback_srcs, nframes, packet_payload, net_period_up, dont_htonl_floats);
  681. }
  682. //driver loader-----------------------------------------------------------------------
  683. #ifdef __cplusplus
  684. extern "C"
  685. {
  686. #endif
  687. SERVER_EXPORT jack_driver_desc_t* driver_get_descriptor ()
  688. {
  689. jack_driver_desc_t* desc = ( jack_driver_desc_t* ) calloc ( 1, sizeof ( jack_driver_desc_t ) );
  690. jack_driver_param_desc_t * params;
  691. strcpy ( desc->name, "netone" ); // size MUST be less then JACK_DRIVER_NAME_MAX + 1
  692. strcpy ( desc->desc, "netjack one slave backend component" ); // size MUST be less then JACK_DRIVER_PARAM_DESC + 1
  693. desc->nparams = 18;
  694. params = ( jack_driver_param_desc_t* ) calloc ( desc->nparams, sizeof ( jack_driver_param_desc_t ) );
  695. int i = 0;
  696. strcpy (params[i].name, "audio-ins");
  697. params[i].character = 'i';
  698. params[i].type = JackDriverParamUInt;
  699. params[i].value.ui = 2U;
  700. strcpy (params[i].short_desc, "Number of capture channels (defaults to 2)");
  701. strcpy (params[i].long_desc, params[i].short_desc);
  702. i++;
  703. strcpy (params[i].name, "audio-outs");
  704. params[i].character = 'o';
  705. params[i].type = JackDriverParamUInt;
  706. params[i].value.ui = 2U;
  707. strcpy (params[i].short_desc, "Number of playback channels (defaults to 2)");
  708. strcpy (params[i].long_desc, params[i].short_desc);
  709. i++;
  710. strcpy (params[i].name, "midi-ins");
  711. params[i].character = 'I';
  712. params[i].type = JackDriverParamUInt;
  713. params[i].value.ui = 1U;
  714. strcpy (params[i].short_desc, "Number of midi capture channels (defaults to 1)");
  715. strcpy (params[i].long_desc, params[i].short_desc);
  716. i++;
  717. strcpy (params[i].name, "midi-outs");
  718. params[i].character = 'O';
  719. params[i].type = JackDriverParamUInt;
  720. params[i].value.ui = 1U;
  721. strcpy (params[i].short_desc, "Number of midi playback channels (defaults to 1)");
  722. strcpy (params[i].long_desc, params[i].short_desc);
  723. i++;
  724. strcpy (params[i].name, "rate");
  725. params[i].character = 'r';
  726. params[i].type = JackDriverParamUInt;
  727. params[i].value.ui = 48000U;
  728. strcpy (params[i].short_desc, "Sample rate");
  729. strcpy (params[i].long_desc, params[i].short_desc);
  730. i++;
  731. strcpy (params[i].name, "period");
  732. params[i].character = 'p';
  733. params[i].type = JackDriverParamUInt;
  734. params[i].value.ui = 1024U;
  735. strcpy (params[i].short_desc, "Frames per period");
  736. strcpy (params[i].long_desc, params[i].short_desc);
  737. i++;
  738. strcpy (params[i].name, "num-periods");
  739. params[i].character = 'n';
  740. params[i].type = JackDriverParamUInt;
  741. params[i].value.ui = 5U;
  742. strcpy (params[i].short_desc,
  743. "Network latency setting in no. of periods");
  744. strcpy (params[i].long_desc, params[i].short_desc);
  745. i++;
  746. strcpy (params[i].name, "listen-port");
  747. params[i].character = 'l';
  748. params[i].type = JackDriverParamUInt;
  749. params[i].value.ui = 3000U;
  750. strcpy (params[i].short_desc,
  751. "The socket port we are listening on for sync packets");
  752. strcpy (params[i].long_desc, params[i].short_desc);
  753. i++;
  754. strcpy (params[i].name, "factor");
  755. params[i].character = 'f';
  756. params[i].type = JackDriverParamUInt;
  757. params[i].value.ui = 1U;
  758. strcpy (params[i].short_desc,
  759. "Factor for sample rate reduction");
  760. strcpy (params[i].long_desc, params[i].short_desc);
  761. i++;
  762. strcpy (params[i].name, "upstream-factor");
  763. params[i].character = 'u';
  764. params[i].type = JackDriverParamUInt;
  765. params[i].value.ui = 0U;
  766. strcpy (params[i].short_desc,
  767. "Factor for sample rate reduction on the upstream");
  768. strcpy (params[i].long_desc, params[i].short_desc);
  769. i++;
  770. strcpy (params[i].name, "celt");
  771. params[i].character = 'c';
  772. params[i].type = JackDriverParamUInt;
  773. params[i].value.ui = 0U;
  774. strcpy (params[i].short_desc,
  775. "sets celt encoding and number of kbits per channel");
  776. strcpy (params[i].long_desc, params[i].short_desc);
  777. i++;
  778. strcpy (params[i].name, "bit-depth");
  779. params[i].character = 'b';
  780. params[i].type = JackDriverParamUInt;
  781. params[i].value.ui = 0U;
  782. strcpy (params[i].short_desc,
  783. "Sample bit-depth (0 for float, 8 for 8bit and 16 for 16bit)");
  784. strcpy (params[i].long_desc, params[i].short_desc);
  785. i++;
  786. strcpy (params[i].name, "transport-sync");
  787. params[i].character = 't';
  788. params[i].type = JackDriverParamBool;
  789. params[i].value.ui = 1U;
  790. strcpy (params[i].short_desc,
  791. "Whether to slave the transport to the master transport");
  792. strcpy (params[i].long_desc, params[i].short_desc);
  793. i++;
  794. strcpy (params[i].name, "autoconf");
  795. params[i].character = 'a';
  796. params[i].type = JackDriverParamBool;
  797. params[i].value.ui = 1U;
  798. strcpy (params[i].short_desc,
  799. "Whether to use Autoconfig, or just start.");
  800. strcpy (params[i].long_desc, params[i].short_desc);
  801. i++;
  802. strcpy (params[i].name, "redundancy");
  803. params[i].character = 'R';
  804. params[i].type = JackDriverParamUInt;
  805. params[i].value.ui = 1U;
  806. strcpy (params[i].short_desc,
  807. "Send packets N times");
  808. strcpy (params[i].long_desc, params[i].short_desc);
  809. i++;
  810. strcpy (params[i].name, "native-endian");
  811. params[i].character = 'e';
  812. params[i].type = JackDriverParamBool;
  813. params[i].value.ui = 0U;
  814. strcpy (params[i].short_desc,
  815. "Dont convert samples to network byte order.");
  816. strcpy (params[i].long_desc, params[i].short_desc);
  817. i++;
  818. strcpy (params[i].name, "jitterval");
  819. params[i].character = 'J';
  820. params[i].type = JackDriverParamInt;
  821. params[i].value.i = 0;
  822. strcpy (params[i].short_desc,
  823. "attempted jitterbuffer microseconds on master");
  824. strcpy (params[i].long_desc, params[i].short_desc);
  825. i++;
  826. strcpy (params[i].name, "always-deadline");
  827. params[i].character = 'D';
  828. params[i].type = JackDriverParamBool;
  829. params[i].value.ui = 0U;
  830. strcpy (params[i].short_desc,
  831. "always use deadline");
  832. strcpy (params[i].long_desc, params[i].short_desc);
  833. desc->params = params;
  834. return desc;
  835. }
  836. SERVER_EXPORT Jack::JackDriverClientInterface* driver_initialize ( Jack::JackLockedEngine* engine, Jack::JackSynchro* table, const JSList* params )
  837. {
  838. jack_nframes_t sample_rate = 48000;
  839. jack_nframes_t resample_factor = 1;
  840. jack_nframes_t period_size = 1024;
  841. unsigned int capture_ports = 2;
  842. unsigned int playback_ports = 2;
  843. unsigned int capture_ports_midi = 1;
  844. unsigned int playback_ports_midi = 1;
  845. unsigned int listen_port = 3000;
  846. unsigned int resample_factor_up = 0;
  847. unsigned int bitdepth = 0;
  848. unsigned int handle_transport_sync = 1;
  849. unsigned int use_autoconfig = 1;
  850. unsigned int latency = 5;
  851. unsigned int redundancy = 1;
  852. unsigned int mtu = 1400;
  853. int dont_htonl_floats = 0;
  854. int always_deadline = 0;
  855. int jitter_val = 0;
  856. const JSList * node;
  857. const jack_driver_param_t * param;
  858. for ( node = params; node; node = jack_slist_next ( node ) )
  859. {
  860. param = ( const jack_driver_param_t* ) node->data;
  861. switch ( param->character )
  862. {
  863. case 'i':
  864. capture_ports = param->value.ui;
  865. break;
  866. case 'o':
  867. playback_ports = param->value.ui;
  868. break;
  869. case 'I':
  870. capture_ports_midi = param->value.ui;
  871. break;
  872. case 'O':
  873. playback_ports_midi = param->value.ui;
  874. break;
  875. case 'r':
  876. sample_rate = param->value.ui;
  877. break;
  878. case 'p':
  879. period_size = param->value.ui;
  880. break;
  881. case 'l':
  882. listen_port = param->value.ui;
  883. break;
  884. case 'f':
  885. #if HAVE_SAMPLERATE
  886. resample_factor = param->value.ui;
  887. #else
  888. jack_error( "not built with libsamplerate support" );
  889. return NULL;
  890. #endif
  891. break;
  892. case 'u':
  893. #if HAVE_SAMPLERATE
  894. resample_factor_up = param->value.ui;
  895. #else
  896. jack_error( "not built with libsamplerate support" );
  897. return NULL;
  898. #endif
  899. break;
  900. case 'b':
  901. bitdepth = param->value.ui;
  902. break;
  903. case 'c':
  904. #if HAVE_CELT
  905. bitdepth = CELT_MODE;
  906. resample_factor = param->value.ui;
  907. #else
  908. jack_error( "not built with celt support" );
  909. return NULL;
  910. #endif
  911. break;
  912. case 't':
  913. handle_transport_sync = param->value.ui;
  914. break;
  915. case 'a':
  916. use_autoconfig = param->value.ui;
  917. break;
  918. case 'n':
  919. latency = param->value.ui;
  920. break;
  921. case 'R':
  922. redundancy = param->value.ui;
  923. break;
  924. case 'H':
  925. dont_htonl_floats = param->value.ui;
  926. break;
  927. case 'J':
  928. jitter_val = param->value.i;
  929. break;
  930. case 'D':
  931. always_deadline = param->value.ui;
  932. break;
  933. }
  934. }
  935. try
  936. {
  937. Jack::JackDriverClientInterface* driver =
  938. new Jack::JackWaitThreadedDriver (
  939. new Jack::JackNetOneDriver ( "system", "net_pcm", engine, table, listen_port, mtu,
  940. capture_ports_midi, playback_ports_midi, capture_ports, playback_ports,
  941. sample_rate, period_size, resample_factor,
  942. "net_pcm", handle_transport_sync, bitdepth, use_autoconfig, latency, redundancy,
  943. dont_htonl_floats, always_deadline, jitter_val ) );
  944. if ( driver->Open ( period_size, sample_rate, 1, 1, capture_ports, playback_ports,
  945. 0, "from_master_", "to_master_", 0, 0 ) == 0 )
  946. {
  947. return driver;
  948. }
  949. else
  950. {
  951. delete driver;
  952. return NULL;
  953. }
  954. }
  955. catch ( ... )
  956. {
  957. return NULL;
  958. }
  959. }
  960. #ifdef __cplusplus
  961. }
  962. #endif
  963. }