36#define MAXWAIT4EPGINFO 3
38#define NEWTIMERLIMIT 120
43#define MAXRECORDCONTROLS (MAXDEVICES * MAXRECEIVERS)
44#define MAXINSTANTRECTIME (24 * 60 - 1)
45#define MAXWAITFORCAMMENU 10
46#define CAMMENURETRYTIMEOUT 3
47#define CAMRESPONSETIMEOUT 5
48#define PROGRESSTIMEOUT 100
49#define MINFREEDISK 300
50#define NODISKSPACEDELTA 300
51#define MAXCHNAMWIDTH 16
53#define CHNUMWIDTH (numdigits(cChannels::MaxNumber()) + 1)
54#define CHNAMWIDTH (min(MAXCHNAMWIDTH, cChannels::MaxShortChannelNameLength() + 1))
60 virtual void Set(
void)
override;
103 virtual void Set(
void)
override;
248 bool Modified =
false;
299 virtual void Set(
void)
override;
352#define CHANNELNUMBERTIMEOUT 1000
359 void Set(
bool Force =
false);
368 virtual void Move(
int From,
int To)
override;
397 for (
const cChannel *Channel = Channels->First(); Channel; Channel = Channels->
Next(Channel)) {
401 if (Channel == CurrentChannel)
411 SetHelp(
tr(
"Button$Edit"),
tr(
"Button$New"),
tr(
"Button$Delete"),
tr(
"Button$Mark"));
446 if (!ci->Channel()->GroupSep() && ci->Channel()->Number() ==
number) {
500 bool Deleted =
false;
503 int DeletedChannel = Channel->
Number();
505 if (Timers->UsesChannel(Channel)) {
511 if (CurrentChannel && Channel == CurrentChannel) {
515 CurrentChannel = Channels->
Get(n);
516 CurrentChannelNr = 0;
518 Channels->
Del(Channel);
521 isyslog(
"channel %d deleted", DeletedChannel);
523 if (CurrentChannel && CurrentChannel->
Number() != CurrentChannelNr) {
539 cChannel *CurrentChannel = Channels->GetByNumber(CurrentChannelNr);
542 if (FromChannel && ToChannel) {
543 int FromNumber = FromChannel->
Number();
544 int ToNumber = ToChannel->
Number();
545 if (Channels->MoveNeedsDecrement(FromChannel, ToChannel)) {
546 ToChannel = Channels->
Prev(ToChannel);
549 Channels->Move(FromChannel, ToChannel);
553 isyslog(
"channel %d moved to %d", FromNumber, ToNumber);
554 if (CurrentChannel && CurrentChannel->
Number() != CurrentChannelNr) {
556 Channels->SwitchTo(CurrentChannel->
Number());
574 if (
cChannel *Channel = MenuEditChannel->Channel()) {
601 if (!ci->Channel()->GroupSep() && ci->Channel()->Number() == CurrentChannelNr) {
634 text = Text ? strdup(Text) : NULL;
679 virtual void Set(
void)
override;
714:
cOsdMenu(Folder ?
tr(
"Edit folder") :
tr(
"New folder"), 12)
743 if (strcmp(Folder->Text(),
name) == 0) {
748 char *p = strpbrk(
name,
"\\{}#~");
823#define FOLDERDELIMCHARSUBST 0x01
831 for (Folder = List->
First(); Folder; Folder = List->
Next(Folder)) {
832 if (strcmp(Path, Folder->
Text()) == 0)
844 for (
const cRecording *Recording = Recordings->
First(); Recording; Recording = Recordings->
Next(Recording)) {
845 cString Folder = Recording->Folder();
847 if (Dirs.
Find(Folder) < 0)
848 Dirs.
Append(strdup(Folder));
851 for (
int i = 0; i < Dirs.
Size(); i++) {
852 if (
char *s = Dirs[i])
864 RecordingsStateKey.
Remove();
877 Add(FolderItem, CurrentFolder ? strcmp(Folder->Text(), CurrentFolder) == 0 :
false);
889 if (strncmp(Folder->Folder()->Text(), Path, p - Path) == 0) {
953 Set(mef->GetFolder());
1126 cString Folder = mf->GetFolder();
1131 memmove(
data.
file, p, strlen(p) + 1);
1160 if (IsVps != WasVps) {
1161 time_t NewStartTime = 0;
1162 time_t NewStopTime = 0;
1174 if (NewStartTime && NewStopTime) {
1212 Timers->Del(
timer,
false);
1265 virtual void Set(
void)
override;
1293 localtime_r(&Day, &tm_r);
1295 strftime(buffer,
sizeof(buffer),
"%Y%m%d", &tm_r);
1315 *name && **name ?
" " :
"",
1377 for (
const cTimer *Timer = Timers->First(); Timer; Timer = Timers->
Next(Timer)) {
1381 if (CurrentTimer && Timer->
Id() == CurrentTimer->
Id() && (!Timer->Remote() && !CurrentTimer->
Remote() || Timer->Remote() && CurrentTimer->
Remote() && strcmp(Timer->Remote(), CurrentTimer->
Remote()) == 0))
1402 int NewHelpKeys = 0;
1441 StateKey.
Remove(Timer != NULL);
1468 bool TimerRecording = Timer->
Recording();
1500 if (Timer && Timer->
Event())
1528 Add(CurrentItem,
true);
1556 SetHelp(TimerMatch ==
tmFull ?
tr(
"Button$Timer") :
tr(
"Button$Record"), NULL, NULL, CanSwitch ?
tr(
"Button$Switch") : NULL);
1665 char v =
event->Vps() && (
event->Vps() -
event->
StartTime()) ?
'V' :
' ';
1666 char r =
event->SeenWithin(30) &&
event->IsRunning() ?
'*' :
' ';
1668 cString eds =
event->GetDateString();
1670 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());
1722 for (
const cChannel *Channel = Channels->
First(); Channel; Channel = Channels->
Next(Channel)) {
1723 if (!Channel->GroupSep()) {
1725 if (
const cEvent *Event = Now ? Schedule->GetPresentEvent() : Schedule->GetFollowingEvent())
1738 bool result =
false;
1753 int NewHelpKeys = 0;
1756 NewHelpKeys |= 0x02;
1758 NewHelpKeys |= 0x01;
1760 NewHelpKeys |= 0x04;
1762 NewHelpKeys |= 0x08;
1765 NewHelpKeys |= 0x10;
1771 const char *Red[] = { NULL,
tr(
"Button$Record"),
tr(
"Button$Timer") };
1772 SetHelp(Red[NewHelpKeys & 0x03],
now ?
tr(
"Button$Next") :
tr(
"Button$Now"),
tr(
"Button$Schedule"),
canSwitch ?
tr(
"Button$Switch") : NULL);
1807 Timers->SetExplicitModify();
1808 if (item->timerMatch ==
tmFull) {
1809 if (
cTimer *Timer = Timers->GetMatch(item->event))
1815 if (
cTimer *t = Timers->GetTimer(Timer)) {
1823 Timers->SetModified();
1828 else if (Timer->
Remote())
1891 if (HadSubMenu &&
Update())
1939 Set(Timers, Channels, NULL,
true);
1955 const cEvent *Event = NULL;
1958 Event = CurrentItem->
event;
1964 bool Refresh =
false;
1990 const cEvent *PresentEvent = Event ? Event : Schedule->GetPresentEvent();
1992 for (
const cEvent *ev = Schedule->Events()->First(); ev; ev = Schedule->Events()->
Next(ev)) {
1993 if (ev->EndTime() >
now || ev == PresentEvent)
2011 for (
const cEvent *ev = Schedule->Events()->First(); ev; ev = Schedule->Events()->
Next(ev)) {
2012 if ((ev->EndTime() >
now || ev == Event) && !strcmp(ev->Title(), Event->
Title()))
2029 for (
const cChannel *ch = Channels->First(); ch; ch = Channels->
Next(ch)) {
2032 for (
const cEvent *ev = Schedule->Events()->First(); ev; ev = Schedule->Events()->
Next(ev)) {
2033 if ((ev->EndTime() >
now || ev == Event) && !strcmp(ev->Title(), Event->
Title()))
2049 for (
const cChannel *ch = Channels->First(); ch; ch = Channels->
Next(ch)) {
2052 for (
const cEvent *ev = Schedule->Events()->First(); ev; ev = Schedule->Events()->
Next(ev)) {
2053 if (ev->EndTime() >
now || ev == Event)
2063 bool result =
false;
2078 int NewHelpKeys = 0;
2081 NewHelpKeys |= 0x02;
2083 NewHelpKeys |= 0x01;
2087 NewHelpKeys |= 0x10;
2093 const char *Red[] = { NULL,
tr(
"Button$Record"),
tr(
"Button$Timer") };
2094 SetHelp(Red[NewHelpKeys & 0x03],
tr(
"Button$Now"),
tr(
"Button$Next"),
canSwitch ?
tr(
"Button$Switch") : NULL);
2104 Set(Timers, Channels, NULL,
true);
2114 Timers->SetExplicitModify();
2115 if (item->timerMatch ==
tmFull) {
2116 if (
cTimer *Timer = Timers->GetMatch(item->event))
2122 if (
cTimer *t = Timers->GetTimer(Timer)) {
2130 Timers->SetModified();
2135 else if (Timer->
Remote())
2152 if ((Channel = Channels->GetByChannelID(item->
event->
ChannelID(),
true)) != NULL) {
2153 if (!Channels->SwitchTo(Channel->
Number()))
2168 Set(Timers, Channels);
2186 ChannelNr = Channel->Number();
2211 Set(Timers, Channels, Channel,
true);
2230 if (
const cChannel *Channel = Channels->GetByChannelID(ei->ChannelID(),
true)) {
2232 Set(Timers, Channels, Channel,
true);
2235 else if (HadSubMenu &&
Update())
2254 const char *s = Command->Text();
2255 if (Command->SubItems())
2269 const char *p = strchr(s,
':');
2276 if (l > 1 && t[l - 1] ==
'?') {
2304 const char *cmd = *cmdbuf ? *cmdbuf : *
command;
2305 dsyslog(
"executing command '%s'", cmd);
2307 if (p.
Open(cmd,
"r")) {
2310 while ((c = fgetc(p)) != EOF) {
2312 if (
char *NewBuffer = (
char *)realloc(
result, l + 21))
2315 esyslog(
"ERROR: out of memory");
2326 esyslog(
"ERROR: can't open pipe for command '%s'", cmd);
2467 const char *p = strchr(s,
'\n');
2468 int l = p ? p - s : strlen(s);
2471 item->
SetText(strndup(s, l),
false);
2516 else if (state ==
osBack) {
2543 if (CamSlot->HasUserIO())
2556#define osUserRecRenamed osUser1
2557#define osUserRecMoved osUser2
2558#define osUserRecRemoved osUser3
2559#define osUserRecEmpty osUser4
2606 for (
const cRecording *Recording = Recordings->First(); Recording; Recording = Recordings->
Next(Recording)) {
2607 if (Recording->IsInPath(
path)) {
2608 int FileSizeMB = Recording->FileSizeMB();
2609 if (FileSizeMB > 0 )
2610 DirSize += FileSizeMB;
2651 if (strcmp(NewPath,
path)) {
2652 int NumRecordings = 0;
2655 NumRecordings = Recordings->GetNumRecordingsInPath(
path);
2662 Recordings->SetExplicitModify();
2663 Error = !Recordings->MoveRecordings(
path, NewPath);
2665 Recordings->SetModified();
2689 else if (Key ==
kOk)
2771 Add(
new cOsdItem(
tr(
"This recording is currently in use - no changes are possible!"),
osUnknown,
false));
2873 if (
const cRecording *Recording = Control->GetRecording()) {
2875 Control->ClearEditingMarks();
2895 bool Modified =
false;
2898 StateKey.
Remove(Modified);
2907 StateKey.
Remove(Modified);
2920 if (strcmp(NewName, Recording->
Name())) {
2922 StateKey.
Remove(Modified);
2930 if (strcmp(Recording->
Folder(), OldFolder))
2933 StateKey.
Remove(Modified);
2936 StateKey.
Remove(Modified);
2973 virtual void Display(
void)
override;
2988 SetHelp(
tr(
"Button$Recordings"),
tr(
"Button$Restore"),
tr(
"Button$Permanently delete"));
2990 SetHelp(
tr(
"Button$Play"),
tr(
"Button$Rewind"), NULL,
tr(
"Button$Edit"));
2997 else if (t > 2 * 3600) buffer =
cString::sprintf(
tr(
"Deleted recording (%d hours left)"),
int(t / 3600));
2998 else if (t > 2 * 60) buffer =
cString::sprintf(
tr(
"Deleted recording (%d minutes left)"),
int(t / 60));
3111 if (*
Text() ==
'\t')
3153:
cOsdMenu(Base ? (DelRecMenu ? *
cString::sprintf(
"%s %s",
tr(
"Deleted in"), Base) : Base)
3154 : (DelRecMenu ?
tr(
"Deleted recordings") :
tr(
"Recordings")), 9, 6, 7)
3157 base = Base ? strdup(Base) : NULL;
3180 if (!ri->IsDirectory()) {
3193 int NewHelpKeys = 0;
3207 switch (NewHelpKeys) {
3211 case 3:
SetHelp(
tr(
"Button$Recordings"),
tr(
"Button$Restore"),
tr(
"Button$Permanently delete"),
tr(
"Button$Info"));
break;
3212 case 4:
SetHelp(
tr(
"Button$Deleted recordings"),
tr(
"Button$Rewind"),
tr(
"Button$Delete"),
tr(
"Button$Info"));
break;
3228 const char *CurrentRecording = NULL;
3230 CurrentRecording = ri->Recording()->FileName();
3231 if (!CurrentRecording) {
3246 time_t LastReplayTime = 0;
3247 for (
const cRecording *Recording = Recordings->
First(); Recording; Recording = Recordings->
Next(Recording)) {
3254 if (p->Name() && strcmp(p->Name(), Item->
Name()) == 0) {
3260 if (*Item->
Text() && !LastDir) {
3269 if (LastItem || LastDir) {
3270 if (CurrentRecording) {
3271 if (strcmp(CurrentRecording, Recording->FileName()) == 0)
3272 CurrentItem = LastDir ? LastDir : LastItem;
3275 time_t t = Recording->GetLastReplayTime();
3276 if (t > LastReplayTime) {
3278 CurrentItem = LastDir ? LastDir : LastItem;
3334 const char *t = ri->
Name();
3392 if (
cTimer *Timer = rc->Timer()) {
3394 if (Timer->IsSingleEvent()) {
3396 isyslog(
"deleted timer %s", *Timer->ToDescr());
3410 char *RemoteBuf = NULL;
3412 if (2 == sscanf(TimerId,
"%d@%m[^ \n]", &Id, &RemoteBuf) && Id != 0) {
3417 if (
cTimer *Timer = Timers->GetById(Id, Remote)) {
3418 cTimer OldTimer = *Timer;
3420 if (Timer->IsSingleEvent()) {
3454 FileName = Recording->FileName();
3470 if (!Recording || Recording->
Delete()) {
3472 Recordings->
Del(Recording,
false);
3473 DeletedRecordings->
Add(Recording);
3506 if (Recording->Undelete()) {
3507 DeletedRecordings->
Del(Recording,
false);
3508 Recordings->
Add(Recording);
3540 if (Recording->Remove()) {
3541 DeletedRecordings->
Del(Recording);
3566 if (ri->IsDirectory()) {
3659 ri->SetRecording(riSub->Recording());
3695 virtual void Store(
void)
override;
3730 virtual void Set(
void);
3821 bool ModifiedAppearance =
false;
3830 ModifiedAppearance =
true;
3839 ModifiedAppearance =
true;
3841 ModifiedAppearance =
true;
3846 ModifiedAppearance =
true;
3848 ModifiedAppearance =
true;
3850 ModifiedAppearance =
true;
3853 Recordings->ClearSortNames();
3861 if (ModifiedAppearance)
3957 for (k = 0; k < oldnumLanguages; k++) {
3961 if (k >= oldnumLanguages) {
4022 SetHelp(NULL,
tr(
"Button$Audio"),
tr(
"Button$Subtitles"), NULL);
4057 int oldVideoDisplayFormat =
::Setup.VideoDisplayFormat;
4058 bool oldVideoFormat =
::Setup.VideoFormat;
4060 int oldDisplaySubtitles =
::Setup.DisplaySubtitles;
4082 for (k = 0; k < oldnumAudioLanguages; k++) {
4086 if (k >= oldnumAudioLanguages) {
4100 for (k = 0; k < oldnumSubtitleLanguages; k++) {
4104 if (k >= oldnumSubtitleLanguages) {
4119 if (
::Setup.VideoDisplayFormat != oldVideoDisplayFormat)
4121 if (
::Setup.VideoFormat != oldVideoFormat)
4123 if (
::Setup.DisplaySubtitles != oldDisplaySubtitles)
4163 int NumSatDevices = 0;
4168 if (NumSatDevices > 1) {
4193 bool DeviceBondingsChanged =
false;
4203 else if (DeviceBondingsChanged)
4229 const char *Activating =
"";
4233 case msReset: CamName =
tr(
"CAM reset");
break;
4234 case msPresent: CamName =
tr(
"CAM present");
break;
4235 case msReady: CamName =
tr(
"CAM ready");
break;
4236 default: CamName =
"-";
break;
4241 Activating =
tr(
" (activating)");
4247 if (DeviceNumbers.
Size() > 0) {
4250 for (
int i = 0; i < DeviceNumbers.
Size(); i++)
4251 AssignedDevice =
cString::sprintf(
"%s %d", *AssignedDevice, DeviceNumbers[i]);
4255 if (strcmp(buffer,
Text()) != 0) {
4284 if (CamSlot->IsMasterSlot())
4295 const char *NewActivationHelp =
"";
4299 NewActivationHelp =
tr(
"Button$Cancel activation");
4301 NewActivationHelp =
tr(
"Button$Activate");
4315 time_t t0 = time(NULL);
4349 if (Device->ProvidesChannel(Channel)) {
4351 if (CamSlot->
Assign(Device,
true)) {
4354 if (CamSlot->
Assign(Device)) {
4355 if (Device->SwitchChannel(Channel,
true)) {
4455 virtual void Store(
void)
override;
4485 Recordings->ResetResume();
4554 bool ModifiedSVDRPSettings =
false;
4555 bool ModifiedShowChannelNamesWithSource =
false;
4561 if (ModifiedShowChannelNamesWithSource) {
4563 for (
cChannel *Channel = Channels->First(); Channel; Channel = Channels->
Next(Channel))
4564 Channel->UpdateNameSource();
4568 if (ModifiedSVDRPSettings) {
4572 Timers->SetExplicitModify();
4573 if (Timers->StoreRemoteTimers(NULL, NULL))
4574 Timers->SetModified();
4610 for (
int i = 0; ; i++) {
4652 virtual void Set(
void);
4670 snprintf(buffer,
sizeof(buffer),
"%s - VDR %s",
tr(
"Setup"),
VDRVERSION);
4740#define STOP_RECORDING trNOOP(" Stop recording ")
4802 for (
int i = 0; ; i++) {
4826 bool result =
false;
4831 bool HasDeletedRecordings = DeletedRecordings->Count();
4845 bool NewReplaying =
false;
4850 if (Force || NewReplaying !=
replaying) {
4885 const char *s = NULL;
4960 default:
switch (Key) {
4962 case kRed:
if (!HadSubMenu)
4965 case kGreen:
if (!HadSubMenu) {
4970 case kYellow:
if (!HadSubMenu)
4973 case kBlue:
if (!HadSubMenu)
4979 bool DoDisplay =
Update();
4999 int indexSubtitle = 0;
5003 case 2:
if (p->
type == 0x05)
5026 if (
const cChannel *Channel = Channels->GetByNumber(LiveChannel)) {
5028 if (
const cSchedule *Schedule = Schedules->GetSchedule(Channel)) {
5029 if (
const cEvent *Present = Schedule->GetPresentEvent())
5059 channel = Channels->GetByNumber(Number);
5112 const cEvent *Present = Schedule->GetPresentEvent();
5113 const cEvent *Following = Schedule->GetFollowingEvent();
5139 Channel = Direction > 0 ? Channels->
Next(Channel) : Channels->
Prev(Channel);
5141 Channel = Direction > 0 ? Channels->First() : Channels->Last();
5180 while (ch && (ch = Channels->
Next(ch)) != NULL) {
5182 if (n <= ch->Number() && ch->
Number() < n + m) {
5214 group = Channel->Index();
5217 int SaveGroup =
group;
5279 channel = Channels->Get(Channels->GetNextNormal(
group));
5317 Channels->SwitchTo(NewChannel->
Number());
5322 bool PositionerMoving = Positioner && Positioner->
IsMoving();
5324 if (!PositionerMoving) {
5341#define VOLUMETIMEOUT 1000
5342#define MUTETIMEOUT 5000
5408#define TRACKTIMEOUT 5000
5423 if (TrackId && TrackId->
id) {
5426 if (i == CurrentAudioTrack)
5475 int oldTrack =
track;
5492 static int ac[] = { 1, 0, 2 };
5519 if (
track != oldTrack) {
5544 if (TrackId && TrackId->
id) {
5547 if (i == CurrentSubtitleTrack)
5593 int oldTrack =
track;
5619 if (
track != oldTrack) {
5657 ChannelsStateKey.
Remove();
5682 SchedulesStateKey.
Remove();
5694 if (!
Timer && !LastReplayed)
5696 SchedulesStateKey.
Remove();
5711 SchedulesStateKey.
Remove();
5720#define INSTANT_REC_EPG_LOOKAHEAD 300
5729 if (
const cSchedule *Schedule = Schedules->GetSchedule(Channel)) {
5730 event = Schedule->GetEventAround(Time);
5733 dsyslog(
"got EPG info after %d seconds", seconds);
5739 dsyslog(
"waiting for EPG info...");
5742 dsyslog(
"no EPG info available");
5753 isyslog(
"timer %s %s with %d error%s", *
timer->
ToDescr(), Finished ?
"finished" :
"stopped", Errors, Errors != 1 ?
"s" :
"");
5764 if (ExecuteUserCommand)
5786 static time_t LastNoDiskSpaceMessage = 0;
5795 isyslog(
"not enough disk space to start recording%s%s", Timer ?
" timer " :
"", Timer ? *Timer->
ToDescr() :
"");
5797 LastNoDiskSpaceMessage = time(NULL);
5801 LastNoDiskSpaceMessage = 0;
5811 dsyslog(
"switching device %d to channel %d %s (%s)", device->
DeviceNumber() + 1, Channel->Number(), *Channel->GetChannelID().ToString(), Channel->Name());
5819 if (!Timer || Timer->
Matches()) {
5828 else if (!Timer || !Timer->
Pending()) {
5829 isyslog(
"no free DVB device to record channel %d (%s)!", ch, Channel->Name());
5834 esyslog(
"ERROR: channel %d not defined!", ch);
5843 return Start(Timers, NULL, Pause);
5853 if (
id && strcmp(
id, InstantId) == 0) {
5901 if (LastInstantId && LastInstantId ==
RecordControls[i]->InstantId())
5902 LastInstantId = NULL;
5930 bool Result =
false;
5949 isyslog(
"stopping recording due to modification of channel %d (%s)", Channel->
Number(), Channel->
Name());
5978 int NewState =
state;
5979 bool Result = State != NewState;
6062 Timers->SetExplicitModify();
6064 Timers->SetModified();
6087 Recordings->SetExplicitModify();
6089 if (Recording->Delete()) {
6091 Recordings->Del(Recording,
false);
6092 DeletedRecordings->Add(Recording);
6094 Recordings->SetModified();
6134 if (!Recordings->GetByName(
fileName))
6187 bool NormalPlay = (
Play && Speed == -1);
6228 int NumErrors = Errors ? Errors->
Size() : 0;
6233 Index = Current - Index;
6255 strcpy(buf,
tr(
"Jump: "));
6256 int len = strlen(buf);
6265 sprintf(buf + len,
"%c%c:%c%c", ch10, ch1, cm10, cm1);
6271#define STAY_SECONDS_OFF_END 10
6344 if (
GetIndex(Current, Total,
true)) {
6355 Goto(Current,
true);
6376 Goto(m->Position());
6380 Goto(m->Position(),
true);
6424 else if (!MarkRequired)
6432 int NumErrors = Errors ? Errors->
Size() : 0;
6433 if (NumErrors > 0) {
6438 for (
int i = 0; i < NumErrors; i++) {
6439 int Position = Errors->
At(i);
6440 if (Offset && Position == Current + Offset) {
6441 Goto(Position,
true);
6444 if (Position > Current + Offset) {
6445 int NextIFrame =
SkipFrames(Position - Current) + Offset;
6446 if (NextIFrame > Position) {
6448 Offset = NextIFrame - Current;
6452 Goto(Position,
true);
6456 if (Current < Total)
6460 for (
int i = NumErrors - 1; i >= 0; i--) {
6461 if (Errors->
At(i) < Current) {
6462 int Position = Errors->
At(i);
6463 Goto(Position,
true);
6562 bool DoShowMode =
true;
cString ChannelString(const cChannel *Channel, int Number)
#define LOCK_CHANNELS_READ
#define LOCK_CHANNELS_WRITE
void Initialize(int *InitialValue, double FramesPerSecond)
bool Devices(cVector< int > &DeviceNumbers)
Adds the numbers of any devices that currently use this CAM to the given DeviceNumbers.
int Priority(void)
Returns the priority of the device this slot is currently assigned to, or IDLEPRIORITY if it is not a...
cCamSlot * MasterSlot(void)
Returns this CAM slot's master slot, or a pointer to itself if it is a master slot.
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.
virtual bool EnterMenu(void)
Requests the CAM in this slot to start its menu.
virtual cCiEnquiry * GetEnquiry(void)
Gets a pending enquiry, or NULL if there is no enquiry.
virtual eModuleStatus ModuleStatus(void)
Returns the status of the CAM in this slot.
virtual bool HasUserIO(void)
Returns true if there is a pending user interaction, which shall be retrieved via GetMenu() or GetEnq...
virtual bool Assign(cDevice *Device, bool Query=false)
Assigns this CAM slot to the given Device, if this is possible.
virtual cCiMenu * GetMenu(void)
Gets a pending menu, or NULL if there is no menu.
cDevice * Device(void)
Returns the device this CAM slot is currently assigned to.
virtual bool Reset(void)
Resets the CAM in this slot.
virtual void StartActivation(void)
Puts the CAM in this slot into a mode where an inserted smart card can be activated.
virtual bool IsActivating(void)
Returns true if this CAM slot is currently activating a smart card.
virtual bool HasMMI(void)
Returns 'true' if the CAM in this slot has an active MMI.
virtual bool CanActivate(void)
Returns true if there is a CAM in this slot that can be put into activation mode.
cCamSlot * MtdSpawn(void)
If this CAM slot can do MTD ("Multi Transponder Decryption"), a call to this function returns a cMtdC...
int SlotNumber(void)
Returns the number of this CAM slot within the whole system.
virtual void CancelActivation(void)
Cancels a previously started activation (if any).
const int * Dpids(void) const
static cString ToText(const cChannel *Channel)
const char * Name(void) const
bool GroupSep(void) const
const int * Caids(void) const
const char * ShortName(bool OrName=false) const
const int * Apids(void) const
const char * Provider(void) const
static cChannels * GetChannelsWrite(cStateKey &StateKey, int TimeoutMs=0)
Gets the list of channels for write access.
bool HasUniqueChannelID(const cChannel *NewChannel, const cChannel *OldChannel=NULL) const
static int MaxNumber(void)
int GetPrevNormal(int Idx) const
Get previous normal channel (not group).
static const cChannels * GetChannelsRead(cStateKey &StateKey, int TimeoutMs=0)
Gets the list of channels for read access.
void ReNumber(void)
Recalculate 'number' based on channel type.
const cChannel * GetByNumber(int Number, int SkipGap=0) const
void SetModifiedByUser(void)
const cChannel * GetByChannelID(tChannelID ChannelID, bool TryWithoutRid=false, bool TryWithoutPolarization=false) const
bool SwitchTo(int Number) const
void Del(cChannel *Channel)
Delete the given Channel from the list.
int GetNextNormal(int Idx) const
Get next normal channel (not group).
void Reply(const char *s)
tComponent * Component(int Index) const
int NumComponents(void) const
static void SleepMs(int TimeoutMs)
Creates a cCondWait object and uses it to sleep for TimeoutMs milliseconds, immediately giving up the...
static cControl * Control(cMutexLock &MutexLock, bool Hidden=false, bool *LockedOtherwise=NULL)
Returns the current replay control (if any) in case it is currently visible.
double FramesPerSecond(void) const
static void Shutdown(void)
static void Launch(cControl *Control)
static cString EditedFileName(const char *FileName)
Returns the full path name of the edited version of the recording with the given FileName.
void SetKeepTracks(bool KeepTracks)
Controls whether the current audio and subtitle track settings shall be kept as they currently are,...
bool SetCurrentSubtitleTrack(eTrackType Type, bool Manual=false)
Sets the current subtitle track to the given Type.
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 cDevice * ActualDevice(void)
Returns the actual receiving device in case of Transfer Mode, or the primary device otherwise.
static cDevice * PrimaryDevice(void)
Returns the primary device.
eTrackType GetCurrentSubtitleTrack(void) const
static cDevice * GetDevice(int Index)
Gets the device with the given Index.
eTrackType GetCurrentAudioTrack(void) const
bool SwitchChannel(const cChannel *Channel, bool LiveView)
Switches the device to the given Channel, initiating transfer mode if necessary.
int DeviceNumber(void) const
Returns the number of this device (0 ... numDevices - 1).
bool AttachReceiver(cReceiver *Receiver)
Attaches the given receiver to this device.
static int CurrentChannel(void)
Returns the number of the current channel on the primary device.
void StopReplay(void)
Stops the current replay session (if any).
int GetAudioChannel(void)
Gets the current audio channel, which is stereo (0), mono left (1) or mono right (2).
void EnsureAudioTrack(bool Force=false)
Makes sure an audio track is selected that is actually available.
const tTrackId * GetTrack(eTrackType Type)
Returns a pointer to the given track id, or NULL if Type is not less than ttMaxTrackTypes.
static void SetCurrentChannel(int ChannelNumber)
Sets the number of the current channel on the primary device, without actually switching to it.
void SetAudioChannel(int AudioChannel)
Sets the audio channel to stereo (0), mono left (1) or mono right (2).
static int NumDevices(void)
Returns the total number of devices.
virtual void SetVideoDisplayFormat(eVideoDisplayFormat VideoDisplayFormat)
Sets the video display format to the given one (only useful if this device has an MPEG decoder).
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 ClrAvailableTracks(bool DescriptionsOnly=false, bool IdsOnly=false)
Clears the list of currently available tracks.
void EnsureSubtitleTrack(void)
Makes sure one of the preferred language subtitle tracks is selected.
static int CurrentVolume(void)
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.
bool SetCurrentAudioTrack(eTrackType Type)
Sets the current audio track to the given Type.
const cEvent * lastPresent
void DisplayChannel(void)
const cEvent * lastFollowing
cSkinDisplayChannel * displayChannel
virtual ~cDisplayChannel() override
virtual eOSState ProcessKey(eKeys Key) override
const cPositioner * positioner
static cDisplayChannel * currentDisplayChannel
cDisplayChannel(int Number, bool Switched)
const cChannel * NextAvailableChannel(const cChannel *Channel, int Direction)
virtual void Show(void) override
cSkinDisplayTracks * displayTracks
cDisplaySubtitleTracks(void)
static void Process(eKeys Key)
char * descriptions[ttMaxTrackTypes+1]
eTrackType types[ttMaxTrackTypes]
static cDisplaySubtitleTracks * currentDisplayTracks
static cDisplaySubtitleTracks * Create(void)
virtual ~cDisplaySubtitleTracks() override
virtual eOSState ProcessKey(eKeys Key) override
virtual eOSState ProcessKey(eKeys Key) override
char * descriptions[ttMaxTrackTypes+1]
static cDisplayTracks * Create(void)
static cDisplayTracks * currentDisplayTracks
virtual void Show(void) override
cSkinDisplayTracks * displayTracks
static void Process(eKeys Key)
virtual ~cDisplayTracks() override
eTrackType types[ttMaxTrackTypes]
static cDisplayVolume * Create(void)
cSkinDisplayVolume * displayVolume
virtual void Show(void) override
virtual eOSState ProcessKey(eKeys Key) override
static void Process(eKeys Key)
static cDisplayVolume * currentDisplayVolume
virtual ~cDisplayVolume() override
void Append(const char *Title)
static bool BondDevices(const char *Bondings)
Bonds the devices as defined in the given Bondings string.
void SetMarks(const cMarks *Marks)
bool GetIndex(int &Current, int &Total, bool SnapToIFrame=false)
const cErrors * GetErrors(void)
void SkipSeconds(int Seconds)
cDvbPlayerControl(const char *FileName, bool PauseLive=false)
bool GetReplayMode(bool &Play, bool &Forward, int &Speed)
int SkipFrames(int Frames)
void Goto(int Index, bool Still=false)
bool GetFrameNumber(int &Current, int &Total)
static void SetupChanged(void)
const char * ShortText(void) const
time_t EndTime(void) const
const char * Description(void) const
bool IsRunning(bool OrAboutToStart=false) const
time_t StartTime(void) const
tChannelID ChannelID(void) const
cString GetTimeString(void) const
const char * Title(void) const
const cSchedule * Schedule(void) const
static bool GetAvailableFontNames(cStringList *FontNames, bool Monospaced=false)
Queries the font configuration for a list of available font names, which is returned in FontNames.
bool Confirm(const char *s, int Seconds=10, bool WaitForTimeout=false)
bool Contains(const cListObject *Object) const
If a pointer to an object contained in this list has been obtained while holding a lock,...
void Del(cListObject *Object, bool DeleteObject=true)
virtual void Move(int From, int To)
void SetModified(void)
Unconditionally marks this list as modified.
void SetSyncStateKey(cStateKey &StateKey)
When making changes to this list (while holding a write lock) that shall not affect some other code t...
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 Add(cListObject *Object, cListObject *After=NULL)
cListObject(const cListObject &ListObject)
cListObject * Prev(void) const
cListObject * Next(void) const
const T * Prev(const T *Object) const
const T * First(void) const
Returns the first element in this list, or NULL if the list is empty.
cList(const char *NeedsLocking=NULL)
const T * Next(const T *Object) const
< Returns the element immediately before Object in this list, or NULL if Object is the first element ...
const T * Last(void) const
Returns the last element in this list, or NULL if the list is empty.
const cOsdItem * Get(int Index) const
void SetPosition(int Position)
int GetNumSequences(void) const
Returns the actual number of sequences to be cut from the recording.
void Add(int Position)
If this cMarks object is used by multiple threads, the caller must Lock() it before calling Add() and...
const cMark * GetNext(int Position) const
bool Load(const char *RecordingFileName, double FramesPerSecond=DEFAULTFRAMESPERSECOND, bool IsPesRecording=false)
const cMark * Get(int Position) const
static bool DeleteMarksFile(const cRecording *Recording)
const cMark * GetPrev(int Position) const
virtual eOSState ProcessKey(eKeys Key) override
cList< cNestedItem > * commands
virtual ~cMenuCommands() override
cMenuCommands(const char *Title, cList< cNestedItem > *Commands, const char *Parameters=NULL)
bool Parse(const char *s)
cOsdItem * cancelEditingItem
cOsdItem * stopRecordingItem
cOsdItem * stopReplayItem
virtual eOSState ProcessKey(eKeys Key) override
cOsdItem * deletedRecordingsItem
bool Update(bool Force=false)
cMenuMain(eOSState State=osUnknown, bool OpenSubMenus=false)
static cOsdObject * pluginOsdObject
static cOsdObject * PluginOsdObject(void)
void SetText(const char *Text)
void SetSubItems(bool On)
cNestedItem(const char *Text, bool WithSubItems=false)
cList< cNestedItem > * SubItems(void)
const char * Text(void) const
const char * Text(void) const
void SetSelectable(bool Selectable)
virtual eOSState ProcessKey(eKeys Key)
bool Selectable(void) const
void SetText(const char *Text, bool Copy=true)
cOsdItem(eOSState State=osUnknown)
void SetNeedsFastResponse(bool NeedsFastResponse)
cOsdObject(bool FastResponse=false)
static bool OsdSizeChanged(int &State)
Checks if the OSD size has changed and a currently displayed OSD needs to be redrawn.
static void UpdateOsdSize(bool Force=false)
Inquires the actual size of the video display and adjusts the OSD and font sizes accordingly.
static int IsOpen(void)
Returns true if there is currently a level 0 OSD open.
bool Open(const char *Command, const char *Mode)
static bool HasPlugins(void)
static cPlugin * CallFirstService(const char *Id, void *Data=NULL)
static cPlugin * GetPlugin(int Index)
virtual cMenuSetupPage * SetupMenu(void)
virtual const char * Version(void)=0
virtual const char * MainMenuEntry(void)
virtual cOsdObject * MainMenuAction(void)
virtual const char * Description(void)=0
A steerable satellite dish generally points to the south on the northern hemisphere,...
virtual bool IsMoving(void) const
Returns true if the dish is currently moving as a result of a call to GotoPosition() or GotoAngle().
bool IsAttached(void)
Returns true if this receiver is (still) attached to a device.
virtual ~cRecordControl()
const char * InstantId(void)
void Stop(bool ExecuteUserCommand=true)
cRecordControl(cDevice *Device, cTimers *Timers, cTimer *Timer=NULL, bool Pause=false)
static bool StateChanged(int &State)
static const char * GetInstantId(const char *LastInstantId)
static void ChannelDataModified(const cChannel *Channel)
static bool Process(cTimers *Timers, time_t t)
static bool PauseLiveVideo(void)
static void Shutdown(void)
static bool Start(cTimers *Timers, cTimer *Timer, bool Pause=false)
static cRecordControl * RecordControls[]
static void Stop(const char *InstantId)
static cRecordControl * GetRecordControl(const char *FileName)
static void ChangeState(void)
cRecorder(const char *FileName, const cChannel *Channel, int Priority)
Creates a new recorder for the given Channel and the given Priority that will record into the file Fi...
void Stop(void)
Stops the recorder.
virtual bool Filter(const cRecording *Recording) const =0
Returns true if the given Recording shall be displayed in the Recordings menu.
void SetParentalRating(int ParentalRating)
const char * Description(void) const
static void InvokeCommand(const char *State, const char *RecordingFileName, const char *SourceFileName=NULL)
bool ChangePriorityLifetime(int NewPriority, int NewLifetime)
Changes the priority and lifetime of this recording to the given values.
bool HasMarks(void) const
Returns true if this recording has any editing marks.
bool WriteInfo(const char *OtherFileName=NULL)
Writes the info file of this recording.
int IsInUse(void) const
Checks whether this recording is currently in use and therefore shall not be tampered with.
bool ChangeName(const char *NewName)
Changes the name of this recording to the given value.
bool Delete(void)
Changes the file name (both internally and on disk) to make this a "deleted" recording.
cString Folder(void) const
Returns the name of the folder this recording is stored in (without the video directory).
void DeleteResume(void) const
const char * Name(void) const
Returns the full name of the recording (without the video directory).
const char * FileName(void) const
Returns the full path name to the recording directory, including the video directory and the actual '...
cRecordingInfo * Info(void) const
cString BaseName(void) const
Returns the base name of this recording (without the video directory and folder).
const char * Title(char Delimiter=' ', bool NewIndicator=false, int Level=-1) const
double FramesPerSecond(void) const
bool IsPesRecording(void) const
time_t Deleted(void) const
void DelAll(void)
Deletes/terminates all operations.
bool StateChanged(int &OldState)
Returns true if the state if this recordings handler has changed since the last call with the given O...
bool Add(int Usage, const char *FileNameSrc, const char *FileNameDst=NULL)
Adds the given FileNameSrc to the recordings handler for (later) processing.
int GetUsage(const char *FileName)
Returns the usage type for the given FileName.
void Del(const char *FileName)
Deletes the given FileName from the list of operations.
static const cRecordings * GetRecordingsRead(cStateKey &StateKey, int TimeoutMs=0)
Gets the list of recordings for read access.
static const cRecordings * GetDeletedRecordingsRead(cStateKey &StateKey, int TimeoutMs=0)
Gets the list of deleted recordings for read access.
static cRecordings * GetDeletedRecordingsWrite(cStateKey &StateKey, int TimeoutMs=0)
Gets the list of deleted recordings for write access.
static cRecordings * GetRecordingsWrite(cStateKey &StateKey, int TimeoutMs=0)
Gets the list of recordings for write access.
static void TouchUpdate(void)
Touches the '.update' file in the video directory, so that other instances of VDR that access the sam...
void Add(cRecording *Recording)
const cRecording * GetByName(const char *FileName) const
bool Put(uint64_t Code, bool Repeat=false, bool Release=false)
static void TriggerLastActivity(void)
Simulates user activity, for instance to keep the current menu open even if no remote control key has...
static void SetRecording(const char *FileName)
static const char * LastReplayed(void)
virtual void Show(void) override
void TimeSearchDisplay(void)
static void ClearLastReplayed(const char *FileName)
virtual eOSState ProcessKey(eKeys Key) override
void MarkMove(int Frames, bool MarkRequired)
static cReplayControl * currentReplayControl
virtual const cRecording * GetRecording(void) override
Returns the cRecording that is currently being replayed, or NULL if this player is not playing a cRec...
void TimeSearchProcess(eKeys Key)
void MarkJump(bool Forward)
cSkinDisplayReplay * displayReplay
void ShowTimed(int Seconds=0)
static cTimer * timeshiftTimer
virtual cOsdObject * GetInfo(void) override
Returns an OSD object that displays information about the currently played programme.
virtual void Hide(void) override
bool ShowProgress(bool Initial)
static void DelTimeshiftTimer(void)
cAdaptiveSkipper adaptiveSkipper
virtual void ClearEditingMarks(void) override
Clears any editing marks this player might be showing.
virtual ~cReplayControl() override
void ErrorJump(bool Forward)
static const char * NowReplaying(void)
cReplayControl(bool PauseLive=false)
bool FromString(const char *s)
bool HasTimer(void) const
const cSchedule * GetSchedule(tChannelID ChannelID) const
static const cSchedules * GetSchedulesRead(cStateKey &StateKey, int TimeoutMs=0)
Gets the list of schedules for read access.
static void ResetVersions(void)
int SubtitleFgTransparency
char SVDRPDefaultHost[HOST_NAME_MAX]
char OSDTheme[MaxThemeName]
int SubtitleLanguages[I18N_MAX_LANGUAGES+1]
int EPGLanguages[I18N_MAX_LANGUAGES+1]
char OSDSkin[MaxSkinName]
int AlwaysSortFoldersFirst
char OSDLanguage[I18N_MAX_LOCALE_LEN]
int ShowChannelNamesWithSource
int OpenRecMenuAtLastReplayed
int SubtitleBgTransparency
int AdaptiveSkipAlternate
int AudioLanguages[I18N_MAX_LANGUAGES+1]
char NameInstantRecord[NAME_MAX+1]
char FontOsd[MAXFONTNAME]
char FontSml[MAXFONTNAME]
char FontFix[MAXFONTNAME]
char SVDRPHostName[HOST_NAME_MAX]
void RequestEmergencyExit(void)
Requests an emergency exit of the VDR main loop.
bool ConfirmRestart(bool Ask)
Check for background activity that blocks restart.
void Exit(int ExitCode)
Set VDR exit code and initiate end of VDR main loop.
virtual void SetEvents(const cEvent *Present, const cEvent *Following)=0
Sets the Present and Following EPG events.
virtual void SetPositioner(const cPositioner *Positioner)
Sets the Positioner used to move the satellite dish.
virtual void SetChannel(const cChannel *Channel, int Number)=0
Sets the current channel to Channel.
virtual void SetErrors(const cErrors *Errors)
Sets the errors found in the recording to Errors, which shall be used to display the progress bar thr...
virtual void SetJump(const char *Jump)=0
Sets the prompt that allows the user to enter a jump point.
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 void SetRecording(const cRecording *Recording)
Sets the recording that is currently being played.
virtual void SetCurrent(const char *Current)=0
Sets the current position within the recording, as a user readable string in the form "h:mm:ss....
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 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 void SetTotal(const char *Total)=0
Sets the total length of the recording, as a user readable string in the form "h:mm:ss".
virtual void SetAudioChannel(int AudioChannel)=0
Sets the audio channel indicator.
virtual void SetTrack(int Index, const char *const *Tracks)=0
< This class implements the track display.
virtual void SetVolume(int Current, int Total, bool Mute)=0
< This class implements the volume/mute display.
virtual void Flush(void)
Actually draws the OSD display to the output device.
virtual cSkinDisplayReplay * DisplayReplay(bool ModeOnly)=0
Creates and returns a new object for displaying replay progress.
virtual cSkinDisplayTracks * DisplayTracks(const char *Title, int NumTracks, const char *const *Tracks)=0
Creates and returns a new object for displaying the available tracks.
virtual cSkinDisplayChannel * DisplayChannel(bool WithInfo)=0
Creates and returns a new object for displaying the current channel.
bool SetCurrent(const char *Name=NULL)
Sets the current skin to the one indicated by name.
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...
cSkin * Current(void)
Returns a pointer to the current skin.
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.
virtual void SetData(cChannel *Channel)=0
Sets all source specific parameters to those of the given Channel.
virtual cOsdItem * GetOsdItem(void)=0
Returns all the OSD items necessary for editing the source specific parameters of the channel that wa...
virtual void GetData(cChannel *Channel)=0
Copies all source specific parameters to the given Channel.
cSourceParam * Get(char Source)
static cString ToString(int Code)
const char * Description(void) const
void Remove(bool IncState=true)
Removes this key from the lock it was previously used with.
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...
static void MsgMarksModified(const cMarks *Marks)
static void MsgOsdChannel(const char *Text)
static void MsgSetAudioChannel(int AudioChannel)
static void MsgOsdProgramme(time_t PresentTime, const char *PresentTitle, const char *PresentSubtitle, time_t FollowingTime, const char *FollowingTitle, const char *FollowingSubtitle)
static void MsgReplaying(const cControl *Control, const char *Name, const char *FileName, bool On)
static void MsgRecording(const cDevice *Device, const char *Name, const char *FileName, bool On)
static void MsgOsdClear(void)
static void MsgSetAudioTrack(int Index, const char *const *Tracks)
static void MsgOsdTextItem(const char *Text, bool Scroll=false)
static void MsgSetSubtitleTrack(int Index, const char *const *Tracks)
void Sort(bool IgnoreCase=false)
int Find(const char *s) const
cString & CompactChars(char c)
Compact any sequence of characters 'c' to a single character, and strip all of them from the beginnin...
cString(const char *S=NULL, bool TakePointer=false)
static cString sprintf(const char *fmt,...) __attribute__((format(printf
const char * Description(void)
Returns a user visible, single line description of this theme.
bool Load(const char *FileName, bool OnlyDescriptions=false)
Loads the theme data from the given file.
int GetThemeIndex(const char *Description)
const char * Name(int Index)
bool Load(const char *SkinName)
const char *const * Descriptions(void)
const char * FileName(int Index)
bool Active(void)
Checks whether the thread is still alive.
uint64_t Elapsed(void) const
Returns the number of milliseconds that have elapsed since the last call to Set().
void Set(int Ms=0)
Sets the timer.
bool TimedOut(void) const
Returns true if the number of milliseconds given in the last call to Set() have passed.
const char * File(void) const
cString PrintFirstDay(void) const
bool CalcNewStartStopTime(bool ToVps, time_t &NewStartTime, time_t &NewStopTime) const
Calculates new start and stop time of this timer, when switching VPS control on/off.
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...
int weekdays
bitmask, lowest bits: SSFTWTM (the 'M' is the LSB)
bool IsSingleEvent(void) const
void SetPending(bool Pending)
cTimer(bool Instant=false, bool Pause=false, const cChannel *Channel=NULL)
time_t StopTime(void) const
The stop time of this timer, which is the time as given by the user (for normal timers) or the end ti...
time_t FirstDay(void) const
bool Recording(void) const
void SetFlags(uint Flags)
int start
the start and stop time of this timer as given by the user,
void SetDeferred(int Seconds)
bool IsPatternTimer(void) const
const char * Pattern(void) const
static cString PrintDay(time_t Day, int WeekDays, bool SingleByteChars)
void TriggerRespawn(void)
void SetRemote(const char *Remote)
bool SetEvent(const cEvent *Event)
int stop
in the form hhmm, with hh (00..23) and mm (00..59) added as hh*100+mm
const cEvent * Event(void) const
time_t StartTime(void) const
The start time of this timer, which is the time as given by the user (for normal timers) or the start...
const cChannel * Channel(void) const
cString ToDescr(void) const
virtual int Compare(const cListObject &ListObject) const override
Must return 0 if this object is equal to ListObject, a positive value if it is "greater",...
bool SetEventFromSchedule(const cSchedules *Schedules)
void SetRecording(bool Recording)
char pattern[NAME_MAX *2+1]
static int GetMDay(time_t t)
bool HasFlags(uint Flags) const
const char * Remote(void) const
cString ToText(bool UseChannelID=false) const
void Add(cTimer *Timer, cTimer *After=NULL)
static cTimers * GetTimersWrite(cStateKey &StateKey, int TimeoutMs=0)
Gets the list of timers for write access.
void Del(cTimer *Timer, bool DeleteObject=true)
static const cTimers * GetTimersRead(cStateKey &StateKey, int TimeoutMs=0)
Gets the list of timers for read access.
const cTimer * GetMatch(time_t t) const
void Sort(__compar_fn_t Compare)
virtual void Insert(T Data, int Before=0)
virtual void Append(T Data)
static const char * Name(void)
static int VideoDiskSpace(int *FreeMB=NULL, int *UsedMB=NULL)
static void ForceCheck(void)
To avoid unnecessary load, the video disk usage is only actually checked every DISKSPACECHEK seconds.
cNestedItemList RecordingCommands
#define TIMERMACRO_BEFORE
#define TIMERMACRO_EPISODE
#define IS_AUDIO_TRACK(t)
#define IS_DOLBY_TRACK(t)
#define MAXPARENTALRATING
#define LOCK_SCHEDULES_READ
#define MAXEPGBUGFIXLEVEL
const char * DefaultFontOsd
const char * DefaultFontSml
const char * DefaultFontFix
const char * I18nLocale(int Language)
Returns the locale code of the given Language (which is an index as returned by I18nCurrentLanguage()...
const cStringList * I18nLanguages(void)
Returns the list of available languages.
int I18nNumLanguagesWithLocale(void)
Returns the number of entries in the list returned by I18nLanguages() that actually have a locale.
int I18nCurrentLanguage(void)
Returns the index of the current language.
void I18nSetLocale(const char *Locale)
Sets the current locale to Locale.
void I18nSetLanguage(int Language)
Sets the current language index to Language.
cString GetRecordingTimerId(const char *Directory)
cString IndexToHMSF(int Index, bool WithFrame, double FramesPerSecond)
void AssertFreeDiskSpace(int Priority, bool Force)
The special Priority value -1 means that we shall get rid of any deleted recordings faster than norma...
void GetRecordingsSortMode(const char *Directory)
int SecondsToFrames(int Seconds, double FramesPerSecond)
eRecordingsSortMode RecordingsSortMode
bool EnoughFreeDiskSpaceForEdit(const char *FileName)
char * ExchangeChars(char *s, bool ToFileSystem)
void IncRecordingsSortMode(const char *Directory)
cDoneRecordings DoneRecordingsPattern
cRecordingsHandler RecordingsHandler
void SetRecordingTimerId(const char *Directory, const char *TimerId)
#define RUC_BEFORERECORDING
#define RUC_AFTERRECORDING
#define LOCK_RECORDINGS_READ
#define MAXVIDEOFILESIZETS
#define LOCK_DELETEDRECORDINGS_WRITE
#define LOCK_DELETEDRECORDINGS_READ
#define LOCK_RECORDINGS_WRITE
cShutdownHandler ShutdownHandler
cSourceParams SourceParams
char language[MAXLANGCODE2]
char language[MAXLANGCODE2]
void StopSVDRPHandler(void)
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...
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...
void StartSVDRPHandler(void)
int SVDRPCode(const char *s)
Returns the value of the three digit reply code of the given SVDRP response string.
cStateKey StateKeySVDRPRemoteTimersPoll
Controls whether a change to the local list of timers needs to result in sending a POLL to the remote...
bool HandleRemoteTimerModifications(cTimer *NewTimer, cTimer *OldTimer, cString *Msg)
Performs any operations necessary to synchronize changes to a timer between peer VDR machines.
#define LOCK_TIMERS_WRITE