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.

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