From 1d4512cbea1cf983890205d4e2af32f0e96350ee Mon Sep 17 00:00:00 2001 From: Klaus Schmidinger Date: Fri, 16 Jun 2006 09:22:20 +0200 Subject: [PATCH] Now making sure VPS timers don't get stuck with outdated events, and that the actual device isn't used for updating a VPS timer's event as long as other free devices are available --- HISTORY | 5 ++++- vdr.c | 30 +++++++++++++++++------------- 2 files changed, 21 insertions(+), 14 deletions(-) diff --git a/HISTORY b/HISTORY index 45a7ce0d..550d9f7d 100644 --- a/HISTORY +++ b/HISTORY @@ -4783,7 +4783,7 @@ Video Disk Recorder Revision History so that they can be suppressed in normal operation mode to avoid clogging the log file in case this function is used frequently (suggested by Helmut Auer). -2006-06-15: Version 1.4.1-1 +2006-06-16: Version 1.4.1-1 - Added "-fPIC" to the compiler options in Make.config.template when compiling plugins (thanks to Udo Richter). If you use your own Make.config file, you may @@ -4791,3 +4791,6 @@ Video Disk Recorder Revision History - Added some comment to cDevice::GetDevice() to explain how the individual conditions are put together to make a decision on which device to use. - Updated 'S13E' in 'sources.conf' (thanks to Antti Hartikainen). +- Now making sure VPS timers don't get stuck with outdated events, and that the + actual device isn't used for updating a VPS timer's event as long as other + free devices are available. diff --git a/vdr.c b/vdr.c index 2f6ad646..2ff9e8cb 100644 --- a/vdr.c +++ b/vdr.c @@ -22,7 +22,7 @@ * * The project's page is at http://www.cadsoft.de/vdr * - * $Id: vdr.c 1.274 2006/06/04 09:04:47 kls Exp $ + * $Id: vdr.c 1.275 2006/06/16 09:17:24 kls Exp $ */ #include @@ -47,6 +47,7 @@ #include "i18n.h" #include "interface.h" #include "keys.h" +#include "libsi/si.h" #include "lirc.h" #include "menu.h" #include "osdbase.h" @@ -773,10 +774,14 @@ int main(int argc, char *argv[]) bool NeedsTransponder = false; if (Timer->HasFlags(tfActive) && !Timer->Recording()) { if (Timer->HasFlags(tfVps)) { - if (Timer->Matches(Now, true, Setup.VpsMargin)) + if (Timer->Matches(Now, true, Setup.VpsMargin)) { InVpsMargin = true; - else if (Timer->Event()) + Timer->SetInVpsMargin(InVpsMargin); + } + else if (Timer->Event()) { + InVpsMargin = Timer->Event()->StartTime() <= Now && Timer->Event()->RunningStatus() == SI::RunningStatusUndefined; NeedsTransponder = Timer->Event()->StartTime() - Now < VPSLOOKAHEADTIME * 3600 && !Timer->Event()->SeenWithin(VPSUPTODATETIME); + } else { cSchedulesLock SchedulesLock; const cSchedules *Schedules = cSchedules::Schedules(SchedulesLock); @@ -790,10 +795,10 @@ int main(int argc, char *argv[]) else NeedsTransponder = Timer->Matches(Now, true, TIMERLOOKAHEADTIME); } - Timer->SetInVpsMargin(InVpsMargin); if (NeedsTransponder || InVpsMargin) { // Find a device that provides the required transponder: cDevice *Device = NULL; + bool DeviceAvailable = false; for (int i = 0; i < cDevice::NumDevices(); i++) { cDevice *d = cDevice::GetDevice(i); if (d && d->ProvidesTransponder(Timer->Channel())) { @@ -802,18 +807,17 @@ int main(int argc, char *argv[]) Device = d; break; } - else if (Now - DeviceUsed[d->DeviceNumber()] > TIMERDEVICETIMEOUT) { - // only check other devices if they have been left alone for a while - if (d->MaySwitchTransponder()) - // this one can be switched without disturbing anything else - Device = d; - else if (!Device && InVpsMargin && !d->Receiving() && d->ProvidesTransponderExclusively(Timer->Channel())) - // use this one only if no other with less impact can be found - Device = d; + bool timeout = Now - DeviceUsed[d->DeviceNumber()] > TIMERDEVICETIMEOUT; // only check other devices if they have been left alone for a while + if (d->MaySwitchTransponder()) { + DeviceAvailable = true; // avoids using the actual device below + if (timeout) + Device = d; // only check other devices if they have been left alone for a while } + else if (timeout && !Device && InVpsMargin && !d->Receiving() && d->ProvidesTransponderExclusively(Timer->Channel())) + Device = d; // use this one only if no other with less impact can be found } } - if (!Device && InVpsMargin) { + if (!Device && InVpsMargin && !DeviceAvailable) { cDevice *d = cDevice::ActualDevice(); if (!d->Receiving() && d->ProvidesTransponder(Timer->Channel()) && Now - DeviceUsed[d->DeviceNumber()] > TIMERDEVICETIMEOUT) Device = d; // use the actual device as a last resort