diff --git a/CONTRIBUTORS b/CONTRIBUTORS index 0711b5bf..6ea191ea 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -2839,6 +2839,7 @@ Johann Friedrichs be an abandoned member of class cSchedulesLock for fixing handling VPS events outside the LingerLimit, which could cause recordings to stop prematurely + for fixing handling timers during the change from DST to winter time Timo Helkio for reporting a hangup when replaying a TS recording with subtitles activated diff --git a/HISTORY b/HISTORY index ddd9044a..8b793f05 100644 --- a/HISTORY +++ b/HISTORY @@ -9162,7 +9162,7 @@ Video Disk Recorder Revision History a subdirectory. - SVDRP peering can now be limited to the default SVDRP host (see MANUAL for details). -2017-11-11: Version 2.3.9 +2017-11-12: Version 2.3.9 - Updated the Italian OSD texts (thanks to Diego Pierotto). - Updated the Finnish OSD texts (thanks to Rolf Ahrenberg). @@ -9199,3 +9199,5 @@ Video Disk Recorder Revision History - The new SVDRP commands 'LSTD' and 'PRIM' can be used to list all available devices and to switch the primary device (thanks to Thomas Reufer). - Added some comments regarding font height (thanks to Thomas Reufer). +- Fixed handling timers during the change from DST to winter time (thanks to Johann + Friedrichs). diff --git a/timers.c b/timers.c index 6859eece..9d28f922 100644 --- a/timers.c +++ b/timers.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: timers.c 4.13 2017/11/09 12:10:46 kls Exp $ + * $Id: timers.c 4.14 2017/11/12 13:01:22 kls Exp $ */ #include "timers.h" @@ -419,20 +419,25 @@ bool cTimer::Matches(time_t t, bool Directly, int Margin) const t = time(NULL); int begin = TimeToInt(start); // seconds from midnight - int length = TimeToInt(stop) - begin; - if (length < 0) - length += SECSINDAY; + int end = TimeToInt(stop); + int length = end - begin; if (IsSingleEvent()) { - startTime = SetTime(day, begin); - stopTime = startTime + length; + time_t t0 = day; + startTime = SetTime(t0, begin); + if (length < 0) + t0 = IncDay(day, 1); + stopTime = SetTime(t0, end); } else { + time_t d = day ? max(day, t) : t; for (int i = -1; i <= 7; i++) { - time_t t0 = IncDay(day ? max(day, t) : t, i); + time_t t0 = IncDay(d, i); if (DayMatches(t0)) { time_t a = SetTime(t0, begin); - time_t b = a + length; + if (length < 0) + t0 = IncDay(d, i + 1); + time_t b = SetTime(t0, end); if ((!day || a >= day) && t < b) { startTime = a; stopTime = b;