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.

985 lines
37KB

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