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.

657 lines
20KB

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