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.

952 lines
33KB

  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 <sys/socket.h>
  34. #include <netinet/in.h>
  35. #include <samplerate.h>
  36. #if HAVE_CELT
  37. #include <celt/celt.h>
  38. #endif
  39. #include "net_driver.h"
  40. #include "netjack_packet.h"
  41. #undef DEBUG_WAKEUP
  42. #define MIN(x,y) ((x)<(y) ? (x) : (y))
  43. static int sync_state = TRUE;
  44. static jack_transport_state_t last_transport_state;
  45. /* This is set upon reading a packetand will be
  46. * written into the pkthdr of an outgoing packet */
  47. static int framecnt;
  48. static int
  49. net_driver_sync_cb(jack_transport_state_t state, jack_position_t *pos, net_driver_t *driver)
  50. {
  51. int retval = sync_state;
  52. if (state == JackTransportStarting && last_transport_state != JackTransportStarting) {
  53. retval = 0;
  54. }
  55. if (state == JackTransportStarting)
  56. jack_info("Starting sync_state = %d", sync_state);
  57. last_transport_state = state;
  58. return retval;
  59. }
  60. static jack_nframes_t
  61. net_driver_wait (net_driver_t *driver, int extra_fd, int *status, float *delayed_usecs)
  62. {
  63. // ok... we wait for a packet on the socket
  64. // TODO:
  65. // we should be able to run freely if the sync source is not transmitting
  66. // especially we should be able to compensate for packet loss somehow.
  67. // but lets try this out first.
  68. //
  69. // on packet loss we should either detect an xrun or just continue running when we
  70. // think, that the sync source is not running anymore.
  71. //socklen_t address_size = sizeof (struct sockaddr_in);
  72. //int len;
  73. int we_have_the_expected_frame = 0;
  74. jack_nframes_t next_frame_avail;
  75. jacknet_packet_header *pkthdr = (jacknet_packet_header *) driver->rx_buf;
  76. if( !driver->next_deadline_valid ) {
  77. if( driver->latency == 0 )
  78. // for full sync mode... always wait for packet.
  79. driver->next_deadline = jack_get_microseconds() + 500*driver->period_usecs;
  80. else if( driver->latency == 1 )
  81. // for normal 1 period latency mode, only 1 period for dealine.
  82. driver->next_deadline = jack_get_microseconds() + 1*driver->period_usecs;
  83. else
  84. driver->next_deadline = jack_get_microseconds() + 2*driver->period_usecs;
  85. driver->next_deadline_valid = 1;
  86. } else {
  87. driver->next_deadline += driver->period_usecs;
  88. }
  89. while(1) {
  90. if( ! netjack_poll_deadline( driver->sockfd, driver->next_deadline ) )
  91. break;
  92. packet_cache_drain_socket( global_packcache, driver->sockfd );
  93. if( packet_cache_get_next_available_framecnt( global_packcache, driver->expected_framecnt, &next_frame_avail) ) {
  94. if( next_frame_avail == driver->expected_framecnt ) {
  95. we_have_the_expected_frame = 1;
  96. break;
  97. }
  98. //printf( "next frame = %d (exp: %d) \n", next_frame_avail, driver->expected_framecnt );
  99. }
  100. }
  101. driver->running_free = 0;
  102. if( we_have_the_expected_frame ) {
  103. packet_cache_retreive_packet( global_packcache, driver->expected_framecnt, (char *) driver->rx_buf, driver->rx_bufsize );
  104. driver->packet_data_valid = 1;
  105. //printf( "ok... %d\n", driver->expected_framecnt );
  106. } else {
  107. // bah... the packet is not there.
  108. // either
  109. // - it got lost.
  110. // - its late
  111. // - sync source is not sending anymore.
  112. // lets check if we have the next packets, we will just run a cycle without data.
  113. // in that case.
  114. if( packet_cache_get_next_available_framecnt( global_packcache, driver->expected_framecnt, &next_frame_avail) )
  115. {
  116. jack_nframes_t offset = next_frame_avail - driver->expected_framecnt;
  117. if( offset < driver->resync_threshold ) {
  118. // ok. dont do nothing. we will run without data.
  119. // this seems to be one or 2 lost packets.
  120. driver->packet_data_valid = 0;
  121. //printf( "lost packet... %d\n", driver->expected_framecnt );
  122. } else {
  123. // the diff is too high. but we have a packet.
  124. // lets resync.
  125. driver->expected_framecnt = next_frame_avail;
  126. packet_cache_retreive_packet( global_packcache, driver->expected_framecnt, (char *) driver->rx_buf, driver->rx_bufsize );
  127. driver->next_deadline_valid = 0;
  128. driver->packet_data_valid = 1;
  129. //printf( "resync... expected: %d, offset=%d\n", driver->expected_framecnt, offset );
  130. }
  131. } else {
  132. // no packets in buffer.
  133. driver->packet_data_valid = 0;
  134. if( driver->num_lost_packets < 3 ) {
  135. // increase deadline.
  136. driver->next_deadline += driver->period_usecs/4;
  137. // might be lost packets.
  138. // continue
  139. } else if( (driver->num_lost_packets <= 10) ) {
  140. // lets try adjusting the deadline, for some packets, we might have just ran 2 fast.
  141. } else {
  142. // give up. lets run freely.
  143. driver->running_free = 1;
  144. // But now we can check for any new frame available.
  145. if( packet_cache_get_next_available_framecnt( global_packcache, 0, &next_frame_avail) ) {
  146. driver->expected_framecnt = next_frame_avail;
  147. packet_cache_retreive_packet( global_packcache, driver->expected_framecnt, (char *) driver->rx_buf, driver->rx_bufsize );
  148. driver->next_deadline_valid = 0;
  149. driver->packet_data_valid = 1;
  150. driver->running_free = 1;
  151. //printf( "resync after freerun... %d\n", driver->expected_framecnt );
  152. }
  153. }
  154. //printf( "free... %d\n", driver->expected_framecnt );
  155. }
  156. }
  157. if( !driver->packet_data_valid )
  158. driver->num_lost_packets += 1;
  159. else {
  160. driver->num_lost_packets = 0;
  161. packet_header_ntoh (pkthdr);
  162. }
  163. framecnt = driver->expected_framecnt;
  164. driver->expected_framecnt += 1;
  165. driver->last_wait_ust = jack_get_microseconds ();
  166. driver->engine->transport_cycle_start (driver->engine, driver->last_wait_ust);
  167. /* this driver doesn't work so well if we report a delay */
  168. /* XXX: this might not be the case anymore */
  169. *delayed_usecs = 0; /* lie about it */
  170. *status = 0;
  171. return driver->period_size;
  172. }
  173. static inline int
  174. net_driver_run_cycle (net_driver_t *driver)
  175. {
  176. jack_engine_t *engine = driver->engine;
  177. int wait_status = -1;
  178. float delayed_usecs;
  179. jack_nframes_t nframes = net_driver_wait (driver, -1, &wait_status,
  180. &delayed_usecs);
  181. // XXX: xrun code removed.
  182. // especially with celt there are no real xruns anymore.
  183. // things are different on the net.
  184. if (wait_status == 0)
  185. return engine->run_cycle (engine, nframes, delayed_usecs);
  186. if (wait_status < 0)
  187. return -1;
  188. else
  189. return 0;
  190. }
  191. static int
  192. net_driver_null_cycle (net_driver_t* driver, jack_nframes_t nframes)
  193. {
  194. // TODO: talk to paul about this.
  195. // do i wait here ?
  196. // just sending out a packet marked with junk ?
  197. //int rx_size = get_sample_size(driver->bitdepth) * driver->capture_channels * driver->net_period_down + sizeof(jacknet_packet_header);
  198. int tx_size = get_sample_size(driver->bitdepth) * driver->playback_channels * driver->net_period_up + sizeof(jacknet_packet_header);
  199. unsigned int *packet_buf, *packet_bufX;
  200. packet_buf = alloca( tx_size);
  201. jacknet_packet_header *tx_pkthdr = (jacknet_packet_header *)packet_buf;
  202. jacknet_packet_header *rx_pkthdr = (jacknet_packet_header *)driver->rx_buf;
  203. //framecnt = rx_pkthdr->framecnt;
  204. driver->reply_port = rx_pkthdr->reply_port;
  205. // offset packet_bufX by the packetheader.
  206. packet_bufX = packet_buf + sizeof(jacknet_packet_header) / sizeof(jack_default_audio_sample_t);
  207. tx_pkthdr->sync_state = (driver->engine->control->sync_remain <= 1);
  208. tx_pkthdr->framecnt = framecnt;
  209. // memset 0 the payload.
  210. int payload_size = get_sample_size(driver->bitdepth) * driver->playback_channels * driver->net_period_up;
  211. memset(packet_bufX, 0, payload_size);
  212. packet_header_hton(tx_pkthdr);
  213. if (driver->srcaddress_valid)
  214. if (driver->reply_port)
  215. driver->syncsource_address.sin_port = htons(driver->reply_port);
  216. netjack_sendto(driver->outsockfd, (char *)packet_buf, tx_size,
  217. 0, (struct sockaddr*)&driver->syncsource_address, sizeof(struct sockaddr_in), driver->mtu);
  218. return 0;
  219. }
  220. static int
  221. net_driver_bufsize (net_driver_t* driver, jack_nframes_t nframes)
  222. {
  223. if (nframes != driver->period_size)
  224. return EINVAL;
  225. return 0;
  226. }
  227. static int
  228. net_driver_read (net_driver_t* driver, jack_nframes_t nframes)
  229. {
  230. jack_position_t local_trans_pos;
  231. jack_transport_state_t local_trans_state;
  232. unsigned int *packet_buf, *packet_bufX;
  233. if( ! driver->packet_data_valid ) {
  234. render_payload_to_jack_ports (driver->bitdepth, NULL, driver->net_period_down, driver->capture_ports, driver->capture_srcs, nframes);
  235. return 0;
  236. }
  237. packet_buf = driver->rx_buf;
  238. jacknet_packet_header *pkthdr = (jacknet_packet_header *)packet_buf;
  239. packet_bufX = packet_buf + sizeof(jacknet_packet_header) / sizeof(jack_default_audio_sample_t);
  240. //packet_header_ntoh(pkthdr);
  241. // fill framecnt from pkthdr.
  242. //if (pkthdr->framecnt != framecnt + 1)
  243. // jack_info("bogus framecount %d", pkthdr->framecnt);
  244. framecnt = pkthdr->framecnt;
  245. driver->reply_port = pkthdr->reply_port;
  246. driver->latency = pkthdr->latency;
  247. // Special handling for latency=0
  248. if( driver->latency == 0 )
  249. driver->resync_threshold = 0;
  250. else
  251. driver->resync_threshold = MIN( 15, pkthdr->latency-1 );
  252. // check whether, we should handle the transport sync stuff, or leave trnasports untouched.
  253. if (driver->handle_transport_sync) {
  254. // read local transport info....
  255. local_trans_state = jack_transport_query(driver->client, &local_trans_pos);
  256. // Now check if we have to start or stop local transport to sync to remote...
  257. switch (pkthdr->transport_state) {
  258. case JackTransportStarting:
  259. // the master transport is starting... so we set our reply to the sync_callback;
  260. if (local_trans_state == JackTransportStopped) {
  261. jack_transport_start(driver->client);
  262. last_transport_state = JackTransportStopped;
  263. sync_state = FALSE;
  264. jack_info("locally stopped... starting...");
  265. }
  266. if (local_trans_pos.frame != (pkthdr->transport_frame + (pkthdr->latency) * nframes)) {
  267. jack_transport_locate(driver->client, (pkthdr->transport_frame + (pkthdr->latency) * nframes));
  268. last_transport_state = JackTransportRolling;
  269. sync_state = FALSE;
  270. jack_info("starting locate to %d", pkthdr->transport_frame + (pkthdr->latency)*nframes);
  271. }
  272. break;
  273. case JackTransportStopped:
  274. sync_state = TRUE;
  275. if (local_trans_pos.frame != (pkthdr->transport_frame)) {
  276. jack_transport_locate(driver->client, (pkthdr->transport_frame));
  277. jack_info("transport is stopped locate to %d", pkthdr->transport_frame);
  278. }
  279. if (local_trans_state != JackTransportStopped)
  280. jack_transport_stop(driver->client);
  281. break;
  282. case JackTransportRolling:
  283. sync_state = TRUE;
  284. // if(local_trans_pos.frame != (pkthdr->transport_frame + (pkthdr->latency) * nframes)) {
  285. // jack_transport_locate(driver->client, (pkthdr->transport_frame + (pkthdr->latency + 2) * nframes));
  286. // jack_info("running locate to %d", pkthdr->transport_frame + (pkthdr->latency)*nframes);
  287. // }
  288. if (local_trans_state != JackTransportRolling)
  289. jack_transport_start (driver->client);
  290. break;
  291. case JackTransportLooping:
  292. break;
  293. }
  294. }
  295. render_payload_to_jack_ports (driver->bitdepth, packet_bufX, driver->net_period_down, driver->capture_ports, driver->capture_srcs, nframes);
  296. return 0;
  297. }
  298. static int
  299. net_driver_write (net_driver_t* driver, jack_nframes_t nframes)
  300. {
  301. uint32_t *packet_buf, *packet_bufX;
  302. int packet_size = get_sample_size(driver->bitdepth) * driver->playback_channels * driver->net_period_up + sizeof(jacknet_packet_header);
  303. jacknet_packet_header *pkthdr;
  304. packet_buf = alloca(packet_size);
  305. pkthdr = (jacknet_packet_header *)packet_buf;
  306. if( driver->running_free )
  307. return 0;
  308. // offset packet_bufX by the packetheader.
  309. packet_bufX = packet_buf + sizeof(jacknet_packet_header) / sizeof(jack_default_audio_sample_t);
  310. pkthdr->sync_state = (driver->engine->control->sync_remain <= 1);
  311. pkthdr->framecnt = framecnt;
  312. render_jack_ports_to_payload(driver->bitdepth, driver->playback_ports, driver->playback_srcs, nframes, packet_bufX, driver->net_period_up);
  313. packet_header_hton(pkthdr);
  314. if (driver->srcaddress_valid)
  315. if (driver->reply_port)
  316. driver->syncsource_address.sin_port = htons(driver->reply_port);
  317. netjack_sendto(driver->outsockfd, (char *)packet_buf, packet_size,
  318. 0, (struct sockaddr*)&driver->syncsource_address, sizeof(struct sockaddr_in), driver->mtu);
  319. return 0;
  320. }
  321. static int
  322. net_driver_attach (net_driver_t *driver)
  323. {
  324. //puts ("net_driver_attach");
  325. jack_port_t * port;
  326. char buf[32];
  327. unsigned int chn;
  328. int port_flags;
  329. driver->engine->set_buffer_size (driver->engine, driver->period_size);
  330. driver->engine->set_sample_rate (driver->engine, driver->sample_rate);
  331. if (driver->handle_transport_sync)
  332. jack_set_sync_callback(driver->client, (JackSyncCallback) net_driver_sync_cb, driver);
  333. port_flags = JackPortIsOutput | JackPortIsPhysical | JackPortIsTerminal;
  334. for (chn = 0; chn < driver->capture_channels_audio; chn++) {
  335. snprintf (buf, sizeof(buf) - 1, "capture_%u", chn + 1);
  336. port = jack_port_register (driver->client, buf,
  337. JACK_DEFAULT_AUDIO_TYPE,
  338. port_flags, 0);
  339. if (!port) {
  340. jack_error ("NET: cannot register port for %s", buf);
  341. break;
  342. }
  343. driver->capture_ports =
  344. jack_slist_append (driver->capture_ports, port);
  345. if( driver->bitdepth == 1000 ) {
  346. #if HAVE_CELT
  347. // XXX: memory leak
  348. CELTMode *celt_mode = celt_mode_create( driver->sample_rate, 1, driver->period_size, NULL );
  349. driver->capture_srcs = jack_slist_append(driver->capture_srcs, celt_decoder_create( celt_mode ) );
  350. #endif
  351. } else {
  352. driver->capture_srcs = jack_slist_append(driver->capture_srcs, src_new(SRC_LINEAR, 1, NULL));
  353. }
  354. }
  355. for (chn = driver->capture_channels_audio; chn < driver->capture_channels; chn++) {
  356. snprintf (buf, sizeof(buf) - 1, "capture_%u", chn + 1);
  357. port = jack_port_register (driver->client, buf,
  358. JACK_DEFAULT_MIDI_TYPE,
  359. port_flags, 0);
  360. if (!port) {
  361. jack_error ("NET: cannot register port for %s", buf);
  362. break;
  363. }
  364. driver->capture_ports =
  365. jack_slist_append (driver->capture_ports, port);
  366. //driver->capture_srcs = jack_slist_append(driver->capture_srcs, src_new(SRC_LINEAR, 1, NULL));
  367. }
  368. port_flags = JackPortIsInput | JackPortIsPhysical | JackPortIsTerminal;
  369. for (chn = 0; chn < driver->playback_channels_audio; chn++) {
  370. snprintf (buf, sizeof(buf) - 1, "playback_%u", chn + 1);
  371. port = jack_port_register (driver->client, buf,
  372. JACK_DEFAULT_AUDIO_TYPE,
  373. port_flags, 0);
  374. if (!port) {
  375. jack_error ("NET: cannot register port for %s", buf);
  376. break;
  377. }
  378. driver->playback_ports =
  379. jack_slist_append (driver->playback_ports, port);
  380. if( driver->bitdepth == 1000 ) {
  381. #if HAVE_CELT
  382. // XXX: memory leak
  383. CELTMode *celt_mode = celt_mode_create( driver->sample_rate, 1, driver->period_size, NULL );
  384. driver->playback_srcs = jack_slist_append(driver->playback_srcs, celt_encoder_create( celt_mode ) );
  385. #endif
  386. } else {
  387. driver->playback_srcs = jack_slist_append(driver->playback_srcs, src_new(SRC_LINEAR, 1, NULL));
  388. }
  389. }
  390. for (chn = driver->playback_channels_audio; chn < driver->playback_channels; chn++) {
  391. snprintf (buf, sizeof(buf) - 1, "playback_%u", chn + 1);
  392. port = jack_port_register (driver->client, buf,
  393. JACK_DEFAULT_MIDI_TYPE,
  394. port_flags, 0);
  395. if (!port) {
  396. jack_error ("NET: cannot register port for %s", buf);
  397. break;
  398. }
  399. driver->playback_ports =
  400. jack_slist_append (driver->playback_ports, port);
  401. //driver->playback_srcs = jack_slist_append(driver->playback_srcs, src_new(SRC_LINEAR, 1, NULL));
  402. }
  403. jack_activate (driver->client);
  404. return 0;
  405. }
  406. static int
  407. net_driver_detach (net_driver_t *driver)
  408. {
  409. JSList * node;
  410. if (driver->engine == 0)
  411. return 0;
  412. //#if 0
  413. for (node = driver->capture_ports; node; node = jack_slist_next (node))
  414. jack_port_unregister (driver->client,
  415. ((jack_port_t *) node->data));
  416. jack_slist_free (driver->capture_ports);
  417. driver->capture_ports = NULL;
  418. //#endif
  419. for (node = driver->playback_ports; node; node = jack_slist_next (node))
  420. jack_port_unregister (driver->client,
  421. ((jack_port_t *) node->data));
  422. jack_slist_free (driver->playback_ports);
  423. driver->playback_ports = NULL;
  424. return 0;
  425. }
  426. static void
  427. net_driver_delete (net_driver_t *driver)
  428. {
  429. jack_driver_nt_finish ((jack_driver_nt_t *) driver);
  430. free (driver);
  431. }
  432. static jack_driver_t *
  433. net_driver_new (jack_client_t * client,
  434. char *name,
  435. unsigned int capture_ports,
  436. unsigned int playback_ports,
  437. unsigned int capture_ports_midi,
  438. unsigned int playback_ports_midi,
  439. jack_nframes_t sample_rate,
  440. jack_nframes_t period_size,
  441. unsigned int listen_port,
  442. unsigned int transport_sync,
  443. unsigned int resample_factor,
  444. unsigned int resample_factor_up,
  445. unsigned int bitdepth)
  446. {
  447. net_driver_t * driver;
  448. int first_pack_len;
  449. struct sockaddr_in address;
  450. jack_info ("creating net driver ... %s|%" PRIu32 "|%" PRIu32
  451. "|%u|%u|%u|transport_sync:%u", name, sample_rate, period_size, listen_port,
  452. capture_ports, playback_ports, transport_sync);
  453. driver = (net_driver_t *) calloc (1, sizeof (net_driver_t));
  454. jack_driver_nt_init ((jack_driver_nt_t *) driver);
  455. driver->write = (JackDriverWriteFunction) net_driver_write;
  456. driver->read = (JackDriverReadFunction) net_driver_read;
  457. driver->null_cycle = (JackDriverNullCycleFunction) net_driver_null_cycle;
  458. driver->nt_attach = (JackDriverNTAttachFunction) net_driver_attach;
  459. driver->nt_detach = (JackDriverNTDetachFunction) net_driver_detach;
  460. driver->nt_bufsize = (JackDriverNTBufSizeFunction) net_driver_bufsize;
  461. driver->nt_run_cycle = (JackDriverNTRunCycleFunction) net_driver_run_cycle;
  462. // Fill in driver values.
  463. // might be subject to autoconfig...
  464. // so dont calculate anything with them...
  465. driver->sample_rate = sample_rate;
  466. driver->period_size = period_size;
  467. driver->listen_port = listen_port;
  468. driver->last_wait_ust = 0;
  469. driver->capture_channels = capture_ports + capture_ports_midi;
  470. driver->capture_channels_audio = capture_ports;
  471. driver->capture_channels_midi = capture_ports_midi;
  472. driver->capture_ports = NULL;
  473. driver->playback_channels = playback_ports + playback_ports_midi;
  474. driver->playback_channels_audio = playback_ports;
  475. driver->playback_channels_midi = playback_ports_midi;
  476. driver->playback_ports = NULL;
  477. driver->handle_transport_sync = transport_sync;
  478. driver->client = client;
  479. driver->engine = NULL;
  480. if ((bitdepth != 0) && (bitdepth != 8) && (bitdepth != 16) && (bitdepth != 1000))
  481. {
  482. jack_info ("Invalid bitdepth: %d (8, 16 or 0 for float) !!!", bitdepth);
  483. return NULL;
  484. }
  485. driver->bitdepth = bitdepth;
  486. if (resample_factor_up == 0)
  487. resample_factor_up = resample_factor;
  488. // Now open the socket, and wait for the first packet to arrive...
  489. driver->sockfd = socket (PF_INET, SOCK_DGRAM, 0);
  490. if (driver->sockfd == -1)
  491. {
  492. jack_info ("socket error");
  493. return NULL;
  494. }
  495. address.sin_family = AF_INET;
  496. address.sin_port = htons(driver->listen_port);
  497. address.sin_addr.s_addr = htonl(INADDR_ANY);
  498. if (bind (driver->sockfd, (struct sockaddr *) &address, sizeof (address)) < 0)
  499. {
  500. jack_info("bind error");
  501. return NULL;
  502. }
  503. driver->outsockfd = socket (PF_INET, SOCK_DGRAM, 0);
  504. if (driver->sockfd == -1)
  505. {
  506. jack_info ("socket error");
  507. return NULL;
  508. }
  509. driver->srcaddress_valid = 0;
  510. jacknet_packet_header *first_packet = alloca (sizeof (jacknet_packet_header));
  511. socklen_t address_size = sizeof (struct sockaddr_in);
  512. jack_info ("Waiting for an incoming packet !!!");
  513. jack_info ("*** IMPORTANT *** Dont connect a client to jackd until the driver is attached to a clock source !!!");
  514. // XXX: netjack_poll polls forever.
  515. // thats ok here.
  516. if (netjack_poll (driver->sockfd, 500))
  517. first_pack_len = recvfrom (driver->sockfd, first_packet, sizeof (jacknet_packet_header), 0, (struct sockaddr*) & driver->syncsource_address, &address_size);
  518. else
  519. first_pack_len = 0;
  520. driver->srcaddress_valid = 1;
  521. driver->mtu = 0;
  522. if (first_pack_len == sizeof (jacknet_packet_header))
  523. {
  524. packet_header_ntoh (first_packet);
  525. jack_info ("AutoConfig Override !!!");
  526. if (driver->sample_rate != first_packet->sample_rate)
  527. {
  528. jack_info ("AutoConfig Override: Master JACK sample rate = %d", first_packet->sample_rate);
  529. driver->sample_rate = first_packet->sample_rate;
  530. }
  531. if (driver->period_size != first_packet->period_size)
  532. {
  533. jack_info ("AutoConfig Override: Master JACK period size is %d", first_packet->period_size);
  534. driver->period_size = first_packet->period_size;
  535. }
  536. if (driver->capture_channels_audio != first_packet->capture_channels_audio)
  537. {
  538. jack_info ("AutoConfig Override: capture_channels_audio = %d", first_packet->capture_channels_audio);
  539. driver->capture_channels_audio = first_packet->capture_channels_audio;
  540. }
  541. if (driver->capture_channels_midi != first_packet->capture_channels_midi)
  542. {
  543. jack_info ("AutoConfig Override: capture_channels_midi = %d", first_packet->capture_channels_midi);
  544. driver->capture_channels_midi = first_packet->capture_channels_midi;
  545. }
  546. if (driver->playback_channels_audio != first_packet->playback_channels_audio)
  547. {
  548. jack_info ("AutoConfig Override: playback_channels_audio = %d", first_packet->playback_channels_audio);
  549. driver->playback_channels_audio = first_packet->playback_channels_audio;
  550. }
  551. if (driver->playback_channels_midi != first_packet->playback_channels_midi)
  552. {
  553. jack_info ("AutoConfig Override: playback_channels_midi = %d", first_packet->playback_channels_midi);
  554. driver->playback_channels_midi = first_packet->playback_channels_midi;
  555. }
  556. driver->capture_channels = driver->capture_channels_audio + driver->capture_channels_midi;
  557. driver->playback_channels = driver->playback_channels_audio + driver->playback_channels_midi;
  558. driver->mtu = first_packet->mtu;
  559. jack_info ("MTU is set to %d bytes", first_packet->mtu);
  560. driver->latency = first_packet->latency;
  561. }
  562. // After possible Autoconfig: do all calculations...
  563. driver->period_usecs =
  564. (jack_time_t) floor ((((float) driver->period_size) / (float)driver->sample_rate)
  565. * 1000000.0f);
  566. if( driver->bitdepth == 1000 ) {
  567. // celt mode.
  568. // TODO: this is a hack. But i dont want to change the packet header.
  569. driver->net_period_down = resample_factor;
  570. driver->net_period_up = resample_factor_up;
  571. } else {
  572. driver->net_period_down = (float) driver->period_size / (float) resample_factor;
  573. driver->net_period_up = (float) driver->period_size / (float) resample_factor_up;
  574. }
  575. driver->rx_bufsize = sizeof (jacknet_packet_header) + driver->net_period_down * driver->capture_channels * get_sample_size (driver->bitdepth);
  576. driver->rx_buf = malloc (driver->rx_bufsize);
  577. driver->pkt_buf = malloc (driver->rx_bufsize);
  578. global_packcache = packet_cache_new (driver->latency + 5, driver->rx_bufsize, driver->mtu);
  579. driver->expected_framecnt_valid = 0;
  580. driver->num_lost_packets = 0;
  581. driver->next_deadline_valid = 0;
  582. // Special handling for latency=0
  583. if( driver->latency == 0 )
  584. driver->resync_threshold = 0;
  585. else
  586. driver->resync_threshold = MIN( 15, driver->latency-1 );
  587. driver->running_free = 0;
  588. jack_info ("netjack: period : up: %d / dn: %d", driver->net_period_up, driver->net_period_down);
  589. jack_info ("netjack: framerate: %d", driver->sample_rate);
  590. jack_info ("netjack: audio : cap: %d / pbk: %d)", driver->capture_channels_audio, driver->playback_channels_audio);
  591. jack_info ("netjack: midi : cap: %d / pbk: %d)", driver->capture_channels_midi, driver->playback_channels_midi);
  592. jack_info ("netjack: buffsize : rx: %d)", driver->rx_bufsize);
  593. return (jack_driver_t *) driver;
  594. }
  595. /* DRIVER "PLUGIN" INTERFACE */
  596. jack_driver_desc_t *
  597. driver_get_descriptor ()
  598. {
  599. jack_driver_desc_t * desc;
  600. jack_driver_param_desc_t * params;
  601. unsigned int i;
  602. desc = calloc (1, sizeof (jack_driver_desc_t));
  603. strcpy (desc->name, "net");
  604. desc->nparams = 12;
  605. params = calloc (desc->nparams, sizeof (jack_driver_param_desc_t));
  606. i = 0;
  607. strcpy (params[i].name, "inchannels");
  608. params[i].character = 'i';
  609. params[i].type = JackDriverParamUInt;
  610. params[i].value.ui = 2U;
  611. strcpy (params[i].short_desc, "Number of capture channels (defaults to 2)");
  612. strcpy (params[i].long_desc, params[i].short_desc);
  613. i++;
  614. strcpy (params[i].name, "outchannels");
  615. params[i].character = 'o';
  616. params[i].type = JackDriverParamUInt;
  617. params[i].value.ui = 2U;
  618. strcpy (params[i].short_desc, "Number of playback channels (defaults to 2)");
  619. strcpy (params[i].long_desc, params[i].short_desc);
  620. i++;
  621. strcpy (params[i].name, "midi inchannels");
  622. params[i].character = 'I';
  623. params[i].type = JackDriverParamUInt;
  624. params[i].value.ui = 1U;
  625. strcpy (params[i].short_desc, "Number of midi capture channels (defaults to 1)");
  626. strcpy (params[i].long_desc, params[i].short_desc);
  627. i++;
  628. strcpy (params[i].name, "midi outchannels");
  629. params[i].character = 'O';
  630. params[i].type = JackDriverParamUInt;
  631. params[i].value.ui = 1U;
  632. strcpy (params[i].short_desc, "Number of midi playback channels (defaults to 1)");
  633. strcpy (params[i].long_desc, params[i].short_desc);
  634. i++;
  635. strcpy (params[i].name, "rate");
  636. params[i].character = 'r';
  637. params[i].type = JackDriverParamUInt;
  638. params[i].value.ui = 48000U;
  639. strcpy (params[i].short_desc, "Sample rate");
  640. strcpy (params[i].long_desc, params[i].short_desc);
  641. i++;
  642. strcpy (params[i].name, "period");
  643. params[i].character = 'p';
  644. params[i].type = JackDriverParamUInt;
  645. params[i].value.ui = 1024U;
  646. strcpy (params[i].short_desc, "Frames per period");
  647. strcpy (params[i].long_desc, params[i].short_desc);
  648. i++;
  649. strcpy (params[i].name, "listen-port");
  650. params[i].character = 'l';
  651. params[i].type = JackDriverParamUInt;
  652. params[i].value.ui = 3000U;
  653. strcpy (params[i].short_desc,
  654. "The socket port we are listening on for sync packets");
  655. strcpy (params[i].long_desc, params[i].short_desc);
  656. i++;
  657. strcpy (params[i].name, "factor");
  658. params[i].character = 'f';
  659. params[i].type = JackDriverParamUInt;
  660. params[i].value.ui = 1U;
  661. strcpy (params[i].short_desc,
  662. "Factor for sample rate reduction");
  663. strcpy (params[i].long_desc, params[i].short_desc);
  664. i++;
  665. strcpy (params[i].name, "upstream-factor");
  666. params[i].character = 'u';
  667. params[i].type = JackDriverParamUInt;
  668. params[i].value.ui = 0U;
  669. strcpy (params[i].short_desc,
  670. "Factor for sample rate reduction on the upstream");
  671. strcpy (params[i].long_desc, params[i].short_desc);
  672. i++;
  673. strcpy (params[i].name, "celt");
  674. params[i].character = 'c';
  675. params[i].type = JackDriverParamUInt;
  676. params[i].value.ui = 0U;
  677. strcpy (params[i].short_desc,
  678. "sets celt encoding and number of bytes per channel");
  679. strcpy (params[i].long_desc, params[i].short_desc);
  680. i++;
  681. strcpy (params[i].name, "bit-depth");
  682. params[i].character = 'b';
  683. params[i].type = JackDriverParamUInt;
  684. params[i].value.ui = 0U;
  685. strcpy (params[i].short_desc,
  686. "Sample bit-depth (0 for float, 8 for 8bit and 16 for 16bit)");
  687. strcpy (params[i].long_desc, params[i].short_desc);
  688. i++;
  689. strcpy (params[i].name, "transport-sync");
  690. params[i].character = 't';
  691. params[i].type = JackDriverParamUInt;
  692. params[i].value.ui = 1U;
  693. strcpy (params[i].short_desc,
  694. "Whether to slave the transport to the master transport");
  695. strcpy (params[i].long_desc, params[i].short_desc);
  696. desc->params = params;
  697. return desc;
  698. }
  699. const char driver_client_name[] = "net_pcm";
  700. jack_driver_t *
  701. driver_initialize (jack_client_t *client, const JSList * params)
  702. {
  703. jack_nframes_t sample_rate = 48000;
  704. jack_nframes_t resample_factor = 1;
  705. jack_nframes_t period_size = 1024;
  706. unsigned int capture_ports = 2;
  707. unsigned int playback_ports = 2;
  708. unsigned int capture_ports_midi = 1;
  709. unsigned int playback_ports_midi = 1;
  710. unsigned int listen_port = 3000;
  711. unsigned int resample_factor_up = 0;
  712. unsigned int bitdepth = 0;
  713. unsigned int handle_transport_sync = 1;
  714. const JSList * node;
  715. const jack_driver_param_t * param;
  716. for (node = params; node; node = jack_slist_next (node)) {
  717. param = (const jack_driver_param_t *) node->data;
  718. switch (param->character) {
  719. case 'i':
  720. capture_ports = param->value.ui;
  721. break;
  722. case 'o':
  723. playback_ports = param->value.ui;
  724. break;
  725. case 'I':
  726. capture_ports_midi = param->value.ui;
  727. break;
  728. case 'O':
  729. playback_ports_midi = param->value.ui;
  730. break;
  731. case 'r':
  732. sample_rate = param->value.ui;
  733. break;
  734. case 'p':
  735. period_size = param->value.ui;
  736. break;
  737. case 'l':
  738. listen_port = param->value.ui;
  739. break;
  740. case 'f':
  741. resample_factor = param->value.ui;
  742. break;
  743. case 'u':
  744. resample_factor_up = param->value.ui;
  745. break;
  746. case 'b':
  747. bitdepth = param->value.ui;
  748. break;
  749. case 'c':
  750. #if HAVE_CELT
  751. bitdepth = 1000;
  752. resample_factor = param->value.ui;
  753. #else
  754. printf( "not built with celt support\n" );
  755. exit(10);
  756. #endif
  757. break;
  758. case 't':
  759. handle_transport_sync = param->value.ui;
  760. break;
  761. }
  762. }
  763. return net_driver_new (client, "net_pcm", capture_ports, playback_ports,
  764. capture_ports_midi, playback_ports_midi,
  765. sample_rate, period_size,
  766. listen_port, handle_transport_sync,
  767. resample_factor, resample_factor_up, bitdepth);
  768. }
  769. void
  770. driver_finish (jack_driver_t *driver)
  771. {
  772. net_driver_delete ((net_driver_t *) driver);
  773. }