1
0
mirror of https://github.com/VDR4Arch/vdr.git synced 2023-10-10 13:36:52 +02:00

Fixed a long delay at the end when replaying a recording that has stopped recording less than an hour ago

This commit is contained in:
Klaus Schmidinger 2012-09-05 14:16:52 +02:00
parent e64ab2a2a7
commit f7a1954fe3
3 changed files with 50 additions and 5 deletions

View File

@ -7191,7 +7191,7 @@ Video Disk Recorder Revision History
turn on adding the source character to channel names whenever they are displayed turn on adding the source character to channel names whenever they are displayed
(suggested by Ludi Kaleni). (suggested by Ludi Kaleni).
2012-09-02: Version 1.7.30 2012-09-05: Version 1.7.30
- Fixed sorting recordings in the top level video directory. - Fixed sorting recordings in the top level video directory.
- Fixed handling control characters in SI data in case of UTF-8 encoded strings - Fixed handling control characters in SI data in case of UTF-8 encoded strings
@ -7221,3 +7221,5 @@ Video Disk Recorder Revision History
Christopher Reimer and Udo Richter for contributing to the patch). Christopher Reimer and Udo Richter for contributing to the patch).
- By default (without FHS support) the config directory is now set to the value - By default (without FHS support) the config directory is now set to the value
given in the -v option if only -v and no -c is given. given in the -v option if only -v and no -c is given.
- Fixed a long delay at the end when replaying a recording that has stopped recording
less than an hour ago (typically time shift mode or a freshly edited recording).

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: recording.c 2.58 2012/07/15 10:47:58 kls Exp $ * $Id: recording.c 2.59 2012/09/05 11:45:55 kls Exp $
*/ */
#include "recording.h" #include "recording.h"
@ -1607,6 +1607,9 @@ struct tIndexTs {
#define INDEXFILECHECKINTERVAL 500 // ms between checks for existence of the regenerated index file #define INDEXFILECHECKINTERVAL 500 // ms between checks for existence of the regenerated index file
#define INDEXFILETESTINTERVAL 10 // ms between tests for the size of the index file in case of pausing live video #define INDEXFILETESTINTERVAL 10 // ms between tests for the size of the index file in case of pausing live video
cMutex cIndexFile::indexListMutex;
cVector<const cIndexFile *> cIndexFile::indexList;
cIndexFile::cIndexFile(const char *FileName, bool Record, bool IsPesRecording, bool PauseLive) cIndexFile::cIndexFile(const char *FileName, bool Record, bool IsPesRecording, bool PauseLive)
:resumeFile(FileName, IsPesRecording) :resumeFile(FileName, IsPesRecording)
{ {
@ -1687,10 +1690,13 @@ cIndexFile::cIndexFile(const char *FileName, bool Record, bool IsPesRecording, b
LOG_ERROR_STR(*fileName); LOG_ERROR_STR(*fileName);
} }
} }
if (Record)
AddToIndexList(this);
} }
cIndexFile::~cIndexFile() cIndexFile::~cIndexFile()
{ {
RemoveFromIndexList(this);
if (f >= 0) if (f >= 0)
close(f); close(f);
free(index); free(index);
@ -1735,8 +1741,7 @@ bool cIndexFile::CatchUp(int Index)
for (int i = 0; i <= MAXINDEXCATCHUP && (Index < 0 || Index >= last); i++) { for (int i = 0; i <= MAXINDEXCATCHUP && (Index < 0 || Index >= last); i++) {
struct stat buf; struct stat buf;
if (fstat(f, &buf) == 0) { if (fstat(f, &buf) == 0) {
if (time(NULL) - buf.st_mtime > MININDEXAGE) { if (!IsInIndexList(this)) {
// apparently the index file is not being written any more
close(f); close(f);
f = -1; f = -1;
break; break;
@ -1902,6 +1907,39 @@ int cIndexFile::GetLength(const char *FileName, bool IsPesRecording)
return -1; return -1;
} }
void cIndexFile::AddToIndexList(const cIndexFile *IndexFile)
{
cMutexLock MutexLock(&indexListMutex);
for (int i = 0; i < indexList.Size(); i++) {
if (!indexList[i]) {
indexList[i] = IndexFile;
return;
}
}
indexList.Append(IndexFile);
}
void cIndexFile::RemoveFromIndexList(const cIndexFile *IndexFile)
{
cMutexLock MutexLock(&indexListMutex);
for (int i = 0; i < indexList.Size(); i++) {
if (indexList[i] == IndexFile) {
indexList[i] = NULL;
return;
}
}
}
bool cIndexFile::IsInIndexList(const cIndexFile *IndexFile)
{
cMutexLock MutexLock(&indexListMutex);
for (int i = 0; i < indexList.Size(); i++) {
if (indexList[i] && !strcmp(indexList[i]->fileName, IndexFile->fileName))
return true;
}
return false;
}
bool GenerateIndex(const char *FileName) bool GenerateIndex(const char *FileName)
{ {
if (DirectoryOk(FileName)) { if (DirectoryOk(FileName)) {

View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: recording.h 2.34 2012/06/09 13:55:22 kls Exp $ * $Id: recording.h 2.35 2012/09/05 11:25:33 kls Exp $
*/ */
#ifndef __RECORDING_H #ifndef __RECORDING_H
@ -275,6 +275,11 @@ private:
cResumeFile resumeFile; cResumeFile resumeFile;
cIndexFileGenerator *indexFileGenerator; cIndexFileGenerator *indexFileGenerator;
cMutex mutex; cMutex mutex;
static cMutex indexListMutex;
static cVector<const cIndexFile *> indexList;
static void AddToIndexList(const cIndexFile *IndexFile);
static void RemoveFromIndexList(const cIndexFile *IndexFile);
static bool IsInIndexList(const cIndexFile *IndexFile);
static cString IndexFileName(const char *FileName, bool IsPesRecording); static cString IndexFileName(const char *FileName, bool IsPesRecording);
void ConvertFromPes(tIndexTs *IndexTs, int Count); void ConvertFromPes(tIndexTs *IndexTs, int Count);
void ConvertToPes(tIndexTs *IndexTs, int Count); void ConvertToPes(tIndexTs *IndexTs, int Count);