diff options
Diffstat (limited to 'vdr.c')
-rw-r--r-- | vdr.c | 61 |
1 files changed, 35 insertions, 26 deletions
@@ -22,7 +22,7 @@ * * The project's page is at http://www.cadsoft.de/vdr * - * $Id: vdr.c 1.272 2006/05/14 09:23:46 kls Exp $ + * $Id: vdr.c 1.274 2006/06/04 09:04:47 kls Exp $ */ #include <getopt.h> @@ -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,8 +503,9 @@ 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; // Load plugins: @@ -605,6 +607,7 @@ int main(int argc, char *argv[]) new cSkinSTTNG; Skins.SetCurrent(Setup.OSDSkin); cThemes::Load(Skins.Current()->Name(), Setup.OSDTheme, Skins.Current()->Theme()); + CurrentSkin = Skins.Current(); // Start plugins: @@ -613,8 +616,10 @@ int main(int argc, char *argv[]) // Set skin and theme in case they're implemented by a plugin: - Skins.SetCurrent(Setup.OSDSkin); - cThemes::Load(Skins.Current()->Name(), Setup.OSDTheme, Skins.Current()->Theme()); + if (!CurrentSkin || CurrentSkin == Skins.Current() && strcmp(Skins.Current()->Name(), Setup.OSDSkin) != 0) { + Skins.SetCurrent(Setup.OSDSkin); + cThemes::Load(Skins.Current()->Name(), Setup.OSDTheme, Skins.Current()->Theme()); + } // Remote Controls: if (RcuDevice) @@ -758,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) { @@ -793,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 @@ -806,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: @@ -826,7 +835,7 @@ int main(int argc, char *argv[]) } } } - LastVpsCheck = time(NULL); + LastTimerCheck = time(NULL); } // Delete expired timers: Timers.DeleteExpired(); @@ -1125,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()) |