INCLUDES += -I$(VDRDIR)/include -I$(DVBDIR)/include
DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"$(PLUGIN)"' -DVOMPSERVER
+DEFINES += -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE
### The object files (add further files here):
for(int i = 1; i < 1000; i++) segments[i] = NULL;
// FIXME find out max file path / name lengths
-
+#if VDRVERSNUM < 10703
indexFile = new cIndexFile(recording->FileName(), false);
+#else
+ indexFile = new cIndexFile(recording->FileName(), false, recording->IsPesRecording());
+#endif
if (!indexFile) log->log("RecPlayer", Log::ERR, "Failed to create indexfile!");
scan();
while(segments[i++]) delete segments[i];
char fileName[2048];
- for(i = 1; i < 1000; i++)
+#if VDRVERSNUM < 10703
+ for(i = 1; i < 255; i++)//maximum is 255 files instead of 1000, according to VDR HISTORY file...
{
snprintf(fileName, 2047, "%s/%03i.vdr", recording->FileName(), i);
+#else
+ for(i = 1; i < 65535; i++)
+ {
+ if (recording->IsPesRecording())
+ snprintf(fileName, 2047, "%s/%03i.vdr", recording->FileName(), i);
+ else
+ snprintf(fileName, 2047, "%s/%05i.ts", recording->FileName(), i);
+#endif
log->log("RecPlayer", Log::DEBUG, "FILENAME: %s", fileName);
file = fopen(fileName, "r");
if (!file) break;
if (file) fclose(file);
char fileName[2048];
+#if VDRVERSNUM < 10703
snprintf(fileName, 2047, "%s/%03i.vdr", recording->FileName(), index);
+#else
+ if (recording->IsPesRecording())
+ snprintf(fileName, 2047, "%s/%03i.vdr", recording->FileName(), index);
+ else
+ snprintf(fileName, 2047, "%s/%05i.ts", recording->FileName(), index);
+#endif
log->log("RecPlayer", Log::DEBUG, "openFile called for index %i string:%s", index, fileName);
file = fopen(fileName, "r");
ULLONG RecPlayer::positionFromFrameNumber(ULONG frameNumber)
{
if (!indexFile) return 0;
-
+#if VDRVERSNUM < 10703
uchar retFileNumber;
int retFileOffset;
uchar retPicType;
+#else
+ uint16_t retFileNumber;
+ off_t retFileOffset;
+ bool retPicType;
+#endif
int retLength;
+
if (!indexFile->Get((int)frameNumber, &retFileNumber, &retFileOffset, &retPicType, &retLength))
{
return 0;
if (!indexFile) return false;
+#if VDRVERSNUM < 10703
uchar waste1;
int waste2;
+#else
+ uint16_t waste1;
+ off_t waste2;
+#endif
int iframeLength;
int indexReturnFrameNumber;
recordingManager = NULL;
}
#endif
- if (loggedIn) cleanConfig();
+ //if (loggedIn) cleanConfig();
decClients();
delete media;
return nrClients;
}
-
+/*
void VompClient::cleanConfig()
{
log->log("Client", Log::DEBUG, "Clean config");
delete[] resumes;
#endif
-}
+} */
void VompClientStartThread(void* arg)
{
void VompClient::writeResumeData()
{
- config.setValueLong("ResumeData",
+ /*config.setValueLong("ResumeData",
(char*)recplayer->getCurrentRecording()->FileName(),
- recplayer->frameNumberFromPosition(recplayer->getLastPosition()) );
+ recplayer->frameNumberFromPosition(recplayer->getLastPosition()) );*/
+
+ /* write to vdr resume file */
+ int resume = recplayer->frameNumberFromPosition(recplayer->getLastPosition());
+ char* ResumeIdC = config.getValueString("General", "ResumeId");
+ int ResumeId;
+ if (ResumeIdC)
+ ResumeId = atoi(ResumeIdC);
+ else
+ ResumeId = 0;
+
+ while (ResumeIDLock)
+ cCondWait::SleepMs(100);
+ ResumeIDLock = true;
+ int OldSetupResumeID = Setup.ResumeID;
+ Setup.ResumeID = ResumeId; //UGLY: quickly change resumeid
+#if VDRVERSNUM < 10703
+ cResumeFile ResumeFile((char*)recplayer->getCurrentRecording()->FileName()); //get corresponding resume file
+#else
+ cResumeFile ResumeFile((char*)recplayer->getCurrentRecording()->FileName(),(char*)recplayer->getCurrentRecording()->IsPesRecording()); //get corresponding resume file
+#endif
+ Setup.ResumeID = OldSetupResumeID; //and restore it back
+ ResumeIDLock = false;
+ ResumeFile.Save(resume);
+ //isyslog("VOMPDEBUG: Saving resume = %i, ResumeId = %i",resume, ResumeId);
}
#endif
bool loggedIn;
char* configDir;
- void cleanConfig();
+ //void cleanConfig();
#ifndef VOMPSTANDALONE
cChannel* channelFromNumber(ULONG channelNumber);
#include "i18n.h"
#include "vdrcommand.h"
+bool ResumeIDLock;
+
VompClientRRProc::VompClientRRProc(VompClient& x)
: x(x)
{
resp->addULLONG(x.recplayer->getLengthBytes());
resp->addULONG(x.recplayer->getLengthFrames());
+#if VDRVERSNUM < 10703
+ resp->addUCHAR(true);//added for TS
+#else
+ resp->addUCHAR(recording->IsPesRecording());//added for TS
+#endif
+
resp->finalise();
x.tcp.sendPacket(resp->getPtr(), resp->getLen());
// Get resume point
- char* value = x.config.getValueString("ResumeData", (char*)req->data);
+/* char* value = x.config.getValueString("ResumeData", (char*)req->data);
if (value)
{
resumePoint = strtoul(value, NULL, 10);
delete[] value;
+ }*/
+
+ char* ResumeIdC = x.config.getValueString("General", "ResumeId");
+ int ResumeId;
+ if (ResumeIdC) {
+ ResumeId = atoi(ResumeIdC);
+ delete[] ResumeIdC;
}
+ else
+ ResumeId = 0; //default if not defined in vomp-MAC.conf
+
+ while (ResumeIDLock)
+ cCondWait::SleepMs(100);
+ ResumeIDLock = true;
+ int OldSetupResumeID = Setup.ResumeID;
+ Setup.ResumeID = ResumeId; //UGLY: quickly change resumeid
+#if VDRVERSNUM < 10703
+ cResumeFile ResumeFile(recording->FileName()); //get corresponding resume file
+#else
+ cResumeFile ResumeFile(recording->FileName(), recording->IsPesRecording()); //get corresponding resume file
+#endif
+ Setup.ResumeID = OldSetupResumeID; //and restore it back
+ ResumeIDLock = false;
+
+ int resume = ResumeFile.Read();
+ //isyslog("VOMPDEBUG: resumePoint = %i, resume = %i, ResumeId = %i",resumePoint, resume, ResumeId);
+ if (resume >= 0)
+ resumePoint = ResumeFile.Read();
+
log->log("RRProc", Log::DEBUG, "GRI: RP: %lu", resumePoint);
resp->addULONG(resumePoint);
-
// Get summary
#if VDRVERSNUM < 10300
if (recording)
{
+#if VDRVERSNUM < 10703
Marks.Load(recording->FileName());
+#else
+ Marks.Load(recording->FileName(), recording->FramesPerSecond(), recording->IsPesRecording());
+#endif
if (Marks.Count())
{
for (const cMark *m = Marks.First(); m; m = Marks.Next(m))
#include <queue>
#include "serialize.h"
+extern bool ResumeIDLock;
+
using namespace std;
class VompClient;