From 809fbda03c5014ba9cd361f5113d1d717cd41ea6 Mon Sep 17 00:00:00 2001 From: louis Date: Tue, 26 Jan 2016 18:32:38 +0100 Subject: Version 0.8.0 beta --- coreengine/viewdisplayreplay.c | 314 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 314 insertions(+) create mode 100644 coreengine/viewdisplayreplay.c (limited to 'coreengine/viewdisplayreplay.c') diff --git a/coreengine/viewdisplayreplay.c b/coreengine/viewdisplayreplay.c new file mode 100644 index 0000000..503b72f --- /dev/null +++ b/coreengine/viewdisplayreplay.c @@ -0,0 +1,314 @@ +#include "viewdisplayreplay.h" + +/************************************************************************************ +* cViewReplay +************************************************************************************/ + +cViewReplay::cViewReplay(void) { + veCustomTokens = NULL; + veEndTime = NULL; + veMessage = NULL; + veScraperContent = NULL; + veRecTitle = NULL; + veRecInfo = NULL; + veCurrentTime = NULL; + veTotalTime = NULL; + veProgressbar = NULL; + veCutMarks = NULL; + veProgressModeOnly = NULL; + veControlIcons = NULL; + veControlIconsModeOnly = NULL; + veJump = NULL; + veOnPause = NULL; + veOnPauseModeOnly = NULL; + ClearVariables(); + viewId = eViewType::DisplayReplay; + viewName = strdup("displayreplay"); + numViewElements = (int)eVeDisplayReplay::count; + viewElements = new cViewElement*[numViewElements]; + for (int i=0; i < numViewElements; i++) { + viewElements[i] = NULL; + } + SetViewElements(); +} + +cViewReplay::~cViewReplay() { +} + +void cViewReplay::SetViewElements(void) { + viewElementNames.insert(pair("background", (int)eVeDisplayReplay::background)); + viewElementNames.insert(pair("backgroundmodeonly", (int)eVeDisplayReplay::backgroundmodeonly)); + viewElementNames.insert(pair("datetime", (int)eVeDisplayReplay::datetime)); + viewElementNames.insert(pair("time", (int)eVeDisplayReplay::time)); + viewElementNames.insert(pair("scrapercontent", (int)eVeDisplayReplay::scrapercontent)); + viewElementNames.insert(pair("rectitle", (int)eVeDisplayReplay::rectitle)); + viewElementNames.insert(pair("recinfo", (int)eVeDisplayReplay::recinfo)); + viewElementNames.insert(pair("currenttime", (int)eVeDisplayReplay::currenttime)); + viewElementNames.insert(pair("endtime", (int)eVeDisplayReplay::endtime)); + viewElementNames.insert(pair("totaltime", (int)eVeDisplayReplay::totaltime)); + viewElementNames.insert(pair("progressbar", (int)eVeDisplayReplay::progressbar)); + viewElementNames.insert(pair("cutmarks", (int)eVeDisplayReplay::cutmarks)); + viewElementNames.insert(pair("cutmarks", (int)eVeDisplayReplay::cutmarks)); + viewElementNames.insert(pair("controlicons", (int)eVeDisplayReplay::controlicons)); + viewElementNames.insert(pair("controliconsmodeonly", (int)eVeDisplayReplay::controliconsmodeonly)); + viewElementNames.insert(pair("progressmodeonly", (int)eVeDisplayReplay::progressmodeonly)); + viewElementNames.insert(pair("jump", (int)eVeDisplayReplay::jump)); + viewElementNames.insert(pair("message", (int)eVeDisplayReplay::message)); + viewElementNames.insert(pair("onpause", (int)eVeDisplayReplay::onpause)); + viewElementNames.insert(pair("onpausemodeonly", (int)eVeDisplayReplay::onpausemodeonly)); + viewElementNames.insert(pair("customtokens", (int)eVeDisplayReplay::customtokens)); +} + +void cViewReplay::SetViewElementObjects(void) { + for (int i = 0; i < numViewElements; i++) { + if (!viewElements[i]) + continue; + if (dynamic_cast(viewElements[i])) + { + veMessage = dynamic_cast(viewElements[i]); + } + else if (dynamic_cast(viewElements[i])) + { + veScraperContent = dynamic_cast(viewElements[i]); + } + else if (dynamic_cast(viewElements[i])) + { + veCustomTokens = dynamic_cast(viewElements[i]); + } + else if (dynamic_cast(viewElements[i])) + { + veRecTitle = dynamic_cast(viewElements[i]); + } + else if (dynamic_cast(viewElements[i])) + { + veRecInfo = dynamic_cast(viewElements[i]); + } + else if (dynamic_cast(viewElements[i])) + { + veCurrentTime = dynamic_cast(viewElements[i]); + } + else if (dynamic_cast(viewElements[i])) + { + veTotalTime = dynamic_cast(viewElements[i]); + } + else if (dynamic_cast(viewElements[i])) + { + veEndTime = dynamic_cast(viewElements[i]); + } + else if (dynamic_cast(viewElements[i])) + { + veProgressbar = dynamic_cast(viewElements[i]); + } + else if (dynamic_cast(viewElements[i])) + { + veCutMarks = dynamic_cast(viewElements[i]); + } + else if (dynamic_cast(viewElements[i])) + { + veProgressModeOnly = dynamic_cast(viewElements[i]); + } + else if (dynamic_cast(viewElements[i]) && (i == (int)eVeDisplayReplay::controlicons)) + { + veControlIcons = dynamic_cast(viewElements[i]); + } + else if (dynamic_cast(viewElements[i]) && i == (int)eVeDisplayReplay::controliconsmodeonly) + { + veControlIconsModeOnly = dynamic_cast(viewElements[i]); + } + else if (dynamic_cast(viewElements[i])) + { + veJump = dynamic_cast(viewElements[i]); + } + else if (dynamic_cast(viewElements[i]) && i == (int)eVeDisplayReplay::onpause) + { + veOnPause = dynamic_cast(viewElements[i]); + veOnPause->SetDetached(); + veOnPause->UnsetWaitOnWakeup(); + } + else if (dynamic_cast(viewElements[i]) && i == (int)eVeDisplayReplay::onpausemodeonly) + { + veOnPauseModeOnly = dynamic_cast(viewElements[i]); + veOnPauseModeOnly->SetDetached(); + veOnPauseModeOnly->UnsetWaitOnWakeup(); + } + } +} + +void cViewReplay::ClearVariables(void) { + cView::ClearVariables(); + modeOnly = false; + lastFlush = 0; + message = false; + reclength = -1; + timeShiftActive = false; + timeShiftFramesTotal = -1; + timeShiftLength = -1; + timeShiftDuration = ""; + if (veCustomTokens) + veCustomTokens->Reset(); + if (veEndTime) + veEndTime->Set(cString("")); + if (veCutMarks) + veCutMarks->Reset(); +} + +void cViewReplay::SetTimeShift(int framesTotal, int timeShiftLength) { + timeShiftActive = true; + timeShiftFramesTotal = framesTotal; + this->timeShiftLength = timeShiftLength; + int mins = (timeShiftLength / 60) % 60; + int hours = (timeShiftLength / 3600) % 24; + timeShiftDuration = cString::sprintf("%d:%02d", hours, mins); +} + +void cViewReplay::SetRecording(const cRecording *recording) { + if (veRecTitle) { + veRecTitle->Set(recording); + } + if (veRecInfo) { + veRecInfo->Set(recording); + } + if (veScraperContent) { + veScraperContent->Set(recording); + } +} + +void cViewReplay::SetTitle(const char *title) { + if (veRecTitle) { + veRecTitle->Set(title); + } +} + +void cViewReplay::SetCurrent(const char *current) { + if (veCurrentTime) + veCurrentTime->Set(current); + Render((int)eVeDisplayReplay::currenttime); + //good place to refresh these viewelements + //since SetCurrent is called every second + Render((int)eVeDisplayReplay::datetime); + Render((int)eVeDisplayReplay::time); + Render((int)eVeDisplayChannel::customtokens); +} + +void cViewReplay::SetTotal(const char *total) { + if (veTotalTime) + veTotalTime->Set(total, timeShiftActive, *timeShiftDuration); + Render((int)eVeDisplayReplay::totaltime); +} + +void cViewReplay::SetEndTime(int current, int total) { + if (!veEndTime) + return; + int totalLength = total; + int recordingLength = reclength; + if (timeShiftActive && timeShiftFramesTotal > 0) { + totalLength = timeShiftFramesTotal; + recordingLength = timeShiftLength; + } + double rest = (double)(totalLength - current) / (double)totalLength; + time_t end = time(0) + rest*recordingLength; + veEndTime->Set(TimeString(end)); + Render((int)eVeDisplayReplay::endtime); +} + +void cViewReplay::SetProgressbar(int current, int total) { + if (veProgressbar) + veProgressbar->Set(current, total, timeShiftActive, timeShiftFramesTotal); + Render((int)eVeDisplayReplay::progressbar); +} + +void cViewReplay::SetMarks(const cMarks *marks, int current, int total) { + if (veCutMarks) + veCutMarks->Set(marks, current, total, timeShiftActive, timeShiftFramesTotal); + Render((int)eVeDisplayReplay::cutmarks); +} + +void cViewReplay::SetControlIcons(bool play, bool forward, int speed) { + if (!modeOnly) { + if (veControlIcons) + veControlIcons->Set(play, forward, speed); + Render((int)eVeDisplayReplay::controlicons); + } else { + if (veControlIconsModeOnly) + veControlIconsModeOnly->Set(play, forward, speed); + Render((int)eVeDisplayReplay::controliconsmodeonly); + } + +} + +void cViewReplay::SetJump(const char *jump) { + if (veJump) { + if (!jump) + veJump->Clear(); + else + veJump->Set(jump); + } + Render((int)eVeDisplayReplay::jump); +} + +void cViewReplay::SetMessage(eMessageType type, const char *text) { + if (veMessage) { + if (text) + veMessage->Set(type, text); + else + veMessage->Clear(); + } + Render((int)eVeDisplayReplay::message); +} + +void cViewReplay::StartOnPause(const char *recfilename) { + cVeDrOnPause *onPause = (!modeOnly) ? veOnPause : veOnPauseModeOnly; + if (!onPause) + return; + onPause->Set(recfilename); + onPause->Parse(true); +} + +void cViewReplay::ClearOnPause(void) { + cVeDrOnPause *onPause = (!modeOnly) ? veOnPause : veOnPauseModeOnly; + if (!onPause) + return; + onPause->Close(); +} + +void cViewReplay::Flush(void) { + if (init) { + sdOsd.LockFlush(); + if (!modeOnly) { + Render((int)eVeDisplayReplay::background); + Render((int)eVeDisplayReplay::rectitle); + Render((int)eVeDisplayReplay::recinfo); + Render((int)eVeDisplayReplay::scrapercontent); + } else { + Render((int)eVeDisplayReplay::backgroundmodeonly); + } + } + + if (modeOnly) { + SetProgressModeOnly(); + } + + cView::Flush(); +} + +void cViewReplay::SetProgressModeOnly(void) { + if (!veProgressModeOnly) + return; + time_t now = time(0); + if (now == lastFlush) { + return; + } + lastFlush = now; + + cControl *control = cControl::Control(); + if (!control) + return; + double fps = control->FramesPerSecond(); + int current = 0; + int total = 0; + if (!control->GetIndex(current, total)) + return; + veProgressModeOnly->Set(fps, current, total); + if (veProgressModeOnly->Parse()) + veProgressModeOnly->Render(); +} \ No newline at end of file -- cgit v1.2.3