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.

1129 lines
43KB

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