Fixed handling timers in case an event is modified and "phased out" while the timer is recording

This commit is contained in:
Klaus Schmidinger 2012-10-16 08:24:10 +02:00
parent 4149053935
commit 38d48afad9
2 changed files with 15 additions and 10 deletions

View File

@ -7272,7 +7272,7 @@ Video Disk Recorder Revision History
".keep" to prevent a directory from being deleted when it is empty. Currently the ".keep" to prevent a directory from being deleted when it is empty. Currently the
only file name that is ignored is ".sort". only file name that is ignored is ".sort".
2012-10-15: Version 1.7.32 2012-10-16: Version 1.7.32
- Pressing the Play key during normal live viewing mode now opens the Recordings menu - Pressing the Play key during normal live viewing mode now opens the Recordings menu
if there is no "last viewed" recording (thanks to Alexander Wenzel). if there is no "last viewed" recording (thanks to Alexander Wenzel).
@ -7303,3 +7303,5 @@ Video Disk Recorder Revision History
closer). closer).
- Fixed a possible memory leak in SI::StructureLoop::getNextAsPointer() (reported by - Fixed a possible memory leak in SI::StructureLoop::getNextAsPointer() (reported by
Sundararaj Reel). Sundararaj Reel).
- Fixed handling timers in case an event is modified and "phased out" while the timer
is recording.

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: timers.c 2.13 2012/10/13 14:16:22 kls Exp $ * $Id: timers.c 2.14 2012/10/16 08:22:39 kls Exp $
*/ */
#include "timers.h" #include "timers.h"
@ -465,10 +465,11 @@ bool cTimer::Matches(time_t t, bool Directly, int Margin) const
startTime = event->StartTime(); startTime = event->StartTime();
stopTime = event->EndTime(); stopTime = event->EndTime();
if (!Margin) { // this is an actual check if (!Margin) { // this is an actual check
if (event->Schedule()->PresentSeenWithin(EITPRESENTFOLLOWINGRATE)) // VPS control can only work with up-to-date events... if (event->Schedule()->PresentSeenWithin(EITPRESENTFOLLOWINGRATE)) { // VPS control can only work with up-to-date events...
return event->IsRunning(true); if (event->StartTime() > 0) // checks for "phased out" events
else return event->IsRunning(true);
return startTime <= t && t < stopTime; // ...otherwise we fall back to normal timer handling }
return startTime <= t && t < stopTime; // ...otherwise we fall back to normal timer handling
} }
} }
} }
@ -549,10 +550,12 @@ void cTimer::SetEventFromSchedule(const cSchedules *Schedules)
lastSetEvent = now; lastSetEvent = now;
const cEvent *Event = NULL; const cEvent *Event = NULL;
if (HasFlags(tfVps) && Schedule->Events()->First()->Vps()) { if (HasFlags(tfVps) && Schedule->Events()->First()->Vps()) {
if (event && Recording()) if (event && event->StartTime() > 0) { // checks for "phased out" events
return; // let the recording end first if (Recording())
if (event && (now <= event->EndTime() || Matches(0, true))) return; // let the recording end first
return; // stay with the old event until the timer has completely expired if (now <= event->EndTime() || Matches(0, true))
return; // stay with the old event until the timer has completely expired
}
// VPS timers only match if their start time exactly matches the event's VPS time: // VPS timers only match if their start time exactly matches the event's VPS time:
for (const cEvent *e = Schedule->Events()->First(); e; e = Schedule->Events()->Next(e)) { for (const cEvent *e = Schedule->Events()->First(); e; e = Schedule->Events()->Next(e)) {
if (e->StartTime() && e->RunningStatus() != SI::RunningStatusNotRunning) { // skip outdated events if (e->StartTime() && e->RunningStatus() != SI::RunningStatusNotRunning) { // skip outdated events