[netjack] improve deadline handling, to recover from running too fast.
[jack.git] / drivers / netjack / net_driver.c
blob07488579be90ee925b696bf1c21511b09ac64b01
1 /* -*- mode: c; c-file-style: "linux"; -*- */
2 /*
3 NetJack Driver
5 Copyright (C) 2008 Pieter Palmers <pieterpalmers@users.sourceforge.net>
6 Copyright (C) 2006 Torben Hohn <torbenh@gmx.de>
7 Copyright (C) 2003 Robert Ham <rah@bash.sh>
8 Copyright (C) 2001 Paul Davis
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 2 of the License, or
13 (at your option) any later version.
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 $Id: net_driver.c,v 1.17 2006/04/16 20:16:10 torbenh Exp $
27 #include <math.h>
28 #include <stdio.h>
29 #include <memory.h>
30 #include <unistd.h>
31 #include <stdlib.h>
32 #include <errno.h>
33 #include <stdarg.h>
34 #include <sys/mman.h>
36 #include <jack/types.h>
37 #include <jack/engine.h>
38 #include <sysdeps/time.h>
40 #include <sys/types.h>
41 #include <sys/socket.h>
42 #include <netinet/in.h>
44 #include "config.h"
46 #include <samplerate.h>
48 #if HAVE_CELT
49 #include <celt/celt.h>
50 #endif
52 #include "net_driver.h"
53 #include "netjack_packet.h"
55 #undef DEBUG_WAKEUP
57 #define MIN(x,y) ((x)<(y) ? (x) : (y))
59 static int sync_state = TRUE;
60 static jack_transport_state_t last_transport_state;
62 static int
63 net_driver_sync_cb(jack_transport_state_t state, jack_position_t *pos, net_driver_t *driver)
65 int retval = sync_state;
67 if (state == JackTransportStarting && last_transport_state != JackTransportStarting) {
68 retval = 0;
70 // if (state == JackTransportStarting)
71 // jack_info("Starting sync_state = %d", sync_state);
72 last_transport_state = state;
73 return retval;
76 static jack_nframes_t
77 net_driver_wait (net_driver_t *driver, int extra_fd, int *status, float *delayed_usecs)
79 // ok... we wait for a packet on the socket
80 // TODO:
81 // we should be able to run freely if the sync source is not transmitting
82 // especially we should be able to compensate for packet loss somehow.
83 // but lets try this out first.
85 // on packet loss we should either detect an xrun or just continue running when we
86 // think, that the sync source is not running anymore.
88 //socklen_t address_size = sizeof (struct sockaddr_in);
89 //int len;
90 int we_have_the_expected_frame = 0;
91 jack_nframes_t next_frame_avail;
92 jack_time_t packet_recv_time_stamp;
93 jacknet_packet_header *pkthdr = (jacknet_packet_header *) driver->rx_buf;
95 if( !driver->next_deadline_valid ) {
96 if( driver->latency == 0 )
97 // for full sync mode... always wait for packet.
98 driver->next_deadline = jack_get_microseconds() + 500*driver->period_usecs;
99 else if( driver->latency == 1 )
100 // for normal 1 period latency mode, only 1 period for dealine.
101 driver->next_deadline = jack_get_microseconds() + driver->period_usecs;
102 else
103 // looks like waiting 1 period always is correct.
104 // not 100% sure yet. with the improved resync, it might be better,
105 // to have more than one period headroom for high latency.
106 //driver->next_deadline = jack_get_microseconds() + 5*driver->latency*driver->period_usecs/4;
107 driver->next_deadline = jack_get_microseconds() + 2*driver->period_usecs;
109 driver->next_deadline_valid = 1;
110 } else {
111 driver->next_deadline += driver->period_usecs;
114 // Increment expected frame here.
115 driver->expected_framecnt += 1;
117 // Now check if required packet is already in the cache.
118 // then poll (have deadline calculated)
119 // then drain socket, rinse and repeat.
120 while(1) {
121 if( packet_cache_get_next_available_framecnt( global_packcache, driver->expected_framecnt, &next_frame_avail) ) {
122 if( next_frame_avail == driver->expected_framecnt ) {
123 we_have_the_expected_frame = 1;
124 break;
127 if( ! netjack_poll_deadline( driver->sockfd, driver->next_deadline ) )
128 break;
130 packet_cache_drain_socket( global_packcache, driver->sockfd );
133 // check if we know who to send our packets too.
134 // TODO: there is still something wrong when trying
135 // to send back to another port on localhost.
136 // need to use -r on netsource for that.
137 if (!driver->srcaddress_valid)
138 if( global_packcache->master_address_valid ) {
139 memcpy (&(driver->syncsource_address), &(global_packcache->master_address), sizeof( struct sockaddr_in ) );
140 driver->srcaddress_valid = 1;
143 // XXX: switching mode unconditionally is stupid.
144 // if we were running free perhaps we like to behave differently
145 // ie. fastforward one packet etc.
146 // well... this is the first packet we see. hmm.... dunno ;S
147 // it works... so...
148 driver->running_free = 0;
150 if( we_have_the_expected_frame ) {
151 driver->time_to_deadline = driver->next_deadline - jack_get_microseconds() - driver->period_usecs;
152 packet_cache_retreive_packet( global_packcache, driver->expected_framecnt, (char *) driver->rx_buf, driver->rx_bufsize , &packet_recv_time_stamp);
153 //int recv_time_offset = (int) (jack_get_microseconds() - packet_recv_time_stamp);
154 packet_header_ntoh(pkthdr);
155 driver->deadline_goodness = (int)pkthdr->sync_state;
156 driver->packet_data_valid = 1;
158 // TODO: Queue state could be taken into account.
159 // But needs more processing, cause, when we are running as
160 // fast as we can, recv_time_offset can be zero, which is
161 // good.
162 // need to add (now-deadline) and check that.
164 if( recv_time_offset < driver->period_usecs )
165 //driver->next_deadline -= driver->period_usecs*driver->latency/100;
166 driver->next_deadline += driver->period_usecs/1000;
169 if( driver->deadline_goodness < 10*(int)driver->period_usecs/100*driver->latency ) {
170 driver->next_deadline -= driver->period_usecs/1000;
171 //printf( "goodness: %d, Adjust deadline: --- %d\n", driver->deadline_goodness, (int) driver->period_usecs*driver->latency/100 );
173 if( driver->deadline_goodness > 10*(int)driver->period_usecs/100*driver->latency ) {
174 driver->next_deadline += driver->period_usecs/1000;
175 //printf( "goodness: %d, Adjust deadline: +++ %d\n", driver->deadline_goodness, (int) driver->period_usecs*driver->latency/100 );
177 } else {
178 driver->time_to_deadline = 0;
179 // bah... the packet is not there.
180 // either
181 // - it got lost.
182 // - its late
183 // - sync source is not sending anymore.
185 // lets check if we have the next packets, we will just run a cycle without data.
186 // in that case.
188 if( packet_cache_get_next_available_framecnt( global_packcache, driver->expected_framecnt, &next_frame_avail) )
190 jack_nframes_t offset = next_frame_avail - driver->expected_framecnt;
192 //if( offset < driver->resync_threshold )
193 if( offset < 10 ) {
194 // ok. dont do nothing. we will run without data.
195 // this seems to be one or 2 lost packets.
197 // this can also be reordered packet jitter.
198 // (maybe this is not happening in real live)
199 // but it happens in netem.
201 driver->packet_data_valid = 0;
203 // I also found this happening, when the packet queue, is too full.
204 // but wtf ? use a smaller latency. this link can handle that ;S
205 if( packet_cache_get_fill( global_packcache, driver->expected_framecnt ) > 80.0 )
206 driver->next_deadline -= driver->period_usecs/2;
209 } else {
210 // the diff is too high. but we have a packet in the future.
211 // lets resync.
212 driver->expected_framecnt = next_frame_avail;
213 packet_cache_retreive_packet( global_packcache, driver->expected_framecnt, (char *) driver->rx_buf, driver->rx_bufsize, NULL );
214 packet_header_ntoh(pkthdr);
215 //driver->deadline_goodness = 0;
216 driver->deadline_goodness = (int)pkthdr->sync_state - (int)driver->period_usecs * offset;
217 driver->next_deadline_valid = 0;
218 driver->packet_data_valid = 1;
221 } else {
222 // no packets in buffer.
223 driver->packet_data_valid = 0;
225 //printf( "frame %d No Packet in queue. num_lost_packets = %d \n", driver->expected_framecnt, driver->num_lost_packets );
226 if( driver->num_lost_packets < 5 ) {
227 // ok. No Packet in queue. The packet was either lost,
228 // or we are running too fast.
230 // Adjusting the deadline unconditionally resulted in
231 // too many xruns on master.
232 // But we need to adjust for the case we are running too fast.
233 // So lets check if the last packet is there now.
235 // It would not be in the queue anymore, if it had been
236 // retrieved. This might break for redundancy, but
237 // i will make the packet cache drop redundant packets,
238 // that have already been retreived.
240 if( packet_cache_get_highest_available_framecnt( global_packcache, &next_frame_avail) ) {
241 if( next_frame_avail == (driver->expected_framecnt - 1) ) {
242 // Ok. the last packet is there now.
243 // and it had not been retrieved.
245 // TODO: We are still dropping 2 packets.
246 // perhaps we can adjust the deadline
247 // when (num_packets lost == 0)
249 // This might still be too much.
250 driver->next_deadline += driver->period_usecs/8;
253 } else if( (driver->num_lost_packets <= 10) ) {
254 // lets try adjusting the deadline harder, for some packets, we might have just ran 2 fast.
255 //driver->next_deadline += driver->period_usecs*driver->latency/8;
256 } else {
258 // But now we can check for any new frame available.
260 if( packet_cache_get_highest_available_framecnt( global_packcache, &next_frame_avail) ) {
261 driver->expected_framecnt = next_frame_avail;
262 packet_cache_retreive_packet( global_packcache, driver->expected_framecnt, (char *) driver->rx_buf, driver->rx_bufsize, NULL );
263 packet_header_ntoh(pkthdr);
264 driver->deadline_goodness = pkthdr->sync_state;
265 driver->next_deadline_valid = 0;
266 driver->packet_data_valid = 1;
267 driver->running_free = 0;
268 printf( "resync after freerun... %d\n", driver->expected_framecnt );
269 } else {
270 // give up. lets run freely.
271 // XXX: hmm...
273 driver->running_free = 1;
275 // when we really dont see packets.
276 // reset source address. and open possibility for new master.
277 // maybe dsl reconnect. Also restart of netsource without fix
278 // reply address changes port.
279 if (driver->num_lost_packets > 200 ) {
280 driver->srcaddress_valid = 0;
281 packet_cache_reset_master_address( global_packcache );
288 if( !driver->packet_data_valid )
289 driver->num_lost_packets += 1;
290 else {
291 driver->num_lost_packets = 0;
292 //packet_header_ntoh (pkthdr);
297 driver->last_wait_ust = jack_get_microseconds ();
298 driver->engine->transport_cycle_start (driver->engine, driver->last_wait_ust);
300 /* this driver doesn't work so well if we report a delay */
301 /* XXX: this might not be the case anymore */
302 /* the delayed _usecs is a resync or something. */
303 *delayed_usecs = 0; /* lie about it */
304 *status = 0;
305 return driver->period_size;
308 static inline int
309 net_driver_run_cycle (net_driver_t *driver)
311 jack_engine_t *engine = driver->engine;
312 int wait_status = -1;
313 float delayed_usecs;
315 jack_nframes_t nframes = net_driver_wait (driver, -1, &wait_status,
316 &delayed_usecs);
318 // XXX: xrun code removed.
319 // especially with celt there are no real xruns anymore.
320 // things are different on the net.
322 if (wait_status == 0)
323 return engine->run_cycle (engine, nframes, delayed_usecs);
325 if (wait_status < 0)
326 return -1;
327 else
328 return 0;
331 static int
332 net_driver_null_cycle (net_driver_t* driver, jack_nframes_t nframes)
334 // TODO: talk to paul about this.
335 // do i wait here ?
336 // just sending out a packet marked with junk ?
338 //int rx_size = get_sample_size(driver->bitdepth) * driver->capture_channels * driver->net_period_down + sizeof(jacknet_packet_header);
339 int tx_size = get_sample_size(driver->bitdepth) * driver->playback_channels * driver->net_period_up + sizeof(jacknet_packet_header);
340 unsigned int *packet_buf, *packet_bufX;
342 packet_buf = alloca( tx_size);
343 jacknet_packet_header *tx_pkthdr = (jacknet_packet_header *)packet_buf;
344 jacknet_packet_header *rx_pkthdr = (jacknet_packet_header *)driver->rx_buf;
346 //framecnt = rx_pkthdr->framecnt;
348 driver->reply_port = rx_pkthdr->reply_port;
350 // offset packet_bufX by the packetheader.
351 packet_bufX = packet_buf + sizeof(jacknet_packet_header) / sizeof(jack_default_audio_sample_t);
353 tx_pkthdr->sync_state = (driver->engine->control->sync_remain <= 1);
355 tx_pkthdr->framecnt = driver->expected_framecnt;
357 // memset 0 the payload.
358 int payload_size = get_sample_size(driver->bitdepth) * driver->playback_channels * driver->net_period_up;
359 memset(packet_bufX, 0, payload_size);
361 packet_header_hton(tx_pkthdr);
362 if (driver->srcaddress_valid)
364 int r;
365 if (driver->reply_port)
366 driver->syncsource_address.sin_port = htons(driver->reply_port);
368 for( r=0; r<driver->redundancy; r++ )
369 netjack_sendto(driver->outsockfd, (char *)packet_buf, tx_size,
370 0, (struct sockaddr*)&(driver->syncsource_address), sizeof(struct sockaddr_in), driver->mtu);
373 return 0;
376 static int
377 net_driver_bufsize (net_driver_t* driver, jack_nframes_t nframes)
379 if (nframes != driver->period_size)
380 return EINVAL;
382 return 0;
385 static int
386 net_driver_read (net_driver_t* driver, jack_nframes_t nframes)
388 jack_position_t local_trans_pos;
389 jack_transport_state_t local_trans_state;
391 unsigned int *packet_buf, *packet_bufX;
393 if( ! driver->packet_data_valid ) {
394 render_payload_to_jack_ports (driver->bitdepth, NULL, driver->net_period_down, driver->capture_ports, driver->capture_srcs, nframes);
395 return 0;
397 packet_buf = driver->rx_buf;
399 jacknet_packet_header *pkthdr = (jacknet_packet_header *)packet_buf;
401 packet_bufX = packet_buf + sizeof(jacknet_packet_header) / sizeof(jack_default_audio_sample_t);
403 driver->reply_port = pkthdr->reply_port;
404 driver->latency = pkthdr->latency;
406 // Special handling for latency=0
407 if( driver->latency == 0 )
408 driver->resync_threshold = 0;
409 else
410 driver->resync_threshold = MIN( 15, pkthdr->latency-1 );
412 // check whether, we should handle the transport sync stuff, or leave trnasports untouched.
413 if (driver->handle_transport_sync) {
415 // read local transport info....
416 local_trans_state = jack_transport_query(driver->client, &local_trans_pos);
418 // Now check if we have to start or stop local transport to sync to remote...
419 switch (pkthdr->transport_state) {
420 case JackTransportStarting:
421 // the master transport is starting... so we set our reply to the sync_callback;
422 if (local_trans_state == JackTransportStopped) {
423 jack_transport_start(driver->client);
424 last_transport_state = JackTransportStopped;
425 sync_state = FALSE;
426 jack_info("locally stopped... starting...");
429 if (local_trans_pos.frame != (pkthdr->transport_frame + (pkthdr->latency) * nframes)) {
430 jack_transport_locate(driver->client, (pkthdr->transport_frame + (pkthdr->latency) * nframes));
431 last_transport_state = JackTransportRolling;
432 sync_state = FALSE;
433 jack_info("starting locate to %d", pkthdr->transport_frame + (pkthdr->latency)*nframes);
435 break;
436 case JackTransportStopped:
437 sync_state = TRUE;
438 if (local_trans_pos.frame != (pkthdr->transport_frame)) {
439 jack_transport_locate(driver->client, (pkthdr->transport_frame));
440 jack_info("transport is stopped locate to %d", pkthdr->transport_frame);
442 if (local_trans_state != JackTransportStopped)
443 jack_transport_stop(driver->client);
444 break;
445 case JackTransportRolling:
446 sync_state = TRUE;
447 // if(local_trans_pos.frame != (pkthdr->transport_frame + (pkthdr->latency) * nframes)) {
448 // jack_transport_locate(driver->client, (pkthdr->transport_frame + (pkthdr->latency + 2) * nframes));
449 // jack_info("running locate to %d", pkthdr->transport_frame + (pkthdr->latency)*nframes);
450 // }
451 if (local_trans_state != JackTransportRolling)
452 jack_transport_start (driver->client);
453 break;
455 case JackTransportLooping:
456 break;
460 render_payload_to_jack_ports (driver->bitdepth, packet_bufX, driver->net_period_down, driver->capture_ports, driver->capture_srcs, nframes);
462 return 0;
465 static int
466 net_driver_write (net_driver_t* driver, jack_nframes_t nframes)
468 uint32_t *packet_buf, *packet_bufX;
470 int packet_size = get_sample_size(driver->bitdepth) * driver->playback_channels * driver->net_period_up + sizeof(jacknet_packet_header);
471 jacknet_packet_header *pkthdr;
473 packet_buf = alloca(packet_size);
474 pkthdr = (jacknet_packet_header *)packet_buf;
476 if( driver->running_free ) {
477 return 0;
480 // offset packet_bufX by the packetheader.
481 packet_bufX = packet_buf + sizeof(jacknet_packet_header) / sizeof(jack_default_audio_sample_t);
483 pkthdr->sync_state = (driver->engine->control->sync_remain <= 1);
484 pkthdr->latency = driver->time_to_deadline;
485 //printf( "time to deadline = %d goodness=%d\n", (int)driver->time_to_deadline, driver->deadline_goodness );
486 pkthdr->framecnt = driver->expected_framecnt;
489 render_jack_ports_to_payload(driver->bitdepth, driver->playback_ports, driver->playback_srcs, nframes, packet_bufX, driver->net_period_up);
491 packet_header_hton(pkthdr);
492 if (driver->srcaddress_valid)
494 int r;
496 #ifdef __APPLE__
497 static const int flag = 0;
498 #else
499 static const int flag = MSG_CONFIRM;
500 #endif
502 if (driver->reply_port)
503 driver->syncsource_address.sin_port = htons(driver->reply_port);
505 for( r=0; r<driver->redundancy; r++ )
506 netjack_sendto(driver->outsockfd, (char *)packet_buf, packet_size,
507 flag, (struct sockaddr*)&(driver->syncsource_address), sizeof(struct sockaddr_in), driver->mtu);
510 return 0;
514 static int
515 net_driver_attach (net_driver_t *driver)
517 //puts ("net_driver_attach");
518 jack_port_t * port;
519 char buf[32];
520 unsigned int chn;
521 int port_flags;
523 driver->engine->set_buffer_size (driver->engine, driver->period_size);
524 driver->engine->set_sample_rate (driver->engine, driver->sample_rate);
526 if (driver->handle_transport_sync)
527 jack_set_sync_callback(driver->client, (JackSyncCallback) net_driver_sync_cb, driver);
529 port_flags = JackPortIsOutput | JackPortIsPhysical | JackPortIsTerminal;
531 for (chn = 0; chn < driver->capture_channels_audio; chn++) {
532 snprintf (buf, sizeof(buf) - 1, "capture_%u", chn + 1);
534 port = jack_port_register (driver->client, buf,
535 JACK_DEFAULT_AUDIO_TYPE,
536 port_flags, 0);
537 if (!port) {
538 jack_error ("NET: cannot register port for %s", buf);
539 break;
542 driver->capture_ports =
543 jack_slist_append (driver->capture_ports, port);
545 if( driver->bitdepth == 1000 ) {
546 #if HAVE_CELT
547 // XXX: memory leak
548 CELTMode *celt_mode = celt_mode_create( driver->sample_rate, 1, driver->period_size, NULL );
549 driver->capture_srcs = jack_slist_append(driver->capture_srcs, celt_decoder_create( celt_mode ) );
550 #endif
551 } else {
552 driver->capture_srcs = jack_slist_append(driver->capture_srcs, src_new(SRC_LINEAR, 1, NULL));
555 for (chn = driver->capture_channels_audio; chn < driver->capture_channels; chn++) {
556 snprintf (buf, sizeof(buf) - 1, "capture_%u", chn + 1);
558 port = jack_port_register (driver->client, buf,
559 JACK_DEFAULT_MIDI_TYPE,
560 port_flags, 0);
561 if (!port) {
562 jack_error ("NET: cannot register port for %s", buf);
563 break;
566 driver->capture_ports =
567 jack_slist_append (driver->capture_ports, port);
568 //driver->capture_srcs = jack_slist_append(driver->capture_srcs, src_new(SRC_LINEAR, 1, NULL));
571 port_flags = JackPortIsInput | JackPortIsPhysical | JackPortIsTerminal;
573 for (chn = 0; chn < driver->playback_channels_audio; chn++) {
574 snprintf (buf, sizeof(buf) - 1, "playback_%u", chn + 1);
576 port = jack_port_register (driver->client, buf,
577 JACK_DEFAULT_AUDIO_TYPE,
578 port_flags, 0);
580 if (!port) {
581 jack_error ("NET: cannot register port for %s", buf);
582 break;
585 driver->playback_ports =
586 jack_slist_append (driver->playback_ports, port);
587 if( driver->bitdepth == 1000 ) {
588 #if HAVE_CELT
589 // XXX: memory leak
590 CELTMode *celt_mode = celt_mode_create( driver->sample_rate, 1, driver->period_size, NULL );
591 driver->playback_srcs = jack_slist_append(driver->playback_srcs, celt_encoder_create( celt_mode ) );
592 #endif
593 } else {
594 driver->playback_srcs = jack_slist_append(driver->playback_srcs, src_new(SRC_LINEAR, 1, NULL));
597 for (chn = driver->playback_channels_audio; chn < driver->playback_channels; chn++) {
598 snprintf (buf, sizeof(buf) - 1, "playback_%u", chn + 1);
600 port = jack_port_register (driver->client, buf,
601 JACK_DEFAULT_MIDI_TYPE,
602 port_flags, 0);
604 if (!port) {
605 jack_error ("NET: cannot register port for %s", buf);
606 break;
609 driver->playback_ports =
610 jack_slist_append (driver->playback_ports, port);
611 //driver->playback_srcs = jack_slist_append(driver->playback_srcs, src_new(SRC_LINEAR, 1, NULL));
614 jack_activate (driver->client);
615 return 0;
618 static int
619 net_driver_detach (net_driver_t *driver)
621 JSList * node;
623 if (driver->engine == 0)
624 return 0;
625 //#if 0
626 for (node = driver->capture_ports; node; node = jack_slist_next (node))
627 jack_port_unregister (driver->client,
628 ((jack_port_t *) node->data));
630 jack_slist_free (driver->capture_ports);
631 driver->capture_ports = NULL;
632 //#endif
634 for (node = driver->playback_ports; node; node = jack_slist_next (node))
635 jack_port_unregister (driver->client,
636 ((jack_port_t *) node->data));
638 jack_slist_free (driver->playback_ports);
639 driver->playback_ports = NULL;
641 return 0;
644 static void
645 net_driver_delete (net_driver_t *driver)
647 jack_driver_nt_finish ((jack_driver_nt_t *) driver);
648 free (driver);
651 static jack_driver_t *
652 net_driver_new (jack_client_t * client,
653 char *name,
654 unsigned int capture_ports,
655 unsigned int playback_ports,
656 unsigned int capture_ports_midi,
657 unsigned int playback_ports_midi,
658 jack_nframes_t sample_rate,
659 jack_nframes_t period_size,
660 unsigned int listen_port,
661 unsigned int transport_sync,
662 unsigned int resample_factor,
663 unsigned int resample_factor_up,
664 unsigned int bitdepth,
665 unsigned int use_autoconfig,
666 unsigned int latency,
667 unsigned int redundancy)
669 net_driver_t * driver;
670 int first_pack_len;
671 struct sockaddr_in address;
673 jack_info ("creating net driver ... %s|%" PRIu32 "|%" PRIu32
674 "|%u|%u|%u|transport_sync:%u", name, sample_rate, period_size, listen_port,
675 capture_ports, playback_ports, transport_sync);
677 driver = (net_driver_t *) calloc (1, sizeof (net_driver_t));
679 jack_driver_nt_init ((jack_driver_nt_t *) driver);
681 driver->write = (JackDriverWriteFunction) net_driver_write;
682 driver->read = (JackDriverReadFunction) net_driver_read;
683 driver->null_cycle = (JackDriverNullCycleFunction) net_driver_null_cycle;
684 driver->nt_attach = (JackDriverNTAttachFunction) net_driver_attach;
685 driver->nt_detach = (JackDriverNTDetachFunction) net_driver_detach;
686 driver->nt_bufsize = (JackDriverNTBufSizeFunction) net_driver_bufsize;
687 driver->nt_run_cycle = (JackDriverNTRunCycleFunction) net_driver_run_cycle;
689 // Fill in driver values.
690 // might be subject to autoconfig...
691 // so dont calculate anything with them...
693 driver->sample_rate = sample_rate;
694 driver->period_size = period_size;
696 driver->listen_port = listen_port;
697 driver->last_wait_ust = 0;
699 driver->capture_channels = capture_ports + capture_ports_midi;
700 driver->capture_channels_audio = capture_ports;
701 driver->capture_channels_midi = capture_ports_midi;
702 driver->capture_ports = NULL;
703 driver->playback_channels = playback_ports + playback_ports_midi;
704 driver->playback_channels_audio = playback_ports;
705 driver->playback_channels_midi = playback_ports_midi;
706 driver->playback_ports = NULL;
708 driver->handle_transport_sync = transport_sync;
709 driver->mtu = 1400;
710 driver->latency = latency;
711 driver->redundancy = redundancy;
714 driver->client = client;
715 driver->engine = NULL;
718 if ((bitdepth != 0) && (bitdepth != 8) && (bitdepth != 16) && (bitdepth != 1000))
720 jack_info ("Invalid bitdepth: %d (8, 16 or 0 for float) !!!", bitdepth);
721 return NULL;
723 driver->bitdepth = bitdepth;
726 if (resample_factor_up == 0)
727 resample_factor_up = resample_factor;
729 // Now open the socket, and wait for the first packet to arrive...
730 driver->sockfd = socket (PF_INET, SOCK_DGRAM, 0);
731 if (driver->sockfd == -1)
733 jack_info ("socket error");
734 return NULL;
736 address.sin_family = AF_INET;
737 address.sin_port = htons(driver->listen_port);
738 address.sin_addr.s_addr = htonl(INADDR_ANY);
739 if (bind (driver->sockfd, (struct sockaddr *) &address, sizeof (address)) < 0)
741 jack_info("bind error");
742 return NULL;
745 driver->outsockfd = socket (PF_INET, SOCK_DGRAM, 0);
746 if (driver->outsockfd == -1)
748 jack_info ("socket error");
749 return NULL;
751 driver->srcaddress_valid = 0;
753 if (use_autoconfig)
755 jacknet_packet_header *first_packet = alloca (sizeof (jacknet_packet_header));
756 socklen_t address_size = sizeof (struct sockaddr_in);
758 jack_info ("Waiting for an incoming packet !!!");
759 jack_info ("*** IMPORTANT *** Dont connect a client to jackd until the driver is attached to a clock source !!!");
761 // XXX: netjack_poll polls forever.
762 // thats ok here.
763 if (netjack_poll (driver->sockfd, 500))
764 first_pack_len = recvfrom (driver->sockfd, first_packet, sizeof (jacknet_packet_header), 0, (struct sockaddr*) & driver->syncsource_address, &address_size);
765 else
766 first_pack_len = 0;
768 driver->srcaddress_valid = 1;
770 if (first_pack_len == sizeof (jacknet_packet_header))
772 packet_header_ntoh (first_packet);
774 jack_info ("AutoConfig Override !!!");
775 if (driver->sample_rate != first_packet->sample_rate)
777 jack_info ("AutoConfig Override: Master JACK sample rate = %d", first_packet->sample_rate);
778 driver->sample_rate = first_packet->sample_rate;
781 if (driver->period_size != first_packet->period_size)
783 jack_info ("AutoConfig Override: Master JACK period size is %d", first_packet->period_size);
784 driver->period_size = first_packet->period_size;
786 if (driver->capture_channels_audio != first_packet->capture_channels_audio)
788 jack_info ("AutoConfig Override: capture_channels_audio = %d", first_packet->capture_channels_audio);
789 driver->capture_channels_audio = first_packet->capture_channels_audio;
791 if (driver->capture_channels_midi != first_packet->capture_channels_midi)
793 jack_info ("AutoConfig Override: capture_channels_midi = %d", first_packet->capture_channels_midi);
794 driver->capture_channels_midi = first_packet->capture_channels_midi;
796 if (driver->playback_channels_audio != first_packet->playback_channels_audio)
798 jack_info ("AutoConfig Override: playback_channels_audio = %d", first_packet->playback_channels_audio);
799 driver->playback_channels_audio = first_packet->playback_channels_audio;
801 if (driver->playback_channels_midi != first_packet->playback_channels_midi)
803 jack_info ("AutoConfig Override: playback_channels_midi = %d", first_packet->playback_channels_midi);
804 driver->playback_channels_midi = first_packet->playback_channels_midi;
807 driver->mtu = first_packet->mtu;
808 jack_info ("MTU is set to %d bytes", first_packet->mtu);
809 driver->latency = first_packet->latency;
812 driver->capture_channels = driver->capture_channels_audio + driver->capture_channels_midi;
813 driver->playback_channels = driver->playback_channels_audio + driver->playback_channels_midi;
815 // After possible Autoconfig: do all calculations...
816 driver->period_usecs =
817 (jack_time_t) floor ((((float) driver->period_size) / (float)driver->sample_rate)
818 * 1000000.0f);
820 if( driver->bitdepth == 1000 ) {
821 // celt mode.
822 // TODO: this is a hack. But i dont want to change the packet header.
823 driver->net_period_down = resample_factor;
824 driver->net_period_up = resample_factor_up;
825 } else {
826 driver->net_period_down = (float) driver->period_size / (float) resample_factor;
827 driver->net_period_up = (float) driver->period_size / (float) resample_factor_up;
830 driver->rx_bufsize = sizeof (jacknet_packet_header) + driver->net_period_down * driver->capture_channels * get_sample_size (driver->bitdepth);
831 driver->rx_buf = malloc (driver->rx_bufsize);
832 driver->pkt_buf = malloc (driver->rx_bufsize);
833 global_packcache = packet_cache_new (driver->latency + 5, driver->rx_bufsize, driver->mtu);
835 driver->expected_framecnt_valid = 0;
836 driver->num_lost_packets = 0;
837 driver->next_deadline_valid = 0;
838 driver->deadline_goodness = 0;
839 driver->time_to_deadline = 0;
841 // Special handling for latency=0
842 if( driver->latency == 0 )
843 driver->resync_threshold = 0;
844 else
845 driver->resync_threshold = MIN( 15, driver->latency-1 );
847 driver->running_free = 0;
849 jack_info ("netjack: period : up: %d / dn: %d", driver->net_period_up, driver->net_period_down);
850 jack_info ("netjack: framerate: %d", driver->sample_rate);
851 jack_info ("netjack: audio : cap: %d / pbk: %d)", driver->capture_channels_audio, driver->playback_channels_audio);
852 jack_info ("netjack: midi : cap: %d / pbk: %d)", driver->capture_channels_midi, driver->playback_channels_midi);
853 jack_info ("netjack: buffsize : rx: %d)", driver->rx_bufsize);
854 return (jack_driver_t *) driver;
857 /* DRIVER "PLUGIN" INTERFACE */
859 jack_driver_desc_t *
860 driver_get_descriptor ()
862 jack_driver_desc_t * desc;
863 jack_driver_param_desc_t * params;
864 unsigned int i;
866 desc = calloc (1, sizeof (jack_driver_desc_t));
867 strcpy (desc->name, "net");
868 desc->nparams = 15;
870 params = calloc (desc->nparams, sizeof (jack_driver_param_desc_t));
872 i = 0;
873 strcpy (params[i].name, "inchannels");
874 params[i].character = 'i';
875 params[i].type = JackDriverParamUInt;
876 params[i].value.ui = 2U;
877 strcpy (params[i].short_desc, "Number of capture channels (defaults to 2)");
878 strcpy (params[i].long_desc, params[i].short_desc);
880 i++;
881 strcpy (params[i].name, "outchannels");
882 params[i].character = 'o';
883 params[i].type = JackDriverParamUInt;
884 params[i].value.ui = 2U;
885 strcpy (params[i].short_desc, "Number of playback channels (defaults to 2)");
886 strcpy (params[i].long_desc, params[i].short_desc);
888 i++;
889 strcpy (params[i].name, "midi inchannels");
890 params[i].character = 'I';
891 params[i].type = JackDriverParamUInt;
892 params[i].value.ui = 1U;
893 strcpy (params[i].short_desc, "Number of midi capture channels (defaults to 1)");
894 strcpy (params[i].long_desc, params[i].short_desc);
896 i++;
897 strcpy (params[i].name, "midi outchannels");
898 params[i].character = 'O';
899 params[i].type = JackDriverParamUInt;
900 params[i].value.ui = 1U;
901 strcpy (params[i].short_desc, "Number of midi playback channels (defaults to 1)");
902 strcpy (params[i].long_desc, params[i].short_desc);
904 i++;
905 strcpy (params[i].name, "rate");
906 params[i].character = 'r';
907 params[i].type = JackDriverParamUInt;
908 params[i].value.ui = 48000U;
909 strcpy (params[i].short_desc, "Sample rate");
910 strcpy (params[i].long_desc, params[i].short_desc);
912 i++;
913 strcpy (params[i].name, "period");
914 params[i].character = 'p';
915 params[i].type = JackDriverParamUInt;
916 params[i].value.ui = 1024U;
917 strcpy (params[i].short_desc, "Frames per period");
918 strcpy (params[i].long_desc, params[i].short_desc);
920 i++;
921 strcpy (params[i].name, "listen-port");
922 params[i].character = 'l';
923 params[i].type = JackDriverParamUInt;
924 params[i].value.ui = 3000U;
925 strcpy (params[i].short_desc,
926 "The socket port we are listening on for sync packets");
927 strcpy (params[i].long_desc, params[i].short_desc);
929 i++;
930 strcpy (params[i].name, "factor");
931 params[i].character = 'f';
932 params[i].type = JackDriverParamUInt;
933 params[i].value.ui = 1U;
934 strcpy (params[i].short_desc,
935 "Factor for sample rate reduction");
936 strcpy (params[i].long_desc, params[i].short_desc);
938 i++;
939 strcpy (params[i].name, "upstream-factor");
940 params[i].character = 'u';
941 params[i].type = JackDriverParamUInt;
942 params[i].value.ui = 0U;
943 strcpy (params[i].short_desc,
944 "Factor for sample rate reduction on the upstream");
945 strcpy (params[i].long_desc, params[i].short_desc);
947 i++;
948 strcpy (params[i].name, "celt");
949 params[i].character = 'c';
950 params[i].type = JackDriverParamUInt;
951 params[i].value.ui = 0U;
952 strcpy (params[i].short_desc,
953 "sets celt encoding and number of bytes per channel");
954 strcpy (params[i].long_desc, params[i].short_desc);
956 i++;
957 strcpy (params[i].name, "bit-depth");
958 params[i].character = 'b';
959 params[i].type = JackDriverParamUInt;
960 params[i].value.ui = 0U;
961 strcpy (params[i].short_desc,
962 "Sample bit-depth (0 for float, 8 for 8bit and 16 for 16bit)");
963 strcpy (params[i].long_desc, params[i].short_desc);
965 i++;
966 strcpy (params[i].name, "transport-sync");
967 params[i].character = 't';
968 params[i].type = JackDriverParamUInt;
969 params[i].value.ui = 1U;
970 strcpy (params[i].short_desc,
971 "Whether to slave the transport to the master transport");
972 strcpy (params[i].long_desc, params[i].short_desc);
974 i++;
975 strcpy (params[i].name, "autoconf");
976 params[i].character = 'a';
977 params[i].type = JackDriverParamUInt;
978 params[i].value.ui = 1U;
979 strcpy (params[i].short_desc,
980 "Whether to use Autoconfig, or just start.");
981 strcpy (params[i].long_desc, params[i].short_desc);
983 i++;
984 strcpy (params[i].name, "latency");
985 params[i].character = 'L';
986 params[i].type = JackDriverParamUInt;
987 params[i].value.ui = 5U;
988 strcpy (params[i].short_desc,
989 "Latency setting");
990 strcpy (params[i].long_desc, params[i].short_desc);
992 i++;
993 strcpy (params[i].name, "redundancy");
994 params[i].character = 'R';
995 params[i].type = JackDriverParamUInt;
996 params[i].value.ui = 1U;
997 strcpy (params[i].short_desc,
998 "Send packets N times");
999 strcpy (params[i].long_desc, params[i].short_desc);
1001 desc->params = params;
1003 return desc;
1006 const char driver_client_name[] = "net_pcm";
1008 jack_driver_t *
1009 driver_initialize (jack_client_t *client, const JSList * params)
1011 jack_nframes_t sample_rate = 48000;
1012 jack_nframes_t resample_factor = 1;
1013 jack_nframes_t period_size = 1024;
1014 unsigned int capture_ports = 2;
1015 unsigned int playback_ports = 2;
1016 unsigned int capture_ports_midi = 1;
1017 unsigned int playback_ports_midi = 1;
1018 unsigned int listen_port = 3000;
1019 unsigned int resample_factor_up = 0;
1020 unsigned int bitdepth = 0;
1021 unsigned int handle_transport_sync = 1;
1022 unsigned int use_autoconfig = 1;
1023 unsigned int latency = 5;
1024 unsigned int redundancy = 1;
1025 const JSList * node;
1026 const jack_driver_param_t * param;
1028 for (node = params; node; node = jack_slist_next (node)) {
1029 param = (const jack_driver_param_t *) node->data;
1031 switch (param->character) {
1033 case 'i':
1034 capture_ports = param->value.ui;
1035 break;
1037 case 'o':
1038 playback_ports = param->value.ui;
1039 break;
1041 case 'I':
1042 capture_ports_midi = param->value.ui;
1043 break;
1045 case 'O':
1046 playback_ports_midi = param->value.ui;
1047 break;
1049 case 'r':
1050 sample_rate = param->value.ui;
1051 break;
1053 case 'p':
1054 period_size = param->value.ui;
1055 break;
1057 case 'l':
1058 listen_port = param->value.ui;
1059 break;
1061 case 'f':
1062 resample_factor = param->value.ui;
1063 break;
1065 case 'u':
1066 resample_factor_up = param->value.ui;
1067 break;
1069 case 'b':
1070 bitdepth = param->value.ui;
1071 break;
1073 case 'c':
1074 #if HAVE_CELT
1075 bitdepth = 1000;
1076 resample_factor = param->value.ui;
1077 #else
1078 printf( "not built with celt support\n" );
1079 exit(10);
1080 #endif
1081 break;
1083 case 't':
1084 handle_transport_sync = param->value.ui;
1085 break;
1087 case 'a':
1088 use_autoconfig = param->value.ui;
1089 break;
1091 case 'L':
1092 latency = param->value.ui;
1093 break;
1095 case 'R':
1096 redundancy = param->value.ui;
1097 break;
1101 return net_driver_new (client, "net_pcm", capture_ports, playback_ports,
1102 capture_ports_midi, playback_ports_midi,
1103 sample_rate, period_size,
1104 listen_port, handle_transport_sync,
1105 resample_factor, resample_factor_up, bitdepth,
1106 use_autoconfig, latency, redundancy);
1109 void
1110 driver_finish (jack_driver_t *driver)
1112 net_driver_delete ((net_driver_t *) driver);