summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKlaus Schmidinger <vdr@tvdr.de>2000-04-23 15:38:16 +0200
committerKlaus Schmidinger <vdr@tvdr.de>2000-04-23 15:38:16 +0200
commit160c6ec5eb369d309350e9fdf588e29d4ea215bd (patch)
treee3fc59f1dba568d3b2f895c6fca2626045a609dd
parent88f13b1b296218589a44dac227964a8a47a75e50 (diff)
downloadvdr-160c6ec5eb369d309350e9fdf588e29d4ea215bd.tar.gz
vdr-160c6ec5eb369d309350e9fdf588e29d4ea215bd.tar.bz2
Implemented replay progress display
-rw-r--r--dvbapi.c105
-rw-r--r--dvbapi.h17
-rw-r--r--interface.c27
-rw-r--r--interface.h8
-rw-r--r--menu.c48
-rw-r--r--menu.h9
-rw-r--r--osd.c4
-rw-r--r--osd.h8
-rw-r--r--osm.c31
-rw-r--r--recording.c21
-rw-r--r--recording.h8
-rw-r--r--remote.c25
-rw-r--r--remote.h3
-rw-r--r--tools.c5
14 files changed, 248 insertions, 71 deletions
diff --git a/dvbapi.c b/dvbapi.c
index 3f10dd37..67cb0439 100644
--- a/dvbapi.c
+++ b/dvbapi.c
@@ -4,7 +4,7 @@
* See the main source file 'osm.c' for copyright information and
* 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"
@@ -85,7 +85,7 @@ public:
int Last(void) { return last; }
int GetResume(void) { return resume; }
bool StoreResume(int Index);
- static char *Str(int Index);
+ static char *Str(int Index, bool WithFrame = false);
};
cIndexFile::cIndexFile(const char *FileName, bool Record)
@@ -256,7 +256,7 @@ bool cIndexFile::StoreResume(int Index)
return false;
}
-char *cIndexFile::Str(int Index)
+char *cIndexFile::Str(int Index, bool WithFrame)
{
static char buffer[16];
int f = (Index % FRAMESPERSEC) + 1;
@@ -264,7 +264,7 @@ char *cIndexFile::Str(int Index)
int m = s / 60 % 60;
int h = s / 3600;
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;
}
@@ -752,6 +752,7 @@ public:
int Resume(void);
bool Save(void);
void SkipSeconds(int Seconds);
+ void GetIndex(int &Current, int &Total);
};
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)
{
int Length;
@@ -1003,6 +1014,8 @@ cDvbApi::cDvbApi(void)
leaveok(stdscr, TRUE);
window = NULL;
#endif
+ lastProgress = -1;
+ replayTitle = NULL;
}
cDvbApi::~cDvbApi()
@@ -1018,6 +1031,7 @@ cDvbApi::~cDvbApi()
endwin();
#endif
}
+ delete replayTitle;
}
#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
-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;
rows = h;
#ifdef DEBUG_OSD
@@ -1081,6 +1097,8 @@ void cDvbApi::Open(int w, int h, int d)
SETCOLOR(clrCyan, 0x00, 0xFC, 0xFC, 255);
SETCOLOR(clrMagenta, 0xB0, 0x00, 0xFC, 255);
SETCOLOR(clrWhite, 0xFC, 0xFC, 0xFC, 255);
+
+ lastProgress = -1;
}
void cDvbApi::Close(void)
@@ -1088,6 +1106,7 @@ void cDvbApi::Close(void)
#ifndef DEBUG_OSD
Cmd(OSD_Close);
#endif
+ lastProgress = -1;
}
void cDvbApi::Clear(void)
@@ -1134,6 +1153,50 @@ void cDvbApi::Text(int x, int y, const char *s, eDvbColor colorFg, eDvbColor col
#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)
{
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()) {
esyslog(LOG_ERR, "ERROR: StartReplay() called while recording - ignored!");
@@ -1321,6 +1384,13 @@ bool cDvbApi::StartReplay(const char *FileName)
StopReplay();
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:
if (!FileName) {
@@ -1364,7 +1434,7 @@ bool cDvbApi::StartReplay(const char *FileName)
bool FastRewind = false;
int ResumeIndex = Buffer->Resume();
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 (;;) {
if (Buffer->Read() < 0)
break;
@@ -1408,6 +1478,12 @@ bool cDvbApi::StartReplay(const char *FileName)
Buffer->SkipSeconds(Seconds);
}
}
+ case dvbGetIndex: {
+ int Current, Total;
+ Buffer->GetIndex(Current, Total);
+ writeint(toMain, Current);
+ writeint(toMain, Total);
+ }
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;
+}
+
diff --git a/dvbapi.h b/dvbapi.h
index 8303d59f..63bea31d 100644
--- a/dvbapi.h
+++ b/dvbapi.h
@@ -4,7 +4,7 @@
* See the main source file 'osm.c' for copyright information and
* 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
@@ -62,13 +62,21 @@ private:
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);
public:
- void Open(int w, int h, int d = 0);
+ void Open(int w, int h);
void Close(void);
void Clear(void);
void Fill(int x, int y, int w, int h, 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);
+ // Progress Display facilities
+
+private:
+ int lastProgress;
+ char *replayTitle;
+public:
+ void ShowProgress(bool Initial = false);
+
// Channel facilities
bool SetChannel(int FrequencyMHz, char Polarization, int Diseqc, int Srate, int Vpid, int Apid, int Ca, int Pnr);
@@ -81,6 +89,7 @@ private:
dvbFastForward,
dvbFastRewind,
dvbSkip,
+ dvbGetIndex,
};
bool isMainProcess;
pid_t pidRecord, pidReplay;
@@ -105,10 +114,11 @@ public:
// returned.
void StopRecord(void);
// 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.
// If there is already a replay session active, it will be stopped
// and the new file will be played back.
+ // If provided Title will be used in the progress display.
void StopReplay(void);
// Stops the current replay session (if any).
void PauseReplay(void);
@@ -122,6 +132,7 @@ public:
// 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
// beginning of the recording.
+ bool GetIndex(int *Current, int *Total = NULL);
};
#endif //__DVBAPI_H
diff --git a/interface.c b/interface.c
index fd1fa2dc..2eaf5f3a 100644
--- a/interface.c
+++ b/interface.c
@@ -4,7 +4,7 @@
* See the main source file 'osm.c' for copyright information and
* 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"
@@ -33,10 +33,10 @@ void cInterface::Init(void)
#endif
}
-void cInterface::Open(int NumCols, int NumLines, int StartLine)
+void cInterface::Open(int NumCols, int NumLines)
{
if (!open++)
- DvbApi.Open(NumCols, NumLines, StartLine);
+ DvbApi.Open(NumCols, NumLines);
}
void cInterface::Close(void)
@@ -47,23 +47,28 @@ void cInterface::Close(void)
DvbApi.Close();
}
-unsigned int cInterface::GetCh(void)
+unsigned int cInterface::GetCh(bool Wait)
{
#ifdef DEBUG_REMOTE
+ timeout(Wait ? 1000 :10);
int c = getch();
return (c > 0) ? c : 0;
#else
-//XXX #ifdef DEBUG_OSD
-//XXX wrefresh(window);//XXX
-//XXX #endif
- unsigned int Command;
- return RcIo.GetCommand(&Command) ? Command : 0;
+#ifdef DEBUG_OSD
+ timeout(0);
+ getch(); // just to make 'ncurses' display the window:
+#endif
+ if (Wait || RcIo.InputAvailable()) {
+ unsigned int Command;
+ return RcIo.GetCommand(&Command, NULL) ? Command : 0;
+ }
+ return 0;
#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;
return Key;
}
diff --git a/interface.h b/interface.h
index 76fdab8d..050e17c4 100644
--- a/interface.h
+++ b/interface.h
@@ -4,7 +4,7 @@
* See the main source file 'osm.c' for copyright information and
* 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
@@ -20,16 +20,16 @@ private:
int open;
int cols[MaxCols];
eKeys keyFromWait;
- unsigned int GetCh(void);
+ unsigned int GetCh(bool Wait = true);
void QueryKeys(void);
void HelpButton(int Index, const char *Text, eDvbColor FgColor, eDvbColor BgColor);
eKeys Wait(int Seconds = 1, bool KeepChar = false);
public:
cInterface(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);
- eKeys GetKey(void);
+ eKeys GetKey(bool Wait = true);
void Clear(void);
void ClearEol(int x, int y, eDvbColor Color = clrBackground);
void SetCols(int *c);
diff --git a/menu.c b/menu.c
index 6bbade8c..cdabed8d 100644
--- a/menu.c
+++ b/menu.c
@@ -4,7 +4,7 @@
* See the main source file 'osm.c' for copyright information and
* 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"
@@ -915,16 +915,7 @@ cMenuRecordingItem::cMenuRecordingItem(cRecording *Recording)
void cMenuRecordingItem::Set(void)
{
- char *buffer = NULL;
- 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);
+ SetText(recording->Title('\t'));
}
// --- cMenuRecordings -------------------------------------------------------
@@ -957,7 +948,7 @@ eOSState cMenuRecordings::Play(void)
cMenuRecordingItem *ri = (cMenuRecordingItem *)Get(Current());
if (ri) {
//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 osContinue;
@@ -1022,3 +1013,36 @@ eOSState cMenuMain::ProcessKey(eKeys Key)
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;
+}
+
diff --git a/menu.h b/menu.h
index 813beecd..096c7a57 100644
--- a/menu.h
+++ b/menu.h
@@ -4,7 +4,7 @@
* See the main source file 'osm.c' for copyright information and
* 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
@@ -18,4 +18,11 @@ public:
virtual eOSState ProcessKey(eKeys Key);
};
+class cReplayDisplay {
+public:
+ cReplayDisplay(void);
+ ~cReplayDisplay();
+ eKeys ProcessKey(eKeys Key);
+ };
+
#endif //_MENU_H
diff --git a/osd.c b/osd.c
index 673d075c..82551570 100644
--- a/osd.c
+++ b/osd.c
@@ -4,7 +4,7 @@
* See the main source file 'osm.c' for copyright information and
* 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"
@@ -35,7 +35,7 @@ cOsdItem::~cOsdItem()
delete text;
}
-void cOsdItem::SetText(char *Text, bool Copy)
+void cOsdItem::SetText(const char *Text, bool Copy)
{
delete text;
text = Copy ? strdup(Text) : Text;
diff --git a/osd.h b/osd.h
index 5ec13349..3b92467a 100644
--- a/osd.h
+++ b/osd.h
@@ -4,7 +4,7 @@
* See the main source file 'osm.c' for copyright information and
* 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
@@ -28,7 +28,7 @@ enum eOSState { osUnknown,
class cOsdItem : public cListObject {
private:
- char *text;
+ const char *text;
int offset;
eOSState state;
protected:
@@ -37,8 +37,8 @@ public:
cOsdItem(eOSState State = osUnknown);
cOsdItem(char *Text, eOSState State = osUnknown);
virtual ~cOsdItem();
- void SetText(char *Text, bool Copy = true);
- char *Text(void) { return text; }
+ void SetText(const char *Text, bool Copy = true);
+ const char *Text(void) { return text; }
void Display(int Offset = -1, bool Current = false);
virtual void Set(void) {}
virtual eOSState ProcessKey(eKeys Key);
diff --git a/osm.c b/osm.c
index 7d1c7849..fc6759a9 100644
--- a/osm.c
+++ b/osm.c
@@ -22,7 +22,7 @@
*
* 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>
@@ -65,6 +65,7 @@ int main(int argc, char *argv[])
if (signal(SIGTERM, SignalHandler) == SIG_IGN) signal(SIGTERM, SIG_IGN);
cMenuMain *Menu = NULL;
+ cReplayDisplay *ReplayDisplay = NULL;
cTimer *Timer = NULL;
int dcTime = 0, dcNumber = 0;
int LastChannel = -1;
@@ -72,9 +73,11 @@ int main(int argc, char *argv[])
while (!Interrupted) {
// Channel display:
if (CurrentChannel != LastChannel) {
- cChannel *channel = Channels.Get(CurrentChannel);
- if (channel)
- Interface.DisplayChannel(CurrentChannel + 1, channel->name);
+ if (!Menu && !ReplayDisplay) {
+ cChannel *channel = Channels.Get(CurrentChannel);
+ if (channel)
+ Interface.DisplayChannel(CurrentChannel + 1, channel->name);
+ }
LastChannel = CurrentChannel;
}
// Direct Channel Select (action):
@@ -90,6 +93,7 @@ int main(int argc, char *argv[])
AssertFreeDiskSpace();
if (!Timer && (Timer = cTimer::GetMatch()) != NULL) {
DELETENULL(Menu);
+ DELETENULL(ReplayDisplay);
// make sure the timer won't be deleted:
Timer->SetRecording(true);
// switch to channel:
@@ -114,7 +118,7 @@ int main(int argc, char *argv[])
}
}
// User Input:
- eKeys key = Interface.GetKey();
+ eKeys key = Interface.GetKey(!ReplayDisplay);
if (Menu) {
switch (Menu->ProcessKey(key)) {
default: if (key != kMenu)
@@ -124,7 +128,7 @@ int main(int argc, char *argv[])
break;
}
}
- else {
+ else if (!ReplayDisplay || (key = ReplayDisplay->ProcessKey(key)) != kNone) {
switch (key) {
// Direct Channel Select (input):
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!");
break;
case kPause: DvbApi.PauseReplay(); break;
- case kStop: DvbApi.StopReplay(); break;
+ case kStop: DELETENULL(ReplayDisplay);
+ DvbApi.StopReplay();
+ break;
case kSearchBack: DvbApi.FastRewind(); break;
case kSearchForward: DvbApi.FastForward(); break;
case kSkipBack: DvbApi.Skip(-60); break;
case kSkipForward: DvbApi.Skip(60); break;
// Menu Control:
- case kMenu: Menu = new cMenuMain;
+ case kMenu: DELETENULL(ReplayDisplay);
+ Menu = new cMenuMain;
Menu->Display();
break;
// Up/Down Channel Select:
@@ -164,8 +171,12 @@ int main(int argc, char *argv[])
}
break;
// Viewing Control:
- case kOk: LastChannel = -1; break; // forces channel display
- //TODO if replaying switch to progress display instead
+ case kOk: if (ReplayDisplay)
+ DELETENULL(ReplayDisplay);
+ else if (DvbApi.Replaying())
+ ReplayDisplay = new cReplayDisplay;
+ else
+ LastChannel = -1; break; // forces channel display
default: break;
}
}
diff --git a/recording.c b/recording.c
index de202ce0..6d70bd49 100644
--- a/recording.c
+++ b/recording.c
@@ -4,7 +4,7 @@
* See the main source file 'osm.c' for copyright information and
* 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
@@ -140,12 +140,14 @@ cRecording::cRecording(const char *FileName)
name[p - FileName] = 0;
}
}
+ titleBuffer = NULL;
}
cRecording::~cRecording()
{
delete fileName;
delete name;
+ delete titleBuffer;
}
const char *cRecording::FileName(void)
@@ -157,6 +159,23 @@ const char *cRecording::FileName(void)
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 result = true;
diff --git a/recording.h b/recording.h
index 2e79a7da..3151896d 100644
--- a/recording.h
+++ b/recording.h
@@ -4,7 +4,7 @@
* See the main source file 'osm.c' for copyright information and
* 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
@@ -17,9 +17,12 @@
void AssertFreeDiskSpace(void);
class cRecording : public cListObject {
-public:
+ friend class cRecordings;
+private:
+ char *titleBuffer;
char *name;
char *fileName;
+public:
time_t start;
int priority;
int lifetime;
@@ -28,6 +31,7 @@ public:
cRecording(const char *FileName);
~cRecording();
const char *FileName(void);
+ const char *Title(char Delimiter = ' ');
bool Delete(void);
// Changes the file name so that it will no longer be visible in the OSM
// Returns false in case of error
diff --git a/remote.c b/remote.c
index 84737aa2..f547add7 100644
--- a/remote.c
+++ b/remote.c
@@ -4,7 +4,7 @@
* See the main source file 'osm.c' for copyright information and
* 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"
@@ -51,9 +51,8 @@ cRcIo::~cRcIo()
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) {
fd_set set;
struct timeval timeout;
@@ -61,13 +60,19 @@ int cRcIo::ReceiveByte(bool Wait)
timeout.tv_usec = Wait ? 0 : 10000;
FD_ZERO(&set);
FD_SET(f, &set);
- if (select(FD_SETSIZE, &set, NULL, NULL, &timeout) > 0) {
- if (FD_ISSET(f, &set)) {
- unsigned char b;
- if (read(f, &b, 1) == 1)
- return b;
- }
- }
+ if (select(FD_SETSIZE, &set, NULL, NULL, &timeout) > 0)
+ 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;
+ if (read(f, &b, 1) == 1)
+ return b;
}
return -1;
}
diff --git a/remote.h b/remote.h
index 22a80850..0e2a04e7 100644
--- a/remote.h
+++ b/remote.h
@@ -4,7 +4,7 @@
* See the main source file 'osm.c' for copyright information and
* 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
@@ -29,6 +29,7 @@ public:
enum { modeH = 'h', modeB = 'b', modeS = 's' };
cRcIo(char *DeviceName);
~cRcIo();
+ bool InputAvailable(bool Wait = false);
void Flush(int WaitSeconds = 0);
bool SetCode(unsigned char Code, unsigned short Address);
bool SetMode(unsigned char Mode);
diff --git a/tools.c b/tools.c
index e356e0fd..d12ac495 100644
--- a/tools.c
+++ b/tools.c
@@ -4,7 +4,7 @@
* See the main source file 'osm.c' for copyright information and
* 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
@@ -40,8 +40,7 @@ char readchar(int filedes)
bool readint(int filedes, int &n)
{
- //XXX timeout!!
- return read(filedes, &n, sizeof(n));
+ return read(filedes, &n, sizeof(n)) == sizeof(n);
}
char *readline(FILE *f)