mirror of
				https://github.com/vdr-projects/vdr.git
				synced 2025-03-01 10:50:46 +00:00 
			
		
		
		
	Implemented replay progress display
This commit is contained in:
		
							
								
								
									
										105
									
								
								dvbapi.c
									
									
									
									
									
								
							
							
						
						
									
										105
									
								
								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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										17
									
								
								dvbapi.h
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								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
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										25
									
								
								interface.c
									
									
									
									
									
								
							
							
						
						
									
										25
									
								
								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
 | 
			
		||||
#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) ? Command : 0;
 | 
			
		||||
     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;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -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);
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										48
									
								
								menu.c
									
									
									
									
									
								
							
							
						
						
									
										48
									
								
								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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										9
									
								
								menu.h
									
									
									
									
									
								
							
							
						
						
									
										9
									
								
								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
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										4
									
								
								osd.c
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								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;
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										8
									
								
								osd.h
									
									
									
									
									
								
							
							
						
						
									
										8
									
								
								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);
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										25
									
								
								osm.c
									
									
									
									
									
								
							
							
						
						
									
										25
									
								
								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) {
 | 
			
		||||
           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;
 | 
			
		||||
             }
 | 
			
		||||
           }
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										21
									
								
								recording.c
									
									
									
									
									
								
							
							
						
						
									
										21
									
								
								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;
 | 
			
		||||
 
 | 
			
		||||
@@ -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
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										19
									
								
								remote.c
									
									
									
									
									
								
							
							
						
						
									
										19
									
								
								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,14 +60,20 @@ 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)) {
 | 
			
		||||
     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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										3
									
								
								remote.h
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								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);
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										5
									
								
								tools.c
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								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)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user