Go to the documentation of this file.
36 #define MAXWAIT4EPGINFO 3 // seconds
37 #define MODETIMEOUT 3 // seconds
38 #define NEWTIMERLIMIT 120 // seconds until the start time of a new timer created from the Schedule menu,
41 #define DEFERTIMER 60 // seconds by which a timer is deferred in case of problems
43 #define MAXRECORDCONTROLS (MAXDEVICES * MAXRECEIVERS)
44 #define MAXINSTANTRECTIME (24 * 60 - 1) // 23:59 hours
45 #define MAXWAITFORCAMMENU 10 // seconds to wait for the CAM menu to open
46 #define CAMMENURETRYTIMEOUT 3 // seconds after which opening the CAM menu is retried
47 #define CAMRESPONSETIMEOUT 5 // seconds to wait for a response from a CAM
48 #define PROGRESSTIMEOUT 100 // milliseconds to wait before updating the replay progress display
49 #define MINFREEDISK 300 // minimum free disk space (in MB) required to start recording
50 #define NODISKSPACEDELTA 300 // seconds between "Not enough disk space to start recording!" messages
51 #define MAXCHNAMWIDTH 16 // maximum number of characters of channels' short names shown in schedules menus
53 #define CHNUMWIDTH (numdigits(cChannels::MaxNumber()) + 1)
54 #define CHNAMWIDTH (min(MAXCHNAMWIDTH, cChannels::MaxShortChannelNameLength() + 1))
60 virtual void Set(
void);
103 virtual void Set(
void);
248 bool Modified =
false;
299 virtual void Set(
void);
351 #define CHANNELNUMBERTIMEOUT 1000 //ms
358 void Set(
bool Force =
false);
367 virtual void Move(
int From,
int To);
396 for (
const cChannel *Channel = Channels->First(); Channel; Channel = Channels->
Next(Channel)) {
400 if (Channel == CurrentChannel)
410 SetHelp(
tr(
"Button$Edit"),
tr(
"Button$New"),
tr(
"Button$Delete"),
tr(
"Button$Mark"));
445 if (!ci->Channel()->GroupSep() && ci->Channel()->Number() ==
number) {
498 bool Deleted =
false;
501 int DeletedChannel = Channel->
Number();
503 if (Timers->UsesChannel(Channel)) {
509 if (CurrentChannel && Channel == CurrentChannel) {
513 CurrentChannel = Channels->
Get(n);
514 CurrentChannelNr = 0;
516 Channels->
Del(Channel);
519 isyslog(
"channel %d deleted", DeletedChannel);
521 if (CurrentChannel && CurrentChannel->
Number() != CurrentChannelNr) {
537 cChannel *CurrentChannel = Channels->GetByNumber(CurrentChannelNr);
540 if (FromChannel && ToChannel) {
541 int FromNumber = FromChannel->
Number();
542 int ToNumber = ToChannel->
Number();
543 if (Channels->MoveNeedsDecrement(FromChannel, ToChannel)) {
544 ToChannel = Channels->
Prev(ToChannel);
547 Channels->Move(FromChannel, ToChannel);
551 isyslog(
"channel %d moved to %d", FromNumber, ToNumber);
552 if (CurrentChannel && CurrentChannel->
Number() != CurrentChannelNr) {
554 Channels->SwitchTo(CurrentChannel->
Number());
572 if (
cChannel *Channel = MenuEditChannel->Channel()) {
599 if (!ci->Channel()->GroupSep() && ci->Channel()->Number() == CurrentChannelNr) {
632 text = Text ? strdup(Text) : NULL;
677 virtual void Set(
void);
712 :
cOsdMenu(Folder ?
tr(
"Edit folder") :
tr(
"New folder"), 12)
741 if (strcmp(Folder->Text(),
name) == 0) {
746 char *p = strpbrk(
name,
"\\{}#~");
821 #define FOLDERDELIMCHARSUBST 0x01
829 for (Folder =
List->First(); Folder; Folder =
List->Next(Folder)) {
830 if (strcmp(Path, Folder->
Text()) == 0)
842 for (
const cRecording *Recording = Recordings->
First(); Recording; Recording = Recordings->
Next(Recording)) {
843 cString Folder = Recording->Folder();
845 if (Dirs.
Find(Folder) < 0)
846 Dirs.
Append(strdup(Folder));
849 for (
int i = 0; i < Dirs.
Size(); i++) {
850 if (
char *s = Dirs[i])
862 RecordingsStateKey.
Remove();
875 Add(FolderItem, CurrentFolder ? strcmp(Folder->Text(), CurrentFolder) == 0 :
false);
887 if (strncmp(Folder->Folder()->Text(), Path, p - Path) == 0) {
951 Set(mef->GetFolder());
1118 cString Folder = mf->GetFolder();
1123 memmove(
data.
file, p, strlen(p) + 1);
1178 Timers->Del(
timer,
false);
1231 virtual void Set(
void);
1259 localtime_r(&Day, &tm_r);
1261 strftime(buffer,
sizeof(buffer),
"%Y%m%d", &tm_r);
1280 *name && **name ?
" " :
"",
1337 for (
const cTimer *Timer = Timers->First(); Timer; Timer = Timers->
Next(Timer)) {
1340 if (CurrentTimer && Timer->
Id() == CurrentTimer->
Id() && (!Timer->Remote() && !CurrentTimer->
Remote() || Timer->Remote() && CurrentTimer->
Remote() && strcmp(Timer->Remote(), CurrentTimer->
Remote()) == 0))
1359 int NewHelpKeys = 0;
1398 StateKey.
Remove(Timer != NULL);
1425 bool TimerRecording = Timer->
Recording();
1458 if (Timer && Timer->
Event())
1484 Add(CurrentItem,
true);
1508 SetHelp(TimerMatch ==
tmFull ?
tr(
"Button$Timer") :
tr(
"Button$Record"), NULL, NULL, CanSwitch ?
tr(
"Button$Switch") : NULL);
1611 char v =
event->Vps() && (
event->Vps() -
event->StartTime()) ?
'V' :
' ';
1612 char r =
event->SeenWithin(30) &&
event->IsRunning() ?
'*' :
' ';
1614 cString eds =
event->GetDateString();
1616 buffer =
cString::sprintf(
"%d\t%.*s\t%.*s\t%s\t%c%c%c\t%s",
channel->
Number(),
Utf8SymChars(csn, 999), csn,
Utf8SymChars(eds, 6), *eds, *
event->
GetTimeString(), t, v, r,
event->
Title());
1665 for (
const cChannel *Channel = Channels->
First(); Channel; Channel = Channels->
Next(Channel)) {
1666 if (!Channel->GroupSep()) {
1668 if (
const cEvent *Event = Now ? Schedule->GetPresentEvent() : Schedule->GetFollowingEvent())
1680 bool result =
false;
1695 int NewHelpKeys = 0;
1698 NewHelpKeys |= 0x02;
1700 NewHelpKeys |= 0x01;
1702 NewHelpKeys |= 0x04;
1704 NewHelpKeys |= 0x08;
1707 NewHelpKeys |= 0x10;
1713 const char *Red[] = { NULL,
tr(
"Button$Record"),
tr(
"Button$Timer") };
1714 SetHelp(Red[NewHelpKeys & 0x03],
now ?
tr(
"Button$Next") :
tr(
"Button$Now"),
tr(
"Button$Schedule"),
canSwitch ?
tr(
"Button$Switch") : NULL);
1749 Timers->SetExplicitModify();
1750 if (item->timerMatch ==
tmFull) {
1751 if (
cTimer *Timer = Timers->GetMatch(item->event))
1757 if (
cTimer *t = Timers->GetTimer(Timer)) {
1765 Timers->SetModified();
1770 else if (Timer->
Remote())
1835 if (HadSubMenu &&
Update()) {
1885 Set(Timers, Channels, NULL,
true);
1901 const cEvent *Event = NULL;
1904 Event = CurrentItem->
event;
1910 bool Refresh =
false;
1936 const cEvent *PresentEvent = Event ? Event : Schedule->GetPresentEvent();
1938 for (
const cEvent *ev = Schedule->Events()->First(); ev; ev = Schedule->Events()->
Next(ev)) {
1939 if (ev->EndTime() >
now || ev == PresentEvent)
1957 for (
const cEvent *ev = Schedule->Events()->First(); ev; ev = Schedule->Events()->
Next(ev)) {
1958 if ((ev->EndTime() >
now || ev == Event) && !strcmp(ev->Title(), Event->
Title()))
1975 for (
const cChannel *ch = Channels->First(); ch; ch = Channels->
Next(ch)) {
1978 for (
const cEvent *ev = Schedule->Events()->First(); ev; ev = Schedule->Events()->
Next(ev)) {
1979 if ((ev->EndTime() >
now || ev == Event) && !strcmp(ev->Title(), Event->
Title()))
1995 for (
const cChannel *ch = Channels->First(); ch; ch = Channels->
Next(ch)) {
1998 for (
const cEvent *ev = Schedule->Events()->First(); ev; ev = Schedule->Events()->
Next(ev)) {
1999 if (ev->EndTime() >
now || ev == Event)
2009 bool result =
false;
2024 int NewHelpKeys = 0;
2027 NewHelpKeys |= 0x02;
2029 NewHelpKeys |= 0x01;
2033 NewHelpKeys |= 0x10;
2039 const char *Red[] = { NULL,
tr(
"Button$Record"),
tr(
"Button$Timer") };
2040 SetHelp(Red[NewHelpKeys & 0x03],
tr(
"Button$Now"),
tr(
"Button$Next"),
canSwitch ?
tr(
"Button$Switch") : NULL);
2050 Set(Timers, Channels, NULL,
true);
2060 Timers->SetExplicitModify();
2061 if (item->timerMatch ==
tmFull) {
2062 if (
cTimer *Timer = Timers->GetMatch(item->event))
2068 if (
cTimer *t = Timers->GetTimer(Timer)) {
2076 Timers->SetModified();
2081 else if (Timer->
Remote())
2100 if (Channel = Channels->GetByChannelID(item->
event->
ChannelID(),
true)) {
2101 if (!Channels->SwitchTo(Channel->
Number()))
2116 Set(Timers, Channels);
2134 ChannelNr = Channel->Number();
2159 Set(Timers, Channels, Channel,
true);
2178 if (
const cChannel *Channel = Channels->GetByChannelID(ei->ChannelID(),
true)) {
2180 Set(Timers, Channels, Channel,
true);
2183 else if (HadSubMenu &&
Update()) {
2204 const char *s = Command->Text();
2205 if (Command->SubItems())
2219 const char *p = strchr(s,
':');
2226 if (l > 1 && t[l - 1] ==
'?') {
2254 const char *cmd = *cmdbuf ? *cmdbuf : *
command;
2255 dsyslog(
"executing command '%s'", cmd);
2257 if (p.
Open(cmd,
"r")) {
2260 while ((c = fgetc(p)) != EOF) {
2262 if (
char *NewBuffer = (
char *)realloc(
result, l + 21))
2265 esyslog(
"ERROR: out of memory");
2276 esyslog(
"ERROR: can't open pipe for command '%s'", cmd);
2417 const char *p = strchr(s,
'\n');
2418 int l = p ? p - s : strlen(s);
2421 item->
SetText(strndup(s, l),
false);
2466 else if (state ==
osBack) {
2493 if (CamSlot->HasUserIO())
2506 #define osUserRecRenamed osUser1
2507 #define osUserRecMoved osUser2
2508 #define osUserRecRemoved osUser3
2509 #define osUserRecEmpty osUser4
2556 for (
const cRecording *Recording = Recordings->First(); Recording; Recording = Recordings->
Next(Recording)) {
2557 if (Recording->IsInPath(
path)) {
2558 int FileSizeMB = Recording->FileSizeMB();
2559 if (FileSizeMB > 0 )
2560 DirSize += FileSizeMB;
2601 if (strcmp(NewPath,
path)) {
2602 int NumRecordings = 0;
2605 NumRecordings = Recordings->GetNumRecordingsInPath(
path);
2612 Recordings->SetExplicitModify();
2613 Error = !Recordings->MoveRecordings(
path, NewPath);
2615 Recordings->SetModified();
2639 else if (Key ==
kOk)
2721 Add(
new cOsdItem(
tr(
"This recording is currently in use - no changes are possible!"),
osUnknown,
false));
2803 if (access(*FileName, F_OK) != 0 ||
Interface->
Confirm(
tr(
"Edited version already exists - overwrite?"))) {
2808 Recordings->AddByName(FileName);
2852 if (
const cRecording *Recording = Control->GetRecording()) {
2854 Control->ClearEditingMarks();
2875 bool Modified =
false;
2878 StateKey.
Remove(Modified);
2891 if (strcmp(NewName, Recording->
Name())) {
2893 StateKey.
Remove(Modified);
2901 if (strcmp(Recording->
Folder(), OldFolder))
2904 StateKey.
Remove(Modified);
2907 StateKey.
Remove(Modified);
2959 SetHelp(
tr(
"Button$Play"),
tr(
"Button$Rewind"), NULL,
tr(
"Button$Edit"));
3058 if (*
Text() ==
'\t')
3092 :
cOsdMenu(Base ? Base :
tr(
"Recordings"), 9, 6, 6)
3095 base = Base ? strdup(Base) : NULL;
3116 if (!ri->IsDirectory())
3125 int NewHelpKeys = 0;
3133 switch (NewHelpKeys) {
3135 case 1:
SetHelp(
tr(
"Button$Open"), NULL, NULL,
tr(
"Button$Edit"));
break;
3148 const char *CurrentRecording = NULL;
3150 CurrentRecording = ri->Recording()->FileName();
3151 if (!CurrentRecording)
3159 for (
const cRecording *Recording = Recordings->
First(); Recording; Recording = Recordings->
Next(Recording)) {
3166 if (p->Name() && strcmp(p->Name(), Item->
Name()) == 0) {
3172 if (*Item->
Text() && !LastDir) {
3180 if (LastItem || LastDir) {
3182 if (strcmp(
path, Recording->Folder()) == 0)
3183 CurrentItem = LastDir ? LastDir : LastItem;
3185 else if (CurrentRecording && strcmp(CurrentRecording, Recording->FileName()) == 0)
3186 CurrentItem = LastDir ? LastDir : LastItem;
3227 const char *t = ri->
Name();
3273 if (
cTimer *Timer = rc->Timer()) {
3276 if (Timer->IsSingleEvent()) {
3278 isyslog(
"deleted timer %s", *Timer->ToDescr());
3290 char *RemoteBuf = NULL;
3292 if (2 == sscanf(TimerId,
"%d@%m[^ \n]", &Id, &RemoteBuf)) {
3297 if (
cTimer *Timer = Timers->GetById(Id, Remote)) {
3298 cTimer OldTimer = *Timer;
3301 if (Timer->IsSingleEvent()) {
3332 FileName = Recording->FileName();
3345 if (!Recording || Recording->
Delete()) {
3371 if (ri->IsDirectory())
3449 ri->SetRecording(riSub->Recording());
3477 virtual void Store(
void);
3512 virtual void Set(
void);
3603 bool ModifiedAppearance =
false;
3612 ModifiedAppearance =
true;
3621 ModifiedAppearance =
true;
3623 ModifiedAppearance =
true;
3628 ModifiedAppearance =
true;
3630 ModifiedAppearance =
true;
3632 ModifiedAppearance =
true;
3635 Recordings->ClearSortNames();
3643 if (ModifiedAppearance)
3737 for (k = 0; k < oldnumLanguages; k++) {
3741 if (k >= oldnumLanguages) {
3798 SetHelp(NULL,
tr(
"Button$Audio"),
tr(
"Button$Subtitles"), NULL);
3834 int oldVideoDisplayFormat =
::Setup.VideoDisplayFormat;
3835 bool oldVideoFormat =
::Setup.VideoFormat;
3837 bool oldDisplaySubtitles =
::Setup.DisplaySubtitles;
3859 for (k = 0; k < oldnumAudioLanguages; k++) {
3863 if (k >= oldnumAudioLanguages) {
3877 for (k = 0; k < oldnumSubtitleLanguages; k++) {
3881 if (k >= oldnumSubtitleLanguages) {
3896 if (::
Setup.VideoDisplayFormat != oldVideoDisplayFormat)
3898 if (::
Setup.VideoFormat != oldVideoFormat)
3900 if (::
Setup.DisplaySubtitles != oldDisplaySubtitles)
3940 int NumSatDevices = 0;
3945 if (NumSatDevices > 1) {
3970 bool DeviceBondingsChanged =
false;
3980 else if (DeviceBondingsChanged)
4006 const char *Activating =
"";
4010 case msReset: CamName =
tr(
"CAM reset");
break;
4011 case msPresent: CamName =
tr(
"CAM present");
break;
4012 case msReady: CamName =
tr(
"CAM ready");
break;
4013 default: CamName =
"-";
break;
4018 Activating =
tr(
" (activating)");
4024 if (DeviceNumbers.
Size() > 0) {
4027 for (
int i = 0; i < DeviceNumbers.
Size(); i++)
4028 AssignedDevice =
cString::sprintf(
"%s %d", *AssignedDevice, DeviceNumbers[i]);
4032 if (strcmp(buffer,
Text()) != 0) {
4061 if (CamSlot->IsMasterSlot())
4072 const char *NewActivationHelp =
"";
4076 NewActivationHelp =
tr(
"Button$Cancel activation");
4078 NewActivationHelp =
tr(
"Button$Activate");
4092 time_t t0 = time(NULL);
4126 if (Device->ProvidesChannel(Channel)) {
4128 if (CamSlot->
Assign(Device,
true)) {
4131 if (CamSlot->
Assign(Device)) {
4132 if (Device->SwitchChannel(Channel,
true)) {
4232 virtual void Store(
void);
4262 Recordings->ResetResume();
4327 bool ModifiedSVDRPSettings =
false;
4333 if (ModifiedSVDRPSettings) {
4337 Timers->SetExplicitModify();
4338 if (Timers->StoreRemoteTimers(NULL, NULL))
4339 Timers->SetModified();
4375 for (
int i = 0; ; i++) {
4417 virtual void Set(
void);
4435 snprintf(buffer,
sizeof(buffer),
"%s - VDR %s",
tr(
"Setup"),
VDRVERSION);
4505 #define STOP_RECORDING trNOOP(" Stop recording ")
4571 for (
int i = 0; ; i++) {
4595 bool result =
false;
4597 bool NewReplaying =
false;
4602 if (Force || NewReplaying !=
replaying) {
4637 const char *s = NULL;
4717 default:
switch (Key) {
4719 case kRed:
if (!HadSubMenu)
4722 case kGreen:
if (!HadSubMenu) {
4727 case kYellow:
if (!HadSubMenu)
4730 case kBlue:
if (!HadSubMenu)
4762 if (
const cChannel *Channel = Channels->GetByNumber(LiveChannel)) {
4764 if (
const cSchedule *Schedule = Schedules->GetSchedule(Channel)) {
4765 const cEvent *Present = Schedule->GetPresentEvent();
4774 Components = Recording->Info()->Components();
4779 int indexSubtitle = 0;
4783 case 2:
if (p->
type == 0x05)
4816 channel = Channels->GetByNumber(Number);
4869 const cEvent *Present = Schedule->GetPresentEvent();
4870 const cEvent *Following = Schedule->GetFollowingEvent();
4896 Channel = Direction > 0 ? Channels->
Next(Channel) : Channels->
Prev(Channel);
4898 Channel = Direction > 0 ? Channels->First() : Channels->Last();
4937 while (ch && (ch = Channels->
Next(ch)) != NULL) {
4939 if (n <= ch->Number() && ch->
Number() < n + m) {
4971 group = Channel->Index();
4974 int SaveGroup =
group;
5036 channel = Channels->Get(Channels->GetNextNormal(
group));
5074 Channels->SwitchTo(NewChannel->
Number());
5079 bool PositionerMoving = Positioner && Positioner->
IsMoving();
5081 if (!PositionerMoving) {
5098 #define VOLUMETIMEOUT 1000 //ms
5099 #define MUTETIMEOUT 5000 //ms
5165 #define TRACKTIMEOUT 5000 //ms
5180 if (TrackId && TrackId->
id) {
5183 if (i == CurrentAudioTrack)
5232 int oldTrack =
track;
5249 static int ac[] = { 1, 0, 2 };
5276 if (
track != oldTrack) {
5301 if (TrackId && TrackId->
id) {
5304 if (i == CurrentSubtitleTrack)
5350 int oldTrack =
track;
5377 if (
track != oldTrack) {
5411 ChannelsStateKey.
Remove();
5436 SchedulesStateKey.
Remove();
5448 if (!
Timer && !LastReplayed)
5450 SchedulesStateKey.
Remove();
5465 SchedulesStateKey.
Remove();
5474 #define INSTANT_REC_EPG_LOOKAHEAD 300 // seconds to look into the EPG data for an instant recording
5483 if (
const cSchedule *Schedule = Schedules->GetSchedule(Channel)) {
5484 event = Schedule->GetEventAround(Time);
5487 dsyslog(
"got EPG info after %d seconds", seconds);
5493 dsyslog(
"waiting for EPG info...");
5496 dsyslog(
"no EPG info available");
5506 isyslog(
"timer %s %s with %d error%s", *
timer->
ToDescr(), Finished ?
"finished" :
"stopped", Errors, Errors != 1 ?
"s" :
"");
5517 if (ExecuteUserCommand)
5539 static time_t LastNoDiskSpaceMessage = 0;
5548 isyslog(
"not enough disk space to start recording%s%s", Timer ?
" timer " :
"", Timer ? *Timer->
ToDescr() :
"");
5550 LastNoDiskSpaceMessage = time(NULL);
5554 LastNoDiskSpaceMessage = 0;
5564 dsyslog(
"switching device %d to channel %d %s (%s)", device->
DeviceNumber() + 1, Channel->Number(), *Channel->GetChannelID().ToString(), Channel->Name());
5572 if (!Timer || Timer->
Matches()) {
5581 else if (!Timer || !Timer->
Pending()) {
5582 isyslog(
"no free DVB device to record channel %d (%s)!", ch, Channel->Name());
5587 esyslog(
"ERROR: channel %d not defined!", ch);
5596 return Start(Timers, NULL, Pause);
5606 if (
id && strcmp(
id, InstantId) == 0) {
5653 if (LastInstantId && LastInstantId ==
RecordControls[i]->InstantId())
5654 LastInstantId = NULL;
5682 bool Result =
false;
5701 isyslog(
"stopping recording due to modification of channel %d (%s)", Channel->
Number(), Channel->
Name());
5730 int NewState =
state;
5731 bool Result = State != NewState;
5819 Timers->SetExplicitModify();
5824 Timers->SetModified();
5832 Recordings->SetExplicitModify();
5834 if (Recording->Delete()) {
5837 Recordings->SetModified();
5877 if (!Recordings->GetByName(
fileName))
5930 bool NormalPlay = (
Play && Speed == -1);
5973 Index = Current - Index;
5993 strcpy(buf,
tr(
"Jump: "));
5994 int len = strlen(buf);
6003 sprintf(buf + len,
"%c%c:%c%c", ch10, ch1, cm10, cm1);
6009 #define STAY_SECONDS_OFF_END 10
6082 if (
GetIndex(Current, Total,
true)) {
6093 Goto(Current,
true);
6114 Goto(m->Position());
6118 Goto(m->Position(),
true);
6162 else if (!MarkRequired)
6253 bool DoShowMode =
true;
bool SwitchTo(int Number) const
const int * Caids(void) const
void DisplayChannel(void)
bool Devices(cVector< int > &DeviceNumbers)
Adds the numbers of any devices that currently use this CAM to the given DeviceNumbers.
cString BaseName(void) const
Returns the base name of this recording (without the video directory and folder).
virtual ~cDisplayVolume()
static void Process(eKeys Key)
void TimeSearchProcess(eKeys Key)
char language[MAXLANGCODE2]
void SetSyncStateKey(cStateKey &StateKey)
When making changes to this list (while holding a write lock) that shall not affect some other code t...
void TimeSearchDisplay(void)
int start
the start and stop time of this timer as given by the user,
int SubtitleLanguages[I18N_MAX_LANGUAGES+1]
static void MsgOsdChannel(const char *Text)
cSkinDisplayTracks * displayTracks
int SkipFrames(int Frames)
static void ChangeState(void)
virtual ~cRecordControl()
static void SetupChanged(void)
const char * Provider(void) const
static cRecordControl * GetRecordControl(const char *FileName)
double FramesPerSecond(void) const
virtual void SetChannel(const cChannel *Channel, int Number)=0
Sets the current channel to Channel.
void ReNumber(void)
Recalculate 'number' based on channel type.
static cString sprintf(const char *fmt,...) __attribute__((format(printf
cString ChannelString(const cChannel *Channel, int Number)
static int CurrentChannel(void)
Returns the number of the current channel on the primary device.
void SetPending(bool Pending)
virtual void SetPositioner(const cPositioner *Positioner)
Sets the Positioner used to move the satellite dish.
void SetKeepTracks(bool KeepTracks)
Controls whether the current audio and subtitle track settings shall be kept as they currently are,...
cDoneRecordings DoneRecordingsPattern
const cEvent * lastPresent
virtual cMenuSetupPage * SetupMenu(void)
void AssertFreeDiskSpace(int Priority, bool Force)
The special Priority value -1 means that we shall get rid of any deleted recordings faster than norma...
static cDisplayTracks * currentDisplayTracks
static cString ToText(const cChannel *Channel)
int GetThemeIndex(const char *Description)
const cChannel * Channel(void) const
int weekdays
bitmask, lowest bits: SSFTWTM (the 'M' is the LSB)
#define RUC_AFTERRECORDING
virtual ~cDisplaySubtitleTracks()
time_t day
midnight of the day this timer shall hit, or of the first day it shall hit in case of a repeating tim...
void StopSVDRPHandler(void)
void SkipSeconds(int Seconds)
char * descriptions[ttMaxTrackTypes+1]
bool IsPesRecording(void) const
void DelAll(void)
Deletes/terminates all operations.
void I18nSetLanguage(int Language)
Sets the current language index to Language.
const cMark * GetNext(int Position) const
const char * Name(void) const
virtual ~cDisplayTracks()
void EnsureSubtitleTrack(void)
Makes sure one of the preferred language subtitle tracks is selected.
cSkinDisplayChannel * displayChannel
const cTimer * GetMatch(time_t t) const
const cOsdItem * Get(int Index) const
Returns the list element at the given Index, or NULL if no such element exists.
static cPlugin * CallFirstService(const char *Id, void *Data=NULL)
static bool HasPlugins(void)
static void ClearLastReplayed(const char *FileName)
eKeys Message(eMessageType Type, const char *s, int Seconds=0)
Displays the given message, either through a currently visible display object that is capable of doin...
static cDisplayChannel * currentDisplayChannel
static const char * NowReplaying(void)
virtual void SetMode(bool Play, bool Forward, int Speed)=0
Sets the current replay mode, which can be used to display some indicator, showing the user whether w...
virtual cCiMenu * GetMenu(void)
Gets a pending menu, or NULL if there is no menu.
static cPlugin * GetPlugin(int Index)
cRecordingsHandler RecordingsHandler
const char * I18nLocale(int Language)
Returns the locale code of the given Language (which is an index as returned by I18nCurrentLanguage()...
static const cSchedules * GetSchedulesRead(cStateKey &StateKey, int TimeoutMs=0)
Gets the list of schedules for read access.
#define LOCK_CHANNELS_READ
virtual bool HasMMI(void)
Returns 'true' if the CAM in this slot has an active MMI.
void TriggerRespawn(void)
bool ConfirmRestart(bool Ask)
Check for background activity that blocks restart.
static cString ToString(int Code)
static bool Process(cTimers *Timers, time_t t)
static void MsgSetAudioTrack(int Index, const char *const *Tracks)
const cComponents * Components(void) const
char OSDLanguage[I18N_MAX_LOCALE_LEN]
virtual bool Filter(const cRecording *Recording) const =0
Returns true if the given Recording shall be displayed in the Recordings menu.
static const cTimers * GetTimersRead(cStateKey &StateKey, int TimeoutMs=0)
Gets the list of timers for read access.
bool Contains(const cListObject *Object) const
If a pointer to an object contained in this list has been obtained while holding a lock,...
int GetNextNormal(int Idx) const
Get next normal channel (not group)
static const cRecordings * GetRecordingsRead(cStateKey &StateKey, int TimeoutMs=0)
Gets the list of recordings for read access.
static const char * LastReplayed(void)
eTrackType types[ttMaxTrackTypes]
const cRecording * GetByName(const char *FileName) const
const cChannel * NextAvailableChannel(const cChannel *Channel, int Direction)
bool Parse(const char *s)
virtual void SetTrack(int Index, const char *const *Tracks)=0
< This class implements the track display.
#define LOCK_SCHEDULES_READ
virtual void SetMarks(const cMarks *Marks)
Sets the editing marks to Marks, which shall be used to display the progress bar through a cProgressB...
virtual const cPositioner * Positioner(void) const
Returns a pointer to the positioner (if any) this device has used to move the satellite dish to the r...
static cString EditedFileName(const char *FileName)
Returns the full path name of the edited version of the recording with the given FileName.
bool HandleRemoteTimerModifications(cTimer *NewTimer, cTimer *OldTimer, cString *Msg)
Performs any operations necessary to synchronize changes to a timer between peer VDR machines.
char SVDRPHostName[HOST_NAME_MAX]
void EnsureAudioTrack(bool Force=false)
Makes sure an audio track is selected that is actually available.
void SetModifiedByUser(void)
char language[MAXLANGCODE2]
cSkinDisplayVolume * displayVolume
const cChannel * GetByNumber(int Number, int SkipGap=0) const
eTrackType GetCurrentAudioTrack(void) const
static const char * Name(void)
void SetFlags(uint Flags)
virtual const char * Version(void)=0
virtual bool EnterMenu(void)
Requests the CAM in this slot to start its menu.
virtual eOSState ProcessKey(eKeys Key)
const char * Description(void) const
virtual cSkinDisplayVolume * DisplayVolume(void)=0
Creates and returns a new object for displaying the current volume.
virtual void Flush(void)
Actually draws the OSD display to the output device.
static cOsdObject * pluginOsdObject
#define TIMERMACRO_BEFORE
void Initialize(int *InitialValue, double FramesPerSecond)
cRecordingInfo * Info(void) const
bool Add(int Usage, const char *FileNameSrc, const char *FileNameDst=NULL)
Adds the given FileNameSrc to the recordings handler for (later) processing.
const char * Name(int Index)
virtual cCiEnquiry * GetEnquiry(void)
Gets a pending enquiry, or NULL if there is no enquiry.
bool SetCurrentSubtitleTrack(eTrackType Type, bool Manual=false)
Sets the current subtitle track to the given Type.
void Add(cListObject *Object, cListObject *After=NULL)
virtual eOSState ProcessKey(eKeys Key)
virtual const char * Description(void)=0
const char * Title(void) const
bool Put(uint64_t Code, bool Repeat=false, bool Release=false)
virtual void GetData(cChannel *Channel)=0
Copies all source specific parameters to the given Channel.
virtual void CancelActivation(void)
Cancels a previously started activation (if any).
static cDisplayVolume * currentDisplayVolume
cMenuMain(eOSState State=osUnknown, bool OpenSubMenus=false)
static void UpdateOsdSize(bool Force=false)
Inquires the actual size of the video display and adjusts the OSD and font sizes accordingly.
const char * Title(char Delimiter=' ', bool NewIndicator=false, int Level=-1) const
bool SetCurrentAudioTrack(eTrackType Type)
Sets the current audio track to the given Type.
const char * FileName(void) const
Returns the full path name to the recording directory, including the video directory and the actual '...
char FontFix[MAXFONTNAME]
eTrackType GetCurrentSubtitleTrack(void) const
static cChannels * GetChannelsWrite(cStateKey &StateKey, int TimeoutMs=0)
Gets the list of channels for write access.
virtual cOsdItem * GetOsdItem(void)=0
Returns all the OSD items necessary for editing the source specific parameters of the channel that wa...
char NameInstantRecord[NAME_MAX+1]
cString ToText(bool UseChannelID=false) const
const char * Description(void)
Returns a user visible, single line description of this theme.
int SecondsToFrames(int Seconds, double FramesPerSecond)
bool GetSVDRPServerNames(cStringList *ServerNames)
Gets a list of all available VDRs this VDR is connected to via SVDRP, and stores it in the given Serv...
#define LOCK_RECORDINGS_READ
cString Folder(void) const
Returns the name of the folder this recording is stored in (without the video directory).
static void MsgReplaying(const cControl *Control, const char *Name, const char *FileName, bool On)
void SetRecording(bool Recording)
int NumComponents(void) const
static int CurrentVolume(void)
static cDevice * PrimaryDevice(void)
Returns the primary device.
virtual bool Reset(void)
Resets the CAM in this slot.
void Stop(bool ExecuteUserCommand=true)
int QueueMessage(eMessageType Type, const char *s, int Seconds=0, int Timeout=0)
Like Message(), but this function may be called from a background thread.
static int IsOpen(void)
Returns true if there is currently a level 0 OSD open.
const cMark * GetPrev(int Position) const
void SetSubItems(bool On)
time_t EndTime(void) const
cShutdownHandler ShutdownHandler
static cDisplayVolume * Create(void)
void Add(int Position)
If this cMarks object is used by multiple threads, the caller must Lock() it before calling Add() and...
virtual void SetVideoDisplayFormat(eVideoDisplayFormat VideoDisplayFormat)
Sets the video display format to the given one (only useful if this device has an MPEG decoder).
const cSchedule * GetSchedule(tChannelID ChannelID) const
cAdaptiveSkipper adaptiveSkipper
void StopReplay(void)
Stops the current replay session (if any).
const cPositioner * positioner
cListObject * Prev(void) const
bool Delete(void)
Changes the file name so that it will no longer be visible in the "Recordings" menu Returns false in ...
static cRecordings * GetRecordingsWrite(cStateKey &StateKey, int TimeoutMs=0)
Gets the list of recordings for write access.
void Set(int Ms=0)
Sets the timer.
const char *const * Descriptions(void)
cRecordControl(cDevice *Device, cTimers *Timers, cTimer *Timer=NULL, bool Pause=false)
#define MAXVIDEOFILESIZETS
static cDevice * GetDevice(int Index)
Gets the device with the given Index.
virtual void ClearEditingMarks(void)
Clears any editing marks this player might be showing.
void Add(cTimer *Timer, cTimer *After=NULL)
void SetPosition(int Position)
const char * InstantId(void)
virtual void SetVolume(int Current, int Total, bool Mute)=0
< This class implements the volume/mute display.
const char * Name(void) const
Returns the full name of the recording (without the video directory).
bool FromString(const char *s)
virtual bool Assign(cDevice *Device, bool Query=false)
Assigns this CAM slot to the given Device, if this is possible.
int GetPrevNormal(int Idx) const
Get previous normal channel (not group)
void Del(const char *FileName)
Deletes the given FileName from the list of operations.
char * descriptions[ttMaxTrackTypes+1]
void Reply(const char *s)
virtual ~cDisplayChannel()
const cMark * Get(int Position) const
bool IsSingleEvent(void) const
static void Shutdown(void)
cString IndexToHMSF(int Index, bool WithFrame, double FramesPerSecond)
int I18nCurrentLanguage(void)
Returns the index of the current language.
static void MsgSetAudioChannel(int AudioChannel)
virtual bool IsMoving(void) const
Returns true if the dish is currently moving as a result of a call to GotoPosition() or GotoAngle().
void I18nSetLocale(const char *Locale)
Sets the current locale to Locale.
cOsdItem * cancelEditingItem
void Del(cListObject *Object, bool DeleteObject=true)
char FontSml[MAXFONTNAME]
const int * Dpids(void) const
static void InvokeCommand(const char *State, const char *RecordingFileName, const char *SourceFileName=NULL)
virtual void SetVideoFormat(bool VideoFormat16_9)
Sets the output video format to either 16:9 or 4:3 (only useful if this device has an MPEG decoder).
void SetAudioChannel(int AudioChannel)
Sets the audio channel to stereo (0), mono left (1) or mono right (2).
static int MaxNumber(void)
virtual eModuleStatus ModuleStatus(void)
Returns the status of the CAM in this slot.
bool SetEventFromSchedule(const cSchedules *Schedules)
static cString PrintDay(time_t Day, int WeekDays, bool SingleByteChars)
cSkinDisplayReplay * displayReplay
static const char * GetInstantId(const char *LastInstantId)
tChannelID ChannelID(void) const
const T * Last(void) const
Returns the last element in this list, or NULL if the list is empty.
int GetUsage(const char *FileName)
Returns the usage type for the given FileName.
void SetSelectable(bool Selectable)
static void ResetVersions(void)
virtual cOsdObject * GetInfo(void)
Returns an OSD object that displays information about the currently played programme.
static void Launch(cControl *Control)
int AlwaysSortFoldersFirst
void SetText(const char *Text)
cList< cNestedItem > * commands
int EPGLanguages[I18N_MAX_LANGUAGES+1]
static void MsgRecording(const cDevice *Device, const char *Name, const char *FileName, bool On)
virtual void SetEvents(const cEvent *Present, const cEvent *Following)=0
Sets the Present and Following EPG events.
bool GetIndex(int &Current, int &Total, bool SnapToIFrame=false)
void MarkMove(int Frames, bool MarkRequired)
double FramesPerSecond(void) const
char OSDSkin[MaxSkinName]
bool Lock(cStateKey &StateKey, bool Write=false, int TimeoutMs=0) const
Tries to get a lock on this list and returns true if successful.
void Sort(__compar_fn_t Compare)
virtual bool IsActivating(void)
Returns true if this CAM slot is currently activating a smart card.
time_t StartTime(void) const
the start time as given by the user
A steerable satellite dish generally points to the south on the northern hemisphere,...
static void MsgOsdClear(void)
virtual void SetRecording(const cRecording *Recording)
Sets the recording that is currently being played.
virtual void SetData(cChannel *Channel)=0
Sets all source specific parameters to those of the given Channel.
int ShowChannelNamesWithSource
static int VideoDiskSpace(int *FreeMB=NULL, int *UsedMB=NULL)
void SetMarks(const cMarks *Marks)
const char * DefaultFontOsd
virtual const char * GetCamName(void)
Returns the name of the CAM in this slot, or NULL if there is no ready CAM in this slot.
int SubtitleBgTransparency
virtual void SetJump(const char *Jump)=0
Sets the prompt that allows the user to enter a jump point.
void Remove(bool IncState=true)
Removes this key from the lock it was previously used with.
const cChannel * GetByChannelID(tChannelID ChannelID, bool TryWithoutRid=false, bool TryWithoutPolarization=false) const
static void TriggerLastActivity(void)
Simulates user activity, for instance to keep the current menu open even if no remote control key has...
static void MsgSetSubtitleTrack(int Index, const char *const *Tracks)
bool SetAvailableTrack(eTrackType Type, int Index, uint16_t Id, const char *Language=NULL, const char *Description=NULL)
Sets the track of the given Type and Index to the given values.
void Exit(int ExitCode)
Set VDR exit code and initiate end of VDR main loop.
bool Confirm(const char *s, int Seconds=10, bool WaitForTimeout=false)
const char * Text(void) const
void Del(cChannel *Channel)
Delete the given Channel from the list.
virtual eOSState ProcessKey(eKeys Key)
bool Recording(void) const
int SVDRPCode(const char *s)
Returns the value of the three digit reply code of the given SVDRP response string.
const char * Remote(void) const
bool GroupSep(void) const
static void Stop(const char *InstantId)
cString & CompactChars(char c)
Compact any sequence of characters 'c' to a single character, and strip all of them from the beginnin...
cSkinDisplayTracks * displayTracks
void SetExplicitModify(void)
If you have obtained a write lock on this list, and you don't want it to be automatically marked as m...
virtual bool HasUserIO(void)
Returns true if there is a pending user interaction, which shall be retrieved via GetMenu() or GetEnq...
time_t StartTime(void) const
const char * File(void) const
#define IS_AUDIO_TRACK(t)
const cEvent * Event(void) const
int I18nNumLanguagesWithLocale(void)
Returns the number of entries in the list returned by I18nLanguages() that actually have a locale.
cString PrintFirstDay(void) const
static cReplayControl * currentReplayControl
bool AttachReceiver(cReceiver *Receiver)
Attaches the given receiver to this device.
static void MsgOsdTextItem(const char *Text, bool Scroll=false)
const T * First(void) const
Returns the first element in this list, or NULL if the list is empty.
virtual void SetAudioChannel(int AudioChannel)=0
Sets the audio channel indicator.
bool HasFlags(uint Flags) const
eOSState ProcessKey(eKeys Key)
void RequestEmergencyExit(void)
Requests an emergency exit of the VDR main loop.
eOSState ProcessKey(eKeys Key)
bool GetReplayMode(bool &Play, bool &Forward, int &Speed)
int AdaptiveSkipAlternate
cCamSlot * MtdSpawn(void)
If this CAM slot can do MTD ("Multi Transponder Decryption"), a call to this function returns a cMtdC...
bool SetEvent(const cEvent *Event)
bool Load(const char *SkinName)
static void ForceCheck(void)
To avoid unnecessary load, the video disk usage is only actually checked every DISKSPACECHEK seconds.
cOsdItem * stopRecordingItem
cSourceParam * Get(char Source)
static void MsgOsdProgramme(time_t PresentTime, const char *PresentTitle, const char *PresentSubtitle, time_t FollowingTime, const char *FollowingTitle, const char *FollowingSubtitle)
static bool OsdSizeChanged(int &State)
Checks if the OSD size has changed and a currently displayed OSD needs to be redrawn.
bool ChangeName(const char *NewName)
Changes the name of this recording to the given value.
char SVDRPDefaultHost[HOST_NAME_MAX]
cDisplaySubtitleTracks(void)
int Find(const char *s) const
bool IsPatternTimer(void) const
const tTrackId * GetTrack(eTrackType Type)
Returns a pointer to the given track id, or NULL if Type is not less than ttMaxTrackTypes.
void StartSVDRPHandler(void)
virtual cSkinDisplayReplay * DisplayReplay(bool ModeOnly)=0
Creates and returns a new object for displaying replay progress.
virtual eOSState ProcessKey(eKeys Key)
virtual void Move(int From, int To)
void ShowTimed(int Seconds=0)
bool HasUniqueChannelID(const cChannel *NewChannel, const cChannel *OldChannel=NULL) const
const char * Description(void) const
#define MAXEPGBUGFIXLEVEL
int stop
in the form hhmm, with hh (00..23) and mm (00..59) added as hh*100+mm
time_t FirstDay(void) const
void Del(cTimer *Timer, bool DeleteObject=true)
cString GetTimeString(void) const
cCamSlot * MasterSlot(void)
Returns this CAM slot's master slot, or a pointer to itself if it is a master slot.
cMenuCommands(const char *Title, cList< cNestedItem > *Commands, const char *Parameters=NULL)
void MarkJump(bool Forward)
bool HasMarks(void) const
Returns true if this recording has any editing marks.
char * ExchangeChars(char *s, bool ToFileSystem)
void SetNeedsFastResponse(bool NeedsFastResponse)
cString ToDescr(void) const
const T * Prev(const T *Object) const
const char * DefaultFontSml
static void SetRecording(const char *FileName)
char pattern[NAME_MAX *2+1]
static bool GetAvailableFontNames(cStringList *FontNames, bool Monospaced=false)
Queries the font configuration for a list of available font names, which is returned in FontNames.
eOSState ProcessKey(eKeys Key)
cString GetRecordingTimerId(const char *Directory)
virtual void SetCurrent(const char *Current)=0
Sets the current position within the recording, as a user readable string if the form "h:mm:ss....
bool Open(const char *Command, const char *Mode)
virtual const cRecording * GetRecording(void)
Returns the cRecording that is currently being replayed, or NULL if this player is not playing a cRec...
void Append(const char *Title)
static int NumDevices(void)
Returns the total number of devices.
int GetAudioChannel(void)
Gets the current audio channel, which is stereo (0), mono left (1) or mono right (2).
cList< cNestedItem > * SubItems(void)
static bool BondDevices(const char *Bondings)
Bonds the devices as defined in the given Bondings string.
virtual void StartActivation(void)
Puts the CAM in this slot into a mode where an inserted smart card can be activated.
void Goto(int Index, bool Still=false)
virtual int Compare(const cListObject &ListObject) const
Must return 0 if this object is equal to ListObject, a positive value if it is "greater",...
void GetRecordingsSortMode(const char *Directory)
static cDisplayTracks * Create(void)
static bool DeleteMarksFile(const cRecording *Recording)
bool Load(const char *RecordingFileName, double FramesPerSecond=DEFAULTFRAMESPERSECOND, bool IsPesRecording=false)
cListObject * Next(void) const
int GetNumSequences(void) const
Returns the actual number of sequences to be cut from the recording.
cOsdItem * stopReplayItem
#define RUC_BEFORERECORDING
bool ExecSVDRPCommand(const char *ServerName, const char *Command, cStringList *Response)
Sends the given SVDRP Command string to the remote VDR identified by ServerName and collects all of t...
static void SleepMs(int TimeoutMs)
Creates a cCondWait object and uses it to sleep for TimeoutMs milliseconds, immediately giving up the...
bool Load(const char *FileName, bool OnlyDescriptions=false)
Loads the theme data from the given file.
static bool StateChanged(int &State)
char OSDTheme[MaxThemeName]
virtual void Insert(T Data, int Before=0)
static cDevice * ActualDevice(void)
Returns the actual receiving device in case of Transfer Mode, or the primary device otherwise.
void DelByName(const char *FileName)
virtual bool ProvidesSource(int Source) const
Returns true if this device can provide the given source.
static void Process(eKeys Key)
const char * Text(void) const
static void TouchUpdate(void)
Touches the '.update' file in the video directory, so that other instances of VDR that access the sam...
const char * FileName(int Index)
virtual cSkinDisplayTracks * DisplayTracks(const char *Title, int NumTracks, const char *const *Tracks)=0
Creates and returns a new object for displaying the available tracks.
bool TimedOut(void) const
void Reset(void)
Resets the state of this key, so that the next call to a lock's Lock() function with this key will re...
bool SwitchChannel(const cChannel *Channel, bool LiveView)
Switches the device to the given Channel, initiating transfer mode if necessary.
cSourceParams SourceParams
bool Active(void)
Checks whether the thread is still alive.
const char * Description(void) const
static cTimers * GetTimersWrite(cStateKey &StateKey, int TimeoutMs=0)
Gets the list of timers for write access.
void IncRecordingsSortMode(const char *Directory)
virtual bool CanActivate(void)
Returns true if there is a CAM in this slot that can be put into activation mode.
virtual ~cReplayControl()
int IsInUse(void) const
Checks whether this recording is currently in use and therefore shall not be tampered with.
bool Update(bool Force=false)
static const cChannels * GetChannelsRead(cStateKey &StateKey, int TimeoutMs=0)
Gets the list of channels for read access.
void SetModified(void)
Unconditionally marks this list as modified.
cReplayControl(bool PauseLive=false)
const char * ShortName(bool OrName=false) const
int DeviceNumber(void) const
Returns the number of this device (0 ... numDevices - 1).
static void MsgMarksModified(const cMarks *Marks)
eTrackType types[ttMaxTrackTypes]
void SetText(const char *Text, bool Copy=true)
#define TIMERMACRO_EPISODE
bool ShowProgress(bool Initial)
virtual const char * MainMenuEntry(void)
bool Selectable(void) const
tComponent * Component(int Index) const
bool IsAttached(void)
Returns true if this receiver is (still) attached to a device.
void SetRecordingTimerId(const char *Directory, const char *TimerId)
cSkin * Current(void)
Returns a pointer to the current skin.
const cEvent * lastFollowing
const T * Next(const T *Object) const
< Returns the element immediately before Object in this list, or NULL if Object is the first element ...
bool IsRunning(bool OrAboutToStart=false) const
bool GetFrameNumber(int &Current, int &Total)
virtual void Append(T Data)
cDevice * Device(void)
Returns the device this CAM slot is currently assigned to.
void Sort(bool IgnoreCase=false)
static void Process(eKeys Key)
bool ChangePriorityLifetime(int NewPriority, int NewLifetime)
Changes the priority and lifetime of this recording to the given values.
static cDisplaySubtitleTracks * Create(void)
int SlotNumber(void)
Returns the number of this CAM slot within the whole system.
static bool PauseLiveVideo(void)
virtual void SetProgress(int Current, int Total)=0
This function will be called whenever the position in or the total length of the recording has change...
virtual void SetTotal(const char *Total)=0
Sets the total length of the recording, as a user readable string if the form "h:mm:ss".
void ClrAvailableTracks(bool DescriptionsOnly=false, bool IdsOnly=false)
Clears the list of currently available tracks.
static cRecordControl * RecordControls[]
const cStringList * I18nLanguages(void)
Returns the list of available languages.
static bool Start(cTimers *Timers, cTimer *Timer, bool Pause=false)
virtual cOsdObject * MainMenuAction(void)
#define LOCK_CHANNELS_WRITE
const char * DefaultFontFix
static cDisplaySubtitleTracks * currentDisplayTracks
cStateKey StateKeySVDRPRemoteTimersPoll
Controls whether a change to the local list of timers needs to result in sending a POLL to the remote...
cDisplayChannel(int Number, bool Switched)
time_t StopTime(void) const
the stop time as given by the user
static void SetCurrentChannel(int ChannelNumber)
Sets the number of the current channel on the primary device, without actually switching to it.
char FontOsd[MAXFONTNAME]
void SetRemote(const char *Remote)
int AudioLanguages[I18N_MAX_LANGUAGES+1]
const char * Pattern(void) const
static int GetMDay(time_t t)
int Priority(void)
Returns the priority of the device this slot is currently assigned to, or IDLEPRIORITY if it is not a...
static const cCursesFont Font
void SetDeferred(int Seconds)
static cControl * Control(bool Hidden=false)
Old version of this function, for backwards compatibility with plugins.
bool Matches(time_t t=0, bool Directly=false, int Margin=0) const
static cOsdObject * PluginOsdObject(void)
uint64_t Elapsed(void) const
const char * ShortText(void) const
#define LOCK_RECORDINGS_WRITE
static void Shutdown(void)
int SubtitleFgTransparency
static void ChannelDataModified(const cChannel *Channel)
virtual eOSState ProcessKey(eKeys Key)
eRecordingsSortMode RecordingsSortMode
bool WriteInfo(const char *OtherFileName=NULL)
Writes in info file of this recording.
virtual cSkinDisplayChannel * DisplayChannel(bool WithInfo)=0
Creates and returns a new object for displaying the current channel.
const int * Apids(void) const
cNestedItemList RecordingCommands
#define LOCK_TIMERS_WRITE
bool SetCurrent(const char *Name=NULL)
Sets the current skin to the one indicated by name.
#define IS_DOLBY_TRACK(t)