1 /* -*- mode: c; c-file-style: "linux"; -*- */
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 $
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>
46 #include <samplerate.h>
49 #include <celt/celt.h>
52 #include "net_driver.h"
53 #include "netjack_packet.h"
57 #define MIN(x,y) ((x)<(y) ? (x) : (y))
59 static int sync_state
= TRUE
;
60 static jack_transport_state_t last_transport_state
;
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
) {
70 // if (state == JackTransportStarting)
71 // jack_info("Starting sync_state = %d", sync_state);
72 last_transport_state
= state
;
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
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);
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
;
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;
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.
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;
127 if( ! netjack_poll_deadline( driver
->sockfd
, driver
->next_deadline
) )
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
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
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 );
178 driver
->time_to_deadline
= 0;
179 // bah... the packet is not there.
183 // - sync source is not sending anymore.
185 // lets check if we have the next packets, we will just run a cycle without data.
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 )
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;
210 // the diff is too high. but we have a packet in the future.
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;
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;
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
);
270 // give up. lets run freely.
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;
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 */
305 return driver
->period_size
;
309 net_driver_run_cycle (net_driver_t
*driver
)
311 jack_engine_t
*engine
= driver
->engine
;
312 int wait_status
= -1;
315 jack_nframes_t nframes
= net_driver_wait (driver
, -1, &wait_status
,
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
);
332 net_driver_null_cycle (net_driver_t
* driver
, jack_nframes_t nframes
)
334 // TODO: talk to paul about this.
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
)
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
);
377 net_driver_bufsize (net_driver_t
* driver
, jack_nframes_t nframes
)
379 if (nframes
!= driver
->period_size
)
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
);
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;
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
;
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
;
433 jack_info("starting locate to %d", pkthdr
->transport_frame
+ (pkthdr
->latency
)*nframes
);
436 case JackTransportStopped
:
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
);
445 case JackTransportRolling
:
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);
451 if (local_trans_state
!= JackTransportRolling
)
452 jack_transport_start (driver
->client
);
455 case JackTransportLooping
:
460 render_payload_to_jack_ports (driver
->bitdepth
, packet_bufX
, driver
->net_period_down
, driver
->capture_ports
, driver
->capture_srcs
, nframes
);
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
) {
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
)
497 static const int flag
= 0;
499 static const int flag
= MSG_CONFIRM
;
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
);
515 net_driver_attach (net_driver_t
*driver
)
517 //puts ("net_driver_attach");
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
,
538 jack_error ("NET: cannot register port for %s", buf
);
542 driver
->capture_ports
=
543 jack_slist_append (driver
->capture_ports
, port
);
545 if( driver
->bitdepth
== 1000 ) {
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
) );
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
,
562 jack_error ("NET: cannot register port for %s", buf
);
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
,
581 jack_error ("NET: cannot register port for %s", buf
);
585 driver
->playback_ports
=
586 jack_slist_append (driver
->playback_ports
, port
);
587 if( driver
->bitdepth
== 1000 ) {
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
) );
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
,
605 jack_error ("NET: cannot register port for %s", buf
);
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
);
619 net_driver_detach (net_driver_t
*driver
)
623 if (driver
->engine
== 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
;
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
;
645 net_driver_delete (net_driver_t
*driver
)
647 jack_driver_nt_finish ((jack_driver_nt_t
*) driver
);
651 static jack_driver_t
*
652 net_driver_new (jack_client_t
* client
,
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
;
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
;
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
);
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");
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");
745 driver
->outsockfd
= socket (PF_INET
, SOCK_DGRAM
, 0);
746 if (driver
->outsockfd
== -1)
748 jack_info ("socket error");
751 driver
->srcaddress_valid
= 0;
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.
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
);
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
)
820 if( driver
->bitdepth
== 1000 ) {
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
;
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;
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 */
860 driver_get_descriptor ()
862 jack_driver_desc_t
* desc
;
863 jack_driver_param_desc_t
* params
;
866 desc
= calloc (1, sizeof (jack_driver_desc_t
));
867 strcpy (desc
->name
, "net");
870 params
= calloc (desc
->nparams
, sizeof (jack_driver_param_desc_t
));
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
,
990 strcpy (params
[i
].long_desc
, params
[i
].short_desc
);
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
;
1006 const char driver_client_name
[] = "net_pcm";
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
) {
1034 capture_ports
= param
->value
.ui
;
1038 playback_ports
= param
->value
.ui
;
1042 capture_ports_midi
= param
->value
.ui
;
1046 playback_ports_midi
= param
->value
.ui
;
1050 sample_rate
= param
->value
.ui
;
1054 period_size
= param
->value
.ui
;
1058 listen_port
= param
->value
.ui
;
1062 resample_factor
= param
->value
.ui
;
1066 resample_factor_up
= param
->value
.ui
;
1070 bitdepth
= param
->value
.ui
;
1076 resample_factor
= param
->value
.ui
;
1078 printf( "not built with celt support\n" );
1084 handle_transport_sync
= param
->value
.ui
;
1088 use_autoconfig
= param
->value
.ui
;
1092 latency
= param
->value
.ui
;
1096 redundancy
= param
->value
.ui
;
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
);
1110 driver_finish (jack_driver_t
*driver
)
1112 net_driver_delete ((net_driver_t
*) driver
);