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.

1169 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 == 1 )
  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() + 1*driver->period_usecs;
  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 < 10*(int)driver->period_usecs/100*driver->latency ) {
  144. driver->next_deadline -= driver->period_usecs/1000;
  145. //printf( "goodness: %d, Adjust deadline: --- %d\n", driver->deadline_goodness, (int) driver->period_usecs*driver->latency/100 );
  146. }
  147. if( driver->deadline_goodness > 10*(int)driver->period_usecs/100*driver->latency ) {
  148. driver->next_deadline += driver->period_usecs/1000;
  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. {
  560. net_driver_t * driver;
  561. int first_pack_len;
  562. struct sockaddr_in address;
  563. jack_info ("creating net driver ... %s|%" PRIu32 "|%" PRIu32
  564. "|%u|%u|%u|transport_sync:%u", name, sample_rate, period_size, listen_port,
  565. capture_ports, playback_ports, transport_sync);
  566. driver = (net_driver_t *) calloc (1, sizeof (net_driver_t));
  567. jack_driver_nt_init ((jack_driver_nt_t *) driver);
  568. driver->write = (JackDriverWriteFunction) net_driver_write;
  569. driver->read = (JackDriverReadFunction) net_driver_read;
  570. driver->null_cycle = (JackDriverNullCycleFunction) net_driver_null_cycle;
  571. driver->nt_attach = (JackDriverNTAttachFunction) net_driver_attach;
  572. driver->nt_detach = (JackDriverNTDetachFunction) net_driver_detach;
  573. driver->nt_bufsize = (JackDriverNTBufSizeFunction) net_driver_bufsize;
  574. driver->nt_run_cycle = (JackDriverNTRunCycleFunction) net_driver_run_cycle;
  575. // Fill in driver values.
  576. // might be subject to autoconfig...
  577. // so dont calculate anything with them...
  578. driver->sample_rate = sample_rate;
  579. driver->period_size = period_size;
  580. driver->dont_htonl_floats = dont_htonl_floats;
  581. driver->listen_port = listen_port;
  582. driver->last_wait_ust = 0;
  583. driver->capture_channels = capture_ports + capture_ports_midi;
  584. driver->capture_channels_audio = capture_ports;
  585. driver->capture_channels_midi = capture_ports_midi;
  586. driver->capture_ports = NULL;
  587. driver->playback_channels = playback_ports + playback_ports_midi;
  588. driver->playback_channels_audio = playback_ports;
  589. driver->playback_channels_midi = playback_ports_midi;
  590. driver->playback_ports = NULL;
  591. driver->codec_latency = 0;
  592. driver->handle_transport_sync = transport_sync;
  593. driver->mtu = 1400;
  594. driver->latency = latency;
  595. driver->redundancy = redundancy;
  596. driver->always_wait_dedline = always_wait_dedline;
  597. driver->client = client;
  598. driver->engine = NULL;
  599. if ((bitdepth != 0) && (bitdepth != 8) && (bitdepth != 16) && (bitdepth != 1000))
  600. {
  601. jack_info ("Invalid bitdepth: %d (8, 16 or 0 for float) !!!", bitdepth);
  602. return NULL;
  603. }
  604. driver->bitdepth = bitdepth;
  605. if (resample_factor_up == 0)
  606. resample_factor_up = resample_factor;
  607. // Now open the socket, and wait for the first packet to arrive...
  608. driver->sockfd = socket (PF_INET, SOCK_DGRAM, 0);
  609. if (driver->sockfd == -1)
  610. {
  611. jack_info ("socket error");
  612. return NULL;
  613. }
  614. address.sin_family = AF_INET;
  615. address.sin_port = htons(driver->listen_port);
  616. address.sin_addr.s_addr = htonl(INADDR_ANY);
  617. if (bind (driver->sockfd, (struct sockaddr *) &address, sizeof (address)) < 0)
  618. {
  619. jack_info("bind error");
  620. return NULL;
  621. }
  622. driver->outsockfd = socket (PF_INET, SOCK_DGRAM, 0);
  623. if (driver->outsockfd == -1)
  624. {
  625. jack_info ("socket error");
  626. return NULL;
  627. }
  628. driver->srcaddress_valid = 0;
  629. if (use_autoconfig)
  630. {
  631. jacknet_packet_header *first_packet = alloca (sizeof (jacknet_packet_header));
  632. socklen_t address_size = sizeof (struct sockaddr_in);
  633. jack_info ("Waiting for an incoming packet !!!");
  634. jack_info ("*** IMPORTANT *** Dont connect a client to jackd until the driver is attached to a clock source !!!");
  635. // XXX: netjack_poll polls forever.
  636. // thats ok here.
  637. if (netjack_poll (driver->sockfd, 500))
  638. first_pack_len = recvfrom (driver->sockfd, first_packet, sizeof (jacknet_packet_header), 0, (struct sockaddr*) & driver->syncsource_address, &address_size);
  639. else
  640. first_pack_len = 0;
  641. driver->srcaddress_valid = 1;
  642. if (first_pack_len == sizeof (jacknet_packet_header))
  643. {
  644. packet_header_ntoh (first_packet);
  645. jack_info ("AutoConfig Override !!!");
  646. if (driver->sample_rate != first_packet->sample_rate)
  647. {
  648. jack_info ("AutoConfig Override: Master JACK sample rate = %d", first_packet->sample_rate);
  649. driver->sample_rate = first_packet->sample_rate;
  650. }
  651. if (driver->period_size != first_packet->period_size)
  652. {
  653. jack_info ("AutoConfig Override: Master JACK period size is %d", first_packet->period_size);
  654. driver->period_size = first_packet->period_size;
  655. }
  656. if (driver->capture_channels_audio != first_packet->capture_channels_audio)
  657. {
  658. jack_info ("AutoConfig Override: capture_channels_audio = %d", first_packet->capture_channels_audio);
  659. driver->capture_channels_audio = first_packet->capture_channels_audio;
  660. }
  661. if (driver->capture_channels_midi != first_packet->capture_channels_midi)
  662. {
  663. jack_info ("AutoConfig Override: capture_channels_midi = %d", first_packet->capture_channels_midi);
  664. driver->capture_channels_midi = first_packet->capture_channels_midi;
  665. }
  666. if (driver->playback_channels_audio != first_packet->playback_channels_audio)
  667. {
  668. jack_info ("AutoConfig Override: playback_channels_audio = %d", first_packet->playback_channels_audio);
  669. driver->playback_channels_audio = first_packet->playback_channels_audio;
  670. }
  671. if (driver->playback_channels_midi != first_packet->playback_channels_midi)
  672. {
  673. jack_info ("AutoConfig Override: playback_channels_midi = %d", first_packet->playback_channels_midi);
  674. driver->playback_channels_midi = first_packet->playback_channels_midi;
  675. }
  676. driver->mtu = first_packet->mtu;
  677. jack_info ("MTU is set to %d bytes", first_packet->mtu);
  678. driver->latency = first_packet->latency;
  679. }
  680. }
  681. driver->capture_channels = driver->capture_channels_audio + driver->capture_channels_midi;
  682. driver->playback_channels = driver->playback_channels_audio + driver->playback_channels_midi;
  683. // After possible Autoconfig: do all calculations...
  684. driver->period_usecs =
  685. (jack_time_t) floor ((((float) driver->period_size) / (float)driver->sample_rate)
  686. * 1000000.0f);
  687. if( driver->bitdepth == 1000 ) {
  688. // celt mode.
  689. // TODO: this is a hack. But i dont want to change the packet header.
  690. driver->net_period_down = resample_factor;
  691. driver->net_period_up = resample_factor_up;
  692. } else {
  693. driver->net_period_down = (float) driver->period_size / (float) resample_factor;
  694. driver->net_period_up = (float) driver->period_size / (float) resample_factor_up;
  695. }
  696. driver->rx_bufsize = sizeof (jacknet_packet_header) + driver->net_period_down * driver->capture_channels * get_sample_size (driver->bitdepth);
  697. driver->rx_buf = malloc (driver->rx_bufsize);
  698. driver->pkt_buf = malloc (driver->rx_bufsize);
  699. global_packcache = packet_cache_new (driver->latency + 5, driver->rx_bufsize, driver->mtu);
  700. driver->expected_framecnt_valid = 0;
  701. driver->num_lost_packets = 0;
  702. driver->next_deadline_valid = 0;
  703. driver->deadline_goodness = 0;
  704. driver->time_to_deadline = 0;
  705. // Special handling for latency=0
  706. if( driver->latency == 0 )
  707. driver->resync_threshold = 0;
  708. else
  709. driver->resync_threshold = MIN( 15, driver->latency-1 );
  710. driver->running_free = 0;
  711. jack_info ("netjack: period : up: %d / dn: %d", driver->net_period_up, driver->net_period_down);
  712. jack_info ("netjack: framerate: %d", driver->sample_rate);
  713. jack_info ("netjack: audio : cap: %d / pbk: %d)", driver->capture_channels_audio, driver->playback_channels_audio);
  714. jack_info ("netjack: midi : cap: %d / pbk: %d)", driver->capture_channels_midi, driver->playback_channels_midi);
  715. jack_info ("netjack: buffsize : rx: %d)", driver->rx_bufsize);
  716. return (jack_driver_t *) driver;
  717. }
  718. /* DRIVER "PLUGIN" INTERFACE */
  719. jack_driver_desc_t *
  720. driver_get_descriptor ()
  721. {
  722. jack_driver_desc_t * desc;
  723. jack_driver_param_desc_t * params;
  724. unsigned int i;
  725. desc = calloc (1, sizeof (jack_driver_desc_t));
  726. strcpy (desc->name, "net");
  727. desc->nparams = 17;
  728. params = calloc (desc->nparams, sizeof (jack_driver_param_desc_t));
  729. i = 0;
  730. strcpy (params[i].name, "inchannels");
  731. params[i].character = 'i';
  732. params[i].type = JackDriverParamUInt;
  733. params[i].value.ui = 2U;
  734. strcpy (params[i].short_desc, "Number of capture channels (defaults to 2)");
  735. strcpy (params[i].long_desc, params[i].short_desc);
  736. i++;
  737. strcpy (params[i].name, "outchannels");
  738. params[i].character = 'o';
  739. params[i].type = JackDriverParamUInt;
  740. params[i].value.ui = 2U;
  741. strcpy (params[i].short_desc, "Number of playback channels (defaults to 2)");
  742. strcpy (params[i].long_desc, params[i].short_desc);
  743. i++;
  744. strcpy (params[i].name, "midi inchannels");
  745. params[i].character = 'I';
  746. params[i].type = JackDriverParamUInt;
  747. params[i].value.ui = 1U;
  748. strcpy (params[i].short_desc, "Number of midi capture channels (defaults to 1)");
  749. strcpy (params[i].long_desc, params[i].short_desc);
  750. i++;
  751. strcpy (params[i].name, "midi outchannels");
  752. params[i].character = 'O';
  753. params[i].type = JackDriverParamUInt;
  754. params[i].value.ui = 1U;
  755. strcpy (params[i].short_desc, "Number of midi playback channels (defaults to 1)");
  756. strcpy (params[i].long_desc, params[i].short_desc);
  757. i++;
  758. strcpy (params[i].name, "rate");
  759. params[i].character = 'r';
  760. params[i].type = JackDriverParamUInt;
  761. params[i].value.ui = 48000U;
  762. strcpy (params[i].short_desc, "Sample rate");
  763. strcpy (params[i].long_desc, params[i].short_desc);
  764. i++;
  765. strcpy (params[i].name, "period");
  766. params[i].character = 'p';
  767. params[i].type = JackDriverParamUInt;
  768. params[i].value.ui = 1024U;
  769. strcpy (params[i].short_desc, "Frames per period");
  770. strcpy (params[i].long_desc, params[i].short_desc);
  771. i++;
  772. strcpy (params[i].name, "listen-port");
  773. params[i].character = 'l';
  774. params[i].type = JackDriverParamUInt;
  775. params[i].value.ui = 3000U;
  776. strcpy (params[i].short_desc,
  777. "The socket port we are listening on for sync packets");
  778. strcpy (params[i].long_desc, params[i].short_desc);
  779. i++;
  780. strcpy (params[i].name, "factor");
  781. params[i].character = 'f';
  782. params[i].type = JackDriverParamUInt;
  783. params[i].value.ui = 1U;
  784. strcpy (params[i].short_desc,
  785. "Factor for sample rate reduction");
  786. strcpy (params[i].long_desc, params[i].short_desc);
  787. i++;
  788. strcpy (params[i].name, "upstream-factor");
  789. params[i].character = 'u';
  790. params[i].type = JackDriverParamUInt;
  791. params[i].value.ui = 0U;
  792. strcpy (params[i].short_desc,
  793. "Factor for sample rate reduction on the upstream");
  794. strcpy (params[i].long_desc, params[i].short_desc);
  795. i++;
  796. strcpy (params[i].name, "celt");
  797. params[i].character = 'c';
  798. params[i].type = JackDriverParamUInt;
  799. params[i].value.ui = 0U;
  800. strcpy (params[i].short_desc,
  801. "sets celt encoding and number of bytes per channel");
  802. strcpy (params[i].long_desc, params[i].short_desc);
  803. i++;
  804. strcpy (params[i].name, "bit-depth");
  805. params[i].character = 'b';
  806. params[i].type = JackDriverParamUInt;
  807. params[i].value.ui = 0U;
  808. strcpy (params[i].short_desc,
  809. "Sample bit-depth (0 for float, 8 for 8bit and 16 for 16bit)");
  810. strcpy (params[i].long_desc, params[i].short_desc);
  811. i++;
  812. strcpy (params[i].name, "transport-sync");
  813. params[i].character = 't';
  814. params[i].type = JackDriverParamUInt;
  815. params[i].value.ui = 1U;
  816. strcpy (params[i].short_desc,
  817. "Whether to slave the transport to the master transport");
  818. strcpy (params[i].long_desc, params[i].short_desc);
  819. i++;
  820. strcpy (params[i].name, "autoconf");
  821. params[i].character = 'a';
  822. params[i].type = JackDriverParamUInt;
  823. params[i].value.ui = 1U;
  824. strcpy (params[i].short_desc,
  825. "Whether to use Autoconfig, or just start.");
  826. strcpy (params[i].long_desc, params[i].short_desc);
  827. i++;
  828. strcpy (params[i].name, "latency");
  829. params[i].character = 'L';
  830. params[i].type = JackDriverParamUInt;
  831. params[i].value.ui = 5U;
  832. strcpy (params[i].short_desc,
  833. "Latency setting");
  834. strcpy (params[i].long_desc, params[i].short_desc);
  835. i++;
  836. strcpy (params[i].name, "redundancy");
  837. params[i].character = 'R';
  838. params[i].type = JackDriverParamUInt;
  839. params[i].value.ui = 1U;
  840. strcpy (params[i].short_desc,
  841. "Send packets N times");
  842. strcpy (params[i].long_desc, params[i].short_desc);
  843. i++;
  844. strcpy (params[i].name, "no-htonl");
  845. params[i].character = 'H';
  846. params[i].type = JackDriverParamUInt;
  847. params[i].value.ui = 0U;
  848. strcpy (params[i].short_desc,
  849. "Dont convert samples to network byte order.");
  850. strcpy (params[i].long_desc, params[i].short_desc);
  851. i++;
  852. strcpy (params[i].name, "deadline");
  853. params[i].character = 'D';
  854. params[i].type = JackDriverParamBool;
  855. params[i].value.ui = 0U;
  856. strcpy (params[i].short_desc,
  857. "always wait for the deadline, more friendly to alsa_io");
  858. strcpy (params[i].long_desc, params[i].short_desc);
  859. desc->params = params;
  860. return desc;
  861. }
  862. const char driver_client_name[] = "net_pcm";
  863. jack_driver_t *
  864. driver_initialize (jack_client_t *client, const JSList * params)
  865. {
  866. jack_nframes_t sample_rate = 48000;
  867. jack_nframes_t resample_factor = 1;
  868. jack_nframes_t period_size = 1024;
  869. unsigned int capture_ports = 2;
  870. unsigned int playback_ports = 2;
  871. unsigned int capture_ports_midi = 1;
  872. unsigned int playback_ports_midi = 1;
  873. unsigned int listen_port = 3000;
  874. unsigned int resample_factor_up = 0;
  875. unsigned int bitdepth = 0;
  876. unsigned int handle_transport_sync = 1;
  877. unsigned int use_autoconfig = 1;
  878. unsigned int latency = 5;
  879. unsigned int redundancy = 1;
  880. int dont_htonl_floats = 0;
  881. int always_wait_dedline = 0;
  882. const JSList * node;
  883. const jack_driver_param_t * param;
  884. for (node = params; node; node = jack_slist_next (node)) {
  885. param = (const jack_driver_param_t *) node->data;
  886. switch (param->character) {
  887. case 'i':
  888. capture_ports = param->value.ui;
  889. break;
  890. case 'o':
  891. playback_ports = param->value.ui;
  892. break;
  893. case 'I':
  894. capture_ports_midi = param->value.ui;
  895. break;
  896. case 'O':
  897. playback_ports_midi = param->value.ui;
  898. break;
  899. case 'r':
  900. sample_rate = param->value.ui;
  901. break;
  902. case 'p':
  903. period_size = param->value.ui;
  904. break;
  905. case 'l':
  906. listen_port = param->value.ui;
  907. break;
  908. case 'f':
  909. #if HAVE_SAMPLERATE
  910. resample_factor = param->value.ui;
  911. #else
  912. printf( "not built with libsamplerate support\n" );
  913. exit(10);
  914. #endif
  915. break;
  916. case 'u':
  917. #if HAVE_SAMPLERATE
  918. resample_factor_up = param->value.ui;
  919. #else
  920. printf( "not built with libsamplerate support\n" );
  921. exit(10);
  922. #endif
  923. break;
  924. case 'b':
  925. bitdepth = param->value.ui;
  926. break;
  927. case 'c':
  928. #if HAVE_CELT
  929. bitdepth = 1000;
  930. resample_factor = param->value.ui;
  931. #else
  932. printf( "not built with celt support\n" );
  933. exit(10);
  934. #endif
  935. break;
  936. case 't':
  937. handle_transport_sync = param->value.ui;
  938. break;
  939. case 'a':
  940. use_autoconfig = param->value.ui;
  941. break;
  942. case 'L':
  943. latency = param->value.ui;
  944. break;
  945. case 'R':
  946. redundancy = param->value.ui;
  947. break;
  948. case 'H':
  949. dont_htonl_floats = param->value.ui;
  950. break;
  951. case 'D':
  952. always_wait_dedline = param->value.ui;
  953. break;
  954. }
  955. }
  956. return net_driver_new (client, "net_pcm", capture_ports, playback_ports,
  957. capture_ports_midi, playback_ports_midi,
  958. sample_rate, period_size,
  959. listen_port, handle_transport_sync,
  960. resample_factor, resample_factor_up, bitdepth,
  961. use_autoconfig, latency, redundancy,
  962. always_wait_dedline, dont_htonl_floats);
  963. }
  964. void
  965. driver_finish (jack_driver_t *driver)
  966. {
  967. net_driver_delete ((net_driver_t *) driver);
  968. }