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
44KB

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