From 50c0b03f0c21d95770d4c772b4b08bb1fa5fe91c Mon Sep 17 00:00:00 2001 From: Klaus Schmidinger Date: Sun, 4 Jun 2006 09:10:59 +0200 Subject: [PATCH] Now switching to non-VPS timers' channels 60 seconds before the timer starts --- HISTORY | 5 ++++- vdr.c | 53 +++++++++++++++++++++++++++++------------------------ 2 files changed, 33 insertions(+), 25 deletions(-) diff --git a/HISTORY b/HISTORY index cbabbaf0..2fa2f944 100644 --- a/HISTORY +++ b/HISTORY @@ -4746,7 +4746,7 @@ Video Disk Recorder Revision History - Fixed deleting channels in case the current channel's number changes (reported by Mirko Dölle). -2006-06-03: Version 1.4.0-3 +2006-06-04: Version 1.4.0-3 - Fixed the PremiereContentTransmissionDescriptor in 'libsi' (thanks to Stefan Huelswitt). @@ -4773,3 +4773,6 @@ Video Disk Recorder Revision History - Added some log messages when setting the current skin. - Only making a second attempt to set the current skin at startup if the first attempt has failed. +- Now switching to non-VPS timers' channels 60 seconds before the timer starts + (if a free device is available), to allow for the updating of EPG data and CA + descriptors before the actual recording starts. diff --git a/vdr.c b/vdr.c index 42309128..2f6ad646 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.273 2006/06/03 14:46:36 kls Exp $ + * $Id: vdr.c 1.274 2006/06/04 09:04:47 kls Exp $ */ #include @@ -72,8 +72,9 @@ #define DEVICEREADYTIMEOUT 30 // seconds to wait until all devices are ready #define MENUTIMEOUT 120 // seconds of user inactivity after which an OSD display is closed #define SHUTDOWNRETRY 300 // seconds before trying again to shut down -#define VPSCHECKDELTA 10 // seconds between checks for timers that have entered the VPS margin -#define VPSDEVICETIMEOUT 8 // seconds before a device used for VPS may be reused +#define TIMERCHECKDELTA 10 // seconds between checks for timers that need to see their channel +#define TIMERDEVICETIMEOUT 8 // seconds before a device used for timer check may be reused +#define TIMERLOOKAHEADTIME 60 // seconds before a non-VPS timer starts and the channel is switched if possible #define VPSLOOKAHEADTIME 24 // hours within which VPS timers will make sure their events are up to date #define VPSUPTODATETIME 3600 // seconds before the event or schedule of a VPS timer needs to be refreshed @@ -502,7 +503,7 @@ int main(int argc, char *argv[]) int MaxLatencyTime = 0; bool ForceShutdown = false; bool UserShutdown = false; - bool TimerInVpsMargin = false; + bool InhibitEpgScan = false; bool IsInfoMenu = false; cSkin *CurrentSkin = NULL; @@ -762,28 +763,32 @@ int main(int argc, char *argv[]) else LastTimerChannel = Timer->Channel()->Number(); } - // Make sure VPS timers "see" their channel early enough: - static time_t LastVpsCheck = 0; - if (Now - LastVpsCheck > VPSCHECKDELTA) { // don't do this too often - TimerInVpsMargin = false; + // Make sure timers "see" their channel early enough: + static time_t LastTimerCheck = 0; + if (Now - LastTimerCheck > TIMERCHECKDELTA) { // don't do this too often + InhibitEpgScan = false; static time_t DeviceUsed[MAXDEVICES] = { 0 }; for (cTimer *Timer = Timers.First(); Timer; Timer = Timers.Next(Timer)) { bool InVpsMargin = false; bool NeedsTransponder = false; - if (Timer->HasFlags(tfActive | tfVps) && !Timer->Recording()) { - if (Timer->Matches(Now, true, Setup.VpsMargin)) - InVpsMargin = true; - else if (Timer->Event()) - NeedsTransponder = Timer->Event()->StartTime() - Now < VPSLOOKAHEADTIME * 3600 && !Timer->Event()->SeenWithin(VPSUPTODATETIME); - else { - cSchedulesLock SchedulesLock; - const cSchedules *Schedules = cSchedules::Schedules(SchedulesLock); - if (Schedules) { - const cSchedule *Schedule = Schedules->GetSchedule(Timer->Channel()); - NeedsTransponder = Schedule && !Schedule->PresentSeenWithin(VPSUPTODATETIME); + if (Timer->HasFlags(tfActive) && !Timer->Recording()) { + if (Timer->HasFlags(tfVps)) { + if (Timer->Matches(Now, true, Setup.VpsMargin)) + InVpsMargin = true; + else if (Timer->Event()) + NeedsTransponder = Timer->Event()->StartTime() - Now < VPSLOOKAHEADTIME * 3600 && !Timer->Event()->SeenWithin(VPSUPTODATETIME); + else { + cSchedulesLock SchedulesLock; + const cSchedules *Schedules = cSchedules::Schedules(SchedulesLock); + if (Schedules) { + const cSchedule *Schedule = Schedules->GetSchedule(Timer->Channel()); + NeedsTransponder = Schedule && !Schedule->PresentSeenWithin(VPSUPTODATETIME); + } } + InhibitEpgScan |= InVpsMargin | NeedsTransponder; } - TimerInVpsMargin |= InVpsMargin | NeedsTransponder; + else + NeedsTransponder = Timer->Matches(Now, true, TIMERLOOKAHEADTIME); } Timer->SetInVpsMargin(InVpsMargin); if (NeedsTransponder || InVpsMargin) { @@ -797,7 +802,7 @@ int main(int argc, char *argv[]) Device = d; break; } - else if (Now - DeviceUsed[d->DeviceNumber()] > VPSDEVICETIMEOUT) { + 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 @@ -810,7 +815,7 @@ int main(int argc, char *argv[]) } if (!Device && InVpsMargin) { cDevice *d = cDevice::ActualDevice(); - if (!d->Receiving() && d->ProvidesTransponder(Timer->Channel()) && Now - DeviceUsed[d->DeviceNumber()] > VPSDEVICETIMEOUT) + if (!d->Receiving() && d->ProvidesTransponder(Timer->Channel()) && Now - DeviceUsed[d->DeviceNumber()] > TIMERDEVICETIMEOUT) Device = d; // use the actual device as a last resort } // Switch the device to the transponder: @@ -830,7 +835,7 @@ int main(int argc, char *argv[]) } } } - LastVpsCheck = time(NULL); + LastTimerCheck = time(NULL); } // Delete expired timers: Timers.DeleteExpired(); @@ -1129,7 +1134,7 @@ int main(int argc, char *argv[]) } } if (!Menu) { - if (!TimerInVpsMargin) + if (!InhibitEpgScan) EITScanner.Process(); if (!cCutter::Active() && cCutter::Ended()) { if (cCutter::Error())