diff --git a/drivers/netjack/net_driver.c b/drivers/netjack/net_driver.c index ebfbcbb..0c229ca 100644 --- a/drivers/netjack/net_driver.c +++ b/drivers/netjack/net_driver.c @@ -58,9 +58,12 @@ static jack_nframes_t net_driver_wait (net_driver_t *driver, int extra_fd, int *status, float *delayed_usecs) { netjack_driver_state_t *netj = &( driver->netj ); + int delay; - if( netjack_wait( netj ) ) { - driver->engine->delay( driver->engine, 0 ); + delay = netjack_wait( netj ); + if( delay ) { + driver->engine->delay( driver->engine, (float)delay ); + jack_error( "netxruns amount: %dms", delay/1000 ); } diff --git a/drivers/netjack/netjack.c b/drivers/netjack/netjack.c index 0b2b88d..347b243 100644 --- a/drivers/netjack/netjack.c +++ b/drivers/netjack/netjack.c @@ -274,8 +274,9 @@ int netjack_wait( netjack_driver_state_t *netj ) netj->running_free = 0; jack_info( "resync after freerun... %d\n", netj->expected_framecnt ); } else { - // give up. lets run freely. - // XXX: hmm... + if( netj->num_lost_packets == 101 ) { + jack_info( "master seems gone... entering freerun mode\n", netj->expected_framecnt ); + } netj->running_free = 1; @@ -292,16 +293,20 @@ int netjack_wait( netjack_driver_state_t *netj ) } } - if( !netj->packet_data_valid ) + int retval = 0; + + if( !netj->packet_data_valid ) { netj->num_lost_packets += 1; - else { + if( netj->num_lost_packets == 1 ) + retval = netj->period_usecs; + } else { + if( (netj->num_lost_packets>1) && !netj->running_free ) + retval = (netj->num_lost_packets-1) * netj->period_usecs; + netj->num_lost_packets = 0; } - if( !netj->packet_data_valid && !netj->running_free ) - return 1; - - return 0; + return retval; } void netjack_send_silence( netjack_driver_state_t *netj, int syncstate )