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

Fixed switching to Play mode when hitting the end of a timeshifted recording

This commit is contained in:
Klaus Schmidinger 2009-04-05 10:11:26 +02:00
parent c886e69bc6
commit d666dca6a4

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: dvbplayer.c 2.7 2009/04/05 09:05:54 kls Exp $ * $Id: dvbplayer.c 2.8 2009/04/05 10:11:26 kls Exp $
*/ */
#include "dvbplayer.h" #include "dvbplayer.h"
@ -396,6 +396,7 @@ void cDvbPlayer::Action(void)
time_t StuckAtEof = 0; time_t StuckAtEof = 0;
uint32_t LastStc = 0; uint32_t LastStc = 0;
int LastReadIFrame = -1; int LastReadIFrame = -1;
int SwitchToPlayFrame = 0;
while (Running() && (NextFile() || readIndex >= 0 || ringBuffer->Available())) { while (Running() && (NextFile() || readIndex >= 0 || ringBuffer->Available())) {
if (Sleep) { if (Sleep) {
@ -415,7 +416,7 @@ void cDvbPlayer::Action(void)
if (playMode != pmStill && playMode != pmPause) { if (playMode != pmStill && playMode != pmPause) {
if (!readFrame && (replayFile || readIndex >= 0)) { if (!readFrame && (replayFile || readIndex >= 0)) {
if (!nonBlockingFileReader->Reading()) { if (!nonBlockingFileReader->Reading()) {
if (playMode == pmFast || (playMode == pmSlow && playDir == pdBackward)) { if (!SwitchToPlayFrame && (playMode == pmFast || (playMode == pmSlow && playDir == pdBackward))) {
uint16_t FileNumber; uint16_t FileNumber;
off_t FileOffset; off_t FileOffset;
bool TimeShiftMode = index->IsStillRecording(); bool TimeShiftMode = index->IsStillRecording();
@ -432,7 +433,10 @@ void cDvbPlayer::Action(void)
int NewIndex = readIndex + d; int NewIndex = readIndex + d;
if (NewIndex <= 0 && readIndex > 0) if (NewIndex <= 0 && readIndex > 0)
NewIndex = 1; // make sure the very first frame is delivered NewIndex = 1; // make sure the very first frame is delivered
Index = index->GetNextIFrame(NewIndex, playDir == pdForward, &FileNumber, &FileOffset, &Length, TimeShiftMode); NewIndex = index->GetNextIFrame(NewIndex, playDir == pdForward, &FileNumber, &FileOffset, &Length, TimeShiftMode);
if (NewIndex < 0 && TimeShiftMode && playDir == pdForward)
SwitchToPlayFrame = Index;
Index = NewIndex;
readIndependent = true; readIndependent = true;
} }
if (Index >= 0) { if (Index >= 0) {
@ -440,7 +444,7 @@ void cDvbPlayer::Action(void)
if (!NextFile(FileNumber, FileOffset)) if (!NextFile(FileNumber, FileOffset))
continue; continue;
} }
else if (playDir != pdForward || !TimeShiftMode) else
eof = true; eof = true;
} }
else if (index) { else if (index) {
@ -554,7 +558,7 @@ void cDvbPlayer::Action(void)
// Handle hitting begin/end of recording: // Handle hitting begin/end of recording:
if (eof) { if (eof || SwitchToPlayFrame) {
bool SwitchToPlay = false; bool SwitchToPlay = false;
uint32_t Stc = DeviceGetSTC(); uint32_t Stc = DeviceGetSTC();
if (Stc != LastStc) if (Stc != LastStc)
@ -568,17 +572,19 @@ void cDvbPlayer::Action(void)
} }
LastStc = Stc; LastStc = Stc;
int Index = ptsIndex.FindIndex(Stc); int Index = ptsIndex.FindIndex(Stc);
if (playDir == pdForward) { if (playDir == pdForward && !SwitchToPlayFrame) {
if (Index >= LastReadIFrame) if (Index >= LastReadIFrame)
break; // automatically stop at end of recording break; // automatically stop at end of recording
} }
else if (Index <= 0) else if (Index <= 0 || SwitchToPlayFrame && Index >= SwitchToPlayFrame)
SwitchToPlay = true; SwitchToPlay = true;
if (SwitchToPlay) { if (SwitchToPlay) {
Empty(); if (!SwitchToPlayFrame)
Empty();
DevicePlay(); DevicePlay();
playMode = pmPlay; playMode = pmPlay;
playDir = pdForward; playDir = pdForward;
SwitchToPlayFrame = 0;
} }
} }
} }