mirror of
https://github.com/vdr-projects/vdr.git
synced 2025-03-01 10:50:46 +00:00
Version 0.93
- The menus and the channel display now show the current date and time. - The new Setup parameter MaxVideoFileSize can be used to customize the maximum size of the recorded video files. - Fixed a bug in handling repeating timers that record over midnight (the calculation of matching timers has been completely rewritten). - Timers that are currently recording are now marked with '#' in the "Timers" menu. - Timers are now sorted in the "Timers" menu, showing the sequence in which they will be recording. This can be disabled in the "Setup" menu. Note that the "Mark" button doesn't work if timers are displayed sorted.
This commit is contained in:
parent
371bf0665e
commit
ae8fe25312
13
HISTORY
13
HISTORY
@ -663,3 +663,16 @@ Video Disk Recorder Revision History
|
|||||||
- Fixed broken recordings after a driver buffer overflow.
|
- Fixed broken recordings after a driver buffer overflow.
|
||||||
- Fixed the chirping sound after Pause/Play of a DVD (thanks to Andreas
|
- Fixed the chirping sound after Pause/Play of a DVD (thanks to Andreas
|
||||||
Schultz).
|
Schultz).
|
||||||
|
|
||||||
|
2001-08-26: Version 0.93
|
||||||
|
|
||||||
|
- The menus and the channel display now show the current date and time.
|
||||||
|
- The new Setup parameter MaxVideoFileSize can be used to customize the
|
||||||
|
maximum size of the recorded video files.
|
||||||
|
- Fixed a bug in handling repeating timers that record over midnight (the
|
||||||
|
calculation of matching timers has been completely rewritten).
|
||||||
|
- Timers that are currently recording are now marked with '#' in the "Timers"
|
||||||
|
menu.
|
||||||
|
- Timers are now sorted in the "Timers" menu, showing the sequence in which
|
||||||
|
they will be recording. This can be disabled in the "Setup" menu. Note
|
||||||
|
that the "Mark" button doesn't work if timers are displayed sorted.
|
||||||
|
25
MANUAL
25
MANUAL
@ -8,7 +8,7 @@ Video Disk Recorder User's Manual
|
|||||||
possible, several keys have different meanings in the various
|
possible, several keys have different meanings in the various
|
||||||
modes:
|
modes:
|
||||||
|
|
||||||
Key Normal Main Channels Timer Edit/New Recordings Replay
|
Key Normal Main Channels Timers Edit/New Recordings Replay
|
||||||
|
|
||||||
Up Ch up Crsr up Crsr up Crsr up Crsr up Crsr up Play
|
Up Ch up Crsr up Crsr up Crsr up Crsr up Crsr up Play
|
||||||
Down Ch down Crsr down Crsr down Crsr down Crsr down Crsr down Pause
|
Down Ch down Crsr down Crsr down Crsr down Crsr down Crsr down Pause
|
||||||
@ -20,9 +20,12 @@ Video Disk Recorder User's Manual
|
|||||||
Red - Record Edit Edit - Play Jump
|
Red - Record Edit Edit - Play Jump
|
||||||
Green - Language New New - Rewind Skip -60s
|
Green - Language New New - Rewind Skip -60s
|
||||||
Yellow - Eject DVD Delete Delete - Delete Skip +60s
|
Yellow - Eject DVD Delete Delete - Delete Skip +60s
|
||||||
Blue - Resume Mark Mark - Summary Stop
|
Blue - Resume Mark Mark(1) - Summary Stop
|
||||||
0..9 Ch select - - - Numeric inp. - Editing
|
0..9 Ch select - - - Numeric inp. - Editing
|
||||||
|
|
||||||
|
(1) The "Mark" button in the "Timers" menu only works if sorting the timers
|
||||||
|
has been disabled in the "Setup" menu.
|
||||||
|
|
||||||
* Navigating through the On Screen Menus
|
* Navigating through the On Screen Menus
|
||||||
|
|
||||||
The "Main" menu can be called up with the "Menu" key of your remote
|
The "Main" menu can be called up with the "Menu" key of your remote
|
||||||
@ -34,7 +37,8 @@ Video Disk Recorder User's Manual
|
|||||||
any changes that might have been made in the current menu.
|
any changes that might have been made in the current menu.
|
||||||
|
|
||||||
In the "Timers" menu, the current timer can be enabled or disabled with
|
In the "Timers" menu, the current timer can be enabled or disabled with
|
||||||
the "Right" or "Left" key, respectively (enabled timers are marked with ">").
|
the "Right" or "Left" key, respectively (enabled timers are marked with '>',
|
||||||
|
timers that are currently recording are marked with '#').
|
||||||
"Ok" here opens the "Edit timer" menu.
|
"Ok" here opens the "Edit timer" menu.
|
||||||
|
|
||||||
Textual options, like channel names or recording file names, can be edited
|
Textual options, like channel names or recording file names, can be edited
|
||||||
@ -296,6 +300,12 @@ Video Disk Recorder User's Manual
|
|||||||
OSDLanguage = 0 Defines the language used to display the OSD texts.
|
OSDLanguage = 0 Defines the language used to display the OSD texts.
|
||||||
0 = Englisch
|
0 = Englisch
|
||||||
1 = Deutsch
|
1 = Deutsch
|
||||||
|
2 = Slovenian
|
||||||
|
3 = Italian
|
||||||
|
4 = Dutch
|
||||||
|
5 = Portugese
|
||||||
|
6 = French
|
||||||
|
7 = Norwegian
|
||||||
|
|
||||||
PrimaryDVB = 1 Defines the primary DVB interface (i.e. the one that
|
PrimaryDVB = 1 Defines the primary DVB interface (i.e. the one that
|
||||||
will display the menus and will react on input through
|
will display the menus and will react on input through
|
||||||
@ -373,6 +383,10 @@ Video Disk Recorder User's Manual
|
|||||||
connection after which the connection is automatically
|
connection after which the connection is automatically
|
||||||
closed. Default is 300, a value of 0 means no timeout.
|
closed. Default is 300, a value of 0 means no timeout.
|
||||||
|
|
||||||
|
SortTimers = 1 Turns sorting the timers in the "Timers" menu on/off.
|
||||||
|
Timers are sorted by ascending start times, with the
|
||||||
|
first one being the next timer that will start.
|
||||||
|
|
||||||
PrimaryLimit = 0 The minimum priority a timer must have to be allowed to
|
PrimaryLimit = 0 The minimum priority a timer must have to be allowed to
|
||||||
use the primary DVB interface, or to force another timer
|
use the primary DVB interface, or to force another timer
|
||||||
with higher priority to use the primary DVB interface.
|
with higher priority to use the primary DVB interface.
|
||||||
@ -398,6 +412,11 @@ Video Disk Recorder User's Manual
|
|||||||
OSDwidth = 52 The width and height of the OSD .
|
OSDwidth = 52 The width and height of the OSD .
|
||||||
OSDheight = 18 The valid ranges are width=40...56, height=12...21.
|
OSDheight = 18 The valid ranges are width=40...56, height=12...21.
|
||||||
|
|
||||||
|
MaxVideoFileSize=2000 The maximum size of a single recorded video file in MB.
|
||||||
|
The valid range is 100...2000. Default is 2000, but
|
||||||
|
you may want to use smaller values if you are planning
|
||||||
|
on archiving a recording to CD.
|
||||||
|
|
||||||
* 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
|
||||||
|
@ -192,4 +192,6 @@ Video Italia:12610:v:0:22000:121:122:0:0:12220
|
|||||||
AC 3 promo:12670:v:0:22000:308:256:0:0:0
|
AC 3 promo:12670:v:0:22000:308:256:0:0:0
|
||||||
ORF/ZDF:12699:h:0:22000:506:507:0:0:13012
|
ORF/ZDF:12699:h:0:22000:506:507:0:0:13012
|
||||||
VIVA:12670:v:0:22000:309:310:0:0:12732
|
VIVA:12670:v:0:22000:309:310:0:0:12732
|
||||||
|
VIVA2:12552:v:0:22000:171:172:0:0:12120
|
||||||
MTV Central Europe:12699:v:0:22000:3031:3032:0:0:28643
|
MTV Central Europe:12699:v:0:22000:3031:3032:0:0:28643
|
||||||
|
IFA-TV:10832:h:0:22000:132:133:32:0:7251
|
||||||
|
155
config.c
155
config.c
@ -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.55 2001/08/17 13:02:01 kls Exp $
|
* $Id: config.c 1.59 2001/08/26 14:46:43 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
@ -394,6 +394,13 @@ cTimer& cTimer::operator= (const cTimer &Timer)
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool cTimer::operator< (const cTimer &Timer)
|
||||||
|
{
|
||||||
|
time_t t1 = StartTime();
|
||||||
|
time_t t2 = (*(cTimer *)&Timer).StartTime();
|
||||||
|
return t1 < t2 || (t1 == t2 && priority > Timer.priority);
|
||||||
|
}
|
||||||
|
|
||||||
const char *cTimer::ToText(cTimer *Timer)
|
const char *cTimer::ToText(cTimer *Timer)
|
||||||
{
|
{
|
||||||
delete buffer;
|
delete buffer;
|
||||||
@ -415,13 +422,6 @@ int cTimer::TimeToInt(int t)
|
|||||||
return (t / 100 * 60 + t % 100) * 60;
|
return (t / 100 * 60 + t % 100) * 60;
|
||||||
}
|
}
|
||||||
|
|
||||||
time_t cTimer::Day(time_t t)
|
|
||||||
{
|
|
||||||
struct tm d = *localtime(&t);
|
|
||||||
d.tm_hour = d.tm_min = d.tm_sec = 0;
|
|
||||||
return mktime(&d);
|
|
||||||
}
|
|
||||||
|
|
||||||
int cTimer::ParseDay(const char *s)
|
int cTimer::ParseDay(const char *s)
|
||||||
{
|
{
|
||||||
char *tail;
|
char *tail;
|
||||||
@ -511,43 +511,66 @@ bool cTimer::IsSingleEvent(void)
|
|||||||
return (day & 0x80000000) == 0;
|
return (day & 0x80000000) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int cTimer::GetMDay(time_t t)
|
||||||
|
{
|
||||||
|
return localtime(&t)->tm_mday;
|
||||||
|
}
|
||||||
|
|
||||||
|
int cTimer::GetWDay(time_t t)
|
||||||
|
{
|
||||||
|
int weekday = localtime(&t)->tm_wday;
|
||||||
|
return weekday == 0 ? 6 : weekday - 1; // we start with monday==0!
|
||||||
|
}
|
||||||
|
|
||||||
|
bool cTimer::DayMatches(time_t t)
|
||||||
|
{
|
||||||
|
return IsSingleEvent() ? GetMDay(t) == day : (day & (1 << GetWDay(t))) != 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
time_t cTimer::IncDay(time_t t, int Days)
|
||||||
|
{
|
||||||
|
tm tm = *localtime(&t);
|
||||||
|
tm.tm_mday += Days; // now tm_mday may be out of its valid range
|
||||||
|
int h = tm.tm_hour; // save original hour to compensate for DST change
|
||||||
|
t = mktime(&tm); // normalize all values
|
||||||
|
tm.tm_hour = h; // compensate for DST change
|
||||||
|
return mktime(&tm); // calculate final result
|
||||||
|
}
|
||||||
|
|
||||||
|
time_t cTimer::SetTime(time_t t, int SecondsFromMidnight)
|
||||||
|
{
|
||||||
|
tm tm = *localtime(&t);
|
||||||
|
tm.tm_hour = SecondsFromMidnight / 3600;
|
||||||
|
tm.tm_min = (SecondsFromMidnight % 3600) / 60;
|
||||||
|
tm.tm_sec = SecondsFromMidnight % 60;
|
||||||
|
return mktime(&tm);
|
||||||
|
}
|
||||||
|
|
||||||
bool cTimer::Matches(time_t t)
|
bool cTimer::Matches(time_t t)
|
||||||
{
|
{
|
||||||
if (active) {
|
startTime = stopTime = 0;
|
||||||
if (t == 0)
|
if (t == 0)
|
||||||
t = time(NULL);
|
t = time(NULL);
|
||||||
struct tm now = *localtime(&t);
|
|
||||||
int weekday = now.tm_wday == 0 ? 6 : now.tm_wday - 1; // we start with monday==0!
|
|
||||||
int begin = TimeToInt(start);
|
|
||||||
int end = TimeToInt(stop);
|
|
||||||
bool twoDays = (end < begin);
|
|
||||||
|
|
||||||
bool todayMatches = false, yesterdayMatches = false;
|
int begin = TimeToInt(start); // seconds from midnight
|
||||||
if ((day & 0x80000000) != 0) {
|
int length = TimeToInt(stop) - begin;
|
||||||
if ((day & (1 << weekday)) != 0)
|
if (length < 0)
|
||||||
todayMatches = true;
|
length += SECSINDAY;
|
||||||
else if (twoDays) {
|
|
||||||
int yesterday = weekday == 0 ? 6 : weekday - 1;
|
int DaysToCheck = IsSingleEvent() ? 31 : 7;
|
||||||
if ((day & (1 << yesterday)) != 0)
|
for (int i = -1; i <= DaysToCheck; i++) {
|
||||||
yesterdayMatches = true;
|
time_t t0 = IncDay(t, i);
|
||||||
}
|
if (DayMatches(t0)) {
|
||||||
}
|
time_t a = SetTime(t0, begin);
|
||||||
else if (day == now.tm_mday)
|
time_t b = a + length;
|
||||||
todayMatches = true;
|
if (t <= b) {
|
||||||
else if (twoDays) {
|
startTime = a;
|
||||||
time_t ty = t - SECSINDAY;
|
stopTime = b;
|
||||||
if (day == localtime(&ty)->tm_mday)
|
break;
|
||||||
yesterdayMatches = true;
|
}
|
||||||
}
|
}
|
||||||
if (todayMatches || (twoDays && yesterdayMatches)) {
|
}
|
||||||
startTime = Day(t - (yesterdayMatches ? SECSINDAY : 0)) + begin;
|
return active && startTime <= t && t <= stopTime;
|
||||||
stopTime = startTime + (twoDays ? SECSINDAY - begin + end : end - begin);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
startTime = stopTime = 0;
|
|
||||||
return startTime <= t && t <= stopTime;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
time_t cTimer::StartTime(void)
|
time_t cTimer::StartTime(void)
|
||||||
@ -575,21 +598,6 @@ void cTimer::SetPending(bool Pending)
|
|||||||
pending = Pending;
|
pending = Pending;
|
||||||
}
|
}
|
||||||
|
|
||||||
cTimer *cTimer::GetMatch(void)
|
|
||||||
{
|
|
||||||
time_t t = time(NULL); // all timers must be checked against the exact same time to correctly handle Priority!
|
|
||||||
cTimer *t0 = NULL;
|
|
||||||
cTimer *ti = (cTimer *)Timers.First();
|
|
||||||
while (ti) {
|
|
||||||
if (!ti->recording && ti->Matches(t)) {
|
|
||||||
if (!t0 || ti->priority > t0->priority)
|
|
||||||
t0 = ti;
|
|
||||||
}
|
|
||||||
ti = (cTimer *)ti->Next();
|
|
||||||
}
|
|
||||||
return t0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// --- cCommand -------------------------------------------------------------
|
// --- cCommand -------------------------------------------------------------
|
||||||
|
|
||||||
char *cCommand::result = NULL;
|
char *cCommand::result = NULL;
|
||||||
@ -753,6 +761,33 @@ cTimer *cTimers::GetTimer(cTimer *Timer)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cTimer *cTimers::GetMatch(void)
|
||||||
|
{
|
||||||
|
time_t t = time(NULL); // all timers must be checked against the exact same time to correctly handle Priority!
|
||||||
|
cTimer *t0 = NULL;
|
||||||
|
cTimer *ti = First();
|
||||||
|
while (ti) {
|
||||||
|
if (!ti->recording && ti->Matches(t)) {
|
||||||
|
if (!t0 || ti->priority > t0->priority)
|
||||||
|
t0 = ti;
|
||||||
|
}
|
||||||
|
ti = (cTimer *)ti->Next();
|
||||||
|
}
|
||||||
|
return t0;
|
||||||
|
}
|
||||||
|
|
||||||
|
cTimer *cTimers::GetNextActiveTimer(void)
|
||||||
|
{
|
||||||
|
cTimer *t0 = NULL;
|
||||||
|
cTimer *ti = First();
|
||||||
|
while (ti) {
|
||||||
|
if (ti->active && (!t0 || *ti < *t0))
|
||||||
|
t0 = ti;
|
||||||
|
ti = (cTimer *)ti->Next();
|
||||||
|
}
|
||||||
|
return t0;
|
||||||
|
}
|
||||||
|
|
||||||
// -- cSetup -----------------------------------------------------------------
|
// -- cSetup -----------------------------------------------------------------
|
||||||
|
|
||||||
cSetup Setup;
|
cSetup Setup;
|
||||||
@ -776,6 +811,7 @@ cSetup::cSetup(void)
|
|||||||
EPGScanTimeout = 5;
|
EPGScanTimeout = 5;
|
||||||
EPGBugfixLevel = 2;
|
EPGBugfixLevel = 2;
|
||||||
SVDRPTimeout = 300;
|
SVDRPTimeout = 300;
|
||||||
|
SortTimers = 1;
|
||||||
PrimaryLimit = 0;
|
PrimaryLimit = 0;
|
||||||
DefaultPriority = 50;
|
DefaultPriority = 50;
|
||||||
DefaultLifetime = 50;
|
DefaultLifetime = 50;
|
||||||
@ -783,6 +819,7 @@ cSetup::cSetup(void)
|
|||||||
ChannelInfoPos = 0;
|
ChannelInfoPos = 0;
|
||||||
OSDwidth = 52;
|
OSDwidth = 52;
|
||||||
OSDheight = 18;
|
OSDheight = 18;
|
||||||
|
MaxVideoFileSize = MAXVIDEOFILESIZE;
|
||||||
CurrentChannel = -1;
|
CurrentChannel = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -807,6 +844,7 @@ bool cSetup::Parse(char *s)
|
|||||||
else if (!strcasecmp(Name, "EPGScanTimeout")) EPGScanTimeout = atoi(Value);
|
else if (!strcasecmp(Name, "EPGScanTimeout")) EPGScanTimeout = atoi(Value);
|
||||||
else if (!strcasecmp(Name, "EPGBugfixLevel")) EPGBugfixLevel = atoi(Value);
|
else if (!strcasecmp(Name, "EPGBugfixLevel")) EPGBugfixLevel = atoi(Value);
|
||||||
else if (!strcasecmp(Name, "SVDRPTimeout")) SVDRPTimeout = atoi(Value);
|
else if (!strcasecmp(Name, "SVDRPTimeout")) SVDRPTimeout = atoi(Value);
|
||||||
|
else if (!strcasecmp(Name, "SortTimers")) SortTimers = atoi(Value);
|
||||||
else if (!strcasecmp(Name, "PrimaryLimit")) PrimaryLimit = atoi(Value);
|
else if (!strcasecmp(Name, "PrimaryLimit")) PrimaryLimit = atoi(Value);
|
||||||
else if (!strcasecmp(Name, "DefaultPriority")) DefaultPriority = atoi(Value);
|
else if (!strcasecmp(Name, "DefaultPriority")) DefaultPriority = atoi(Value);
|
||||||
else if (!strcasecmp(Name, "DefaultLifetime")) DefaultLifetime = atoi(Value);
|
else if (!strcasecmp(Name, "DefaultLifetime")) DefaultLifetime = atoi(Value);
|
||||||
@ -814,6 +852,7 @@ bool cSetup::Parse(char *s)
|
|||||||
else if (!strcasecmp(Name, "ChannelInfoPos")) ChannelInfoPos = atoi(Value);
|
else if (!strcasecmp(Name, "ChannelInfoPos")) ChannelInfoPos = atoi(Value);
|
||||||
else if (!strcasecmp(Name, "OSDwidth")) OSDwidth = atoi(Value);
|
else if (!strcasecmp(Name, "OSDwidth")) OSDwidth = atoi(Value);
|
||||||
else if (!strcasecmp(Name, "OSDheight")) OSDheight = atoi(Value);
|
else if (!strcasecmp(Name, "OSDheight")) OSDheight = atoi(Value);
|
||||||
|
else if (!strcasecmp(Name, "MaxVideoFileSize")) MaxVideoFileSize = atoi(Value);
|
||||||
else if (!strcasecmp(Name, "CurrentChannel")) CurrentChannel = atoi(Value);
|
else if (!strcasecmp(Name, "CurrentChannel")) CurrentChannel = atoi(Value);
|
||||||
else
|
else
|
||||||
return false;
|
return false;
|
||||||
@ -873,6 +912,7 @@ bool cSetup::Save(const char *FileName)
|
|||||||
fprintf(f, "EPGScanTimeout = %d\n", EPGScanTimeout);
|
fprintf(f, "EPGScanTimeout = %d\n", EPGScanTimeout);
|
||||||
fprintf(f, "EPGBugfixLevel = %d\n", EPGBugfixLevel);
|
fprintf(f, "EPGBugfixLevel = %d\n", EPGBugfixLevel);
|
||||||
fprintf(f, "SVDRPTimeout = %d\n", SVDRPTimeout);
|
fprintf(f, "SVDRPTimeout = %d\n", SVDRPTimeout);
|
||||||
|
fprintf(f, "SortTimers = %d\n", SortTimers);
|
||||||
fprintf(f, "PrimaryLimit = %d\n", PrimaryLimit);
|
fprintf(f, "PrimaryLimit = %d\n", PrimaryLimit);
|
||||||
fprintf(f, "DefaultPriority = %d\n", DefaultPriority);
|
fprintf(f, "DefaultPriority = %d\n", DefaultPriority);
|
||||||
fprintf(f, "DefaultLifetime = %d\n", DefaultLifetime);
|
fprintf(f, "DefaultLifetime = %d\n", DefaultLifetime);
|
||||||
@ -880,6 +920,7 @@ bool cSetup::Save(const char *FileName)
|
|||||||
fprintf(f, "ChannelInfoPos = %d\n", ChannelInfoPos);
|
fprintf(f, "ChannelInfoPos = %d\n", ChannelInfoPos);
|
||||||
fprintf(f, "OSDwidth = %d\n", OSDwidth);
|
fprintf(f, "OSDwidth = %d\n", OSDwidth);
|
||||||
fprintf(f, "OSDheight = %d\n", OSDheight);
|
fprintf(f, "OSDheight = %d\n", OSDheight);
|
||||||
|
fprintf(f, "MaxVideoFileSize = %d\n", MaxVideoFileSize);
|
||||||
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);
|
||||||
|
16
config.h
16
config.h
@ -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.61 2001/08/17 13:00:48 kls Exp $
|
* $Id: config.h 1.66 2001/08/26 14:46:53 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __CONFIG_H
|
#ifndef __CONFIG_H
|
||||||
@ -19,7 +19,7 @@
|
|||||||
#include "eit.h"
|
#include "eit.h"
|
||||||
#include "tools.h"
|
#include "tools.h"
|
||||||
|
|
||||||
#define VDRVERSION "0.92"
|
#define VDRVERSION "0.93"
|
||||||
|
|
||||||
#define MaxBuffer 10000
|
#define MaxBuffer 10000
|
||||||
|
|
||||||
@ -137,18 +137,22 @@ public:
|
|||||||
cTimer(const cEventInfo *EventInfo);
|
cTimer(const cEventInfo *EventInfo);
|
||||||
virtual ~cTimer();
|
virtual ~cTimer();
|
||||||
cTimer& operator= (const cTimer &Timer);
|
cTimer& operator= (const cTimer &Timer);
|
||||||
|
bool operator< (const cTimer &Timer);
|
||||||
const char *ToText(void);
|
const char *ToText(void);
|
||||||
bool Parse(const char *s);
|
bool Parse(const char *s);
|
||||||
bool Save(FILE *f);
|
bool Save(FILE *f);
|
||||||
bool IsSingleEvent(void);
|
bool IsSingleEvent(void);
|
||||||
|
int GetMDay(time_t t);
|
||||||
|
int GetWDay(time_t t);
|
||||||
|
bool DayMatches(time_t t);
|
||||||
|
time_t IncDay(time_t t, int Days);
|
||||||
|
time_t SetTime(time_t t, int SecondsFromMidnight);
|
||||||
bool Matches(time_t t = 0);
|
bool Matches(time_t t = 0);
|
||||||
time_t StartTime(void);
|
time_t StartTime(void);
|
||||||
time_t StopTime(void);
|
time_t StopTime(void);
|
||||||
void SetRecording(bool Recording);
|
void SetRecording(bool Recording);
|
||||||
void SetPending(bool Pending);
|
void SetPending(bool Pending);
|
||||||
static cTimer *GetMatch(void);
|
|
||||||
static int TimeToInt(int t);
|
static int TimeToInt(int t);
|
||||||
static time_t Day(time_t t);
|
|
||||||
static int ParseDay(const char *s);
|
static int ParseDay(const char *s);
|
||||||
static const char *PrintDay(int d);
|
static const char *PrintDay(int d);
|
||||||
};
|
};
|
||||||
@ -251,6 +255,8 @@ public:
|
|||||||
class cTimers : public cConfig<cTimer> {
|
class cTimers : public cConfig<cTimer> {
|
||||||
public:
|
public:
|
||||||
cTimer *GetTimer(cTimer *Timer);
|
cTimer *GetTimer(cTimer *Timer);
|
||||||
|
cTimer *GetMatch(void);
|
||||||
|
cTimer *GetNextActiveTimer(void);
|
||||||
};
|
};
|
||||||
|
|
||||||
class cCommands : public cConfig<cCommand> {};
|
class cCommands : public cConfig<cCommand> {};
|
||||||
@ -282,11 +288,13 @@ public:
|
|||||||
int EPGScanTimeout;
|
int EPGScanTimeout;
|
||||||
int EPGBugfixLevel;
|
int EPGBugfixLevel;
|
||||||
int SVDRPTimeout;
|
int SVDRPTimeout;
|
||||||
|
int SortTimers;
|
||||||
int PrimaryLimit;
|
int PrimaryLimit;
|
||||||
int DefaultPriority, DefaultLifetime;
|
int DefaultPriority, DefaultLifetime;
|
||||||
int VideoFormat;
|
int VideoFormat;
|
||||||
int ChannelInfoPos;
|
int ChannelInfoPos;
|
||||||
int OSDwidth, OSDheight;
|
int OSDwidth, OSDheight;
|
||||||
|
int MaxVideoFileSize;
|
||||||
int CurrentChannel;
|
int CurrentChannel;
|
||||||
cSetup(void);
|
cSetup(void);
|
||||||
bool Load(const char *FileName);
|
bool Load(const char *FileName);
|
||||||
|
20
dvbapi.c
20
dvbapi.c
@ -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.109 2001/08/19 15:09:48 kls Exp $
|
* $Id: dvbapi.c 1.110 2001/08/25 13:52:38 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//#define DVDDEBUG 1
|
//#define DVDDEBUG 1
|
||||||
@ -50,20 +50,16 @@ extern "C" {
|
|||||||
#define DEV_OST_VIDEO "/dev/ost/video"
|
#define DEV_OST_VIDEO "/dev/ost/video"
|
||||||
#define DEV_OST_AUDIO "/dev/ost/audio"
|
#define DEV_OST_AUDIO "/dev/ost/audio"
|
||||||
|
|
||||||
|
#define KILOBYTE(n) ((n) * 1024)
|
||||||
|
#define MEGABYTE(n) ((n) * 1024 * 1024)
|
||||||
|
|
||||||
// The size of the array used to buffer video data:
|
// The size of the array used to buffer video data:
|
||||||
// (must be larger than MINVIDEODATA - see remux.h)
|
// (must be larger than MINVIDEODATA - see remux.h)
|
||||||
#define VIDEOBUFSIZE (1024*1024)
|
#define VIDEOBUFSIZE MEGABYTE(1)
|
||||||
|
|
||||||
// The maximum size of a single frame:
|
// The maximum size of a single frame:
|
||||||
#define MAXFRAMESIZE (192*1024)
|
#define MAXFRAMESIZE KILOBYTE(192)
|
||||||
|
|
||||||
// The maximum file size is limited by the range that can be covered
|
|
||||||
// with 'int'. 4GB might be possible (if the range is considered
|
|
||||||
// 'unsigned'), 2GB should be possible (even if the range is considered
|
|
||||||
// 'signed'), so let's use 1GB for absolute safety (the actual file size
|
|
||||||
// may be slightly higher because we stop recording only before the next
|
|
||||||
// 'I' frame, to have a complete Group Of Pictures):
|
|
||||||
#define MAXVIDEOFILESIZE (1024*1024*1024) // Byte
|
|
||||||
#define MAXFILESPERRECORDING 255
|
#define MAXFILESPERRECORDING 255
|
||||||
|
|
||||||
#define MINFREEDISKSPACE (512) // MB
|
#define MINFREEDISKSPACE (512) // MB
|
||||||
@ -517,7 +513,7 @@ bool cRecordBuffer::RunningLowOnDiskSpace(void)
|
|||||||
bool cRecordBuffer::NextFile(void)
|
bool cRecordBuffer::NextFile(void)
|
||||||
{
|
{
|
||||||
if (recordFile >= 0 && pictureType == I_FRAME) { // every file shall start with an I_FRAME
|
if (recordFile >= 0 && pictureType == I_FRAME) { // every file shall start with an I_FRAME
|
||||||
if (fileSize > MAXVIDEOFILESIZE || RunningLowOnDiskSpace()) {
|
if (fileSize > MEGABYTE(Setup.MaxVideoFileSize) || RunningLowOnDiskSpace()) {
|
||||||
recordFile = fileName.NextFile();
|
recordFile = fileName.NextFile();
|
||||||
fileSize = 0;
|
fileSize = 0;
|
||||||
}
|
}
|
||||||
@ -2217,7 +2213,7 @@ void cCuttingBuffer::Action(void)
|
|||||||
// Write one frame:
|
// Write one frame:
|
||||||
|
|
||||||
if (PictureType == I_FRAME) { // every file shall start with an I_FRAME
|
if (PictureType == I_FRAME) { // every file shall start with an I_FRAME
|
||||||
if (FileSize > MAXVIDEOFILESIZE) {
|
if (FileSize > MEGABYTE(Setup.MaxVideoFileSize)) {
|
||||||
toFile = toFileName->NextFile();
|
toFile = toFileName->NextFile();
|
||||||
if (toFile < 0)
|
if (toFile < 0)
|
||||||
break;
|
break;
|
||||||
|
11
dvbapi.h
11
dvbapi.h
@ -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.46 2001/08/11 12:22:01 kls Exp $
|
* $Id: dvbapi.h 1.47 2001/08/25 13:37:00 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __DVBAPI_H
|
#ifndef __DVBAPI_H
|
||||||
@ -42,6 +42,15 @@ typedef struct CRect {
|
|||||||
|
|
||||||
#define FRAMESPERSEC 25
|
#define FRAMESPERSEC 25
|
||||||
|
|
||||||
|
// The maximum file size is limited by the range that can be covered
|
||||||
|
// with 'int'. 4GB might be possible (if the range is considered
|
||||||
|
// 'unsigned'), 2GB should be possible (even if the range is considered
|
||||||
|
// 'signed'), so let's use 2000MB for absolute safety (the actual file size
|
||||||
|
// may be slightly higher because we stop recording only before the next
|
||||||
|
// 'I' frame, to have a complete Group Of Pictures):
|
||||||
|
#define MAXVIDEOFILESIZE 2000 // MB
|
||||||
|
#define MINVIDEOFILESIZE 100 // MB
|
||||||
|
|
||||||
const char *IndexToHMSF(int Index, bool WithFrame = false);
|
const char *IndexToHMSF(int Index, bool WithFrame = false);
|
||||||
// Converts the given index to a string, optionally containing the frame number.
|
// Converts the given index to a string, optionally containing the frame number.
|
||||||
int HMSFToIndex(const char *HMSF);
|
int HMSFToIndex(const char *HMSF);
|
||||||
|
29
i18n.c
29
i18n.c
@ -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.32 2001/08/17 13:03:15 kls Exp $
|
* $Id: i18n.c 1.35 2001/08/26 13:45:10 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>
|
||||||
@ -794,6 +794,15 @@ const tPhrase Phrases[] = {
|
|||||||
"Temps maxi SVDRP",
|
"Temps maxi SVDRP",
|
||||||
"Ubrukt SVDRP-levetid",
|
"Ubrukt SVDRP-levetid",
|
||||||
},
|
},
|
||||||
|
{ "SortTimers",
|
||||||
|
"Timer sortieren",
|
||||||
|
"", // TODO
|
||||||
|
"", // TODO
|
||||||
|
"", // TODO
|
||||||
|
"", // TODO
|
||||||
|
"", // TODO
|
||||||
|
"", // TODO
|
||||||
|
},
|
||||||
{ "PrimaryLimit",
|
{ "PrimaryLimit",
|
||||||
"Primär-Limit",
|
"Primär-Limit",
|
||||||
"", // TODO
|
"", // TODO
|
||||||
@ -857,6 +866,15 @@ const tPhrase Phrases[] = {
|
|||||||
"Hauteur affichage",
|
"Hauteur affichage",
|
||||||
"", // TODO
|
"", // TODO
|
||||||
},
|
},
|
||||||
|
{ "MaxVideoFileSize",
|
||||||
|
"Max. Video Dateigröße",
|
||||||
|
"", // TODO
|
||||||
|
"", // TODO
|
||||||
|
"", // TODO
|
||||||
|
"", // TODO
|
||||||
|
"", // TODO
|
||||||
|
"", // TODO
|
||||||
|
},
|
||||||
// The days of the week:
|
// The days of the week:
|
||||||
{ "MTWTFSS",
|
{ "MTWTFSS",
|
||||||
"MDMDFSS",
|
"MDMDFSS",
|
||||||
@ -867,6 +885,15 @@ const tPhrase Phrases[] = {
|
|||||||
"LMMJVSD",
|
"LMMJVSD",
|
||||||
"MTOTFLS",
|
"MTOTFLS",
|
||||||
},
|
},
|
||||||
|
{ "MonTueWedThuFriSatSun", // must all be 3 letters!
|
||||||
|
"MonDieMitDonFreSamSon",
|
||||||
|
"", // TODO
|
||||||
|
"", // TODO
|
||||||
|
"", // TODO
|
||||||
|
"", // TODO
|
||||||
|
"", // TODO
|
||||||
|
"", // TODO
|
||||||
|
},
|
||||||
// Learning keys:
|
// Learning keys:
|
||||||
{ "Learning Remote Control Keys",
|
{ "Learning Remote Control Keys",
|
||||||
"Fernbedienungs-Codes lernen",
|
"Fernbedienungs-Codes lernen",
|
||||||
|
@ -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: interface.c 1.40 2001/08/07 16:23:28 kls Exp $
|
* $Id: interface.c 1.41 2001/08/25 13:15:00 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "interface.h"
|
#include "interface.h"
|
||||||
@ -271,7 +271,7 @@ void cInterface::Title(const char *s)
|
|||||||
unsigned int n = t - s;
|
unsigned int n = t - s;
|
||||||
if (n >= sizeof(buffer))
|
if (n >= sizeof(buffer))
|
||||||
n = sizeof(buffer) - 1;
|
n = sizeof(buffer) - 1;
|
||||||
strn0cpy(buffer, s, n);
|
strn0cpy(buffer, s, n + 1);
|
||||||
Write(1, 0, buffer, clrBlack, clrCyan);
|
Write(1, 0, buffer, clrBlack, clrCyan);
|
||||||
t++;
|
t++;
|
||||||
Write(-(cDvbApi::PrimaryDvbApi->WidthInCells(t) + 1), 0, t, clrBlack, clrCyan);
|
Write(-(cDvbApi::PrimaryDvbApi->WidthInCells(t) + 1), 0, t, clrBlack, clrCyan);
|
||||||
|
55
libdtv/x.txt
Normal file
55
libdtv/x.txt
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
Hallo ZDF-EPG-Redaktion!
|
||||||
|
|
||||||
|
Es würde mich interessieren, warum im digitalen EPG des
|
||||||
|
ZDF (über Astra) die Beschreibung der Sendungen oftmals
|
||||||
|
Trennungsstriche und zusätzliche Leerzeichen enthält.
|
||||||
|
So zum Beispiel bei folgendem Eintrag:
|
||||||
|
|
||||||
|
----------------------------------------------------
|
||||||
|
ZDF 23.08 10:50 - 11:35
|
||||||
|
|
||||||
|
Mit Leib und Seele
|
||||||
|
|
||||||
|
Der einzige Mensch
|
||||||
|
|
||||||
|
Stehlin hat die Frühmesse abge- sagt und sein
|
||||||
|
Kommen im Pfarr- haus angekündigt. August, erbost
|
||||||
|
über die Heimlichkeiten und Re- dereien von
|
||||||
|
Stutz, erzwingt eine Aussprache mit Stehlin.
|
||||||
|
----------------------------------------------------
|
||||||
|
|
||||||
|
der ohne Trennungsstriche so aussehen könnte:
|
||||||
|
|
||||||
|
----------------------------------------------------
|
||||||
|
ZDF 23.08 10:50 - 11:35
|
||||||
|
|
||||||
|
Mit Leib und Seele
|
||||||
|
|
||||||
|
Der einzige Mensch
|
||||||
|
|
||||||
|
Stehlin hat die Frühmesse abgesagt und sein
|
||||||
|
Kommen im Pfarrhaus angekündigt. August, erbost
|
||||||
|
über die Heimlichkeiten und Redereien von Stutz,
|
||||||
|
erzwingt eine Aussprache mit Stehlin.
|
||||||
|
----------------------------------------------------
|
||||||
|
|
||||||
|
Ich kann mir das nur so erklären, daß Sie konkrete Annahmen
|
||||||
|
darüber machen, mit welcher Zeilenlänge die Set-Top-Box diese
|
||||||
|
Texte darstellt - aber das ist in meinen Augen eine ziemlich
|
||||||
|
verwegene Annahme, denn es sollte ja wohl der STB überlassen bleiben,
|
||||||
|
wie groß das Fenster für die Darstellung des EPG ist.
|
||||||
|
|
||||||
|
Pro-7 zum Beispiel macht sowas nicht, wodurch der Text deultich
|
||||||
|
besser dargestellt wird.
|
||||||
|
|
||||||
|
Wenn Sie wenigstens nach dem (bzw. statt des) Bindestrich(s) ein deutlich
|
||||||
|
erkennbares Sonderzeichen einfügen würden, dann könnte man das zuverlässig
|
||||||
|
herausfiltern, aber so macht der ZDF-EPG immer wieder einen
|
||||||
|
schlechten Eindruck.
|
||||||
|
|
||||||
|
Über eine Antwort von Ihnen würde ich mich sehr freuen.
|
||||||
|
|
||||||
|
MfG
|
||||||
|
Klaus Schmidinger
|
||||||
|
|
||||||
|
|
66
menu.c
66
menu.c
@ -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.105 2001/08/19 14:45:31 kls Exp $
|
* $Id: menu.c 1.109 2001/08/26 14:03:27 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "menu.h"
|
#include "menu.h"
|
||||||
@ -957,25 +957,30 @@ eOSState cMenuEditTimer::ProcessKey(eKeys Key)
|
|||||||
|
|
||||||
class cMenuTimerItem : public cOsdItem {
|
class cMenuTimerItem : public cOsdItem {
|
||||||
private:
|
private:
|
||||||
int index;
|
|
||||||
cTimer *timer;
|
cTimer *timer;
|
||||||
public:
|
public:
|
||||||
cMenuTimerItem(int Index, cTimer *Timer);
|
cMenuTimerItem(cTimer *Timer);
|
||||||
|
virtual bool operator< (const cListObject &ListObject);
|
||||||
virtual void Set(void);
|
virtual void Set(void);
|
||||||
|
cTimer *Timer(void) { return timer; }
|
||||||
};
|
};
|
||||||
|
|
||||||
cMenuTimerItem::cMenuTimerItem(int Index, cTimer *Timer)
|
cMenuTimerItem::cMenuTimerItem(cTimer *Timer)
|
||||||
{
|
{
|
||||||
index = Index;
|
|
||||||
timer = Timer;
|
timer = Timer;
|
||||||
Set();
|
Set();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool cMenuTimerItem::operator< (const cListObject &ListObject)
|
||||||
|
{
|
||||||
|
return *timer < *((cMenuTimerItem *)&ListObject)->timer;
|
||||||
|
}
|
||||||
|
|
||||||
void cMenuTimerItem::Set(void)
|
void cMenuTimerItem::Set(void)
|
||||||
{
|
{
|
||||||
char *buffer = NULL;
|
char *buffer = NULL;
|
||||||
asprintf(&buffer, "%c\t%d\t%s\t%02d:%02d\t%02d:%02d\t%s",
|
asprintf(&buffer, "%c\t%d\t%s\t%02d:%02d\t%02d:%02d\t%s",
|
||||||
timer->active ? '>' : ' ',
|
timer->active ? timer->recording ? '#' : '>' : ' ',
|
||||||
timer->channel,
|
timer->channel,
|
||||||
timer->PrintDay(timer->day),
|
timer->PrintDay(timer->day),
|
||||||
timer->start / 100,
|
timer->start / 100,
|
||||||
@ -996,6 +1001,7 @@ private:
|
|||||||
eOSState Del(void);
|
eOSState Del(void);
|
||||||
virtual void Move(int From, int To);
|
virtual void Move(int From, int To);
|
||||||
eOSState Summary(void);
|
eOSState Summary(void);
|
||||||
|
cTimer *CurrentTimer(void);
|
||||||
public:
|
public:
|
||||||
cMenuTimers(void);
|
cMenuTimers(void);
|
||||||
virtual eOSState ProcessKey(eKeys Key);
|
virtual eOSState ProcessKey(eKeys Key);
|
||||||
@ -1008,15 +1014,23 @@ cMenuTimers::cMenuTimers(void)
|
|||||||
cTimer *timer;
|
cTimer *timer;
|
||||||
|
|
||||||
while ((timer = Timers.Get(i)) != NULL) {
|
while ((timer = Timers.Get(i)) != NULL) {
|
||||||
Add(new cMenuTimerItem(i, timer));
|
Add(new cMenuTimerItem(timer));
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
SetHelp(tr("Edit"), tr("New"), tr("Delete"), tr("Mark"));
|
if (Setup.SortTimers)
|
||||||
|
Sort();
|
||||||
|
SetHelp(tr("Edit"), tr("New"), tr("Delete"), Setup.SortTimers ? NULL : tr("Mark"));
|
||||||
|
}
|
||||||
|
|
||||||
|
cTimer *cMenuTimers::CurrentTimer(void)
|
||||||
|
{
|
||||||
|
cMenuTimerItem *item = (cMenuTimerItem *)Get(Current());
|
||||||
|
return item ? item->Timer() : NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
eOSState cMenuTimers::Activate(bool On)
|
eOSState cMenuTimers::Activate(bool On)
|
||||||
{
|
{
|
||||||
cTimer *timer = Timers.Get(Current());
|
cTimer *timer = CurrentTimer();
|
||||||
if (timer && timer->active != On) {
|
if (timer && timer->active != On) {
|
||||||
timer->active = On;
|
timer->active = On;
|
||||||
RefreshCurrent();
|
RefreshCurrent();
|
||||||
@ -1031,8 +1045,8 @@ eOSState cMenuTimers::Edit(void)
|
|||||||
{
|
{
|
||||||
if (HasSubMenu() || Count() == 0)
|
if (HasSubMenu() || Count() == 0)
|
||||||
return osContinue;
|
return osContinue;
|
||||||
isyslog(LOG_INFO, "editing timer %d", Current() + 1);
|
isyslog(LOG_INFO, "editing timer %d", CurrentTimer()->Index() + 1);
|
||||||
return AddSubMenu(new cMenuEditTimer(Current()));
|
return AddSubMenu(new cMenuEditTimer(CurrentTimer()->Index()));
|
||||||
}
|
}
|
||||||
|
|
||||||
eOSState cMenuTimers::New(void)
|
eOSState cMenuTimers::New(void)
|
||||||
@ -1041,22 +1055,22 @@ eOSState cMenuTimers::New(void)
|
|||||||
return osContinue;
|
return osContinue;
|
||||||
cTimer *timer = new cTimer;
|
cTimer *timer = new cTimer;
|
||||||
Timers.Add(timer);
|
Timers.Add(timer);
|
||||||
Add(new cMenuTimerItem(timer->Index()/*XXX*/, timer), true);
|
Add(new cMenuTimerItem(timer), true);
|
||||||
Timers.Save();
|
Timers.Save();
|
||||||
isyslog(LOG_INFO, "timer %d added", timer->Index() + 1);
|
isyslog(LOG_INFO, "timer %d added", timer->Index() + 1);
|
||||||
return AddSubMenu(new cMenuEditTimer(Current(), true));
|
return AddSubMenu(new cMenuEditTimer(timer->Index(), true));
|
||||||
}
|
}
|
||||||
|
|
||||||
eOSState cMenuTimers::Del(void)
|
eOSState cMenuTimers::Del(void)
|
||||||
{
|
{
|
||||||
// Check if this timer is active:
|
// Check if this timer is active:
|
||||||
int Index = Current();
|
cTimer *ti = CurrentTimer();
|
||||||
cTimer *ti = Timers.Get(Index);
|
|
||||||
if (ti) {
|
if (ti) {
|
||||||
if (!ti->recording) {
|
if (!ti->recording) {
|
||||||
if (Interface->Confirm(tr("Delete timer?"))) {
|
if (Interface->Confirm(tr("Delete timer?"))) {
|
||||||
Timers.Del(Timers.Get(Index));
|
int Index = ti->Index();
|
||||||
cOsdMenu::Del(Index);
|
Timers.Del(ti);
|
||||||
|
cOsdMenu::Del(Current());
|
||||||
Timers.Save();
|
Timers.Save();
|
||||||
Display();
|
Display();
|
||||||
isyslog(LOG_INFO, "timer %d deleted", Index + 1);
|
isyslog(LOG_INFO, "timer %d deleted", Index + 1);
|
||||||
@ -1081,7 +1095,7 @@ eOSState cMenuTimers::Summary(void)
|
|||||||
{
|
{
|
||||||
if (HasSubMenu() || Count() == 0)
|
if (HasSubMenu() || Count() == 0)
|
||||||
return osContinue;
|
return osContinue;
|
||||||
cTimer *ti = Timers.Get(Current());
|
cTimer *ti = CurrentTimer();
|
||||||
if (ti && ti->summary && *ti->summary)
|
if (ti && ti->summary && *ti->summary)
|
||||||
return AddSubMenu(new cMenuText(tr("Summary"), ti->summary));
|
return AddSubMenu(new cMenuText(tr("Summary"), ti->summary));
|
||||||
return Edit(); // convenience for people not using the Summary feature ;-)
|
return Edit(); // convenience for people not using the Summary feature ;-)
|
||||||
@ -1109,7 +1123,9 @@ eOSState cMenuTimers::ProcessKey(eKeys Key)
|
|||||||
case kRed: return Edit();
|
case kRed: return Edit();
|
||||||
case kGreen: return New();
|
case kGreen: return New();
|
||||||
case kYellow: return Del();
|
case kYellow: return Del();
|
||||||
case kBlue: Mark(); break;
|
case kBlue: if (!Setup.SortTimers)
|
||||||
|
Mark();
|
||||||
|
break;
|
||||||
default: break;
|
default: break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1137,6 +1153,7 @@ cMenuEvent::cMenuEvent(const cEventInfo *EventInfo, bool CanSwitch)
|
|||||||
char *buffer;
|
char *buffer;
|
||||||
asprintf(&buffer, "%-17.*s\t%.*s %s - %s", 17, channel->name, 5, eventInfo->GetDate(), eventInfo->GetTimeString(), eventInfo->GetEndTimeString());
|
asprintf(&buffer, "%-17.*s\t%.*s %s - %s", 17, channel->name, 5, eventInfo->GetDate(), eventInfo->GetTimeString(), eventInfo->GetEndTimeString());
|
||||||
SetTitle(buffer, false);
|
SetTitle(buffer, false);
|
||||||
|
delete buffer;
|
||||||
int Line = 2;
|
int Line = 2;
|
||||||
cMenuTextItem *item;
|
cMenuTextItem *item;
|
||||||
const char *Title = eventInfo->GetTitle();
|
const char *Title = eventInfo->GetTitle();
|
||||||
@ -1377,7 +1394,8 @@ void cMenuSchedule::PrepareSchedule(cChannel *Channel)
|
|||||||
Clear();
|
Clear();
|
||||||
char *buffer = NULL;
|
char *buffer = NULL;
|
||||||
asprintf(&buffer, tr("Schedule - %s"), Channel->name);
|
asprintf(&buffer, tr("Schedule - %s"), Channel->name);
|
||||||
SetTitle(buffer, false);
|
SetTitle(buffer);
|
||||||
|
delete buffer;
|
||||||
if (schedules) {
|
if (schedules) {
|
||||||
const cSchedule *Schedule = Channel->pnr ? schedules->GetSchedule(Channel->pnr) : schedules->GetSchedule();
|
const cSchedule *Schedule = Channel->pnr ? schedules->GetSchedule(Channel->pnr) : schedules->GetSchedule();
|
||||||
int num = Schedule->NumEvents();
|
int num = Schedule->NumEvents();
|
||||||
@ -1704,6 +1722,7 @@ void cMenuSetup::Set(void)
|
|||||||
Add(new cMenuEditIntItem( tr("EPGScanTimeout"), &data.EPGScanTimeout));
|
Add(new cMenuEditIntItem( tr("EPGScanTimeout"), &data.EPGScanTimeout));
|
||||||
Add(new cMenuEditIntItem( tr("EPGBugfixLevel"), &data.EPGBugfixLevel, 0, 3));
|
Add(new cMenuEditIntItem( tr("EPGBugfixLevel"), &data.EPGBugfixLevel, 0, 3));
|
||||||
Add(new cMenuEditIntItem( tr("SVDRPTimeout"), &data.SVDRPTimeout));
|
Add(new cMenuEditIntItem( tr("SVDRPTimeout"), &data.SVDRPTimeout));
|
||||||
|
Add(new cMenuEditBoolItem(tr("SortTimers"), &data.SortTimers));
|
||||||
Add(new cMenuEditIntItem( tr("PrimaryLimit"), &data.PrimaryLimit, 0, MAXPRIORITY));
|
Add(new cMenuEditIntItem( tr("PrimaryLimit"), &data.PrimaryLimit, 0, MAXPRIORITY));
|
||||||
Add(new cMenuEditIntItem( tr("DefaultPriority"), &data.DefaultPriority, 0, MAXPRIORITY));
|
Add(new cMenuEditIntItem( tr("DefaultPriority"), &data.DefaultPriority, 0, MAXPRIORITY));
|
||||||
Add(new cMenuEditIntItem( tr("DefaultLifetime"), &data.DefaultLifetime, 0, MAXLIFETIME));
|
Add(new cMenuEditIntItem( tr("DefaultLifetime"), &data.DefaultLifetime, 0, MAXLIFETIME));
|
||||||
@ -1711,6 +1730,7 @@ void cMenuSetup::Set(void)
|
|||||||
Add(new cMenuEditBoolItem(tr("ChannelInfoPos"), &data.ChannelInfoPos, tr("bottom"), tr("top")));
|
Add(new cMenuEditBoolItem(tr("ChannelInfoPos"), &data.ChannelInfoPos, tr("bottom"), tr("top")));
|
||||||
Add(new cMenuEditIntItem( tr("OSDwidth"), &data.OSDwidth, MINOSDWIDTH, MAXOSDWIDTH));
|
Add(new cMenuEditIntItem( tr("OSDwidth"), &data.OSDwidth, MINOSDWIDTH, MAXOSDWIDTH));
|
||||||
Add(new cMenuEditIntItem( tr("OSDheight"), &data.OSDheight, MINOSDHEIGHT, MAXOSDHEIGHT));
|
Add(new cMenuEditIntItem( tr("OSDheight"), &data.OSDheight, MINOSDHEIGHT, MAXOSDHEIGHT));
|
||||||
|
Add(new cMenuEditIntItem( tr("MaxVideoFileSize"), &data.MaxVideoFileSize, MINVIDEOFILESIZE, MAXVIDEOFILESIZE));
|
||||||
}
|
}
|
||||||
|
|
||||||
eOSState cMenuSetup::ProcessKey(eKeys Key)
|
eOSState cMenuSetup::ProcessKey(eKeys Key)
|
||||||
@ -1951,10 +1971,8 @@ void cDisplayChannel::DisplayChannel(const cChannel *Channel)
|
|||||||
snprintf(buffer, BufSize, "%s", Channel ? Channel->name : tr("*** Invalid Channel ***"));
|
snprintf(buffer, BufSize, "%s", Channel ? Channel->name : tr("*** Invalid Channel ***"));
|
||||||
Interface->Fill(0, 0, Setup.OSDwidth, 1, clrBackground);
|
Interface->Fill(0, 0, Setup.OSDwidth, 1, clrBackground);
|
||||||
Interface->Write(0, 0, buffer);
|
Interface->Write(0, 0, buffer);
|
||||||
time_t t = time(NULL);
|
const char *date = DayDateTime();
|
||||||
struct tm *now = localtime(&t);
|
Interface->Write(-strlen(date), 0, date);
|
||||||
snprintf(buffer, BufSize, "%02d:%02d", now->tm_hour, now->tm_min);
|
|
||||||
Interface->Write(-5, 0, buffer);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void cDisplayChannel::DisplayInfo(void)
|
void cDisplayChannel::DisplayInfo(void)
|
||||||
|
12
osd.c
12
osd.c
@ -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: osd.c 1.17 2001/08/02 14:18:17 kls Exp $
|
* $Id: osd.c 1.18 2001/08/25 13:15:16 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "osd.h"
|
#include "osd.h"
|
||||||
@ -78,7 +78,8 @@ cOsdMenu::cOsdMenu(const char *Title, int c0, int c1, int c2, int c3, int c4)
|
|||||||
{
|
{
|
||||||
hasHotkeys = false;
|
hasHotkeys = false;
|
||||||
visible = false;
|
visible = false;
|
||||||
title = strdup(Title);
|
title = NULL;
|
||||||
|
SetTitle(Title);
|
||||||
cols[0] = c0;
|
cols[0] = c0;
|
||||||
cols[1] = c1;
|
cols[1] = c1;
|
||||||
cols[2] = c2;
|
cols[2] = c2;
|
||||||
@ -109,10 +110,13 @@ void cOsdMenu::SetStatus(const char *s)
|
|||||||
Interface->Status(status);
|
Interface->Status(status);
|
||||||
}
|
}
|
||||||
|
|
||||||
void cOsdMenu::SetTitle(const char *Title, bool Copy)
|
void cOsdMenu::SetTitle(const char *Title, bool ShowDate)
|
||||||
{
|
{
|
||||||
delete title;
|
delete title;
|
||||||
title = Copy ? strdup(Title) : Title;
|
if (ShowDate)
|
||||||
|
asprintf(&title, "%s\t%s", Title, DayDateTime(time(NULL)));
|
||||||
|
else
|
||||||
|
title = strdup(Title);
|
||||||
}
|
}
|
||||||
|
|
||||||
void cOsdMenu::SetHelp(const char *Red, const char *Green, const char *Yellow, const char *Blue)
|
void cOsdMenu::SetHelp(const char *Red, const char *Green, const char *Yellow, const char *Blue)
|
||||||
|
6
osd.h
6
osd.h
@ -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: osd.h 1.23 2001/08/02 13:48:34 kls Exp $
|
* $Id: osd.h 1.24 2001/08/25 12:56:46 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __OSD_H
|
#ifndef __OSD_H
|
||||||
@ -72,7 +72,7 @@ public:
|
|||||||
|
|
||||||
class cOsdMenu : public cOsdBase, public cList<cOsdItem> {
|
class cOsdMenu : public cOsdBase, public cList<cOsdItem> {
|
||||||
private:
|
private:
|
||||||
const char *title;
|
char *title;
|
||||||
int cols[cInterface::MaxCols];
|
int cols[cInterface::MaxCols];
|
||||||
int first, current, marked;
|
int first, current, marked;
|
||||||
cOsdMenu *subMenu;
|
cOsdMenu *subMenu;
|
||||||
@ -94,7 +94,7 @@ protected:
|
|||||||
eOSState AddSubMenu(cOsdMenu *SubMenu);
|
eOSState AddSubMenu(cOsdMenu *SubMenu);
|
||||||
bool HasSubMenu(void) { return subMenu; }
|
bool HasSubMenu(void) { return subMenu; }
|
||||||
void SetStatus(const char *s);
|
void SetStatus(const char *s);
|
||||||
void SetTitle(const char *Title, bool Copy = true);
|
void SetTitle(const char *Title, bool ShowDate = true);
|
||||||
void SetHelp(const char *Red, const char *Green = NULL, const char *Yellow = NULL, const char *Blue = NULL);
|
void SetHelp(const char *Red, const char *Green = NULL, const char *Yellow = NULL, const char *Blue = NULL);
|
||||||
virtual void Del(int Index);
|
virtual void Del(int Index);
|
||||||
public:
|
public:
|
||||||
|
34
tools.c
34
tools.c
@ -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.c 1.40 2001/08/17 12:45:42 kls Exp $
|
* $Id: tools.c 1.43 2001/08/26 15:45:41 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define _GNU_SOURCE
|
#define _GNU_SOURCE
|
||||||
@ -17,7 +17,9 @@
|
|||||||
#endif
|
#endif
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
|
#include <time.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#include "i18n.h"
|
||||||
|
|
||||||
#define MaxBuffer 1000
|
#define MaxBuffer 1000
|
||||||
|
|
||||||
@ -395,6 +397,20 @@ bool SpinUpDisk(const char *FileName)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const char *DayDateTime(time_t t)
|
||||||
|
{
|
||||||
|
static char buffer[32];
|
||||||
|
if (t == 0)
|
||||||
|
time(&t);
|
||||||
|
tm *tm = localtime(&t);
|
||||||
|
int weekday = tm->tm_wday == 0 ? 6 : tm->tm_wday - 1; // we start with monday==0!
|
||||||
|
const char *day = tr("MonTueWedThuFriSatSun");
|
||||||
|
day += weekday * 3;
|
||||||
|
strncpy(buffer, day, 3);
|
||||||
|
snprintf(buffer + 3, sizeof(buffer) - 3, " %2d.%02d %02d:%02d", tm->tm_mday, tm->tm_mon + 1, tm->tm_hour, tm->tm_min);
|
||||||
|
return buffer;
|
||||||
|
}
|
||||||
|
|
||||||
// --- cFile -----------------------------------------------------------------
|
// --- cFile -----------------------------------------------------------------
|
||||||
|
|
||||||
bool cFile::files[FD_SETSIZE] = { false };
|
bool cFile::files[FD_SETSIZE] = { false };
|
||||||
@ -677,3 +693,19 @@ int cListBase::Count(void) const
|
|||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void cListBase::Sort(void)
|
||||||
|
{
|
||||||
|
bool swapped;
|
||||||
|
do {
|
||||||
|
swapped = false;
|
||||||
|
cListObject *object = objects;
|
||||||
|
while (object) {
|
||||||
|
if (object->Next() && *object->Next() < *object) {
|
||||||
|
Move(object->Next(), object);
|
||||||
|
swapped = true;
|
||||||
|
}
|
||||||
|
object = object->Next();
|
||||||
|
}
|
||||||
|
} while (swapped);
|
||||||
|
}
|
||||||
|
|
||||||
|
5
tools.h
5
tools.h
@ -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.29 2001/08/17 12:44:39 kls Exp $
|
* $Id: tools.h 1.31 2001/08/26 12:52:49 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __TOOLS_H
|
#ifndef __TOOLS_H
|
||||||
@ -55,6 +55,7 @@ bool RemoveFileOrDir(const char *FileName, bool FollowSymlinks = false);
|
|||||||
bool RemoveEmptyDirectories(const char *DirName, bool RemoveThis = false);
|
bool RemoveEmptyDirectories(const char *DirName, bool RemoveThis = false);
|
||||||
char *ReadLink(const char *FileName);
|
char *ReadLink(const char *FileName);
|
||||||
bool SpinUpDisk(const char *FileName);
|
bool SpinUpDisk(const char *FileName);
|
||||||
|
const char *DayDateTime(time_t t = 0);
|
||||||
|
|
||||||
class cFile {
|
class cFile {
|
||||||
private:
|
private:
|
||||||
@ -94,6 +95,7 @@ private:
|
|||||||
public:
|
public:
|
||||||
cListObject(void);
|
cListObject(void);
|
||||||
virtual ~cListObject();
|
virtual ~cListObject();
|
||||||
|
virtual bool operator< (const cListObject &ListObject) { return false; }
|
||||||
void Append(cListObject *Object);
|
void Append(cListObject *Object);
|
||||||
void Unlink(void);
|
void Unlink(void);
|
||||||
int Index(void);
|
int Index(void);
|
||||||
@ -114,6 +116,7 @@ public:
|
|||||||
virtual void Clear(void);
|
virtual void Clear(void);
|
||||||
cListObject *Get(int Index) const;
|
cListObject *Get(int Index) const;
|
||||||
int Count(void) const;
|
int Count(void) const;
|
||||||
|
void Sort(void);
|
||||||
};
|
};
|
||||||
|
|
||||||
template<class T> class cList : public cListBase {
|
template<class T> class cList : public cListBase {
|
||||||
|
4
vdr.c
4
vdr.c
@ -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: vdr.c 1.63 2001/08/11 15:33:30 kls Exp $
|
* $Id: vdr.c 1.64 2001/08/26 15:02:00 kls Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
@ -323,7 +323,7 @@ int main(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
// Timers and Recordings:
|
// Timers and Recordings:
|
||||||
if (!Menu) {
|
if (!Menu) {
|
||||||
cTimer *Timer = cTimer::GetMatch();
|
cTimer *Timer = Timers.GetMatch();
|
||||||
if (Timer) {
|
if (Timer) {
|
||||||
if (!cRecordControls::Start(Timer))
|
if (!cRecordControls::Start(Timer))
|
||||||
Timer->SetPending(true);
|
Timer->SetPending(true);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user