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.

661 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. if( netjack_wait( netj ) ) {
  46. driver->engine->delay( driver->engine, 0 );
  47. }
  48. driver->last_wait_ust = jack_get_microseconds ();
  49. driver->engine->transport_cycle_start (driver->engine, driver->last_wait_ust);
  50. /* this driver doesn't work so well if we report a delay */
  51. /* XXX: this might not be the case anymore */
  52. /* the delayed _usecs is a resync or something. */
  53. *delayed_usecs = 0; /* lie about it */
  54. *status = 0;
  55. return netj->period_size;
  56. }
  57. static int
  58. net_driver_run_cycle (net_driver_t *driver)
  59. {
  60. jack_engine_t *engine = driver->engine;
  61. //netjack_driver_state_t *netj = &(driver->netj);
  62. int wait_status = -1;
  63. float delayed_usecs;
  64. jack_nframes_t nframes = net_driver_wait (driver, -1, &wait_status,
  65. &delayed_usecs);
  66. // XXX: xrun code removed.
  67. // especially with celt there are no real xruns anymore.
  68. // things are different on the net.
  69. if (wait_status == 0)
  70. return engine->run_cycle (engine, nframes, delayed_usecs);
  71. if (wait_status < 0)
  72. return -1;
  73. else
  74. return 0;
  75. }
  76. static int
  77. net_driver_null_cycle (net_driver_t* driver, jack_nframes_t nframes)
  78. {
  79. // TODO: talk to paul about this.
  80. // do i wait here ?
  81. // just sending out a packet marked with junk ?
  82. netjack_driver_state_t *netj = &(driver->netj);
  83. int sync_state = (driver->engine->control->sync_remain <= 1);
  84. netjack_send_silence( netj, sync_state );
  85. return 0;
  86. }
  87. static int
  88. net_driver_bufsize (net_driver_t* driver, jack_nframes_t nframes)
  89. {
  90. netjack_driver_state_t *netj = &(driver->netj);
  91. if (nframes != netj->period_size)
  92. return EINVAL;
  93. return 0;
  94. }
  95. static int
  96. net_driver_read (net_driver_t* driver, jack_nframes_t nframes)
  97. {
  98. netjack_driver_state_t *netj = &(driver->netj);
  99. jack_position_t local_trans_pos;
  100. jack_transport_state_t local_trans_state;
  101. unsigned int *packet_buf, *packet_bufX;
  102. if( ! netj->packet_data_valid ) {
  103. render_payload_to_jack_ports (netj->bitdepth, NULL, netj->net_period_down, netj->capture_ports, netj->capture_srcs, nframes, netj->dont_htonl_floats );
  104. return 0;
  105. }
  106. packet_buf = netj->rx_buf;
  107. jacknet_packet_header *pkthdr = (jacknet_packet_header *)packet_buf;
  108. packet_bufX = packet_buf + sizeof(jacknet_packet_header) / sizeof(jack_default_audio_sample_t);
  109. netj->reply_port = pkthdr->reply_port;
  110. netj->latency = pkthdr->latency;
  111. // Special handling for latency=0
  112. if( netj->latency == 0 )
  113. netj->resync_threshold = 0;
  114. else
  115. netj->resync_threshold = MIN( 15, pkthdr->latency-1 );
  116. // check whether, we should handle the transport sync stuff, or leave trnasports untouched.
  117. if (netj->handle_transport_sync) {
  118. int compensated_tranport_pos = (pkthdr->transport_frame + (pkthdr->latency * nframes) + netj->codec_latency);
  119. // read local transport info....
  120. local_trans_state = jack_transport_query(netj->client, &local_trans_pos);
  121. // Now check if we have to start or stop local transport to sync to remote...
  122. switch (pkthdr->transport_state) {
  123. case JackTransportStarting:
  124. // the master transport is starting... so we set our reply to the sync_callback;
  125. if (local_trans_state == JackTransportStopped) {
  126. jack_transport_start(netj->client);
  127. last_transport_state = JackTransportStopped;
  128. sync_state = FALSE;
  129. jack_info("locally stopped... starting...");
  130. }
  131. if (local_trans_pos.frame != compensated_tranport_pos)
  132. {
  133. jack_transport_locate(netj->client, compensated_tranport_pos);
  134. last_transport_state = JackTransportRolling;
  135. sync_state = FALSE;
  136. jack_info("starting locate to %d", compensated_tranport_pos );
  137. }
  138. break;
  139. case JackTransportStopped:
  140. sync_state = TRUE;
  141. if (local_trans_pos.frame != (pkthdr->transport_frame)) {
  142. jack_transport_locate(netj->client, (pkthdr->transport_frame));
  143. jack_info("transport is stopped locate to %d", pkthdr->transport_frame);
  144. }
  145. if (local_trans_state != JackTransportStopped)
  146. jack_transport_stop(netj->client);
  147. break;
  148. case JackTransportRolling:
  149. sync_state = TRUE;
  150. // if(local_trans_pos.frame != (pkthdr->transport_frame + (pkthdr->latency) * nframes)) {
  151. // jack_transport_locate(netj->client, (pkthdr->transport_frame + (pkthdr->latency + 2) * nframes));
  152. // jack_info("running locate to %d", pkthdr->transport_frame + (pkthdr->latency)*nframes);
  153. // }
  154. if (local_trans_state != JackTransportRolling)
  155. jack_transport_start (netj->client);
  156. break;
  157. case JackTransportLooping:
  158. break;
  159. }
  160. }
  161. render_payload_to_jack_ports (netj->bitdepth, packet_bufX, netj->net_period_down, netj->capture_ports, netj->capture_srcs, nframes, netj->dont_htonl_floats );
  162. packet_cache_release_packet(global_packcache, netj->expected_framecnt );
  163. return 0;
  164. }
  165. static int
  166. net_driver_write (net_driver_t* driver, jack_nframes_t nframes)
  167. {
  168. netjack_driver_state_t *netj = &(driver->netj);
  169. int sync_state = (driver->engine->control->sync_remain <= 1);;
  170. uint32_t *packet_buf, *packet_bufX;
  171. int packet_size = get_sample_size(netj->bitdepth) * netj->playback_channels * netj->net_period_up + sizeof(jacknet_packet_header);
  172. jacknet_packet_header *pkthdr;
  173. packet_buf = alloca(packet_size);
  174. pkthdr = (jacknet_packet_header *)packet_buf;
  175. if( netj->running_free ) {
  176. return 0;
  177. }
  178. // offset packet_bufX by the packetheader.
  179. packet_bufX = packet_buf + sizeof(jacknet_packet_header) / sizeof(jack_default_audio_sample_t);
  180. pkthdr->sync_state = sync_state;
  181. pkthdr->latency = netj->time_to_deadline;
  182. //printf( "time to deadline = %d goodness=%d\n", (int)netj->time_to_deadline, netj->deadline_goodness );
  183. pkthdr->framecnt = netj->expected_framecnt;
  184. render_jack_ports_to_payload(netj->bitdepth, netj->playback_ports, netj->playback_srcs, nframes, packet_bufX, netj->net_period_up, netj->dont_htonl_floats );
  185. packet_header_hton(pkthdr);
  186. if (netj->srcaddress_valid)
  187. {
  188. int r;
  189. #ifndef MSG_CONFIRM
  190. static const int flag = 0;
  191. #else
  192. static const int flag = MSG_CONFIRM;
  193. #endif
  194. if (netj->reply_port)
  195. netj->syncsource_address.sin_port = htons(netj->reply_port);
  196. for( r=0; r<netj->redundancy; r++ )
  197. netjack_sendto(netj->outsockfd, (char *)packet_buf, packet_size,
  198. flag, (struct sockaddr*)&(netj->syncsource_address), sizeof(struct sockaddr_in), netj->mtu);
  199. }
  200. return 0;
  201. }
  202. static int
  203. net_driver_attach (net_driver_t *driver)
  204. {
  205. netjack_driver_state_t *netj = &( driver->netj );
  206. driver->engine->set_buffer_size (driver->engine, netj->period_size);
  207. driver->engine->set_sample_rate (driver->engine, netj->sample_rate);
  208. netjack_attach( netj );
  209. return 0;
  210. }
  211. static int
  212. net_driver_detach (net_driver_t *driver)
  213. {
  214. netjack_driver_state_t *netj = &( driver->netj );
  215. if (driver->engine == 0)
  216. return 0;
  217. netjack_detach( netj );
  218. return 0;
  219. }
  220. static void
  221. net_driver_delete (net_driver_t *driver)
  222. {
  223. jack_driver_nt_finish ((jack_driver_nt_t *) driver);
  224. free (driver);
  225. }
  226. static jack_driver_t *
  227. net_driver_new (jack_client_t * client,
  228. char *name,
  229. unsigned int capture_ports,
  230. unsigned int playback_ports,
  231. unsigned int capture_ports_midi,
  232. unsigned int playback_ports_midi,
  233. jack_nframes_t sample_rate,
  234. jack_nframes_t period_size,
  235. unsigned int listen_port,
  236. unsigned int transport_sync,
  237. unsigned int resample_factor,
  238. unsigned int resample_factor_up,
  239. unsigned int bitdepth,
  240. unsigned int use_autoconfig,
  241. unsigned int latency,
  242. unsigned int redundancy,
  243. int dont_htonl_floats,
  244. int always_deadline)
  245. {
  246. net_driver_t * driver;
  247. jack_info ("creating net driver ... %s|%" PRIu32 "|%" PRIu32
  248. "|%u|%u|%u|transport_sync:%u", name, sample_rate, period_size, listen_port,
  249. capture_ports, playback_ports, transport_sync);
  250. driver = (net_driver_t *) calloc (1, sizeof (net_driver_t));
  251. jack_driver_nt_init ((jack_driver_nt_t *) driver);
  252. driver->write = (JackDriverWriteFunction) net_driver_write;
  253. driver->read = (JackDriverReadFunction) net_driver_read;
  254. driver->null_cycle = (JackDriverNullCycleFunction) net_driver_null_cycle;
  255. driver->nt_attach = (JackDriverNTAttachFunction) net_driver_attach;
  256. driver->nt_detach = (JackDriverNTDetachFunction) net_driver_detach;
  257. driver->nt_bufsize = (JackDriverNTBufSizeFunction) net_driver_bufsize;
  258. driver->nt_run_cycle = (JackDriverNTRunCycleFunction) net_driver_run_cycle;
  259. driver->last_wait_ust = 0;
  260. driver->engine = NULL;
  261. netjack_driver_state_t *netj = &(driver->netj);
  262. netjack_init ( netj,
  263. client,
  264. name,
  265. capture_ports,
  266. playback_ports,
  267. capture_ports_midi,
  268. playback_ports_midi,
  269. sample_rate,
  270. period_size,
  271. listen_port,
  272. transport_sync,
  273. resample_factor,
  274. resample_factor_up,
  275. bitdepth,
  276. use_autoconfig,
  277. latency,
  278. redundancy,
  279. dont_htonl_floats,
  280. always_deadline );
  281. netjack_startup( netj );
  282. jack_info ("netjack: period : up: %d / dn: %d", netj->net_period_up, netj->net_period_down);
  283. jack_info ("netjack: framerate: %d", netj->sample_rate);
  284. jack_info ("netjack: audio : cap: %d / pbk: %d)", netj->capture_channels_audio, netj->playback_channels_audio);
  285. jack_info ("netjack: midi : cap: %d / pbk: %d)", netj->capture_channels_midi, netj->playback_channels_midi);
  286. jack_info ("netjack: buffsize : rx: %d)", netj->rx_bufsize);
  287. return (jack_driver_t *) driver;
  288. }
  289. /* DRIVER "PLUGIN" INTERFACE */
  290. jack_driver_desc_t *
  291. driver_get_descriptor ()
  292. {
  293. jack_driver_desc_t * desc;
  294. jack_driver_param_desc_t * params;
  295. unsigned int i;
  296. desc = calloc (1, sizeof (jack_driver_desc_t));
  297. strcpy (desc->name, "net");
  298. desc->nparams = 17;
  299. params = calloc (desc->nparams, sizeof (jack_driver_param_desc_t));
  300. i = 0;
  301. strcpy (params[i].name, "inchannels");
  302. params[i].character = 'i';
  303. params[i].type = JackDriverParamUInt;
  304. params[i].value.ui = 2U;
  305. strcpy (params[i].short_desc, "Number of capture channels (defaults to 2)");
  306. strcpy (params[i].long_desc, params[i].short_desc);
  307. i++;
  308. strcpy (params[i].name, "outchannels");
  309. params[i].character = 'o';
  310. params[i].type = JackDriverParamUInt;
  311. params[i].value.ui = 2U;
  312. strcpy (params[i].short_desc, "Number of playback channels (defaults to 2)");
  313. strcpy (params[i].long_desc, params[i].short_desc);
  314. i++;
  315. strcpy (params[i].name, "midi inchannels");
  316. params[i].character = 'I';
  317. params[i].type = JackDriverParamUInt;
  318. params[i].value.ui = 1U;
  319. strcpy (params[i].short_desc, "Number of midi capture channels (defaults to 1)");
  320. strcpy (params[i].long_desc, params[i].short_desc);
  321. i++;
  322. strcpy (params[i].name, "midi outchannels");
  323. params[i].character = 'O';
  324. params[i].type = JackDriverParamUInt;
  325. params[i].value.ui = 1U;
  326. strcpy (params[i].short_desc, "Number of midi playback channels (defaults to 1)");
  327. strcpy (params[i].long_desc, params[i].short_desc);
  328. i++;
  329. strcpy (params[i].name, "rate");
  330. params[i].character = 'r';
  331. params[i].type = JackDriverParamUInt;
  332. params[i].value.ui = 48000U;
  333. strcpy (params[i].short_desc, "Sample rate");
  334. strcpy (params[i].long_desc, params[i].short_desc);
  335. i++;
  336. strcpy (params[i].name, "period");
  337. params[i].character = 'p';
  338. params[i].type = JackDriverParamUInt;
  339. params[i].value.ui = 1024U;
  340. strcpy (params[i].short_desc, "Frames per period");
  341. strcpy (params[i].long_desc, params[i].short_desc);
  342. i++;
  343. strcpy (params[i].name, "listen-port");
  344. params[i].character = 'l';
  345. params[i].type = JackDriverParamUInt;
  346. params[i].value.ui = 3000U;
  347. strcpy (params[i].short_desc,
  348. "The socket port we are listening on for sync packets");
  349. strcpy (params[i].long_desc, params[i].short_desc);
  350. i++;
  351. strcpy (params[i].name, "factor");
  352. params[i].character = 'f';
  353. params[i].type = JackDriverParamUInt;
  354. params[i].value.ui = 1U;
  355. strcpy (params[i].short_desc,
  356. "Factor for sample rate reduction");
  357. strcpy (params[i].long_desc, params[i].short_desc);
  358. i++;
  359. strcpy (params[i].name, "upstream-factor");
  360. params[i].character = 'u';
  361. params[i].type = JackDriverParamUInt;
  362. params[i].value.ui = 0U;
  363. strcpy (params[i].short_desc,
  364. "Factor for sample rate reduction on the upstream");
  365. strcpy (params[i].long_desc, params[i].short_desc);
  366. i++;
  367. strcpy (params[i].name, "celt");
  368. params[i].character = 'c';
  369. params[i].type = JackDriverParamUInt;
  370. params[i].value.ui = 0U;
  371. strcpy (params[i].short_desc,
  372. "sets celt encoding and number of bytes per channel");
  373. strcpy (params[i].long_desc, params[i].short_desc);
  374. i++;
  375. strcpy (params[i].name, "bit-depth");
  376. params[i].character = 'b';
  377. params[i].type = JackDriverParamUInt;
  378. params[i].value.ui = 0U;
  379. strcpy (params[i].short_desc,
  380. "Sample bit-depth (0 for float, 8 for 8bit and 16 for 16bit)");
  381. strcpy (params[i].long_desc, params[i].short_desc);
  382. i++;
  383. strcpy (params[i].name, "transport-sync");
  384. params[i].character = 't';
  385. params[i].type = JackDriverParamUInt;
  386. params[i].value.ui = 1U;
  387. strcpy (params[i].short_desc,
  388. "Whether to slave the transport to the master transport");
  389. strcpy (params[i].long_desc, params[i].short_desc);
  390. i++;
  391. strcpy (params[i].name, "autoconf");
  392. params[i].character = 'a';
  393. params[i].type = JackDriverParamUInt;
  394. params[i].value.ui = 1U;
  395. strcpy (params[i].short_desc,
  396. "Whether to use Autoconfig, or just start.");
  397. strcpy (params[i].long_desc, params[i].short_desc);
  398. i++;
  399. strcpy (params[i].name, "latency");
  400. params[i].character = 'L';
  401. params[i].type = JackDriverParamUInt;
  402. params[i].value.ui = 5U;
  403. strcpy (params[i].short_desc,
  404. "Latency setting");
  405. strcpy (params[i].long_desc, params[i].short_desc);
  406. i++;
  407. strcpy (params[i].name, "redundancy");
  408. params[i].character = 'R';
  409. params[i].type = JackDriverParamUInt;
  410. params[i].value.ui = 1U;
  411. strcpy (params[i].short_desc,
  412. "Send packets N times");
  413. strcpy (params[i].long_desc, params[i].short_desc);
  414. i++;
  415. strcpy (params[i].name, "no-htonl");
  416. params[i].character = 'H';
  417. params[i].type = JackDriverParamUInt;
  418. params[i].value.ui = 0U;
  419. strcpy (params[i].short_desc,
  420. "Dont convert samples to network byte order.");
  421. strcpy (params[i].long_desc, params[i].short_desc);
  422. i++;
  423. strcpy (params[i].name, "always-deadline");
  424. params[i].character = 'D';
  425. params[i].type = JackDriverParamUInt;
  426. params[i].value.ui = 0U;
  427. strcpy (params[i].short_desc,
  428. "Always wait until deadline");
  429. strcpy (params[i].long_desc, params[i].short_desc);
  430. desc->params = params;
  431. return desc;
  432. }
  433. const char driver_client_name[] = "net_pcm";
  434. jack_driver_t *
  435. driver_initialize (jack_client_t *client, const JSList * params)
  436. {
  437. jack_nframes_t sample_rate = 48000;
  438. jack_nframes_t resample_factor = 1;
  439. jack_nframes_t period_size = 1024;
  440. unsigned int capture_ports = 2;
  441. unsigned int playback_ports = 2;
  442. unsigned int capture_ports_midi = 1;
  443. unsigned int playback_ports_midi = 1;
  444. unsigned int listen_port = 3000;
  445. unsigned int resample_factor_up = 0;
  446. unsigned int bitdepth = 0;
  447. unsigned int handle_transport_sync = 1;
  448. unsigned int use_autoconfig = 1;
  449. unsigned int latency = 5;
  450. unsigned int redundancy = 1;
  451. int dont_htonl_floats = 0;
  452. int always_deadline = 0;
  453. const JSList * node;
  454. const jack_driver_param_t * param;
  455. for (node = params; node; node = jack_slist_next (node)) {
  456. param = (const jack_driver_param_t *) node->data;
  457. switch (param->character) {
  458. case 'i':
  459. capture_ports = param->value.ui;
  460. break;
  461. case 'o':
  462. playback_ports = param->value.ui;
  463. break;
  464. case 'I':
  465. capture_ports_midi = param->value.ui;
  466. break;
  467. case 'O':
  468. playback_ports_midi = param->value.ui;
  469. break;
  470. case 'r':
  471. sample_rate = param->value.ui;
  472. break;
  473. case 'p':
  474. period_size = param->value.ui;
  475. break;
  476. case 'l':
  477. listen_port = param->value.ui;
  478. break;
  479. case 'f':
  480. #if HAVE_SAMPLERATE
  481. resample_factor = param->value.ui;
  482. #else
  483. printf( "not built with libsamplerate support\n" );
  484. exit(10);
  485. #endif
  486. break;
  487. case 'u':
  488. #if HAVE_SAMPLERATE
  489. resample_factor_up = param->value.ui;
  490. #else
  491. printf( "not built with libsamplerate support\n" );
  492. exit(10);
  493. #endif
  494. break;
  495. case 'b':
  496. bitdepth = param->value.ui;
  497. break;
  498. case 'c':
  499. #if HAVE_CELT
  500. bitdepth = 1000;
  501. resample_factor = param->value.ui;
  502. #else
  503. printf( "not built with celt support\n" );
  504. exit(10);
  505. #endif
  506. break;
  507. case 't':
  508. handle_transport_sync = param->value.ui;
  509. break;
  510. case 'a':
  511. use_autoconfig = param->value.ui;
  512. break;
  513. case 'L':
  514. latency = param->value.ui;
  515. break;
  516. case 'R':
  517. redundancy = param->value.ui;
  518. break;
  519. case 'H':
  520. dont_htonl_floats = param->value.ui;
  521. break;
  522. case 'D':
  523. always_deadline = param->value.ui;
  524. break;
  525. }
  526. }
  527. return net_driver_new (client, "net_pcm", capture_ports, playback_ports,
  528. capture_ports_midi, playback_ports_midi,
  529. sample_rate, period_size,
  530. listen_port, handle_transport_sync,
  531. resample_factor, resample_factor_up, bitdepth,
  532. use_autoconfig, latency, redundancy,
  533. dont_htonl_floats, always_deadline);
  534. }
  535. void
  536. driver_finish (jack_driver_t *driver)
  537. {
  538. net_driver_delete ((net_driver_t *) driver);
  539. }