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.

1184 lines
40KB

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