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.

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