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

Implemented replay mode display

This commit is contained in:
Klaus Schmidinger 2001-09-14 14:06:43 +02:00
parent b47ce65b03
commit 5513529419
11 changed files with 109 additions and 18 deletions

View File

@ -102,6 +102,7 @@ Stefan Huelswitt <huels@iname.com>
for implementing the "Jump" function in replay mode for implementing the "Jump" function in replay mode
for implementing "Multi Speed Mode" for implementing "Multi Speed Mode"
for implementing backtracing for fast forward/rewind for implementing backtracing for fast forward/rewind
for implementing the replay mode display
Ulrich Röder <dynamite@efr-net.de> Ulrich Röder <dynamite@efr-net.de>
for pointing out that there are channels that have a symbol rate higher than for pointing out that there are channels that have a symbol rate higher than

View File

@ -716,7 +716,7 @@ Video Disk Recorder Revision History
That way every recording will store the actual summary data at the time of That way every recording will store the actual summary data at the time of
the recording. the recording.
2001-09-09: Version 0.95 2001-09-14: Version 0.95
- Fixed behaviour in case the shutdown didn't take place (there were many - Fixed behaviour in case the shutdown didn't take place (there were many
"next timer event at..." messages in that case). "next timer event at..." messages in that case).
@ -737,3 +737,5 @@ Video Disk Recorder Revision History
- Implemented "Multi Speed Mode" (thanks to Stefan Huelswitt). - Implemented "Multi Speed Mode" (thanks to Stefan Huelswitt).
- Implemented backtracing to hit the right spot after fast forward/rewind - Implemented backtracing to hit the right spot after fast forward/rewind
(thanks to Stefan Huelswitt). (thanks to Stefan Huelswitt).
- Implemented replay mode display (thanks to Stefan Huelswitt, with a few
rewrites by kls).

4
MANUAL
View File

@ -462,6 +462,10 @@ Video Disk Recorder User's Manual
0 = off 0 = off
1 = on 1 = on
ShowReplayMode = 0 Turns displaying the current replay mode on or off.
0 = off
1 = on
* Executing system commands * Executing system commands
The "Main" menu option "Commands" allows you to execute any system commands The "Main" menu option "Commands" allows you to execute any system commands

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: config.c 1.68 2001/09/08 14:59:38 kls Exp $ * $Id: config.c 1.69 2001/09/09 13:52:48 kls Exp $
*/ */
#include "config.h" #include "config.h"
@ -813,6 +813,7 @@ cSetup::cSetup(void)
MinEventTimeout = 30; MinEventTimeout = 30;
MinUserInactivity = 120; MinUserInactivity = 120;
MultiSpeedMode = 0; MultiSpeedMode = 0;
ShowReplayMode = 0;
CurrentChannel = -1; CurrentChannel = -1;
} }
@ -851,6 +852,7 @@ bool cSetup::Parse(char *s)
else if (!strcasecmp(Name, "MinEventTimeout")) MinEventTimeout = atoi(Value); else if (!strcasecmp(Name, "MinEventTimeout")) MinEventTimeout = atoi(Value);
else if (!strcasecmp(Name, "MinUserInactivity")) MinUserInactivity = atoi(Value); else if (!strcasecmp(Name, "MinUserInactivity")) MinUserInactivity = atoi(Value);
else if (!strcasecmp(Name, "MultiSpeedMode")) MultiSpeedMode = atoi(Value); else if (!strcasecmp(Name, "MultiSpeedMode")) MultiSpeedMode = atoi(Value);
else if (!strcasecmp(Name, "ShowReplayMode")) ShowReplayMode = atoi(Value);
else if (!strcasecmp(Name, "CurrentChannel")) CurrentChannel = atoi(Value); else if (!strcasecmp(Name, "CurrentChannel")) CurrentChannel = atoi(Value);
else else
return false; return false;
@ -924,6 +926,7 @@ bool cSetup::Save(const char *FileName)
fprintf(f, "MinEventTimeout = %d\n", MinEventTimeout); fprintf(f, "MinEventTimeout = %d\n", MinEventTimeout);
fprintf(f, "MinUserInactivity = %d\n", MinUserInactivity); fprintf(f, "MinUserInactivity = %d\n", MinUserInactivity);
fprintf(f, "MultiSpeedMode = %d\n", MultiSpeedMode); fprintf(f, "MultiSpeedMode = %d\n", MultiSpeedMode);
fprintf(f, "ShowReplayMode = %d\n", ShowReplayMode);
fprintf(f, "CurrentChannel = %d\n", CurrentChannel); fprintf(f, "CurrentChannel = %d\n", CurrentChannel);
f.Close(); f.Close();
isyslog(LOG_INFO, "saved setup to %s", FileName); isyslog(LOG_INFO, "saved setup to %s", 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: config.h 1.75 2001/09/08 14:58:16 kls Exp $ * $Id: config.h 1.76 2001/09/09 13:51:45 kls Exp $
*/ */
#ifndef __CONFIG_H #ifndef __CONFIG_H
@ -298,6 +298,7 @@ public:
int MaxVideoFileSize; int MaxVideoFileSize;
int MinEventTimeout, MinUserInactivity; int MinEventTimeout, MinUserInactivity;
int MultiSpeedMode; int MultiSpeedMode;
int ShowReplayMode;
int CurrentChannel; int CurrentChannel;
cSetup(void); cSetup(void);
bool Load(const char *FileName); bool Load(const char *FileName);

View File

@ -7,7 +7,7 @@
* DVD support initially written by Andreas Schultz <aschultz@warp10.net> * DVD support initially written by Andreas Schultz <aschultz@warp10.net>
* based on dvdplayer-0.5 by Matjaz Thaler <matjaz.thaler@guest.arnes.si> * based on dvdplayer-0.5 by Matjaz Thaler <matjaz.thaler@guest.arnes.si>
* *
* $Id: dvbapi.c 1.114 2001/09/09 13:34:41 kls Exp $ * $Id: dvbapi.c 1.115 2001/09/14 13:23:21 kls Exp $
*/ */
//#define DVDDEBUG 1 //#define DVDDEBUG 1
@ -720,6 +720,7 @@ public:
virtual void SkipSeconds(int Seconds) {} virtual void SkipSeconds(int Seconds) {}
virtual void Goto(int Position, bool Still = false) {} virtual void Goto(int Position, bool Still = false) {}
virtual void GetIndex(int &Current, int &Total, bool SnapToIFrame = false) { Current = Total = -1; } virtual void GetIndex(int &Current, int &Total, bool SnapToIFrame = false) { Current = Total = -1; }
bool GetReplayMode(bool &Play, bool &Forward, int &Speed);
bool CanToggleAudioTrack(void) { return canToggleAudioTrack; }; bool CanToggleAudioTrack(void) { return canToggleAudioTrack; };
virtual void ToggleAudioTrack(void); virtual void ToggleAudioTrack(void);
}; };
@ -944,6 +945,17 @@ void cPlayBuffer::Backward(void)
} }
} }
bool cPlayBuffer::GetReplayMode(bool &Play, bool &Forward, int &Speed)
{
Play = (playMode == pmPlay || playMode == pmFast);
Forward = (playDir == pdForward);
if (playMode == pmFast || playMode == pmSlow)
Speed = Setup.MultiSpeedMode ? abs(trickSpeed - NORMAL_SPEED) : 0;
else
Speed = -1;
return true;
}
void cPlayBuffer::ToggleAudioTrack(void) void cPlayBuffer::ToggleAudioTrack(void)
{ {
if (CanToggleAudioTrack()) { if (CanToggleAudioTrack()) {
@ -2912,7 +2924,7 @@ void cDvbApi::Open(int w, int h)
cols = w; cols = w;
rows = h; rows = h;
#ifdef DEBUG_OSD #ifdef DEBUG_OSD
window = subwin(stdscr, h, w, d, 0); window = subwin(stdscr, h, w, d, (Setup.OSDwidth - w) / 2);
syncok(window, true); syncok(window, true);
#define B2C(b) (((b) * 1000) / 255) #define B2C(b) (((b) * 1000) / 255)
#define SETCOLOR(n, r, g, b, o) init_color(n, B2C(r), B2C(g), B2C(b)) #define SETCOLOR(n, r, g, b, o) init_color(n, B2C(r), B2C(g), B2C(b))
@ -2930,7 +2942,7 @@ void cDvbApi::Open(int w, int h)
w *= charWidth; w *= charWidth;
h *= lineHeight; h *= lineHeight;
d *= lineHeight; d *= lineHeight;
int x = (720 - (Setup.OSDwidth - 1) * charWidth) / 2; //TODO PAL vs. NTSC??? int x = (720 - w + charWidth) / 2; //TODO PAL vs. NTSC???
int y = (576 - Setup.OSDheight * lineHeight) / 2 + d; int y = (576 - Setup.OSDheight * lineHeight) / 2 + d;
//XXX //XXX
osd = new cDvbOsd(fd_osd, x, y); osd = new cDvbOsd(fd_osd, x, y);
@ -3557,6 +3569,11 @@ bool cDvbApi::GetIndex(int &Current, int &Total, bool SnapToIFrame)
return false; return false;
} }
bool cDvbApi::GetReplayMode(bool &Play, bool &Forward, int &Speed)
{
return replayBuffer && replayBuffer->GetReplayMode(Play, Forward, Speed);
}
void cDvbApi::Goto(int Position, bool Still) void cDvbApi::Goto(int Position, bool Still)
{ {
if (replayBuffer) if (replayBuffer)

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: dvbapi.h 1.48 2001/09/08 11:35:25 kls Exp $ * $Id: dvbapi.h 1.49 2001/09/09 14:37:18 kls Exp $
*/ */
#ifndef __DVBAPI_H #ifndef __DVBAPI_H
@ -289,6 +289,12 @@ public:
bool GetIndex(int &Current, int &Total, bool SnapToIFrame = false); bool GetIndex(int &Current, int &Total, bool SnapToIFrame = false);
// Returns the current and total frame index, optionally snapped to the // Returns the current and total frame index, optionally snapped to the
// nearest I-frame. // nearest I-frame.
bool GetReplayMode(bool &Play, bool &Forward, int &Speed);
// Returns the current replay mode (if applicable).
// 'Play' tells whether we are playing or pausing, 'Forward' tells whether
// we are going forward or backward and 'Speed' is -1 if this is normal
// play/pause mode, 0 if it is single speed fast/slow forward/back mode
// and >0 if this is multi speed mode.
void Goto(int Index, bool Still = false); void Goto(int Index, bool Still = false);
// Positions to the given index and displays that frame as a still picture // Positions to the given index and displays that frame as a still picture
// if Still is true. // if Still is true.

11
i18n.c
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: i18n.c 1.41 2001/09/08 15:01:12 kls Exp $ * $Id: i18n.c 1.42 2001/09/09 13:54:35 kls Exp $
* *
* Slovenian translations provided by Miha Setina <mihasetina@softhome.net> * Slovenian translations provided by Miha Setina <mihasetina@softhome.net>
* Italian translations provided by Alberto Carraro <bertocar@tin.it> * Italian translations provided by Alberto Carraro <bertocar@tin.it>
@ -956,6 +956,15 @@ const tPhrase Phrases[] = {
"", // TODO "", // TODO
"", // TODO "", // TODO
}, },
{ "ShowReplayMode",
"Wiedergabe Status",
"", // TODO
"", // TODO
"", // TODO
"", // TODO
"", // TODO
"", // TODO
},
// The days of the week: // The days of the week:
{ "MTWTFSS", { "MTWTFSS",
"MDMDFSS", "MDMDFSS",

53
menu.c
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: menu.c 1.117 2001/09/08 15:05:16 kls Exp $ * $Id: menu.c 1.118 2001/09/14 14:01:21 kls Exp $
*/ */
#include "menu.h" #include "menu.h"
@ -18,6 +18,7 @@
#define MENUTIMEOUT 120 // seconds #define MENUTIMEOUT 120 // seconds
#define MAXWAIT4EPGINFO 10 // seconds #define MAXWAIT4EPGINFO 10 // seconds
#define MODETIMEOUT 3 // seconds
const char *FileNameChars = " aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ0123456789-.#~^"; const char *FileNameChars = " aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ0123456789-.#~^";
@ -1726,6 +1727,7 @@ void cMenuSetup::Set(void)
Add(new cMenuEditIntItem( tr("MinEventTimeout"), &data.MinEventTimeout)); Add(new cMenuEditIntItem( tr("MinEventTimeout"), &data.MinEventTimeout));
Add(new cMenuEditIntItem( tr("MinUserInactivity"), &data.MinUserInactivity)); Add(new cMenuEditIntItem( tr("MinUserInactivity"), &data.MinUserInactivity));
Add(new cMenuEditBoolItem(tr("MultiSpeedMode"), &data.MultiSpeedMode)); Add(new cMenuEditBoolItem(tr("MultiSpeedMode"), &data.MultiSpeedMode));
Add(new cMenuEditBoolItem(tr("ShowReplayMode"), &data.ShowReplayMode));
} }
eOSState cMenuSetup::ProcessKey(eKeys Key) eOSState cMenuSetup::ProcessKey(eKeys Key)
@ -2332,7 +2334,7 @@ int cReplayControl::titleid = 0;//XXX
cReplayControl::cReplayControl(void) cReplayControl::cReplayControl(void)
{ {
dvbApi = cDvbApi::PrimaryDvbApi; dvbApi = cDvbApi::PrimaryDvbApi;
visible = shown = displayFrames = false; visible = modeOnly = shown = displayFrames = false;
lastCurrent = lastTotal = -1; lastCurrent = lastTotal = -1;
timeoutShow = 0; timeoutShow = 0;
timeSearchActive = false; timeSearchActive = false;
@ -2395,10 +2397,47 @@ void cReplayControl::Hide(void)
{ {
if (visible) { if (visible) {
Interface->Close(); Interface->Close();
needsFastResponse = visible = false; needsFastResponse = visible = modeOnly = false;
} }
} }
bool cReplayControl::ShowMode(void)
{
if (Setup.ShowReplayMode) {
bool Play, Forward;
int Speed;
if (dvbApi->GetReplayMode(Play, Forward, Speed)) {
if (!visible) {
// open small display
Interface->Open(9, -1);
Interface->Clear();
visible = modeOnly = true;
}
timeoutShow = (modeOnly && !timeoutShow && Speed == -1 && Play) ? time(NULL) + MODETIMEOUT : 0;
const char *Mode;
if (Speed == -1) Mode = Play ? " > " : " || ";
else if (Play) Mode = Forward ? " X>> " : " <<X ";
else Mode = Forward ? " X|> " : " <|X ";
char buf[16];
strn0cpy(buf, Mode, sizeof(buf));
char *p = strchr(buf, 'X');
if (p)
*p = Speed > 0 ? '1' + Speed - 1 : ' ';
eDvbFont OldFont = Interface->SetFont(fontFix);
int w = dvbApi->WidthInCells(buf);
int d = max(Width() - w, 0) / 2;
Interface->Write(d, -1, buf);
Interface->Flush();
Interface->SetFont(OldFont);
return true;
}
}
return false;
}
bool cReplayControl::ShowProgress(bool Initial) bool cReplayControl::ShowProgress(bool Initial)
{ {
int Current, Total; int Current, Total;
@ -2435,6 +2474,7 @@ bool cReplayControl::ShowProgress(bool Initial)
lastCurrent = Current; lastCurrent = Current;
} }
lastTotal = Total; lastTotal = Total;
ShowMode();
return true; return true;
} }
return false; return false;
@ -2514,6 +2554,7 @@ void cReplayControl::TimeSearchProcess(eKeys Key)
Hide(); Hide();
else else
Interface->Fill(12, 2, Width() - 22, 1, clrBackground); Interface->Fill(12, 2, Width() - 22, 1, clrBackground);
ShowMode();
} }
} }
@ -2624,7 +2665,7 @@ eOSState cReplayControl::ProcessKey(eKeys Key)
Hide(); Hide();
timeoutShow = 0; timeoutShow = 0;
} }
else else if (!modeOnly)
shown = ShowProgress(!shown) || shown; shown = ShowProgress(!shown) || shown;
} }
bool DisplayedFrames = displayFrames; bool DisplayedFrames = displayFrames;
@ -2633,6 +2674,7 @@ eOSState cReplayControl::ProcessKey(eKeys Key)
TimeSearchProcess(Key); TimeSearchProcess(Key);
return osContinue; return osContinue;
} }
bool DoShowMode = true;
switch (Key) { switch (Key) {
// Positioning: // Positioning:
case kUp: dvbApi->Play(); break; case kUp: dvbApi->Play(); break;
@ -2652,6 +2694,7 @@ eOSState cReplayControl::ProcessKey(eKeys Key)
dvbApi->StopReplay(); dvbApi->StopReplay();
return osEnd; return osEnd;
default: { default: {
DoShowMode = false;
switch (Key) { switch (Key) {
// Editing: // Editing:
//XXX should we do this only when the ProgressDisplay is on??? //XXX should we do this only when the ProgressDisplay is on???
@ -2677,6 +2720,8 @@ eOSState cReplayControl::ProcessKey(eKeys Key)
} }
} }
} }
if (DoShowMode)
ShowMode();
if (DisplayedFrames && !displayFrames) if (DisplayedFrames && !displayFrames)
Interface->Fill(0, 2, 11, 1, clrBackground); Interface->Fill(0, 2, 11, 1, clrBackground);
return osContinue; return osContinue;

5
menu.h
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: menu.h 1.26 2001/09/08 13:58:46 kls Exp $ * $Id: menu.h 1.27 2001/09/14 13:42:08 kls Exp $
*/ */
#ifndef _MENU_H #ifndef _MENU_H
@ -102,7 +102,7 @@ class cReplayControl : public cOsdBase {
private: private:
cDvbApi *dvbApi; cDvbApi *dvbApi;
cMarks marks; cMarks marks;
bool visible, shown, displayFrames; bool visible, modeOnly, shown, displayFrames;
int lastCurrent, lastTotal; int lastCurrent, lastTotal;
time_t timeoutShow; time_t timeoutShow;
bool timeSearchActive, timeSearchHide; bool timeSearchActive, timeSearchHide;
@ -118,6 +118,7 @@ private:
static int titleid;//XXX static int titleid;//XXX
#endif //DVDSUPPORT #endif //DVDSUPPORT
static char *title; static char *title;
bool ShowMode(void);
bool ShowProgress(bool Initial); bool ShowProgress(bool Initial);
void MarkToggle(void); void MarkToggle(void);
void MarkJump(bool Forward); void MarkJump(bool Forward);

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: tools.h 1.31 2001/08/26 12:52:49 kls Exp $ * $Id: tools.h 1.32 2001/09/14 13:40:35 kls Exp $
*/ */
#ifndef __TOOLS_H #ifndef __TOOLS_H
@ -31,7 +31,9 @@ extern int SysLogLevel;
#define DELETENULL(p) (delete (p), p = NULL) #define DELETENULL(p) (delete (p), p = NULL)
template<class T> inline void swap(T &a, T &b) { T t = a; a = b; b = t; }; template<class T> inline T min(T a, T b) { return a <= b ? a : b; }
template<class T> inline T max(T a, T b) { return a >= b ? a : b; }
template<class T> inline void swap(T &a, T &b) { T t = a; a = b; b = t; }
ssize_t safe_read(int filedes, void *buffer, size_t size); ssize_t safe_read(int filedes, void *buffer, size_t size);
ssize_t safe_write(int filedes, const void *buffer, size_t size); ssize_t safe_write(int filedes, const void *buffer, size_t size);