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.

1084 lines
37KB

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