Skip to content

Commit

Permalink
Timeshift: Make sure bufferpath exists
Browse files Browse the repository at this point in the history
  • Loading branch information
manuelm committed Jan 29, 2017
1 parent d112102 commit 39d7bc9
Show file tree
Hide file tree
Showing 8 changed files with 40 additions and 26 deletions.
4 changes: 2 additions & 2 deletions src/IStreamReader.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,15 @@ class IStreamReader
{
public:
virtual ~IStreamReader(void) {};
virtual bool IsValid() = 0;
virtual bool Start() = 0;
virtual ssize_t ReadData(unsigned char *buffer, unsigned int size) = 0;
virtual int64_t Seek(long long position, int whence) = 0;
virtual int64_t Position() = 0;
virtual int64_t Length() = 0;
virtual time_t TimeStart() = 0;
virtual time_t TimeEnd() = 0;
virtual bool NearEnd() = 0;
virtual bool IsTimeshifting() = 0;
virtual bool CanTimeshift() = 0;
};

#endif
2 changes: 1 addition & 1 deletion src/RecordingReader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ RecordingReader::~RecordingReader(void)
XBMC->Log(LOG_DEBUG, "RecordingReader: Stopped");
}

bool RecordingReader::IsValid()
bool RecordingReader::Start()
{
return (m_readHandle != nullptr);
}
Expand Down
2 changes: 1 addition & 1 deletion src/RecordingReader.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@ class RecordingReader
public:
RecordingReader(const std::string &streamURL, time_t end);
~RecordingReader(void);
bool Start();
ssize_t ReadData(unsigned char *buffer, unsigned int size);
bool IsValid();
int64_t Seek(long long position, int whence);
int64_t Position();
int64_t Length();
Expand Down
4 changes: 2 additions & 2 deletions src/StreamReader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ StreamReader::~StreamReader(void)
XBMC->Log(LOG_DEBUG, "StreamReader: Stopped");
}

bool StreamReader::IsValid()
bool StreamReader::Start()
{
return (m_streamHandle != nullptr);
}
Expand Down Expand Up @@ -57,7 +57,7 @@ bool StreamReader::NearEnd()
return true;
}

bool StreamReader::IsTimeshifting()
bool StreamReader::CanTimeshift()
{
return false;
}
4 changes: 2 additions & 2 deletions src/StreamReader.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,15 @@ class StreamReader
public:
StreamReader(const std::string &streamURL);
~StreamReader(void);
bool IsValid() override;
bool Start() override;
ssize_t ReadData(unsigned char *buffer, unsigned int size) override;
int64_t Seek(long long position, int whence) override;
int64_t Position() override;
int64_t Length() override;
time_t TimeStart() override;
time_t TimeEnd() override;
bool NearEnd() override;
bool IsTimeshifting() override;
bool CanTimeshift() override;

private:
void *m_streamHandle;
Expand Down
23 changes: 14 additions & 9 deletions src/TimeshiftBuffer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ using namespace ADDON;

TimeshiftBuffer::TimeshiftBuffer(IStreamReader *strReader,
const std::string &bufferPath)
: m_strReader(strReader), m_bufferPath(bufferPath)
: m_strReader(strReader), m_bufferPath(bufferPath), m_start(0)
{
m_bufferPath += "/tsbuffer.ts";
m_filebufferWriteHandle = XBMC->OpenFileForWrite(m_bufferPath.c_str(), true);
Expand All @@ -20,9 +20,6 @@ TimeshiftBuffer::TimeshiftBuffer(IStreamReader *strReader,
#endif
Sleep(100);
m_filebufferReadHandle = XBMC->OpenFile(m_bufferPath.c_str(), READ_NO_CACHE);
m_start = time(NULL);
XBMC->Log(LOG_INFO, "Timeshift: Started");
CreateThread();
}

TimeshiftBuffer::~TimeshiftBuffer(void)
Expand All @@ -37,18 +34,26 @@ TimeshiftBuffer::~TimeshiftBuffer(void)
XBMC->Log(LOG_DEBUG, "Timeshift: Stopped");
}

bool TimeshiftBuffer::IsValid()
bool TimeshiftBuffer::Start()
{
return (m_strReader != nullptr && m_strReader->IsValid()
&& m_filebufferWriteHandle != nullptr
&& m_filebufferReadHandle != nullptr);
if (m_strReader == nullptr
|| m_filebufferWriteHandle == nullptr
|| m_filebufferReadHandle == nullptr)
return false;
if (IsRunning())
return true;
XBMC->Log(LOG_INFO, "Timeshift: Started");
m_start = time(NULL);
CreateThread();
return true;
}

void *TimeshiftBuffer::Process()
{
XBMC->Log(LOG_DEBUG, "Timeshift: Thread started");
uint8_t buffer[STREAM_READ_BUFFER_SIZE];

m_strReader->Start();
while (!IsStopped())
{
ssize_t read = m_strReader->ReadData(buffer, sizeof(buffer));
Expand Down Expand Up @@ -134,7 +139,7 @@ bool TimeshiftBuffer::NearEnd()
//return Length() - Position() <= 10 * 1048576;
}

bool TimeshiftBuffer::IsTimeshifting()
bool TimeshiftBuffer::CanTimeshift()
{
return true;
}
4 changes: 2 additions & 2 deletions src/TimeshiftBuffer.h
Original file line number Diff line number Diff line change
Expand Up @@ -12,15 +12,15 @@ class TimeshiftBuffer
public:
TimeshiftBuffer(IStreamReader *strReader, const std::string &bufferPath);
~TimeshiftBuffer(void);
bool IsValid() override;
bool Start() override;
ssize_t ReadData(unsigned char *buffer, unsigned int size) override;
int64_t Seek(long long position, int whence) override;
int64_t Position() override;
int64_t Length() override;
time_t TimeStart() override;
time_t TimeEnd() override;
bool NearEnd() override;
bool IsTimeshifting() override;
bool CanTimeshift() override;

private:
virtual void *Process(void) override;
Expand Down
23 changes: 16 additions & 7 deletions src/client.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -501,9 +501,10 @@ bool OpenLiveStream(const PVR_CHANNEL &channel)

std::string streamURL = DvbData->GetLiveStreamURL(channel);
strReader = new StreamReader(streamURL);
if (g_timeshift == Timeshift::ON_PLAYBACK)
if (g_timeshift == Timeshift::ON_PLAYBACK
&& XBMC->DirectoryExists(g_timeshiftBufferPath.c_str()))
strReader = new TimeshiftBuffer(strReader, g_timeshiftBufferPath);
return strReader->IsValid();
return strReader->Start();
}

void CloseLiveStream(void)
Expand All @@ -529,13 +530,16 @@ bool IsRealTimeStream()

bool CanPauseStream(void)
{
return (g_timeshift != Timeshift::OFF);
if (g_timeshift != Timeshift::OFF && strReader)
return (strReader->CanTimeshift()
|| XBMC->DirectoryExists(g_timeshiftBufferPath.c_str()));
return false;
}

bool CanSeekStream(void)
{
// pause button seems to check CanSeekStream() too
//return (strReader && strReader->IsTimeshifting());
//return (strReader && strReader->CanTimeshift());
return (g_timeshift != Timeshift::OFF);
}

Expand All @@ -561,7 +565,7 @@ long long LengthLiveStream(void)

bool IsTimeshifting(void)
{
return (strReader && strReader->IsTimeshifting());
return (strReader && strReader->CanTimeshift());
}

time_t GetBufferTimeStart()
Expand All @@ -576,9 +580,14 @@ time_t GetBufferTimeEnd()

void PauseStream(bool paused)
{
/* start timeshift on pause */
if (paused && g_timeshift != Timeshift::OFF
&& strReader && !strReader->IsTimeshifting())
&& strReader && !strReader->CanTimeshift()
&& XBMC->DirectoryExists(g_timeshiftBufferPath.c_str()))
{
strReader = new TimeshiftBuffer(strReader, g_timeshiftBufferPath);
(void)strReader->Start();
}
}

time_t GetPlayingTime()
Expand Down Expand Up @@ -615,7 +624,7 @@ bool OpenRecordedStream(const PVR_RECORDING &recording)
if (recReader)
SAFE_DELETE(recReader);
recReader = DvbData->OpenRecordedStream(recording);
return recReader->IsValid();
return recReader->Start();
}

void CloseRecordedStream(void)
Expand Down

0 comments on commit 39d7bc9

Please sign in to comment.