diff --git a/HISTORY b/HISTORY index a465182a..fdc91853 100644 --- a/HISTORY +++ b/HISTORY @@ -9578,7 +9578,7 @@ Video Disk Recorder Revision History given (reported by Manuel Reimer). - Fixed handling $(PKG_CONFIG) in newplugin (thanks to Winfried Köhler). -2021-01-11: +2021-01-14: - Fixed strreplace() to handle NULL strings (reported by Jürgen Schneider). - Somewhere down the road the 'x' bit of Doxyfile.filter got lost, so the @@ -9593,3 +9593,4 @@ Video Disk Recorder Revision History (reported by Jürgen Schneider). - Increased the number of possible modulation systems in cDevice::GetDevice() (reported by Ulf Grüne). +- Now explicitly triggering respawning of pattern timers. diff --git a/channels.h b/channels.h index de99830f..dd16b351 100644 --- a/channels.h +++ b/channels.h @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: channels.h 4.5 2020/06/10 14:00:36 kls Exp $ + * $Id: channels.h 5.1 2021/01/14 10:29:05 kls Exp $ */ #ifndef __CHANNELS_H @@ -178,6 +178,7 @@ public: void SetNumber(int Number) { number = Number; } bool GroupSep(void) const { return groupSep; } const char *Parameters(void) const { return parameters; } + const cSchedule *Schedule(void) const { return schedule; } const cLinkChannels* LinkChannels(void) const { return linkChannels; } const cChannel *RefChannel(void) const { return refChannel; } bool IsAtsc(void) const { return cSource::IsAtsc(source); } diff --git a/menu.c b/menu.c index 4b2815ec..8685fb1c 100644 --- a/menu.c +++ b/menu.c @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: menu.c 5.2 2021/01/01 15:26:27 kls Exp $ + * $Id: menu.c 5.3 2021/01/14 10:29:05 kls Exp $ */ #include "menu.h" @@ -1191,6 +1191,7 @@ eOSState cMenuEditTimer::ProcessKey(eKeys Key) data.SetEvent(NULL); *timer = data; } + timer->TriggerRespawn(); LOCK_SCHEDULES_READ; timer->SetEventFromSchedule(Schedules); timer->Matches(); diff --git a/svdrp.c b/svdrp.c index b3c4c350..b993577f 100644 --- a/svdrp.c +++ b/svdrp.c @@ -10,7 +10,7 @@ * and interact with the Video Disk Recorder - or write a full featured * graphical interface that sits on top of an SVDRP connection. * - * $Id: svdrp.c 5.2 2021/01/01 21:23:00 kls Exp $ + * $Id: svdrp.c 5.3 2021/01/14 10:29:05 kls Exp $ */ #include "svdrp.h" @@ -1484,6 +1484,7 @@ void cSVDRPServer::CmdDELT(const char *Option) Timer->Skip(); cRecordControls::Process(Timers, time(NULL)); } + Timer->TriggerRespawn(); Timers->Del(Timer); Timers->SetModified(); isyslog("SVDRP %s < %s deleted timer %s", Setup.SVDRPHostName, *clientName, *Timer->ToDescr()); @@ -2063,6 +2064,7 @@ void cSVDRPServer::CmdMODT(const char *Option) isyslog("SVDRP %s < %s modified timer %s (%s)", Setup.SVDRPHostName, *clientName, *Timer->ToDescr(), Timer->HasFlags(tfActive) ? "active" : "inactive"); if (Timer->IsPatternTimer()) Timer->SetEvent(NULL); + Timer->TriggerRespawn(); Reply(250, "%d %s", Timer->Id(), *Timer->ToText(true)); } else diff --git a/timers.c b/timers.c index 7855bb16..7e697f81 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 5.2 2021/01/07 16:00:17 kls Exp $ + * $Id: timers.c 5.3 2021/01/14 10:29:05 kls Exp $ */ #include "timers.h" @@ -739,6 +739,20 @@ bool cTimer::SpawnPatternTimers(const cSchedules *Schedules, cTimers *Timers) return TimersSpawned; } +void cTimer::TriggerRespawn(void) +{ + if (HasFlags(tfSpawned) || IsPatternTimer()) { + if (Channel()) { + LOCK_CHANNELS_READ; + if (const cSchedule *Schedule = Channel()->Schedule()) { + dsyslog("triggering respawn for timer %s", *ToDescr()); + LOCK_SCHEDULES_WRITE; + const_cast(Schedule)->SetModified(); + } + } + } +} + bool cTimer::SetEventFromSchedule(const cSchedules *Schedules) { if (IsPatternTimer()) @@ -918,7 +932,7 @@ void cTimer::OnOff(void) SetFlags(tfActive); SetEvent(NULL); if (HasFlags(tfActive)) - scheduleState = -1; // have pattern timers spawn if necessary + TriggerRespawn(); // have pattern timers spawn if necessary Matches(); // refresh start and end time } @@ -1112,6 +1126,7 @@ bool cTimers::DeleteExpired(void) cTimer *next = Next(ti); if (!ti->Remote() && ti->Expired()) { ti->SetEvent(NULL); // Del() doesn't call ~cTimer() right away, so this is necessary here + ti->TriggerRespawn(); // in case this is a spawned timer isyslog("deleting timer %s", *ti->ToDescr()); Del(ti); TimersModified = true; diff --git a/timers.h b/timers.h index 79dc39a6..72e99531 100644 --- a/timers.h +++ b/timers.h @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: timers.h 5.1 2020/12/26 15:49:01 kls Exp $ + * $Id: timers.h 5.2 2021/01/14 10:29:05 kls Exp $ */ #ifndef __TIMERS_H @@ -98,6 +98,7 @@ public: void SetId(int Id); void SpawnPatternTimer(const cEvent *Event, cTimers *Timers); bool SpawnPatternTimers(const cSchedules *Schedules, cTimers *Timers); + void TriggerRespawn(void); bool SetEventFromSchedule(const cSchedules *Schedules); bool SetEvent(const cEvent *Event); void SetRecording(bool Recording);