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.

978 lines
37KB

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