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.

1118 lines
36KB

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