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.

992 lines
38KB

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