From 64599db339e6aa4b3921fd84836920023714f8c8 Mon Sep 17 00:00:00 2001 From: kamel5 Date: Thu, 11 Feb 2021 16:45:08 +0100 Subject: [PATCH] In timeshift mode, the title of the actual playback position is displayed If the timeshift mode is activated during playback, the title of the program that was active when the time shift started is displayed by pressing OK. The behavior has now been changed so that the title of the program is displayed in the actual playback position when you press OK. --- coreengine/viewdisplayreplay.c | 49 +++++++++++++++----------- coreengine/viewdisplayreplay.h | 3 +- coreengine/viewelementsdisplayreplay.c | 24 ++++++++++--- coreengine/viewelementsdisplayreplay.h | 7 ++-- 4 files changed, 55 insertions(+), 28 deletions(-) diff --git a/coreengine/viewdisplayreplay.c b/coreengine/viewdisplayreplay.c index aed160d..927780a 100644 --- a/coreengine/viewdisplayreplay.c +++ b/coreengine/viewdisplayreplay.c @@ -143,6 +143,7 @@ void cViewReplay::PreCache(void) { void cViewReplay::ClearVariables(void) { cView::ClearVariables(); recording = NULL; + lastEvent = NULL; modeOnly = false; lastFlush = 0; lastFlushModeOnly = 0; @@ -162,20 +163,6 @@ void cViewReplay::ClearVariables(void) { globalTimers.ClearTimers(); } -void cViewReplay::SetRecording(const cRecording *recording) { - this->recording = recording; - if (veRecTitle) { - veRecTitle->Set(recording); - } - if (veRecInfo) { - veRecInfo->Set(recording); - } - if (veScraperContent) { - veScraperContent->Set(recording); - } - SetTimeShiftValues(); -} - void cViewReplay::GetGlobalTimers(void) { if (!timersLoaded) { timersLoaded = true; @@ -183,7 +170,7 @@ void cViewReplay::GetGlobalTimers(void) { } } -void cViewReplay::SetTimeShiftValues(void) { +void cViewReplay::SetTimeShiftValues(int current, int total) { if (!recording) return; timeShiftActive = false; @@ -209,21 +196,43 @@ void cViewReplay::SetTimeShiftValues(void) { } if (!Schedule) return; - const cEvent *event = Schedule->GetEventAround(time(NULL)); - if (!event) + // Get event at actual recording position + const cEvent *eventEnde = Schedule->GetEventAround(time(NULL)); + if (!eventEnde) return; double fps = recording->FramesPerSecond(); - time_t liveEventStop = event->EndTime(); + time_t liveEventStop = eventEnde->EndTime(); time_t recordingStart = time(0) - recording->LengthInSeconds(); timeShiftFramesTotal = (liveEventStop - recordingStart) * fps; timeShiftLength = liveEventStop - recordingStart; + // Get event at actual replay position + int secondsafter = (int)(recording->LengthInSeconds() * (1.0 - (double)current / (double)total)); + const cEvent *eventReplay = Schedule->GetEventAround(time(NULL) - secondsafter); + // Display title at replay position + if (eventReplay && eventReplay != lastEvent && veRecTitle) { + veRecTitle->Set(recording, eventReplay); + veRecTitle->Parse(); + lastEvent = eventReplay; + } int mins = (timeShiftLength / 60) % 60; int hours = (timeShiftLength / 3600) % 24; timeShiftDuration = cString::sprintf("%d:%02d", hours, mins); } +void cViewReplay::SetRecording(const cRecording *recording) { + this->recording = recording; + if (veRecTitle) { + veRecTitle->Set(recording); + } + if (veRecInfo) { + veRecInfo->Set(recording); + } + if (veScraperContent) { + veScraperContent->Set(recording); + } +} + void cViewReplay::SetTitle(const char *title) { - recording = NULL; if (veRecTitle) { veRecTitle->Set(title); } @@ -263,7 +272,7 @@ void cViewReplay::SetEndTime(int current, int total) { } void cViewReplay::SetProgressbar(int current, int total) { - SetTimeShiftValues(); + SetTimeShiftValues(current, total); if (veProgressbar) veProgressbar->Set(current, total, timeShiftActive, timeShiftFramesTotal); Render((int)eVeDisplayReplay::progressbar); diff --git a/coreengine/viewdisplayreplay.h b/coreengine/viewdisplayreplay.h index 55e7966..310c6e9 100644 --- a/coreengine/viewdisplayreplay.h +++ b/coreengine/viewdisplayreplay.h @@ -22,6 +22,7 @@ private: cVeDrOnPause *veOnPause; cVeDrOnPause *veOnPauseModeOnly; const cRecording *recording; + const cEvent *lastEvent; bool modeOnly; time_t lastFlush; time_t lastFlushModeOnly; @@ -34,7 +35,7 @@ private: bool timersLoaded; cGlobalTimers globalTimers; void GetGlobalTimers(void); - void SetTimeShiftValues(void); + void SetTimeShiftValues(int current, int total); void SetViewElements(void); void ClearVariables(void); void SetViewElementObjects(void); diff --git a/coreengine/viewelementsdisplayreplay.c b/coreengine/viewelementsdisplayreplay.c index 9249d37..5efb2d3 100644 --- a/coreengine/viewelementsdisplayreplay.c +++ b/coreengine/viewelementsdisplayreplay.c @@ -8,6 +8,7 @@ ******************************************************************/ cVeDrRecTitle::cVeDrRecTitle(void) { recording = NULL; + event = NULL; title = NULL; } @@ -24,16 +25,20 @@ void cVeDrRecTitle::SetTokenContainer(void) { InheritTokenContainer(); } -void cVeDrRecTitle::Set(const cRecording *recording) { +void cVeDrRecTitle::Set(const cRecording *recording, const cEvent *event) { if (this->title) { free(this->title); this->title = NULL; } if (this->recording) this->recording = NULL; + if (this->event) + this->event = NULL; if (!recording) return; this->recording = recording; + if (event) + this->event = event; } void cVeDrRecTitle::Set(const char *title) { @@ -43,6 +48,8 @@ void cVeDrRecTitle::Set(const char *title) { } if (this->recording) this->recording = NULL; + if (this->event) + this->event = NULL; if (!title) return; free(this->title); @@ -58,13 +65,22 @@ bool cVeDrRecTitle::Parse(bool force) { tokenContainer->Clear(); if (recording) { const char *recName = NULL; + const char *recShortText = NULL; const cRecordingInfo *recInfo = recording->Info(); - if (recInfo) + if (event) { + recName = event->Title(); + recShortText = event->ShortText(); + } else if (recInfo) { recName = recInfo->Title(); - if (!recName) + recShortText = recInfo->ShortText(); + } + if (!recName) { recName = recording->Name(); + recShortText = ""; + } + tokenContainer->AddStringToken((int)eDRRecTitleST::rectitle, recName); - tokenContainer->AddStringToken((int)eDRRecTitleST::recsubtitle, recInfo ? recInfo->ShortText() : ""); + tokenContainer->AddStringToken((int)eDRRecTitleST::recsubtitle, recShortText); tokenContainer->AddStringToken((int)eDRRecTitleST::recdate, *ShortDateString(recording->Start())); tokenContainer->AddStringToken((int)eDRRecTitleST::rectime, *TimeString(recording->Start())); } else if (title) { diff --git a/coreengine/viewelementsdisplayreplay.h b/coreengine/viewelementsdisplayreplay.h index 7e5d156..c9e40f9 100644 --- a/coreengine/viewelementsdisplayreplay.h +++ b/coreengine/viewelementsdisplayreplay.h @@ -10,13 +10,14 @@ class cVeDrRecTitle : public cViewElement { private: const cRecording *recording; + const cEvent *event; char *title; public: cVeDrRecTitle(void); virtual ~cVeDrRecTitle(void); void SetTokenContainer(void); - void Set(const cRecording *recording); - void Set(const char *title); + void Set(const cRecording *recording = NULL, const cEvent *event = NULL); + void Set(const char *title = NULL); bool Parse(bool forced = false); }; @@ -207,4 +208,4 @@ public: bool Parse(bool forced = false); }; -#endif //__VIEWELEMENTSDR_H \ No newline at end of file +#endif //__VIEWELEMENTSDR_H