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

Implemented replay progress display

This commit is contained in:
Klaus Schmidinger 2000-04-23 15:38:16 +02:00
parent 88f13b1b29
commit 160c6ec5eb
14 changed files with 248 additions and 71 deletions

105
dvbapi.c
View File

@ -4,7 +4,7 @@
* See the main source file 'osm.c' for copyright information and * See the main source file 'osm.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: dvbapi.c 1.4 2000/04/22 13:09:49 kls Exp $ * $Id: dvbapi.c 1.5 2000/04/23 15:32:00 kls Exp $
*/ */
#include "dvbapi.h" #include "dvbapi.h"
@ -85,7 +85,7 @@ public:
int Last(void) { return last; } int Last(void) { return last; }
int GetResume(void) { return resume; } int GetResume(void) { return resume; }
bool StoreResume(int Index); bool StoreResume(int Index);
static char *Str(int Index); static char *Str(int Index, bool WithFrame = false);
}; };
cIndexFile::cIndexFile(const char *FileName, bool Record) cIndexFile::cIndexFile(const char *FileName, bool Record)
@ -256,7 +256,7 @@ bool cIndexFile::StoreResume(int Index)
return false; return false;
} }
char *cIndexFile::Str(int Index) char *cIndexFile::Str(int Index, bool WithFrame)
{ {
static char buffer[16]; static char buffer[16];
int f = (Index % FRAMESPERSEC) + 1; int f = (Index % FRAMESPERSEC) + 1;
@ -264,7 +264,7 @@ char *cIndexFile::Str(int Index)
int m = s / 60 % 60; int m = s / 60 % 60;
int h = s / 3600; int h = s / 3600;
s %= 60; s %= 60;
snprintf(buffer, sizeof(buffer), "%d:%02d:%02d.%02d", h, m, s, f); snprintf(buffer, sizeof(buffer), WithFrame ? "%d:%02d:%02d.%02d" : "%d:%02d:%02d", h, m, s, f);
return buffer; return buffer;
} }
@ -752,6 +752,7 @@ public:
int Resume(void); int Resume(void);
bool Save(void); bool Save(void);
void SkipSeconds(int Seconds); void SkipSeconds(int Seconds);
void GetIndex(int &Current, int &Total);
}; };
cReplayBuffer::cReplayBuffer(int *OutFile, const char *FileName) cReplayBuffer::cReplayBuffer(int *OutFile, const char *FileName)
@ -849,6 +850,16 @@ void cReplayBuffer::SkipSeconds(int Seconds)
} }
} }
void cReplayBuffer::GetIndex(int &Current, int &Total)
{
if (index) {
Current = index->Get(fileNumber, fileOffset);
Total = index->Last();
}
else
Current = Total = -1;
}
void cReplayBuffer::SkipAudioBlocks(void) void cReplayBuffer::SkipAudioBlocks(void)
{ {
int Length; int Length;
@ -1003,6 +1014,8 @@ cDvbApi::cDvbApi(void)
leaveok(stdscr, TRUE); leaveok(stdscr, TRUE);
window = NULL; window = NULL;
#endif #endif
lastProgress = -1;
replayTitle = NULL;
} }
cDvbApi::~cDvbApi() cDvbApi::~cDvbApi()
@ -1018,6 +1031,7 @@ cDvbApi::~cDvbApi()
endwin(); endwin();
#endif #endif
} }
delete replayTitle;
} }
#ifdef DEBUG_OSD #ifdef DEBUG_OSD
@ -1054,8 +1068,10 @@ void cDvbApi::Cmd(OSD_Command cmd, int color, int x0, int y0, int x1, int y1, co
} }
#endif #endif
void cDvbApi::Open(int w, int h, int d) void cDvbApi::Open(int w, int h)
{ {
int d = (h < 0) ? MenuLines + h : 0;
h = abs(h);
cols = w; cols = w;
rows = h; rows = h;
#ifdef DEBUG_OSD #ifdef DEBUG_OSD
@ -1081,6 +1097,8 @@ void cDvbApi::Open(int w, int h, int d)
SETCOLOR(clrCyan, 0x00, 0xFC, 0xFC, 255); SETCOLOR(clrCyan, 0x00, 0xFC, 0xFC, 255);
SETCOLOR(clrMagenta, 0xB0, 0x00, 0xFC, 255); SETCOLOR(clrMagenta, 0xB0, 0x00, 0xFC, 255);
SETCOLOR(clrWhite, 0xFC, 0xFC, 0xFC, 255); SETCOLOR(clrWhite, 0xFC, 0xFC, 0xFC, 255);
lastProgress = -1;
} }
void cDvbApi::Close(void) void cDvbApi::Close(void)
@ -1088,6 +1106,7 @@ void cDvbApi::Close(void)
#ifndef DEBUG_OSD #ifndef DEBUG_OSD
Cmd(OSD_Close); Cmd(OSD_Close);
#endif #endif
lastProgress = -1;
} }
void cDvbApi::Clear(void) void cDvbApi::Clear(void)
@ -1134,6 +1153,50 @@ void cDvbApi::Text(int x, int y, const char *s, eDvbColor colorFg, eDvbColor col
#endif #endif
} }
void cDvbApi::ShowProgress(bool Initial)
{
int Current, Total;
if (GetIndex(&Current, &Total)) {
if (Initial) {
if (replayTitle)
Text(0, 0, replayTitle);
Text(-7, 2, cIndexFile::Str(Total));
}
#ifdef DEBUG_OSD
int p = cols * Current / Total;
Fill(0, 1, p, 1, clrGreen);
Fill(p, 1, cols - p, 1, clrWhite);
#else
int w = cols * charWidth;
int p = w * Current / Total;
if (p != lastProgress) {
int y1 = 1 * lineHeight;
int y2 = 2 * lineHeight - 1;
int x1, x2;
eDvbColor color;
if (lastProgress < p) {
x1 = lastProgress + 1;
x2 = p;
if (p >= w)
p = w - 1;
color = clrGreen;
}
else {
x1 = p + 1;
x2 = lastProgress;
color = clrWhite;
}
if (lastProgress < 0)
Cmd(OSD_FillBlock, clrWhite, 0, y1, w - 1, y2);
Cmd(OSD_FillBlock, color, x1, y1, x2, y2);
lastProgress = p;
}
#endif
Text(0, 2, cIndexFile::Str(Current));
}
}
bool cDvbApi::SetChannel(int FrequencyMHz, char Polarization, int Diseqc, int Srate, int Vpid, int Apid, int Ca, int Pnr) bool cDvbApi::SetChannel(int FrequencyMHz, char Polarization, int Diseqc, int Srate, int Vpid, int Apid, int Ca, int Pnr)
{ {
if (videoDev >= 0) { if (videoDev >= 0) {
@ -1312,7 +1375,7 @@ void cDvbApi::SetReplayMode(int Mode)
} }
} }
bool cDvbApi::StartReplay(const char *FileName) bool cDvbApi::StartReplay(const char *FileName, const char *Title)
{ {
if (Recording()) { if (Recording()) {
esyslog(LOG_ERR, "ERROR: StartReplay() called while recording - ignored!"); esyslog(LOG_ERR, "ERROR: StartReplay() called while recording - ignored!");
@ -1321,6 +1384,13 @@ bool cDvbApi::StartReplay(const char *FileName)
StopReplay(); StopReplay();
if (videoDev >= 0) { if (videoDev >= 0) {
lastProgress = -1;
delete replayTitle;
if (Title) {
if ((replayTitle = strdup(Title)) == NULL)
esyslog(LOG_ERR, "ERROR: StartReplay: can't copy title '%s'", Title);
}
// Check FileName: // Check FileName:
if (!FileName) { if (!FileName) {
@ -1364,7 +1434,7 @@ bool cDvbApi::StartReplay(const char *FileName)
bool FastRewind = false; bool FastRewind = false;
int ResumeIndex = Buffer->Resume(); int ResumeIndex = Buffer->Resume();
if (ResumeIndex >= 0) if (ResumeIndex >= 0)
isyslog(LOG_INFO, "resuming replay at index %d (%s)", ResumeIndex, cIndexFile::Str(ResumeIndex)); isyslog(LOG_INFO, "resuming replay at index %d (%s)", ResumeIndex, cIndexFile::Str(ResumeIndex, true));
for (;;) { for (;;) {
if (Buffer->Read() < 0) if (Buffer->Read() < 0)
break; break;
@ -1408,6 +1478,12 @@ bool cDvbApi::StartReplay(const char *FileName)
Buffer->SkipSeconds(Seconds); Buffer->SkipSeconds(Seconds);
} }
} }
case dvbGetIndex: {
int Current, Total;
Buffer->GetIndex(Current, Total);
writeint(toMain, Current);
writeint(toMain, Total);
}
break; break;
} }
} }
@ -1473,3 +1549,18 @@ void cDvbApi::Skip(int Seconds)
} }
} }
bool cDvbApi::GetIndex(int *Current, int *Total)
{
if (pidReplay) {
int total;
writechar(toReplay, dvbGetIndex);
if (readint(fromReplay, *Current) && readint(fromReplay, total)) {
if (Total)
*Total = total;
}
else
*Current = -1;
}
return *Current >= 0;
}

View File

@ -4,7 +4,7 @@
* See the main source file 'osm.c' for copyright information and * See the main source file 'osm.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: dvbapi.h 1.4 2000/04/22 13:07:34 kls Exp $ * $Id: dvbapi.h 1.5 2000/04/23 10:08:27 kls Exp $
*/ */
#ifndef __DVBAPI_H #ifndef __DVBAPI_H
@ -62,13 +62,21 @@ private:
int cols, rows; int cols, rows;
void Cmd(OSD_Command cmd, int color = 0, int x0 = 0, int y0 = 0, int x1 = 0, int y1 = 0, const void *data = NULL); void Cmd(OSD_Command cmd, int color = 0, int x0 = 0, int y0 = 0, int x1 = 0, int y1 = 0, const void *data = NULL);
public: public:
void Open(int w, int h, int d = 0); void Open(int w, int h);
void Close(void); void Close(void);
void Clear(void); void Clear(void);
void Fill(int x, int y, int w, int h, eDvbColor color = clrBackground); void Fill(int x, int y, int w, int h, eDvbColor color = clrBackground);
void ClrEol(int x, int y, eDvbColor color = clrBackground); void ClrEol(int x, int y, eDvbColor color = clrBackground);
void Text(int x, int y, const char *s, eDvbColor colorFg = clrWhite, eDvbColor colorBg = clrBackground); void Text(int x, int y, const char *s, eDvbColor colorFg = clrWhite, eDvbColor colorBg = clrBackground);
// Progress Display facilities
private:
int lastProgress;
char *replayTitle;
public:
void ShowProgress(bool Initial = false);
// Channel facilities // Channel facilities
bool SetChannel(int FrequencyMHz, char Polarization, int Diseqc, int Srate, int Vpid, int Apid, int Ca, int Pnr); bool SetChannel(int FrequencyMHz, char Polarization, int Diseqc, int Srate, int Vpid, int Apid, int Ca, int Pnr);
@ -81,6 +89,7 @@ private:
dvbFastForward, dvbFastForward,
dvbFastRewind, dvbFastRewind,
dvbSkip, dvbSkip,
dvbGetIndex,
}; };
bool isMainProcess; bool isMainProcess;
pid_t pidRecord, pidReplay; pid_t pidRecord, pidReplay;
@ -105,10 +114,11 @@ public:
// returned. // returned.
void StopRecord(void); void StopRecord(void);
// Stops the current recording session (if any). // Stops the current recording session (if any).
bool StartReplay(const char *FileName); bool StartReplay(const char *FileName, const char *Title = NULL);
// Starts replaying the given file. // Starts replaying the given file.
// If there is already a replay session active, it will be stopped // If there is already a replay session active, it will be stopped
// and the new file will be played back. // and the new file will be played back.
// If provided Title will be used in the progress display.
void StopReplay(void); void StopReplay(void);
// Stops the current replay session (if any). // Stops the current replay session (if any).
void PauseReplay(void); void PauseReplay(void);
@ -122,6 +132,7 @@ public:
// The sign of 'Seconds' determines the direction in which to skip. // The sign of 'Seconds' determines the direction in which to skip.
// Use a very large negative value to go all the way back to the // Use a very large negative value to go all the way back to the
// beginning of the recording. // beginning of the recording.
bool GetIndex(int *Current, int *Total = NULL);
}; };
#endif //__DVBAPI_H #endif //__DVBAPI_H

View File

@ -4,7 +4,7 @@
* See the main source file 'osm.c' for copyright information and * See the main source file 'osm.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: interface.c 1.4 2000/04/22 13:51:48 kls Exp $ * $Id: interface.c 1.5 2000/04/23 15:11:41 kls Exp $
*/ */
#include "interface.h" #include "interface.h"
@ -33,10 +33,10 @@ void cInterface::Init(void)
#endif #endif
} }
void cInterface::Open(int NumCols, int NumLines, int StartLine) void cInterface::Open(int NumCols, int NumLines)
{ {
if (!open++) if (!open++)
DvbApi.Open(NumCols, NumLines, StartLine); DvbApi.Open(NumCols, NumLines);
} }
void cInterface::Close(void) void cInterface::Close(void)
@ -47,23 +47,28 @@ void cInterface::Close(void)
DvbApi.Close(); DvbApi.Close();
} }
unsigned int cInterface::GetCh(void) unsigned int cInterface::GetCh(bool Wait)
{ {
#ifdef DEBUG_REMOTE #ifdef DEBUG_REMOTE
timeout(Wait ? 1000 :10);
int c = getch(); int c = getch();
return (c > 0) ? c : 0; return (c > 0) ? c : 0;
#else #else
//XXX #ifdef DEBUG_OSD #ifdef DEBUG_OSD
//XXX wrefresh(window);//XXX timeout(0);
//XXX #endif getch(); // just to make 'ncurses' display the window:
#endif
if (Wait || RcIo.InputAvailable()) {
unsigned int Command; unsigned int Command;
return RcIo.GetCommand(&Command) ? Command : 0; return RcIo.GetCommand(&Command, NULL) ? Command : 0;
}
return 0;
#endif #endif
} }
eKeys cInterface::GetKey(void) eKeys cInterface::GetKey(bool Wait)
{ {
eKeys Key = keyFromWait != kNone ? keyFromWait : Keys.Get(GetCh()); eKeys Key = keyFromWait != kNone ? keyFromWait : Keys.Get(GetCh(Wait));
keyFromWait = kNone; keyFromWait = kNone;
return Key; return Key;
} }

View File

@ -4,7 +4,7 @@
* See the main source file 'osm.c' for copyright information and * See the main source file 'osm.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: interface.h 1.5 2000/04/22 13:07:16 kls Exp $ * $Id: interface.h 1.6 2000/04/23 14:57:13 kls Exp $
*/ */
#ifndef __INTERFACE_H #ifndef __INTERFACE_H
@ -20,16 +20,16 @@ private:
int open; int open;
int cols[MaxCols]; int cols[MaxCols];
eKeys keyFromWait; eKeys keyFromWait;
unsigned int GetCh(void); unsigned int GetCh(bool Wait = true);
void QueryKeys(void); void QueryKeys(void);
void HelpButton(int Index, const char *Text, eDvbColor FgColor, eDvbColor BgColor); void HelpButton(int Index, const char *Text, eDvbColor FgColor, eDvbColor BgColor);
eKeys Wait(int Seconds = 1, bool KeepChar = false); eKeys Wait(int Seconds = 1, bool KeepChar = false);
public: public:
cInterface(void); cInterface(void);
void Init(void); void Init(void);
void Open(int NumCols = MenuColumns, int NumLines = MenuLines, int StartLine = 0); void Open(int NumCols = MenuColumns, int NumLines = MenuLines);
void Close(void); void Close(void);
eKeys GetKey(void); eKeys GetKey(bool Wait = true);
void Clear(void); void Clear(void);
void ClearEol(int x, int y, eDvbColor Color = clrBackground); void ClearEol(int x, int y, eDvbColor Color = clrBackground);
void SetCols(int *c); void SetCols(int *c);

48
menu.c
View File

@ -4,7 +4,7 @@
* See the main source file 'osm.c' for copyright information and * See the main source file 'osm.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: menu.c 1.5 2000/04/22 15:21:08 kls Exp $ * $Id: menu.c 1.6 2000/04/23 15:38:16 kls Exp $
*/ */
#include "menu.h" #include "menu.h"
@ -915,16 +915,7 @@ cMenuRecordingItem::cMenuRecordingItem(cRecording *Recording)
void cMenuRecordingItem::Set(void) void cMenuRecordingItem::Set(void)
{ {
char *buffer = NULL; SetText(recording->Title('\t'));
struct tm *t = localtime(&recording->start);
asprintf(&buffer, "%02d.%02d.%04d\t%02d:%02d\t%s",
t->tm_mday,
t->tm_mon + 1,
t->tm_year + 1900,
t->tm_hour,
t->tm_min,
recording->name);
SetText(buffer, false);
} }
// --- cMenuRecordings ------------------------------------------------------- // --- cMenuRecordings -------------------------------------------------------
@ -957,7 +948,7 @@ eOSState cMenuRecordings::Play(void)
cMenuRecordingItem *ri = (cMenuRecordingItem *)Get(Current()); cMenuRecordingItem *ri = (cMenuRecordingItem *)Get(Current());
if (ri) { if (ri) {
//XXX what if this recording's file is currently in use??? //XXX what if this recording's file is currently in use???
if (DvbApi.StartReplay(ri->recording->FileName())) if (DvbApi.StartReplay(ri->recording->FileName(), ri->recording->Title()))
return osEnd; return osEnd;
} }
return osContinue; return osContinue;
@ -1022,3 +1013,36 @@ eOSState cMenuMain::ProcessKey(eKeys Key)
return state; return state;
} }
// --- cReplayDisplay --------------------------------------------------------
cReplayDisplay::cReplayDisplay(void)
{
Interface.Open(MenuColumns, -3);
DvbApi.ShowProgress(true);
}
cReplayDisplay::~cReplayDisplay()
{
Interface.Close();
}
eKeys cReplayDisplay::ProcessKey(eKeys Key)
{
if (!DvbApi.Replaying())
return kOk; // will turn off replay display
DvbApi.ShowProgress();
switch (Key) {
case kBegin:
case kPause:
case kStop:
case kSearchBack:
case kSearchForward:
case kSkipBack:
case kSkipForward: break; // will be done in main loop
case kMenu: break; // allow direct switching to menu
case kOk: break; // switches off replay display
default: Key = kNone; // ignore anything not explicitly known here
}
return Key;
}

9
menu.h
View File

@ -4,7 +4,7 @@
* See the main source file 'osm.c' for copyright information and * See the main source file 'osm.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: menu.h 1.2 2000/03/05 10:57:27 kls Exp $ * $Id: menu.h 1.3 2000/04/23 09:25:33 kls Exp $
*/ */
#ifndef _MENU_H #ifndef _MENU_H
@ -18,4 +18,11 @@ public:
virtual eOSState ProcessKey(eKeys Key); virtual eOSState ProcessKey(eKeys Key);
}; };
class cReplayDisplay {
public:
cReplayDisplay(void);
~cReplayDisplay();
eKeys ProcessKey(eKeys Key);
};
#endif //_MENU_H #endif //_MENU_H

4
osd.c
View File

@ -4,7 +4,7 @@
* See the main source file 'osm.c' for copyright information and * See the main source file 'osm.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: osd.c 1.2 2000/02/27 17:23:07 kls Exp $ * $Id: osd.c 1.3 2000/04/23 09:52:39 kls Exp $
*/ */
#include "osd.h" #include "osd.h"
@ -35,7 +35,7 @@ cOsdItem::~cOsdItem()
delete text; delete text;
} }
void cOsdItem::SetText(char *Text, bool Copy) void cOsdItem::SetText(const char *Text, bool Copy)
{ {
delete text; delete text;
text = Copy ? strdup(Text) : Text; text = Copy ? strdup(Text) : Text;

8
osd.h
View File

@ -4,7 +4,7 @@
* See the main source file 'osm.c' for copyright information and * See the main source file 'osm.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: osd.h 1.2 2000/03/05 11:33:11 kls Exp $ * $Id: osd.h 1.3 2000/04/23 09:53:19 kls Exp $
*/ */
#ifndef __OSD_H #ifndef __OSD_H
@ -28,7 +28,7 @@ enum eOSState { osUnknown,
class cOsdItem : public cListObject { class cOsdItem : public cListObject {
private: private:
char *text; const char *text;
int offset; int offset;
eOSState state; eOSState state;
protected: protected:
@ -37,8 +37,8 @@ public:
cOsdItem(eOSState State = osUnknown); cOsdItem(eOSState State = osUnknown);
cOsdItem(char *Text, eOSState State = osUnknown); cOsdItem(char *Text, eOSState State = osUnknown);
virtual ~cOsdItem(); virtual ~cOsdItem();
void SetText(char *Text, bool Copy = true); void SetText(const char *Text, bool Copy = true);
char *Text(void) { return text; } const char *Text(void) { return text; }
void Display(int Offset = -1, bool Current = false); void Display(int Offset = -1, bool Current = false);
virtual void Set(void) {} virtual void Set(void) {}
virtual eOSState ProcessKey(eKeys Key); virtual eOSState ProcessKey(eKeys Key);

25
osm.c
View File

@ -22,7 +22,7 @@
* *
* The project's page is at http://www.cadsoft.de/people/kls/vdr * The project's page is at http://www.cadsoft.de/people/kls/vdr
* *
* $Id: osm.c 1.7 2000/04/22 13:35:37 kls Exp $ * $Id: osm.c 1.8 2000/04/23 14:57:57 kls Exp $
*/ */
#include <signal.h> #include <signal.h>
@ -65,6 +65,7 @@ int main(int argc, char *argv[])
if (signal(SIGTERM, SignalHandler) == SIG_IGN) signal(SIGTERM, SIG_IGN); if (signal(SIGTERM, SignalHandler) == SIG_IGN) signal(SIGTERM, SIG_IGN);
cMenuMain *Menu = NULL; cMenuMain *Menu = NULL;
cReplayDisplay *ReplayDisplay = NULL;
cTimer *Timer = NULL; cTimer *Timer = NULL;
int dcTime = 0, dcNumber = 0; int dcTime = 0, dcNumber = 0;
int LastChannel = -1; int LastChannel = -1;
@ -72,9 +73,11 @@ int main(int argc, char *argv[])
while (!Interrupted) { while (!Interrupted) {
// Channel display: // Channel display:
if (CurrentChannel != LastChannel) { if (CurrentChannel != LastChannel) {
if (!Menu && !ReplayDisplay) {
cChannel *channel = Channels.Get(CurrentChannel); cChannel *channel = Channels.Get(CurrentChannel);
if (channel) if (channel)
Interface.DisplayChannel(CurrentChannel + 1, channel->name); Interface.DisplayChannel(CurrentChannel + 1, channel->name);
}
LastChannel = CurrentChannel; LastChannel = CurrentChannel;
} }
// Direct Channel Select (action): // Direct Channel Select (action):
@ -90,6 +93,7 @@ int main(int argc, char *argv[])
AssertFreeDiskSpace(); AssertFreeDiskSpace();
if (!Timer && (Timer = cTimer::GetMatch()) != NULL) { if (!Timer && (Timer = cTimer::GetMatch()) != NULL) {
DELETENULL(Menu); DELETENULL(Menu);
DELETENULL(ReplayDisplay);
// make sure the timer won't be deleted: // make sure the timer won't be deleted:
Timer->SetRecording(true); Timer->SetRecording(true);
// switch to channel: // switch to channel:
@ -114,7 +118,7 @@ int main(int argc, char *argv[])
} }
} }
// User Input: // User Input:
eKeys key = Interface.GetKey(); eKeys key = Interface.GetKey(!ReplayDisplay);
if (Menu) { if (Menu) {
switch (Menu->ProcessKey(key)) { switch (Menu->ProcessKey(key)) {
default: if (key != kMenu) default: if (key != kMenu)
@ -124,7 +128,7 @@ int main(int argc, char *argv[])
break; break;
} }
} }
else { else if (!ReplayDisplay || (key = ReplayDisplay->ProcessKey(key)) != kNone) {
switch (key) { switch (key) {
// Direct Channel Select (input): // Direct Channel Select (input):
case k0: case k1: case k2: case k3: case k4: case k5: case k6: case k7: case k8: case k9: case k0: case k1: case k2: case k3: case k4: case k5: case k6: case k7: case k8: case k9:
@ -145,13 +149,16 @@ int main(int argc, char *argv[])
Interface.Error("Already recording!"); Interface.Error("Already recording!");
break; break;
case kPause: DvbApi.PauseReplay(); break; case kPause: DvbApi.PauseReplay(); break;
case kStop: DvbApi.StopReplay(); break; case kStop: DELETENULL(ReplayDisplay);
DvbApi.StopReplay();
break;
case kSearchBack: DvbApi.FastRewind(); break; case kSearchBack: DvbApi.FastRewind(); break;
case kSearchForward: DvbApi.FastForward(); break; case kSearchForward: DvbApi.FastForward(); break;
case kSkipBack: DvbApi.Skip(-60); break; case kSkipBack: DvbApi.Skip(-60); break;
case kSkipForward: DvbApi.Skip(60); break; case kSkipForward: DvbApi.Skip(60); break;
// Menu Control: // Menu Control:
case kMenu: Menu = new cMenuMain; case kMenu: DELETENULL(ReplayDisplay);
Menu = new cMenuMain;
Menu->Display(); Menu->Display();
break; break;
// Up/Down Channel Select: // Up/Down Channel Select:
@ -164,8 +171,12 @@ int main(int argc, char *argv[])
} }
break; break;
// Viewing Control: // Viewing Control:
case kOk: LastChannel = -1; break; // forces channel display case kOk: if (ReplayDisplay)
//TODO if replaying switch to progress display instead DELETENULL(ReplayDisplay);
else if (DvbApi.Replaying())
ReplayDisplay = new cReplayDisplay;
else
LastChannel = -1; break; // forces channel display
default: break; default: break;
} }
} }

View File

@ -4,7 +4,7 @@
* See the main source file 'osm.c' for copyright information and * See the main source file 'osm.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: recording.c 1.3 2000/04/16 15:47:45 kls Exp $ * $Id: recording.c 1.4 2000/04/23 09:48:35 kls Exp $
*/ */
#define _GNU_SOURCE #define _GNU_SOURCE
@ -140,12 +140,14 @@ cRecording::cRecording(const char *FileName)
name[p - FileName] = 0; name[p - FileName] = 0;
} }
} }
titleBuffer = NULL;
} }
cRecording::~cRecording() cRecording::~cRecording()
{ {
delete fileName; delete fileName;
delete name; delete name;
delete titleBuffer;
} }
const char *cRecording::FileName(void) const char *cRecording::FileName(void)
@ -157,6 +159,23 @@ const char *cRecording::FileName(void)
return fileName; return fileName;
} }
const char *cRecording::Title(char Delimiter)
{
delete titleBuffer;
titleBuffer = NULL;
struct tm *t = localtime(&start);
asprintf(&titleBuffer, "%02d.%02d.%04d%c%02d:%02d%c%s",
t->tm_mday,
t->tm_mon + 1,
t->tm_year + 1900,
Delimiter,
t->tm_hour,
t->tm_min,
Delimiter,
name);
return titleBuffer;
}
bool cRecording::Delete(void) bool cRecording::Delete(void)
{ {
bool result = true; bool result = true;

View File

@ -4,7 +4,7 @@
* See the main source file 'osm.c' for copyright information and * See the main source file 'osm.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: recording.h 1.3 2000/04/16 15:44:09 kls Exp $ * $Id: recording.h 1.4 2000/04/23 09:50:40 kls Exp $
*/ */
#ifndef __RECORDING_H #ifndef __RECORDING_H
@ -17,9 +17,12 @@
void AssertFreeDiskSpace(void); void AssertFreeDiskSpace(void);
class cRecording : public cListObject { class cRecording : public cListObject {
public: friend class cRecordings;
private:
char *titleBuffer;
char *name; char *name;
char *fileName; char *fileName;
public:
time_t start; time_t start;
int priority; int priority;
int lifetime; int lifetime;
@ -28,6 +31,7 @@ public:
cRecording(const char *FileName); cRecording(const char *FileName);
~cRecording(); ~cRecording();
const char *FileName(void); const char *FileName(void);
const char *Title(char Delimiter = ' ');
bool Delete(void); bool Delete(void);
// Changes the file name so that it will no longer be visible in the OSM // Changes the file name so that it will no longer be visible in the OSM
// Returns false in case of error // Returns false in case of error

View File

@ -4,7 +4,7 @@
* See the main source file 'osm.c' for copyright information and * See the main source file 'osm.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: remote.c 1.4 2000/04/22 15:21:41 kls Exp $ * $Id: remote.c 1.5 2000/04/23 14:41:21 kls Exp $
*/ */
#include "remote.h" #include "remote.h"
@ -51,9 +51,8 @@ cRcIo::~cRcIo()
close(f); close(f);
} }
int cRcIo::ReceiveByte(bool Wait) bool cRcIo::InputAvailable(bool Wait)
{ {
// Returns the byte if one was received within a timeout, -1 otherwise
if (f >= 0) { if (f >= 0) {
fd_set set; fd_set set;
struct timeval timeout; struct timeval timeout;
@ -61,14 +60,20 @@ int cRcIo::ReceiveByte(bool Wait)
timeout.tv_usec = Wait ? 0 : 10000; timeout.tv_usec = Wait ? 0 : 10000;
FD_ZERO(&set); FD_ZERO(&set);
FD_SET(f, &set); FD_SET(f, &set);
if (select(FD_SETSIZE, &set, NULL, NULL, &timeout) > 0) { if (select(FD_SETSIZE, &set, NULL, NULL, &timeout) > 0)
if (FD_ISSET(f, &set)) { return FD_ISSET(f, &set);
}
return false;
}
int cRcIo::ReceiveByte(bool Wait)
{
// Returns the byte if one was received within a timeout, -1 otherwise
if (InputAvailable(Wait)) {
unsigned char b; unsigned char b;
if (read(f, &b, 1) == 1) if (read(f, &b, 1) == 1)
return b; return b;
} }
}
}
return -1; return -1;
} }

View File

@ -4,7 +4,7 @@
* See the main source file 'osm.c' for copyright information and * See the main source file 'osm.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: remote.h 1.2 2000/04/16 13:53:50 kls Exp $ * $Id: remote.h 1.3 2000/04/23 14:40:16 kls Exp $
*/ */
#ifndef __REMOTE_H #ifndef __REMOTE_H
@ -29,6 +29,7 @@ public:
enum { modeH = 'h', modeB = 'b', modeS = 's' }; enum { modeH = 'h', modeB = 'b', modeS = 's' };
cRcIo(char *DeviceName); cRcIo(char *DeviceName);
~cRcIo(); ~cRcIo();
bool InputAvailable(bool Wait = false);
void Flush(int WaitSeconds = 0); void Flush(int WaitSeconds = 0);
bool SetCode(unsigned char Code, unsigned short Address); bool SetCode(unsigned char Code, unsigned short Address);
bool SetMode(unsigned char Mode); bool SetMode(unsigned char Mode);

View File

@ -4,7 +4,7 @@
* See the main source file 'osm.c' for copyright information and * See the main source file 'osm.c' for copyright information and
* how to reach the author. * how to reach the author.
* *
* $Id: tools.c 1.3 2000/04/15 15:10:05 kls Exp $ * $Id: tools.c 1.4 2000/04/23 15:30:17 kls Exp $
*/ */
#define _GNU_SOURCE #define _GNU_SOURCE
@ -40,8 +40,7 @@ char readchar(int filedes)
bool readint(int filedes, int &n) bool readint(int filedes, int &n)
{ {
//XXX timeout!! return read(filedes, &n, sizeof(n)) == sizeof(n);
return read(filedes, &n, sizeof(n));
} }
char *readline(FILE *f) char *readline(FILE *f)