[linux-dvb] Improving recovery in the frontend tuning thread

Jon Burgess jburgess at uklinux.net
Fri Sep 2 23:11:11 CEST 2005

While reading through the frontend tuning thread code I noticed that the 
algorithm in update_delay() looks wrong. The code doesn't have any 
comments in it to indicate what it is intended to do, but the way I read 
it, the intention is to slow down the scanning if we've recently locked 
and make it faster when we've not locked for a while.

Here is the piece of the code in question:

static void update_delay(int *quality, int *delay, int min_delay, int 
     int q2;

     if (locked)
	      (*quality) = (*quality * 220 + 36*256) / 256;
	      (*quality) = (*quality * 220 + 0) / 256;

     q2 = *quality - 128;
     q2 *= q2;
     *delay = min_delay + q2 * HZ / (128*128);

The quality value slowly increases when we lock and drops when unlocked.

The code does the right thing if the quality level is > 128, by 
returning an increasing delay as the quality increases (i.e. more delay 
when we are locked most of the time).

What I think is wrong is that as the quality goes below 128 the delay 
also starts to increase! This is because q2 goes negative and so q2*q2 
is positive and increases as quality goes to zero. If we never get a 
lock then the delay is just as long as if we have a near perfect lock.

I reckon the behaviour needs to be adjusted as per this patch so that 
the code returns "min_delay" for all values of quality < 128. It should 
help recover more quickly if the signal has been unlocked for a long time.

Does this make things better?
Or is the large delay when the quality is near zero intentional?


-------------- next part --------------
A non-text attachment was scrubbed...
Name: dvb-fe-delay.patch
Type: text/x-patch
Size: 483 bytes
Desc: not available
Url : http://www.linuxtv.org/pipermail/linux-dvb/attachments/20050902/66aec8b2/dvb-fe-delay.bin

More information about the linux-dvb mailing list