jack1 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.

685 lines
21KB

  1. /* -*- mode: c; c-file-style: "linux"; -*- */
  2. /*
  3. NetJack Driver
  4. Copyright (C) 2008 Pieter Palmers <pieterpalmers@users.sourceforge.net>
  5. Copyright (C) 2006 Torben Hohn <torbenh@gmx.de>
  6. Copyright (C) 2003 Robert Ham <rah@bash.sh>
  7. Copyright (C) 2001 Paul Davis
  8. This program is free software; you can redistribute it and/or modify
  9. it under the terms of the GNU General Public License as published by
  10. the Free Software Foundation; either version 2 of the License, or
  11. (at your option) any later version.
  12. This program is distributed in the hope that it will be useful,
  13. but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. GNU General Public License for more details.
  16. You should have received a copy of the GNU General Public License
  17. along with this program; if not, write to the Free Software
  18. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  19. $Id: net_driver.c,v 1.17 2006/04/16 20:16:10 torbenh Exp $
  20. */
  21. #include <math.h>
  22. #include <stdio.h>
  23. #include <memory.h>
  24. #include <unistd.h>
  25. #include <stdlib.h>
  26. #include <errno.h>
  27. #include <stdarg.h>
  28. #include <sys/mman.h>
  29. #include <jack/types.h>
  30. #include <jack/engine.h>
  31. #include <sysdeps/time.h>
  32. #include <sys/types.h>
  33. #include "config.h"
  34. #include "netjack.h"
  35. #include "netjack_packet.h"
  36. #include "net_driver.h"
  37. #undef DEBUG_WAKEUP
  38. #define MIN(x,y) ((x)<(y) ? (x) : (y))
  39. static jack_transport_state_t last_transport_state;
  40. static int sync_state = TRUE;
  41. static jack_nframes_t
  42. net_driver_wait (net_driver_t *driver, int extra_fd, int *status, float *delayed_usecs)
  43. {
  44. netjack_driver_state_t *netj = &( driver->netj );
  45. int delay;
  46. delay = netjack_wait( netj );
  47. if( delay ) {
  48. //driver->engine->delay( driver->engine, (float)delay );
  49. jack_error( "netxruns amount: %dms", delay/1000 );
  50. }
  51. driver->last_wait_ust = jack_get_microseconds ();
  52. driver->engine->transport_cycle_start (driver->engine, driver->last_wait_ust);
  53. /* this driver doesn't work so well if we report a delay */
  54. /* XXX: this might not be the case anymore */
  55. /* the delayed _usecs is a resync or something. */
  56. *delayed_usecs = 0; /* lie about it */
  57. *status = 0;
  58. return netj->period_size;
  59. }
  60. static int
  61. net_driver_run_cycle (net_driver_t *driver)
  62. {
  63. jack_engine_t *engine = driver->engine;
  64. //netjack_driver_state_t *netj = &(driver->netj);
  65. int wait_status = -1;
  66. float delayed_usecs;
  67. jack_nframes_t nframes = net_driver_wait (driver, -1, &wait_status,
  68. &delayed_usecs);
  69. // XXX: xrun code removed.
  70. // especially with celt there are no real xruns anymore.
  71. // things are different on the net.
  72. if (wait_status == 0)
  73. return engine->run_cycle (engine, nframes, delayed_usecs);
  74. if (wait_status < 0)
  75. return -1;
  76. else
  77. return 0;
  78. }
  79. static int
  80. net_driver_null_cycle (net_driver_t* driver, jack_nframes_t nframes)
  81. {
  82. // TODO: talk to paul about this.
  83. // do i wait here ?
  84. // just sending out a packet marked with junk ?
  85. netjack_driver_state_t *netj = &(driver->netj);
  86. int sync_state = (driver->engine->control->sync_remain <= 1);
  87. netjack_send_silence( netj, sync_state );
  88. return 0;
  89. }
  90. static int
  91. net_driver_bufsize (net_driver_t* driver, jack_nframes_t nframes)
  92. {
  93. netjack_driver_state_t *netj = &(driver->netj);
  94. if (nframes != netj->period_size)
  95. return EINVAL;
  96. return 0;
  97. }
  98. static int
  99. net_driver_read (net_driver_t* driver, jack_nframes_t nframes)
  100. {
  101. netjack_driver_state_t *netj = &(driver->netj);
  102. jack_position_t local_trans_pos;
  103. jack_transport_state_t local_trans_state;
  104. unsigned int *packet_buf, *packet_bufX;
  105. if( ! netj->packet_data_valid ) {
  106. render_payload_to_jack_ports (netj->bitdepth, NULL, netj->net_period_down, netj->capture_ports, netj->capture_srcs, nframes, netj->dont_htonl_floats );
  107. return 0;
  108. }
  109. packet_buf = netj->rx_buf;
  110. jacknet_packet_header *pkthdr = (jacknet_packet_header *)packet_buf;
  111. packet_bufX = packet_buf + sizeof(jacknet_packet_header) / sizeof(jack_default_audio_sample_t);
  112. netj->reply_port = pkthdr->reply_port;
  113. netj->latency = pkthdr->latency;
  114. // Special handling for latency=0
  115. if( netj->latency == 0 )
  116. netj->resync_threshold = 0;
  117. else
  118. netj->resync_threshold = MIN( 15, pkthdr->latency-1 );
  119. // check whether, we should handle the transport sync stuff, or leave trnasports untouched.
  120. if (netj->handle_transport_sync) {
  121. int compensated_tranport_pos = (pkthdr->transport_frame + (pkthdr->latency * nframes) + netj->codec_latency);
  122. // read local transport info....
  123. local_trans_state = jack_transport_query(netj->client, &local_trans_pos);
  124. // Now check if we have to start or stop local transport to sync to remote...
  125. switch (pkthdr->transport_state) {
  126. case JackTransportStarting:
  127. // the master transport is starting... so we set our reply to the sync_callback;
  128. if (local_trans_state == JackTransportStopped) {
  129. jack_transport_start(netj->client);
  130. last_transport_state = JackTransportStopped;
  131. sync_state = FALSE;
  132. jack_info("locally stopped... starting...");
  133. }
  134. if (local_trans_pos.frame != compensated_tranport_pos)
  135. {
  136. jack_transport_locate(netj->client, compensated_tranport_pos);
  137. last_transport_state = JackTransportRolling;
  138. sync_state = FALSE;
  139. jack_info("starting locate to %d", compensated_tranport_pos );
  140. }
  141. break;
  142. case JackTransportStopped:
  143. sync_state = TRUE;
  144. if (local_trans_pos.frame != (pkthdr->transport_frame)) {
  145. jack_transport_locate(netj->client, (pkthdr->transport_frame));
  146. jack_info("transport is stopped locate to %d", pkthdr->transport_frame);
  147. }
  148. if (local_trans_state != JackTransportStopped)
  149. jack_transport_stop(netj->client);
  150. break;
  151. case JackTransportRolling:
  152. sync_state = TRUE;
  153. // if(local_trans_pos.frame != (pkthdr->transport_frame + (pkthdr->latency) * nframes)) {
  154. // jack_transport_locate(netj->client, (pkthdr->transport_frame + (pkthdr->latency + 2) * nframes));
  155. // jack_info("running locate to %d", pkthdr->transport_frame + (pkthdr->latency)*nframes);
  156. // }
  157. if (local_trans_state != JackTransportRolling)
  158. jack_transport_start (netj->client);
  159. break;
  160. case JackTransportLooping:
  161. break;
  162. }
  163. }
  164. render_payload_to_jack_ports (netj->bitdepth, packet_bufX, netj->net_period_down, netj->capture_ports, netj->capture_srcs, nframes, netj->dont_htonl_floats );
  165. packet_cache_release_packet(netj->packcache, netj->expected_framecnt );
  166. return 0;
  167. }
  168. static int
  169. net_driver_write (net_driver_t* driver, jack_nframes_t nframes)
  170. {
  171. netjack_driver_state_t *netj = &(driver->netj);
  172. int sync_state = (driver->engine->control->sync_remain <= 1);;
  173. uint32_t *packet_buf, *packet_bufX;
  174. int packet_size = get_sample_size(netj->bitdepth) * netj->playback_channels * netj->net_period_up + sizeof(jacknet_packet_header);
  175. jacknet_packet_header *pkthdr;
  176. packet_buf = alloca(packet_size);
  177. pkthdr = (jacknet_packet_header *)packet_buf;
  178. if( netj->running_free ) {
  179. return 0;
  180. }
  181. // offset packet_bufX by the packetheader.
  182. packet_bufX = packet_buf + sizeof(jacknet_packet_header) / sizeof(jack_default_audio_sample_t);
  183. pkthdr->sync_state = sync_state;
  184. pkthdr->latency = netj->time_to_deadline;
  185. //printf( "time to deadline = %d goodness=%d\n", (int)netj->time_to_deadline, netj->deadline_goodness );
  186. pkthdr->framecnt = netj->expected_framecnt;
  187. render_jack_ports_to_payload(netj->bitdepth, netj->playback_ports, netj->playback_srcs, nframes, packet_bufX, netj->net_period_up, netj->dont_htonl_floats );
  188. packet_header_hton(pkthdr);
  189. if (netj->srcaddress_valid)
  190. {
  191. int r;
  192. #ifndef MSG_CONFIRM
  193. static const int flag = 0;
  194. #else
  195. static const int flag = MSG_CONFIRM;
  196. #endif
  197. if (netj->reply_port)
  198. netj->syncsource_address.sin_port = htons(netj->reply_port);
  199. for( r=0; r<netj->redundancy; r++ )
  200. netjack_sendto(netj->sockfd, (char *)packet_buf, packet_size,
  201. flag, (struct sockaddr*)&(netj->syncsource_address), sizeof(struct sockaddr_in), netj->mtu);
  202. }
  203. return 0;
  204. }
  205. static int
  206. net_driver_attach (net_driver_t *driver)
  207. {
  208. netjack_driver_state_t *netj = &( driver->netj );
  209. if (driver->engine->set_buffer_size (driver->engine, netj->period_size)) {
  210. jack_error ("netjack: cannot set engine buffer size to %d (check MIDI)", netj->period_size);
  211. return -1;
  212. }
  213. driver->engine->set_sample_rate (driver->engine, netj->sample_rate);
  214. netjack_attach( netj );
  215. return 0;
  216. }
  217. static int
  218. net_driver_detach (net_driver_t *driver)
  219. {
  220. netjack_driver_state_t *netj = &( driver->netj );
  221. if (driver->engine == 0)
  222. return 0;
  223. netjack_detach( netj );
  224. return 0;
  225. }
  226. static void
  227. net_driver_delete (net_driver_t *driver)
  228. {
  229. netjack_driver_state_t *netj = &( driver->netj );
  230. netjack_release( netj );
  231. jack_driver_nt_finish ((jack_driver_nt_t *) driver);
  232. free (driver);
  233. }
  234. static jack_driver_t *
  235. net_driver_new (jack_client_t * client,
  236. char *name,
  237. unsigned int capture_ports,
  238. unsigned int playback_ports,
  239. unsigned int capture_ports_midi,
  240. unsigned int playback_ports_midi,
  241. jack_nframes_t sample_rate,
  242. jack_nframes_t period_size,
  243. unsigned int listen_port,
  244. unsigned int transport_sync,
  245. unsigned int resample_factor,
  246. unsigned int resample_factor_up,
  247. unsigned int bitdepth,
  248. unsigned int use_autoconfig,
  249. unsigned int latency,
  250. unsigned int redundancy,
  251. int dont_htonl_floats,
  252. int always_deadline,
  253. int jitter_val)
  254. {
  255. net_driver_t * driver;
  256. jack_info ("creating net driver ... %s|%" PRIu32 "|%" PRIu32
  257. "|%u|%u|%u|transport_sync:%u", name, sample_rate, period_size, listen_port,
  258. capture_ports, playback_ports, transport_sync);
  259. driver = (net_driver_t *) calloc (1, sizeof (net_driver_t));
  260. jack_driver_nt_init ((jack_driver_nt_t *) driver);
  261. driver->write = (JackDriverWriteFunction) net_driver_write;
  262. driver->read = (JackDriverReadFunction) net_driver_read;
  263. driver->null_cycle = (JackDriverNullCycleFunction) net_driver_null_cycle;
  264. driver->nt_attach = (JackDriverNTAttachFunction) net_driver_attach;
  265. driver->nt_detach = (JackDriverNTDetachFunction) net_driver_detach;
  266. driver->nt_bufsize = (JackDriverNTBufSizeFunction) net_driver_bufsize;
  267. driver->nt_run_cycle = (JackDriverNTRunCycleFunction) net_driver_run_cycle;
  268. driver->last_wait_ust = 0;
  269. driver->engine = NULL;
  270. netjack_driver_state_t *netj = &(driver->netj);
  271. netjack_init ( netj,
  272. client,
  273. name,
  274. capture_ports,
  275. playback_ports,
  276. capture_ports_midi,
  277. playback_ports_midi,
  278. sample_rate,
  279. period_size,
  280. listen_port,
  281. transport_sync,
  282. resample_factor,
  283. resample_factor_up,
  284. bitdepth,
  285. use_autoconfig,
  286. latency,
  287. redundancy,
  288. dont_htonl_floats,
  289. always_deadline,
  290. jitter_val );
  291. netjack_startup( netj );
  292. jack_info ("netjack: period : up: %d / dn: %d", netj->net_period_up, netj->net_period_down);
  293. jack_info ("netjack: framerate: %d", netj->sample_rate);
  294. jack_info ("netjack: audio : cap: %d / pbk: %d)", netj->capture_channels_audio, netj->playback_channels_audio);
  295. jack_info ("netjack: midi : cap: %d / pbk: %d)", netj->capture_channels_midi, netj->playback_channels_midi);
  296. jack_info ("netjack: buffsize : rx: %d)", netj->rx_bufsize);
  297. driver->period_usecs = netj->period_usecs;
  298. return (jack_driver_t *) driver;
  299. }
  300. /* DRIVER "PLUGIN" INTERFACE */
  301. jack_driver_desc_t *
  302. driver_get_descriptor ()
  303. {
  304. jack_driver_desc_t * desc;
  305. jack_driver_param_desc_t * params;
  306. unsigned int i;
  307. desc = calloc (1, sizeof (jack_driver_desc_t));
  308. strcpy (desc->name, "net");
  309. desc->nparams = 18;
  310. params = calloc (desc->nparams, sizeof (jack_driver_param_desc_t));
  311. i = 0;
  312. strcpy (params[i].name, "audio-ins");
  313. params[i].character = 'i';
  314. params[i].type = JackDriverParamUInt;
  315. params[i].value.ui = 2U;
  316. strcpy (params[i].short_desc, "Number of capture channels (defaults to 2)");
  317. strcpy (params[i].long_desc, params[i].short_desc);
  318. i++;
  319. strcpy (params[i].name, "audio-outs");
  320. params[i].character = 'o';
  321. params[i].type = JackDriverParamUInt;
  322. params[i].value.ui = 2U;
  323. strcpy (params[i].short_desc, "Number of playback channels (defaults to 2)");
  324. strcpy (params[i].long_desc, params[i].short_desc);
  325. i++;
  326. strcpy (params[i].name, "midi-ins");
  327. params[i].character = 'I';
  328. params[i].type = JackDriverParamUInt;
  329. params[i].value.ui = 1U;
  330. strcpy (params[i].short_desc, "Number of midi capture channels (defaults to 1)");
  331. strcpy (params[i].long_desc, params[i].short_desc);
  332. i++;
  333. strcpy (params[i].name, "midi-outs");
  334. params[i].character = 'O';
  335. params[i].type = JackDriverParamUInt;
  336. params[i].value.ui = 1U;
  337. strcpy (params[i].short_desc, "Number of midi playback channels (defaults to 1)");
  338. strcpy (params[i].long_desc, params[i].short_desc);
  339. i++;
  340. strcpy (params[i].name, "rate");
  341. params[i].character = 'r';
  342. params[i].type = JackDriverParamUInt;
  343. params[i].value.ui = 48000U;
  344. strcpy (params[i].short_desc, "Sample rate");
  345. strcpy (params[i].long_desc, params[i].short_desc);
  346. i++;
  347. strcpy (params[i].name, "period");
  348. params[i].character = 'p';
  349. params[i].type = JackDriverParamUInt;
  350. params[i].value.ui = 1024U;
  351. strcpy (params[i].short_desc, "Frames per period");
  352. strcpy (params[i].long_desc, params[i].short_desc);
  353. i++;
  354. strcpy (params[i].name, "num-periods");
  355. params[i].character = 'n';
  356. params[i].type = JackDriverParamUInt;
  357. params[i].value.ui = 5U;
  358. strcpy (params[i].short_desc,
  359. "Network latency setting in no. of periods");
  360. strcpy (params[i].long_desc, params[i].short_desc);
  361. i++;
  362. strcpy (params[i].name, "listen-port");
  363. params[i].character = 'l';
  364. params[i].type = JackDriverParamUInt;
  365. params[i].value.ui = 3000U;
  366. strcpy (params[i].short_desc,
  367. "The socket port we are listening on for sync packets");
  368. strcpy (params[i].long_desc, params[i].short_desc);
  369. i++;
  370. strcpy (params[i].name, "factor");
  371. params[i].character = 'f';
  372. params[i].type = JackDriverParamUInt;
  373. params[i].value.ui = 1U;
  374. strcpy (params[i].short_desc,
  375. "Factor for sample rate reduction (deprecated)");
  376. strcpy (params[i].long_desc, params[i].short_desc);
  377. i++;
  378. strcpy (params[i].name, "upstream-factor");
  379. params[i].character = 'u';
  380. params[i].type = JackDriverParamUInt;
  381. params[i].value.ui = 0U;
  382. strcpy (params[i].short_desc,
  383. "Factor for sample rate reduction on the upstream (deprecated)");
  384. strcpy (params[i].long_desc, params[i].short_desc);
  385. i++;
  386. strcpy (params[i].name, "celt");
  387. params[i].character = 'c';
  388. params[i].type = JackDriverParamUInt;
  389. params[i].value.ui = 0U;
  390. strcpy (params[i].short_desc,
  391. "sets celt encoding and kbits value one channel is encoded at");
  392. strcpy (params[i].long_desc, params[i].short_desc);
  393. i++;
  394. strcpy (params[i].name, "bit-depth");
  395. params[i].character = 'b';
  396. params[i].type = JackDriverParamUInt;
  397. params[i].value.ui = 0U;
  398. strcpy (params[i].short_desc,
  399. "Sample bit-depth (0 for float, 8 for 8bit and 16 for 16bit)");
  400. strcpy (params[i].long_desc, params[i].short_desc);
  401. i++;
  402. strcpy (params[i].name, "transport-sync");
  403. params[i].character = 't';
  404. params[i].type = JackDriverParamUInt;
  405. params[i].value.ui = 1U;
  406. strcpy (params[i].short_desc,
  407. "Whether to slave the transport to the master transport");
  408. strcpy (params[i].long_desc, params[i].short_desc);
  409. i++;
  410. strcpy (params[i].name, "autoconf");
  411. params[i].character = 'a';
  412. params[i].type = JackDriverParamUInt;
  413. params[i].value.ui = 1U;
  414. strcpy (params[i].short_desc,
  415. "Whether to use Autoconfig, or just start.");
  416. strcpy (params[i].long_desc, params[i].short_desc);
  417. i++;
  418. strcpy (params[i].name, "redundancy");
  419. params[i].character = 'R';
  420. params[i].type = JackDriverParamUInt;
  421. params[i].value.ui = 1U;
  422. strcpy (params[i].short_desc,
  423. "Send packets N times");
  424. strcpy (params[i].long_desc, params[i].short_desc);
  425. i++;
  426. strcpy (params[i].name, "native-endian");
  427. params[i].character = 'e';
  428. params[i].type = JackDriverParamUInt;
  429. params[i].value.ui = 0U;
  430. strcpy (params[i].short_desc,
  431. "Don't convert samples to network byte order.");
  432. strcpy (params[i].long_desc, params[i].short_desc);
  433. i++;
  434. strcpy (params[i].name, "jitterval");
  435. params[i].character = 'J';
  436. params[i].type = JackDriverParamInt;
  437. params[i].value.i = 0;
  438. strcpy (params[i].short_desc,
  439. "attempted jitterbuffer microseconds on master");
  440. strcpy (params[i].long_desc, params[i].short_desc);
  441. i++;
  442. strcpy (params[i].name, "always-deadline");
  443. params[i].character = 'D';
  444. params[i].type = JackDriverParamUInt;
  445. params[i].value.ui = 0U;
  446. strcpy (params[i].short_desc,
  447. "Always wait until deadline");
  448. strcpy (params[i].long_desc, params[i].short_desc);
  449. desc->params = params;
  450. return desc;
  451. }
  452. const char driver_client_name[] = "net_pcm";
  453. jack_driver_t *
  454. driver_initialize (jack_client_t *client, const JSList * params)
  455. {
  456. jack_nframes_t sample_rate = 48000;
  457. jack_nframes_t resample_factor = 1;
  458. jack_nframes_t period_size = 1024;
  459. unsigned int capture_ports = 2;
  460. unsigned int playback_ports = 2;
  461. unsigned int capture_ports_midi = 1;
  462. unsigned int playback_ports_midi = 1;
  463. unsigned int listen_port = 3000;
  464. unsigned int resample_factor_up = 0;
  465. unsigned int bitdepth = 0;
  466. unsigned int handle_transport_sync = 1;
  467. unsigned int use_autoconfig = 1;
  468. unsigned int latency = 5;
  469. unsigned int redundancy = 1;
  470. int dont_htonl_floats = 0;
  471. int always_deadline = 0;
  472. int jitter_val = 0;
  473. const JSList * node;
  474. const jack_driver_param_t * param;
  475. for (node = params; node; node = jack_slist_next (node)) {
  476. param = (const jack_driver_param_t *) node->data;
  477. switch (param->character) {
  478. case 'i':
  479. capture_ports = param->value.ui;
  480. break;
  481. case 'o':
  482. playback_ports = param->value.ui;
  483. break;
  484. case 'I':
  485. capture_ports_midi = param->value.ui;
  486. break;
  487. case 'O':
  488. playback_ports_midi = param->value.ui;
  489. break;
  490. case 'r':
  491. sample_rate = param->value.ui;
  492. break;
  493. case 'p':
  494. period_size = param->value.ui;
  495. break;
  496. case 'l':
  497. listen_port = param->value.ui;
  498. break;
  499. case 'f':
  500. #if HAVE_SAMPLERATE
  501. resample_factor = param->value.ui;
  502. #else
  503. printf( "not built with libsamplerate support\n" );
  504. exit(10);
  505. #endif
  506. break;
  507. case 'u':
  508. #if HAVE_SAMPLERATE
  509. resample_factor_up = param->value.ui;
  510. #else
  511. printf( "not built with libsamplerate support\n" );
  512. exit(10);
  513. #endif
  514. break;
  515. case 'b':
  516. bitdepth = param->value.ui;
  517. break;
  518. case 'c':
  519. #if HAVE_CELT
  520. bitdepth = 1000;
  521. resample_factor = param->value.ui;
  522. #else
  523. printf( "not built with celt support\n" );
  524. exit(10);
  525. #endif
  526. break;
  527. case 't':
  528. handle_transport_sync = param->value.ui;
  529. break;
  530. case 'a':
  531. use_autoconfig = param->value.ui;
  532. break;
  533. case 'n':
  534. latency = param->value.ui;
  535. break;
  536. case 'R':
  537. redundancy = param->value.ui;
  538. break;
  539. case 'e':
  540. dont_htonl_floats = param->value.ui;
  541. break;
  542. case 'J':
  543. jitter_val = param->value.i;
  544. break;
  545. case 'D':
  546. always_deadline = param->value.ui;
  547. break;
  548. }
  549. }
  550. return net_driver_new (client, "net_pcm", capture_ports, playback_ports,
  551. capture_ports_midi, playback_ports_midi,
  552. sample_rate, period_size,
  553. listen_port, handle_transport_sync,
  554. resample_factor, resample_factor_up, bitdepth,
  555. use_autoconfig, latency, redundancy,
  556. dont_htonl_floats, always_deadline, jitter_val);
  557. }
  558. void
  559. driver_finish (jack_driver_t *driver)
  560. {
  561. net_driver_delete ((net_driver_t *) driver);
  562. }