Fixed handling timers during the change from DST to winter time

This commit is contained in:
Klaus Schmidinger 2017-11-12 13:13:06 +01:00
parent 54b721ebde
commit 8dcff164fa
3 changed files with 17 additions and 9 deletions

View File

@ -2839,6 +2839,7 @@ Johann Friedrichs <johann.friedrichs@web.de>
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 <timolavi@mbnet.fi>
for reporting a hangup when replaying a TS recording with subtitles activated

View File

@ -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).

View File

@ -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;