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);
393 CurrentChannel = Channels->GetByNumber(cDevice::CurrentChannel());
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) {
463 return cDevice::PrimaryDevice()->SwitchChannel(ch,
true) ?
osEnd :
osContinue;
498 bool Deleted =
false;
499 int CurrentChannelNr = cDevice::CurrentChannel();
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);
520 isyslog(
"channel %d deleted", DeletedChannel);
522 if (CurrentChannel && CurrentChannel->
Number() != CurrentChannelNr) {
523 if (!cDevice::PrimaryDevice()->Replaying() || cDevice::PrimaryDevice()->Transferring())
537 int CurrentChannelNr = cDevice::CurrentChannel();
538 cChannel *CurrentChannel = Channels->GetByNumber(CurrentChannelNr);
541 if (FromChannel && ToChannel) {
542 int FromNumber = FromChannel->
Number();
543 int ToNumber = ToChannel->
Number();
544 Channels->Move(FromChannel, ToChannel);
547 Channels->SetModifiedByUser();
548 isyslog(
"channel %d moved to %d", FromNumber, ToNumber);
549 if (CurrentChannel && CurrentChannel->
Number() != CurrentChannelNr) {
550 if (!cDevice::PrimaryDevice()->Replaying() || cDevice::PrimaryDevice()->Transferring())
551 Channels->SwitchTo(CurrentChannel->
Number());
569 if (
cChannel *Channel = MenuEditChannel->Channel()) {
594 int CurrentChannelNr = cDevice::CurrentChannel();
596 if (!ci->Channel()->GroupSep() && ci->Channel()->Number() == CurrentChannelNr) {
629 text = Text ? strdup(Text) : NULL;
674 virtual void Set(
void);
709 :
cOsdMenu(Folder ?
tr(
"Edit folder") :
tr(
"New folder"), 12)
738 if (strcmp(Folder->Text(),
name) == 0) {
743 char *p = strpbrk(
name,
"\\{}#~");
818 #define FOLDERDELIMCHARSUBST 0x01
826 for (Folder =
List->First(); Folder; Folder =
List->Next(Folder)) {
827 if (strcmp(Path, Folder->
Text()) == 0)
839 for (
const cRecording *Recording = Recordings->First(); Recording; Recording = Recordings->
Next(Recording)) {
840 cString Folder = Recording->Folder();
842 if (Dirs.
Find(Folder) < 0)
843 Dirs.
Append(strdup(Folder));
846 for (
int i = 0; i < Dirs.
Size(); i++) {
847 if (
char *s = Dirs[i])
857 if (
const cRecordings *Recordings = cRecordings::GetRecordingsRead(RecordingsStateKey)) {
859 RecordingsStateKey.
Remove();
872 Add(FolderItem, CurrentFolder ? strcmp(Folder->Text(), CurrentFolder) == 0 :
false);
884 if (strncmp(Folder->Folder()->Text(), Path, p - Path) == 0) {
948 Set(mef->GetFolder());
1066 cString Folder = mf->GetFolder();
1075 memmove(
data.
file, p, strlen(p) + 1);
1179 virtual void Set(
void);
1207 localtime_r(&Day, &tm_r);
1209 strftime(buffer,
sizeof(buffer),
"%Y%m%d", &tm_r);
1221 *name && **name ?
" " :
"",
1276 for (
const cTimer *Timer = Timers->First(); Timer; Timer = Timers->
Next(Timer)) {
1279 if (CurrentTimer && Timer->
Id() == CurrentTimer->
Id() && (!Timer->Remote() && !CurrentTimer->
Remote() || Timer->Remote() && CurrentTimer->
Remote() && strcmp(Timer->Remote(), CurrentTimer->
Remote()) == 0))
1283 SetCurrent(CurrentItem ? CurrentItem : First());
1298 int NewHelpKeys = 0;
1335 StateKey.
Remove(Timer != NULL);
1362 bool TimerRecording = Timer->
Recording();
1395 if (Timer && Timer->
Event())
1421 Add(CurrentItem,
true);
1445 SetHelp(TimerMatch ==
tmFull ?
tr(
"Button$Timer") :
tr(
"Button$Record"), NULL, NULL, CanSwitch ?
tr(
"Button$Switch") : NULL);
1546 char v =
event->Vps() && (
event->Vps() -
event->StartTime()) ?
'V' :
' ';
1547 char r =
event->SeenWithin(30) &&
event->IsRunning() ?
'*' :
' ';
1549 cString eds =
event->GetDateString();
1551 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());
1600 for (
const cChannel *Channel = Channels->First(); Channel; Channel = Channels->
Next(Channel)) {
1601 if (!Channel->GroupSep()) {
1603 if (
const cEvent *Event = Now ? Schedule->GetPresentEvent() : Schedule->GetFollowingEvent())
1615 bool result =
false;
1617 for (
cOsdItem *item = First(); item; item =
Next(item)) {
1630 int NewHelpKeys = 0;
1633 NewHelpKeys |= 0x02;
1635 NewHelpKeys |= 0x01;
1637 NewHelpKeys |= 0x04;
1639 NewHelpKeys |= 0x08;
1641 if (Channel->Number() != cDevice::CurrentChannel()) {
1642 NewHelpKeys |= 0x10;
1648 const char *Red[] = { NULL,
tr(
"Button$Record"),
tr(
"Button$Timer") };
1649 SetHelp(Red[NewHelpKeys & 0x03],
now ?
tr(
"Button$Next") :
tr(
"Button$Now"),
tr(
"Button$Schedule"),
canSwitch ?
tr(
"Button$Switch") : NULL);
1668 if (!cDevice::PrimaryDevice()->SwitchChannel(Channel,
true))
1684 Timers->SetExplicitModify();
1685 if (item->timerMatch ==
tmFull) {
1686 if (
cTimer *Timer = Timers->GetMatch(item->event))
1692 if (
cTimer *t = Timers->GetTimer(Timer)) {
1700 Timers->SetModified();
1705 else if (Timer->
Remote())
1745 for (
cOsdItem *item = First(); item; item =
Next(item)) {
1746 if (((
cMenuScheduleItem *)item)->channel->Number() == cDevice::CurrentChannel()) {
1770 if (HadSubMenu &&
Update()) {
1820 Set(Timers, Channels, NULL,
true);
1836 const cEvent *Event = NULL;
1839 Event = CurrentItem->
event;
1843 Channel = Channels->
GetByNumber(cDevice::CurrentChannel());
1845 bool Refresh =
false;
1871 const cEvent *PresentEvent = Event ? Event : Schedule->GetPresentEvent();
1873 for (
const cEvent *ev = Schedule->Events()->First(); ev; ev = Schedule->Events()->
Next(ev)) {
1874 if (ev->EndTime() >
now || ev == PresentEvent)
1892 for (
const cEvent *ev = Schedule->Events()->First(); ev; ev = Schedule->Events()->
Next(ev)) {
1893 if ((ev->EndTime() >
now || ev == Event) && !strcmp(ev->Title(), Event->
Title()))
1910 for (
const cChannel *ch = Channels->First(); ch; ch = Channels->
Next(ch)) {
1913 for (
const cEvent *ev = Schedule->Events()->First(); ev; ev = Schedule->Events()->
Next(ev)) {
1914 if ((ev->EndTime() >
now || ev == Event) && !strcmp(ev->Title(), Event->
Title()))
1930 for (
const cChannel *ch = Channels->First(); ch; ch = Channels->
Next(ch)) {
1933 for (
const cEvent *ev = Schedule->Events()->First(); ev; ev = Schedule->Events()->
Next(ev)) {
1934 if (ev->EndTime() >
now || ev == Event)
1944 bool result =
false;
1946 for (
cOsdItem *item = First(); item; item =
Next(item)) {
1959 int NewHelpKeys = 0;
1962 NewHelpKeys |= 0x02;
1964 NewHelpKeys |= 0x01;
1967 if (Channel->Number() != cDevice::CurrentChannel()) {
1968 NewHelpKeys |= 0x10;
1974 const char *Red[] = { NULL,
tr(
"Button$Record"),
tr(
"Button$Timer") };
1975 SetHelp(Red[NewHelpKeys & 0x03],
tr(
"Button$Now"),
tr(
"Button$Next"),
canSwitch ?
tr(
"Button$Switch") : NULL);
1985 Set(Timers, Channels, NULL,
true);
1995 Timers->SetExplicitModify();
1996 if (item->timerMatch ==
tmFull) {
1997 if (
cTimer *Timer = Timers->GetMatch(item->event))
2003 if (
cTimer *t = Timers->GetTimer(Timer)) {
2011 Timers->SetModified();
2016 else if (Timer->
Remote())
2035 if (Channel = Channels->GetByChannelID(item->
event->
ChannelID(),
true)) {
2036 if (!Channels->SwitchTo(Channel->
Number()))
2051 Set(Timers, Channels);
2069 ChannelNr = Channel->Number();
2093 if (
const cChannel *Channel = Channels->GetByNumber(cDevice::CurrentChannel()))
2094 Set(Timers, Channels, Channel,
true);
2113 if (
const cChannel *Channel = Channels->GetByChannelID(ei->ChannelID(),
true)) {
2115 Set(Timers, Channels, Channel,
true);
2118 else if (HadSubMenu &&
Update()) {
2139 const char *s = Command->Text();
2140 if (Command->SubItems())
2154 const char *p = strchr(s,
':');
2161 if (l > 1 && t[l - 1] ==
'?') {
2189 const char *cmd = *cmdbuf ? *cmdbuf : *
command;
2190 dsyslog(
"executing command '%s'", cmd);
2192 if (p.
Open(cmd,
"r")) {
2195 while ((c = fgetc(p)) != EOF) {
2197 if (
char *NewBuffer = (
char *)realloc(
result, l + 21))
2200 esyslog(
"ERROR: out of memory");
2211 esyslog(
"ERROR: can't open pipe for command '%s'", cmd);
2313 dsyslog(
"CAM %d: Menu ------------------",
camSlot->SlotNumber());
2339 dsyslog(
"CAM %d: Enquiry ------------------",
camSlot->SlotNumber());
2352 const char *p = strchr(s,
'\n');
2353 int l = p ? p - s : strlen(s);
2356 item->
SetText(strndup(s, l),
false);
2401 else if (state ==
osBack) {
2428 if (CamSlot->HasUserIO())
2441 #define osUserRecRenamed osUser1
2442 #define osUserRecMoved osUser2
2443 #define osUserRecRemoved osUser3
2444 #define osUserRecEmpty osUser4
2519 if (strcmp(NewPath,
path)) {
2520 int NumRecordings = 0;
2523 NumRecordings = Recordings->GetNumRecordingsInPath(
path);
2530 Recordings->SetExplicitModify();
2531 Error = !Recordings->MoveRecordings(
path, NewPath);
2533 Recordings->SetModified();
2557 else if (Key ==
kOk)
2639 Add(
new cOsdItem(
tr(
"This recording is currently in use - no changes are possible!"),
osUnknown,
false));
2717 if (strcmp(NewName,
recording->Name())) {
2721 if (access(*FileName, F_OK) != 0 ||
Interface->
Confirm(
tr(
"Edited version already exists - overwrite?"))) {
2726 Recordings->AddByName(FileName);
2769 if (
const cRecording *Recording = Control->GetRecording()) {
2771 Control->ClearEditingMarks();
2785 cRecordings *Recordings = cRecordings::GetRecordingsWrite(StateKey);
2792 bool Modified =
false;
2795 StateKey.
Remove(Modified);
2808 if (strcmp(NewName, Recording->Name())) {
2810 StateKey.
Remove(Modified);
2818 if (strcmp(Recording->
Folder(), OldFolder))
2821 StateKey.
Remove(Modified);
2824 StateKey.
Remove(Modified);
2874 SetHelp(
tr(
"Button$Play"),
tr(
"Button$Rewind"), NULL,
tr(
"Button$Edit"));
2973 if (*
Text() ==
'\t')
3007 :
cOsdMenu(Base ? Base :
tr(
"Recordings"), 9, 6, 6)
3010 base = Base ? strdup(Base) : NULL;
3031 if (!ri->IsDirectory())
3040 int NewHelpKeys = 0;
3048 switch (NewHelpKeys) {
3050 case 1:
SetHelp(
tr(
"Button$Open"), NULL, NULL,
tr(
"Button$Edit"));
break;
3063 const char *CurrentRecording = NULL;
3065 CurrentRecording = ri->Recording()->FileName();
3066 if (!CurrentRecording)
3074 for (
const cRecording *Recording = Recordings->First(); Recording; Recording = Recordings->
Next(Recording)) {
3081 if (p->Name() && strcmp(p->Name(), Item->
Name()) == 0) {
3087 if (*Item->
Text() && !LastDir) {
3095 if (LastItem || LastDir) {
3097 if (strcmp(
path, Recording->Folder()) == 0)
3098 CurrentItem = LastDir ? LastDir : LastItem;
3100 else if (CurrentRecording && strcmp(CurrentRecording, Recording->FileName()) == 0)
3101 CurrentItem = LastDir ? LastDir : LastItem;
3142 const char *t = ri->
Name();
3174 cDevice::PrimaryDevice()->StopReplay();
3188 if (
cTimer *Timer = rc->Timer()) {
3191 if (Timer->IsSingleEvent()) {
3193 isyslog(
"deleted timer %s", *Timer->ToDescr());
3205 char *RemoteBuf = NULL;
3207 if (2 == sscanf(TimerId,
"%d@%m[^ \n]", &Id, &RemoteBuf)) {
3212 if (
cTimer *Timer = Timers->GetById(Id, Remote)) {
3213 cTimer OldTimer = *Timer;
3216 if (Timer->IsSingleEvent()) {
3247 FileName = Recording->FileName();
3260 if (!Recording || Recording->
Delete()) {
3265 cVideoDiskUsage::ForceCheck();
3286 if (ri->IsDirectory())
3364 ri->SetRecording(riSub->Recording());
3392 virtual void Store(
void);
3427 virtual void Set(
void);
3518 bool ModifiedAppearance =
false;
3527 ModifiedAppearance =
true;
3536 ModifiedAppearance =
true;
3538 ModifiedAppearance =
true;
3543 ModifiedAppearance =
true;
3545 ModifiedAppearance =
true;
3547 ModifiedAppearance =
true;
3550 Recordings->ClearSortNames();
3558 if (ModifiedAppearance)
3652 for (k = 0; k < oldnumLanguages; k++) {
3656 if (k >= oldnumLanguages) {
3713 SetHelp(NULL,
tr(
"Button$Audio"),
tr(
"Button$Subtitles"), NULL);
3749 int oldVideoDisplayFormat =
::Setup.VideoDisplayFormat;
3750 bool oldVideoFormat =
::Setup.VideoFormat;
3752 bool oldStandardCompliance =
::Setup.StandardCompliance;
3753 bool oldDisplaySubtitles =
::Setup.DisplaySubtitles;
3775 for (k = 0; k < oldnumAudioLanguages; k++) {
3779 if (k >= oldnumAudioLanguages) {
3793 for (k = 0; k < oldnumSubtitleLanguages; k++) {
3797 if (k >= oldnumSubtitleLanguages) {
3812 if (::
Setup.VideoDisplayFormat != oldVideoDisplayFormat)
3814 if (::
Setup.VideoFormat != oldVideoFormat)
3815 cDevice::PrimaryDevice()->SetVideoFormat(::
Setup.VideoFormat);
3816 if (::
Setup.DisplaySubtitles != oldDisplaySubtitles)
3817 cDevice::PrimaryDevice()->EnsureSubtitleTrack();
3818 if (::
Setup.StandardCompliance != oldStandardCompliance) {
3820 Channels->SetExplicitModify();
3821 Channels->ReNumber();
3861 int NumSatDevices = 0;
3862 for (
int i = 0; i < cDevice::NumDevices(); i++) {
3866 if (NumSatDevices > 1) {
3867 for (
int i = 0; i < cDevice::NumDevices(); i++) {
3891 bool DeviceBondingsChanged =
false;
3901 else if (DeviceBondingsChanged)
3927 const char *Activating =
"";
3931 case msReset: CamName =
tr(
"CAM reset");
break;
3932 case msPresent: CamName =
tr(
"CAM present");
break;
3933 case msReady: CamName =
tr(
"CAM ready");
break;
3934 default: CamName =
"-";
break;
3939 Activating =
tr(
" (activating)");
3945 if (DeviceNumbers.
Size() > 0) {
3948 for (
int i = 0; i < DeviceNumbers.
Size(); i++)
3949 AssignedDevice =
cString::sprintf(
"%s %d", *AssignedDevice, DeviceNumbers[i]);
3953 if (strcmp(buffer,
Text()) != 0) {
3982 if (CamSlot->IsMasterSlot())
3993 const char *NewActivationHelp =
"";
3997 NewActivationHelp =
tr(
"Button$Cancel activation");
3999 NewActivationHelp =
tr(
"Button$Activate");
4013 time_t t0 = time(NULL);
4019 dsyslog(
"CAM %d: retrying to enter CAM menu...", item->
CamSlot()->SlotNumber());
4044 if (
const cChannel *Channel = Channels->GetByNumber(cDevice::CurrentChannel())) {
4045 for (
int i = 0; i < cDevice::NumDevices(); i++) {
4047 if (Device->ProvidesChannel(Channel)) {
4049 if (CamSlot->
Assign(Device,
true)) {
4052 if (CamSlot->
Assign(Device)) {
4053 if (Device->SwitchChannel(Channel,
true)) {
4154 virtual void Store(
void);
4184 Recordings->ResetResume();
4249 bool ModifiedSVDRPSettings =
false;
4255 if (ModifiedSVDRPSettings) {
4259 Timers->SetExplicitModify();
4260 if (Timers->StoreRemoteTimers(NULL, NULL))
4261 Timers->SetModified();
4297 for (
int i = 0; ; i++) {
4339 virtual void Set(
void);
4357 snprintf(buffer,
sizeof(buffer),
"%s - VDR %s",
tr(
"Setup"),
VDRVERSION);
4427 #define STOP_RECORDING trNOOP(" Stop recording ")
4492 for (
int i = 0; ; i++) {
4516 bool result =
false;
4519 if (Force || NewReplaying !=
replaying) {
4554 const char *s = NULL;
4634 default:
switch (Key) {
4636 case kRed:
if (!HadSubMenu)
4639 case kGreen:
if (!HadSubMenu) {
4644 case kYellow:
if (!HadSubMenu)
4647 case kBlue:
if (!HadSubMenu)
4675 cDevice::PrimaryDevice()->ClrAvailableTracks(
true);
4679 if (
const cChannel *Channel = Channels->GetByNumber(LiveChannel)) {
4681 if (
const cSchedule *Schedule = Schedules->GetSchedule(Channel)) {
4682 const cEvent *Present = Schedule->GetPresentEvent();
4691 Components = Recording->Info()->Components();
4696 int indexSubtitle = 0;
4700 case 2:
if (p->
type == 0x05)
4707 case 4: cDevice::PrimaryDevice()->SetAvailableTrack(
ttDolby, indexDolby++, 0, LiveChannel ? NULL : p->
language, p->
description);
4733 channel = Channels->GetByNumber(Number);
4761 channel = Channels->GetByNumber(cDevice::CurrentChannel());
4786 const cEvent *Present = Schedule->GetPresentEvent();
4787 const cEvent *Following = Schedule->GetFollowingEvent();
4813 Channel = Direction > 0 ? Channels->
Next(Channel) : Channels->
Prev(Channel);
4815 Channel = Direction > 0 ? Channels->First() : Channels->Last();
4854 while (ch && (ch = Channels->
Next(ch)) != NULL) {
4856 if (n <= ch->Number() && ch->
Number() < n + m) {
4887 if (
const cChannel *Channel = Channels->GetByNumber(cDevice::CurrentChannel()))
4888 group = Channel->Index();
4891 int SaveGroup =
group;
4953 channel = Channels->Get(Channels->GetNextNormal(
group));
4982 if (Key ==
kNone && !
number && group < 0 && !NewChannel && channel && channel->Number() != cDevice::CurrentChannel()) {
4984 channel = Channels->GetByNumber(cDevice::CurrentChannel());
4991 Channels->SwitchTo(NewChannel->
Number());
4996 bool PositionerMoving = Positioner && Positioner->
IsMoving();
4998 if (!PositionerMoving) {
5015 #define VOLUMETIMEOUT 1000 //ms
5016 #define MUTETIMEOUT 5000 //ms
5064 if (cDevice::PrimaryDevice()->IsMute()) {
5082 #define TRACKTIMEOUT 5000 //ms
5089 cDevice::PrimaryDevice()->EnsureAudioTrack();
5090 SetTrackDescriptions(!cDevice::PrimaryDevice()->Replaying() || cDevice::PrimaryDevice()->Transferring() ? cDevice::CurrentChannel() : 0);
5093 audioChannel = cDevice::PrimaryDevice()->GetAudioChannel();
5094 eTrackType CurrentAudioTrack = cDevice::PrimaryDevice()->GetCurrentAudioTrack();
5097 if (TrackId && TrackId->
id) {
5100 if (i == CurrentAudioTrack)
5132 if (cDevice::PrimaryDevice()->NumAudioTracks() > 0) {
5149 int oldTrack =
track;
5166 static int ac[] = { 1, 0, 2 };
5167 audioChannel = ac[cDevice::PrimaryDevice()->GetAudioChannel()];
5183 if (
types[
track] != cDevice::PrimaryDevice()->GetCurrentAudioTrack())
5193 if (
track != oldTrack) {
5194 cDevice::PrimaryDevice()->SetCurrentAudioTrack(
types[
track]);
5198 cDevice::PrimaryDevice()->SetAudioChannel(
audioChannel);
5209 SetTrackDescriptions(!cDevice::PrimaryDevice()->Replaying() || cDevice::PrimaryDevice()->Transferring() ? cDevice::CurrentChannel() : 0);
5215 eTrackType CurrentSubtitleTrack = cDevice::PrimaryDevice()->GetCurrentSubtitleTrack();
5218 if (TrackId && TrackId->
id) {
5221 if (i == CurrentSubtitleTrack)
5250 if (cDevice::PrimaryDevice()->NumSubtitleTracks() > 0) {
5267 int oldTrack =
track;
5286 if (
types[
track] != cDevice::PrimaryDevice()->GetCurrentSubtitleTrack())
5294 if (
track != oldTrack) {
5296 cDevice::PrimaryDevice()->SetCurrentSubtitleTrack(
types[
track],
true);
5347 SchedulesStateKey.
Remove();
5359 if (!
Timer && !LastReplayed)
5361 SchedulesStateKey.
Remove();
5376 SchedulesStateKey.
Remove();
5385 #define INSTANT_REC_EPG_LOOKAHEAD 300 // seconds to look into the EPG data for an instant recording
5394 if (
const cSchedule *Schedule = Schedules->GetSchedule(Channel)) {
5395 event = Schedule->GetEventAround(Time);
5398 dsyslog(
"got EPG info after %d seconds", seconds);
5404 dsyslog(
"waiting for EPG info...");
5407 dsyslog(
"no EPG info available");
5419 if (ExecuteUserCommand)
5441 static time_t LastNoDiskSpaceMessage = 0;
5450 isyslog(
"not enough disk space to start recording%s%s", Timer ?
" timer " :
"", Timer ? *Timer->
ToDescr() :
"");
5452 LastNoDiskSpaceMessage = time(NULL);
5456 LastNoDiskSpaceMessage = 0;
5460 int ch = Timer ? Timer->
Channel()->
Number() : cDevice::CurrentChannel();
5461 if (
const cChannel *Channel = Channels->GetByNumber(ch)) {
5465 dsyslog(
"switching device %d to channel %d %s (%s)", device->
DeviceNumber() + 1, Channel->Number(), *Channel->GetChannelID().ToString(), Channel->Name());
5470 if (!Timer || Timer->
Matches()) {
5479 else if (!Timer || !Timer->
Pending()) {
5480 isyslog(
"no free DVB device to record channel %d (%s)!", ch, Channel->Name());
5485 esyslog(
"ERROR: channel %d not defined!", ch);
5492 return Start(Timers, NULL, Pause);
5502 if (
id && strcmp(
id, InstantId) == 0) {
5549 if (LastInstantId && LastInstantId ==
RecordControls[i]->InstantId())
5550 LastInstantId = NULL;
5578 bool Result =
false;
5597 isyslog(
"stopping recording due to modification of channel %d (%s)", Channel->
Number(), Channel->
Name());
5626 int NewState =
state;
5627 bool Result = State != NewState;
5676 cDevice::PrimaryDevice()->SetKeepTracks(PauseLive);
5698 cDevice::PrimaryDevice()->SetKeepTracks(
false);
5715 Timers->SetExplicitModify();
5720 Timers->SetModified();
5728 Recordings->SetExplicitModify();
5730 if (Recording->Delete()) {
5733 Recordings->SetModified();
5773 if (!Recordings->GetByName(
fileName))
5826 bool NormalPlay = (
Play && Speed == -1);
5869 Index = Current - Index;
5889 strcpy(buf,
tr(
"Jump: "));
5890 int len = strlen(buf);
5899 sprintf(buf + len,
"%c%c:%c%c", ch10, ch1, cm10, cm1);
5905 #define STAY_SECONDS_OFF_END 10
5978 if (
GetIndex(Current, Total,
true)) {
5989 Goto(Current,
true);
6010 Goto(m->Position());
6014 Goto(m->Position(),
true);
6058 else if (!MarkRequired)
6149 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 TimeSearchDisplay(void)
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)
void SetPending(bool Pending)
virtual void SetPositioner(const cPositioner *Positioner)
Sets the Positioner used to move the satellite dish.
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()
cSkinDisplayChannel * displayChannel
const cTimer * GetMatch(time_t t) const
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.
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
const cRecordingInfo * Info(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 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 SetModifiedByUser(void)
char language[MAXLANGCODE2]
cSkinDisplayVolume * displayVolume
const cChannel * GetByNumber(int Number, int SkipGap=0) 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
static cOsdObject * pluginOsdObject
void Initialize(int *InitialValue, double FramesPerSecond)
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.
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
const char *const * Descriptions(void)
const char * FileName(void) const
Returns the full path name to the recording directory, including the video directory and the actual '...
char FontFix[MAXFONTNAME]
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
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)
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.
const cMark * GetPrev(int Position) const
void SetSubItems(bool On)
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...
const cSchedule * GetSchedule(tChannelID ChannelID) const
cAdaptiveSkipper adaptiveSkipper
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 ...
cRecordControl(cDevice *Device, cTimers *Timers, cTimer *Timer=NULL, bool Pause=false)
static void SetCurrentChannel(const cChannel *Channel)
#define MAXVIDEOFILESIZETS
static cDevice * GetDevice(int Index)
Gets the device with the given Index.
virtual void ClearEditingMarks(void)
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.
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)
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
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
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 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
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)
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 Load(const char *SkinName)
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
void StartSVDRPHandler(void)
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
time_t FirstDay(void) const
void Del(cTimer *Timer, bool DeleteObject=true)
cString GetTimeString(void) const
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)
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...
const cListObject * Get(int Index) const
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
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...
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)
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
void SetRecordingTimerId(const char *Directory, const char *TimerId)
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 GetFrameNumber(int &Current, int &Total)
virtual void Append(T Data)
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)
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".
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
char FontOsd[MAXFONTNAME]
void SetRemote(const char *Remote)
int AudioLanguages[I18N_MAX_LANGUAGES+1]
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)
Returns the current replay control (if any) in case it is currently visible.
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.
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)