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.

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