Browse Source

[netjack] improve deadline handling, to recover from running too fast.

git-svn-id: svn+ssh://jackaudio.org/trunk/jack@3190 0c269be4-1314-0410-8aa9-9f06e86f4224
tags/0.116.1^0
torben 17 years ago
parent
commit
cd4ee518dc
2 changed files with 30 additions and 7 deletions
  1. +29
    -6
      drivers/netjack/net_driver.c
  2. +1
    -1
      tools/netsource.c

+ 29
- 6
drivers/netjack/net_driver.c View File

@@ -166,11 +166,11 @@ net_driver_wait (net_driver_t *driver, int extra_fd, int *status, float *delayed
driver->next_deadline += driver->period_usecs/1000;
*/

if( driver->deadline_goodness < 1*(int)driver->period_usecs/8*driver->latency ) {
if( driver->deadline_goodness < 10*(int)driver->period_usecs/100*driver->latency ) {
driver->next_deadline -= driver->period_usecs/1000;
//printf( "goodness: %d, Adjust deadline: --- %d\n", driver->deadline_goodness, (int) driver->period_usecs*driver->latency/100 );
}
if( driver->deadline_goodness > 1*(int)driver->period_usecs/8*driver->latency ) {
if( driver->deadline_goodness > 10*(int)driver->period_usecs/100*driver->latency ) {
driver->next_deadline += driver->period_usecs/1000;
//printf( "goodness: %d, Adjust deadline: +++ %d\n", driver->deadline_goodness, (int) driver->period_usecs*driver->latency/100 );
}
@@ -224,16 +224,39 @@ net_driver_wait (net_driver_t *driver, int extra_fd, int *status, float *delayed
//printf( "frame %d No Packet in queue. num_lost_packets = %d \n", driver->expected_framecnt, driver->num_lost_packets );
if( driver->num_lost_packets < 5 ) {
// adjust deadline.
//driver->next_deadline += driver->period_usecs/8;
// ok. No Packet in queue. The packet was either lost,
// or we are running too fast.
//
// Adjusting the deadline unconditionally resulted in
// too many xruns on master.
// But we need to adjust for the case we are running too fast.
// So lets check if the last packet is there now.
//
// It would not be in the queue anymore, if it had been
// retrieved. This might break for redundancy, but
// i will make the packet cache drop redundant packets,
// that have already been retreived.
//
if( packet_cache_get_highest_available_framecnt( global_packcache, &next_frame_avail) ) {
if( next_frame_avail == (driver->expected_framecnt - 1) ) {
// Ok. the last packet is there now.
// and it had not been retrieved.
//
// TODO: We are still dropping 2 packets.
// perhaps we can adjust the deadline
// when (num_packets lost == 0)
// This might still be too much.
driver->next_deadline += driver->period_usecs/8;
}
}
} else if( (driver->num_lost_packets <= 10) ) {
// lets try adjusting the deadline harder, for some packets, we might have just ran 2 fast.
//driver->next_deadline += driver->period_usecs*driver->latency/8;
} else {
// But now we can check for any new frame available.
// now with redundancy we would move back in most cases.
// we dont want that.
//
if( packet_cache_get_highest_available_framecnt( global_packcache, &next_frame_avail) ) {
driver->expected_framecnt = next_frame_avail;
packet_cache_retreive_packet( global_packcache, driver->expected_framecnt, (char *) driver->rx_buf, driver->rx_bufsize, NULL );


+ 1
- 1
tools/netsource.c View File

@@ -287,7 +287,7 @@ process (jack_nframes_t nframes, void *arg)
state_connected = 0;
packet_cache_reset_master_address( global_packcache );
//printf ("Frame %d \tRealy too many packets missed (%d). Let's reset the counter\n", framecnt, cont_miss);
cont_miss = 5;
cont_miss = 0;
}

/*


Loading…
Cancel
Save