diff options
author | Johann Friedrichs <johann.friedrichs@web.de> | 2017-07-30 13:02:25 +0200 |
---|---|---|
committer | Frank Neumann <fnu@yavdr.org> | 2017-07-30 13:02:25 +0200 |
commit | e5fe89b7fc7990bfec6a304736cd9c72f4c9552b (patch) | |
tree | 7b1622f3504c39f1d0dc05b68e494c3d16a9cfaa /recstatus.c | |
parent | 99d0b7b65fc20519d91c0debcbdf23f24f15fc24 (diff) | |
download | vdr-plugin-epgsearch-e5fe89b7fc7990bfec6a304736cd9c72f4c9552b.tar.gz vdr-plugin-epgsearch-e5fe89b7fc7990bfec6a304736cd9c72f4c9552b.tar.bz2 |
Use separate thread for recdone processing.
Diffstat (limited to 'recstatus.c')
-rw-r--r-- | recstatus.c | 138 |
1 files changed, 9 insertions, 129 deletions
diff --git a/recstatus.c b/recstatus.c index 794ba27..0b382fd 100644 --- a/recstatus.c +++ b/recstatus.c @@ -23,15 +23,15 @@ The project's page is at http://winni.vdr-developer.org/epgsearch #include "epgsearchtools.h" #include "recstatus.h" -#include "recdone.h" +#include "recdone_thread.h" #include "conflictcheck_thread.h" #include "epgsearchcfg.h" #include <math.h> #define ALLOWED_BREAK_INSECS 2 -extern int updateForced; extern int gl_InfoConflict; - +cTimersRecording TimersRecording; +cRecdoneThread RecdoneThread; cRecStatusMonitor* gl_recStatusMonitor = NULL; @@ -54,6 +54,7 @@ void cRecStatusMonitor::Recording(const cDevice *Device, const char *Name, const { // check if this is a new entry cRecDoneTimerObj *tiRFound = NULL; + cMutexLock TimersRecordingLock(&TimersRecording); for (cRecDoneTimerObj *tiR = TimersRecording.First(); tiR; tiR = TimersRecording.Next(tiR)) if (tiR->timer == ti) { @@ -105,139 +106,18 @@ void cRecStatusMonitor::Recording(const cDevice *Device, const char *Name, const if (!On) { - cMutexLock RecsDoneLock(&RecsDone); - // remove timers that finished recording from TimersRecording - // incomplete recordings are kept for a while, perhaps they will be resumed - cRecDoneTimerObj *tiR = TimersRecording.First(); - while(tiR) - { - // check if timer still exists - bool found = false; - - LOCK_TIMERS_READ; - for (const cTimer *ti = Timers->First(); ti; ti = Timers->Next(ti)) - if (ti == tiR->timer) - { - found = true; - break; - } - - if (found && !tiR->timer->Recording()) - { - if (tiR->recDone) - { - cSearchExt* search = SearchExts.GetSearchFromID(tiR->recDone->searchID); - if (!search) return; - - // check if recording has ended before timer end - - bool complete = true; - const cRecording *pRecording; - { - LOCK_RECORDINGS_READ; - pRecording = Recordings->GetByName(Filename); - } - long timerLengthSecs = tiR->timer->StopTime()-tiR->timer->StartTime(); - int recFraction = 100; - if (pRecording && timerLengthSecs) - { - int recLen = RecLengthInSecs(pRecording); - recFraction = double(recLen) * 100 / timerLengthSecs; - } - bool vpsUsed = tiR->timer->HasFlags(tfVps) && tiR->timer->Event() && tiR->timer->Event()->Vps(); - if ((!vpsUsed && now < tiR->timer->StopTime()) || recFraction < (vpsUsed ? 90: 98)) // assure timer has reached its end or at least 98% were recorded - { - complete = false; - LogFile.Log(1,"finished: '%s' (not complete! - recorded only %d%%); search timer: '%s'; VPS used: %s", tiR->timer->File(), recFraction, search->search, vpsUsed ? "Yes": "No"); - } - else - { - LogFile.Log(1,"finished: '%s'; search timer: '%s'; VPS used: %s", tiR->timer->File(), search->search, vpsUsed ? "Yes": "No"); - if (recFraction < 100) - LogFile.Log(2,"recorded %d%%'", recFraction); - } - if (complete) - { - RecsDone.Add(tiR->recDone); - LogFile.Log(1,"added rec done for '%s~%s';%s", tiR->recDone->title?tiR->recDone->title:"unknown title", - tiR->recDone->shortText?tiR->recDone->shortText:"unknown subtitle", - search->search); - RecsDone.Save(); - tiR->recDone = NULL; // prevent deletion - tiR->lastBreak = 0; - - // check for search timers to delete automatically - SearchExts.CheckForAutoDelete(search); - - // trigger a search timer update (skip running events) - search->skipRunningEvents = true; - updateForced = 1; - } - else if (tiR->lastBreak == 0) // store first break - tiR->lastBreak = now; - } - if (tiR->lastBreak == 0 || (now - tiR->lastBreak) > ALLOWED_BREAK_INSECS) - { // remove finished recordings or those with an unallowed break - if (tiR->recDone) delete tiR->recDone; // clean up - cRecDoneTimerObj *tiRNext = TimersRecording.Next(tiR); - TimersRecording.Del(tiR); - tiR = tiRNext; - continue; - } - break; - } - if (!found) - { - if (tiR->recDone) delete tiR->recDone; // clean up - cRecDoneTimerObj *tiRNext = TimersRecording.Next(tiR); - TimersRecording.Del(tiR); - tiR = tiRNext; - continue; - } - tiR = TimersRecording.Next(tiR); - } + // must be done in a different thread because we hold timer and scheduling lock here + while (RecdoneThread.Active()) cCondWait::SleepMs(100); // wait before changing filename + RecdoneThread.SetFilename(Filename); + RecdoneThread.Start(); } } int cRecStatusMonitor::TimerRecDevice(const cTimer* timer) { if (!timer) return 0; + cMutexLock TimersRecordingLock(&TimersRecording); for (cRecDoneTimerObj *tiR = TimersRecording.First(); tiR; tiR = TimersRecording.Next(tiR)) if (tiR->timer == timer && timer->Recording()) return tiR->deviceNr+1; return 0; } - -bool cRecStatusMonitor::IsPesRecording(const cRecording *pRecording) -{ - return pRecording && pRecording->IsPesRecording(); -} - -#define LOC_INDEXFILESUFFIX "/index" - -struct tIndexTs { - uint64_t offset:40; // up to 1TB per file (not using off_t here - must definitely be exactly 64 bit!) - int reserved:7; // reserved for future use - int independent:1; // marks frames that can be displayed by themselves (for trick modes) - uint16_t number:16; // up to 64K files per recording - tIndexTs(off_t Offset, bool Independent, uint16_t Number) - { - offset = Offset; - reserved = 0; - independent = Independent; - number = Number; - } - }; - -int cRecStatusMonitor::RecLengthInSecs(const cRecording *pRecording) -{ - struct stat buf; - cString fullname = cString::sprintf("%s%s", pRecording->FileName(), IsPesRecording(pRecording) ? LOC_INDEXFILESUFFIX ".vdr" : LOC_INDEXFILESUFFIX); - if (pRecording->FileName() && *fullname && access(fullname, R_OK) == 0 && stat(fullname, &buf) == 0) - { - double frames = buf.st_size ? (buf.st_size - 1) / sizeof(tIndexTs) + 1 : 0; - double Seconds = 0; - modf((frames + 0.5) / pRecording->FramesPerSecond(), &Seconds); - return Seconds; - } - return -1; -} |