summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKlaus Schmidinger <vdr@tvdr.de>2006-06-16 09:22:20 +0200
committerKlaus Schmidinger <vdr@tvdr.de>2006-06-16 09:22:20 +0200
commit1d4512cbea1cf983890205d4e2af32f0e96350ee (patch)
tree9cd696f2c50daa143ca8982d0aaf1bb2b1b9288a
parent3ed538f4966d5f3807c04b7c9def02ec83034f9e (diff)
downloadvdr-1d4512cbea1cf983890205d4e2af32f0e96350ee.tar.gz
vdr-1d4512cbea1cf983890205d4e2af32f0e96350ee.tar.bz2
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
-rw-r--r--HISTORY5
-rw-r--r--vdr.c30
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 <getopt.h>
@@ -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