36 #define MAXWAIT4EPGINFO 3 // seconds 37 #define MODETIMEOUT 3 // seconds 38 #define NEWTIMERLIMIT 120 // seconds until the start time of a new timer created from the Schedule menu, 41 #define DEFERTIMER 60 // seconds by which a timer is deferred in case of problems 43 #define MAXRECORDCONTROLS (MAXDEVICES * MAXRECEIVERS) 44 #define MAXINSTANTRECTIME (24 * 60 - 1) // 23:59 hours 45 #define MAXWAITFORCAMMENU 10 // seconds to wait for the CAM menu to open 46 #define CAMMENURETRYTIMEOUT 3 // seconds after which opening the CAM menu is retried 47 #define CAMRESPONSETIMEOUT 5 // seconds to wait for a response from a CAM 48 #define PROGRESSTIMEOUT 100 // milliseconds to wait before updating the replay progress display 49 #define MINFREEDISK 300 // minimum free disk space (in MB) required to start recording 50 #define NODISKSPACEDELTA 300 // seconds between "Not enough disk space to start recording!" messages 51 #define MAXCHNAMWIDTH 16 // maximum number of characters of channels' short names shown in schedules menus 53 #define CHNUMWIDTH (numdigits(cChannels::MaxNumber()) + 1) 54 #define CHNAMWIDTH (min(MAXCHNAMWIDTH, cChannels::MaxShortChannelNameLength() + 1)) 60 virtual void Set(
void);
103 virtual void Set(
void);
248 bool Modified =
false;
299 virtual void Set(
void);
351 #define CHANNELNUMBERTIMEOUT 1000 //ms 358 void Set(
bool Force =
false);
367 virtual void Move(
int From,
int To);
396 for (
const cChannel *Channel = Channels->First(); Channel; Channel = Channels->
Next(Channel)) {
400 if (Channel == CurrentChannel)
410 SetHelp(
tr(
"Button$Edit"),
tr(
"Button$New"),
tr(
"Button$Delete"),
tr(
"Button$Mark"));
445 if (!ci->Channel()->GroupSep() && ci->Channel()->Number() ==
number) {
498 bool Deleted =
false;
501 int DeletedChannel = Channel->
Number();
503 if (Timers->UsesChannel(Channel)) {
509 if (CurrentChannel && Channel == CurrentChannel) {
513 CurrentChannel = Channels->
Get(n);
514 CurrentChannelNr = 0;
516 Channels->
Del(Channel);
520 isyslog(
"channel %d deleted", DeletedChannel);
522 if (CurrentChannel && CurrentChannel->
Number() != CurrentChannelNr) {
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) {
551 Channels->SwitchTo(CurrentChannel->
Number());
569 if (
cChannel *Channel = MenuEditChannel->Channel()) {
615 text = Text ? strdup(Text) : NULL;
660 virtual void Set(
void);
695 :
cOsdMenu(Folder ?
tr(
"Edit folder") :
tr(
"New folder"), 12)
724 if (strcmp(Folder->Text(),
name) == 0) {
729 char *p = strpbrk(
name,
"\\{}#~");
804 #define FOLDERDELIMCHARSUBST 0x01 812 for (Folder =
List->First(); Folder; Folder =
List->Next(Folder)) {
813 if (strcmp(Path, Folder->
Text()) == 0)
825 for (
const cRecording *Recording = Recordings->
First(); Recording; Recording = Recordings->
Next(Recording)) {
826 cString Folder = Recording->Folder();
828 if (Dirs.
Find(Folder) < 0)
829 Dirs.
Append(strdup(Folder));
832 for (
int i = 0; i < Dirs.
Size(); i++) {
833 if (
char *s = Dirs[i])
845 RecordingsStateKey.
Remove();
858 Add(FolderItem, CurrentFolder ? strcmp(Folder->Text(), CurrentFolder) == 0 :
false);
870 if (strncmp(Folder->Folder()->Text(), Path, p - Path) == 0) {
934 Set(mef->GetFolder());
1052 cString Folder = mf->GetFolder();
1061 memmove(
data.
file, p, strlen(p) + 1);
1150 else if (state ==
osEnd && HasSubMenu())
1151 state = SetFolder();
1165 virtual void Set(
void);
1193 localtime_r(&Day, &tm_r);
1195 strftime(buffer,
sizeof(buffer),
"%Y%m%d", &tm_r);
1207 *name && **name ?
" " :
"",
1262 for (
const cTimer *Timer = Timers->First(); Timer; Timer = Timers->
Next(Timer)) {
1265 if (CurrentTimer && Timer->
Id() == CurrentTimer->
Id() && (!Timer->Remote() && !CurrentTimer->
Remote() || Timer->Remote() && CurrentTimer->
Remote() && strcmp(Timer->Remote(), CurrentTimer->
Remote()) == 0))
1284 int NewHelpKeys = 0;
1321 StateKey.
Remove(Timer != NULL);
1348 bool TimerRecording = Timer->
Recording();
1381 if (Timer && Timer->
Event())
1407 Add(CurrentItem,
true);
1431 SetHelp(TimerMatch ==
tmFull ?
tr(
"Button$Timer") :
tr(
"Button$Record"), NULL, NULL, CanSwitch ?
tr(
"Button$Switch") : NULL);
1532 char v =
event->Vps() && (
event->Vps() -
event->StartTime()) ?
'V' :
' ';
1533 char r =
event->SeenWithin(30) &&
event->IsRunning() ?
'*' :
' ';
1535 cString eds =
event->GetDateString();
1537 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());
1586 for (
const cChannel *Channel = Channels->
First(); Channel; Channel = Channels->
Next(Channel)) {
1587 if (!Channel->GroupSep()) {
1589 if (
const cEvent *Event = Now ? Schedule->GetPresentEvent() : Schedule->GetFollowingEvent())
1601 bool result =
false;
1616 int NewHelpKeys = 0;
1619 NewHelpKeys |= 0x02;
1621 NewHelpKeys |= 0x01;
1623 NewHelpKeys |= 0x04;
1625 NewHelpKeys |= 0x08;
1628 NewHelpKeys |= 0x10;
1634 const char *Red[] = { NULL,
tr(
"Button$Record"),
tr(
"Button$Timer") };
1635 SetHelp(Red[NewHelpKeys & 0x03],
now ?
tr(
"Button$Next") :
tr(
"Button$Now"),
tr(
"Button$Schedule"),
canSwitch ?
tr(
"Button$Switch") : NULL);
1670 Timers->SetExplicitModify();
1671 if (item->timerMatch ==
tmFull) {
1672 if (
cTimer *Timer = Timers->GetMatch(item->event))
1678 if (
cTimer *t = Timers->GetTimer(Timer)) {
1686 Timers->SetModified();
1691 else if (Timer->
Remote())
1756 if (HadSubMenu &&
Update()) {
1806 Set(Timers, Channels, NULL,
true);
1822 const cEvent *Event = NULL;
1825 Event = CurrentItem->
event;
1831 bool Refresh =
false;
1857 const cEvent *PresentEvent = Event ? Event : Schedule->GetPresentEvent();
1859 for (
const cEvent *ev = Schedule->Events()->First(); ev; ev = Schedule->Events()->
Next(ev)) {
1860 if (ev->EndTime() >
now || ev == PresentEvent)
1878 for (
const cEvent *ev = Schedule->Events()->First(); ev; ev = Schedule->Events()->
Next(ev)) {
1879 if ((ev->EndTime() >
now || ev == Event) && !strcmp(ev->Title(), Event->
Title()))
1896 for (
const cChannel *ch = Channels->First(); ch; ch = Channels->
Next(ch)) {
1899 for (
const cEvent *ev = Schedule->Events()->First(); ev; ev = Schedule->Events()->
Next(ev)) {
1900 if ((ev->EndTime() >
now || ev == Event) && !strcmp(ev->Title(), Event->
Title()))
1916 for (
const cChannel *ch = Channels->First(); ch; ch = Channels->
Next(ch)) {
1919 for (
const cEvent *ev = Schedule->Events()->First(); ev; ev = Schedule->Events()->
Next(ev)) {
1920 if (ev->EndTime() >
now || ev == Event)
1930 bool result =
false;
1945 int NewHelpKeys = 0;
1948 NewHelpKeys |= 0x02;
1950 NewHelpKeys |= 0x01;
1954 NewHelpKeys |= 0x10;
1960 const char *Red[] = { NULL,
tr(
"Button$Record"),
tr(
"Button$Timer") };
1961 SetHelp(Red[NewHelpKeys & 0x03],
tr(
"Button$Now"),
tr(
"Button$Next"),
canSwitch ?
tr(
"Button$Switch") : NULL);
1971 Set(Timers, Channels, NULL,
true);
1981 Timers->SetExplicitModify();
1982 if (item->timerMatch ==
tmFull) {
1983 if (
cTimer *Timer = Timers->GetMatch(item->event))
1989 if (
cTimer *t = Timers->GetTimer(Timer)) {
1997 Timers->SetModified();
2002 else if (Timer->
Remote())
2021 if (Channel = Channels->GetByChannelID(item->
event->
ChannelID(),
true)) {
2022 if (!Channels->SwitchTo(Channel->
Number()))
2037 Set(Timers, Channels);
2055 ChannelNr = Channel->Number();
2080 Set(Timers, Channels, Channel,
true);
2099 if (
const cChannel *Channel = Channels->GetByChannelID(ei->ChannelID(),
true)) {
2101 Set(Timers, Channels, Channel,
true);
2104 else if (HadSubMenu &&
Update()) {
2125 const char *s = Command->Text();
2126 if (Command->SubItems())
2140 const char *p = strchr(s,
':');
2147 if (l > 1 && t[l - 1] ==
'?') {
2175 const char *cmd = *cmdbuf ? *cmdbuf : *
command;
2176 dsyslog(
"executing command '%s'", cmd);
2178 if (p.
Open(cmd,
"r")) {
2181 while ((c = fgetc(p)) != EOF) {
2183 if (
char *NewBuffer = (
char *)realloc(
result, l + 21))
2186 esyslog(
"ERROR: out of memory");
2197 esyslog(
"ERROR: can't open pipe for command '%s'", cmd);
2338 const char *p = strchr(s,
'\n');
2339 int l = p ? p - s : strlen(s);
2342 item->
SetText(strndup(s, l),
false);
2387 else if (state ==
osBack) {
2414 if (CamSlot->HasUserIO())
2427 #define osUserRecRenamed osUser1 2428 #define osUserRecMoved osUser2 2429 #define osUserRecRemoved osUser3 2430 #define osUserRecEmpty osUser4 2505 if (strcmp(NewPath,
path)) {
2506 int NumRecordings = 0;
2509 NumRecordings = Recordings->GetNumRecordingsInPath(
path);
2516 Recordings->SetExplicitModify();
2517 Error = !Recordings->MoveRecordings(
path, NewPath);
2519 Recordings->SetModified();
2543 else if (Key ==
kOk)
2625 Add(
new cOsdItem(
tr(
"This recording is currently in use - no changes are possible!"),
osUnknown,
false));
2649 buttonDelete = (ResumeFile.Read() != -1) ?
tr(
"Button$Delete resume") : NULL;
2707 if (access(*FileName, F_OK) != 0 ||
Interface->
Confirm(
tr(
"Edited version already exists - overwrite?"))) {
2712 Recordings->AddByName(FileName);
2755 if (
const cRecording *Recording = Control->GetRecording()) {
2757 Control->ClearEditingMarks();
2778 bool Modified =
false;
2781 StateKey.
Remove(Modified);
2794 if (strcmp(NewName, Recording->
Name())) {
2796 StateKey.
Remove(Modified);
2804 if (strcmp(Recording->
Folder(), OldFolder))
2807 StateKey.
Remove(Modified);
2810 StateKey.
Remove(Modified);
2860 SetHelp(
tr(
"Button$Play"),
tr(
"Button$Rewind"), NULL,
tr(
"Button$Edit"));
2959 if (*
Text() ==
'\t')
2993 :
cOsdMenu(Base ? Base :
tr(
"Recordings"), 9, 6, 6)
2996 base = Base ? strdup(Base) : NULL;
3017 if (!ri->IsDirectory())
3026 int NewHelpKeys = 0;
3034 switch (NewHelpKeys) {
3036 case 1:
SetHelp(
tr(
"Button$Open"), NULL, NULL,
tr(
"Button$Edit"));
break;
3049 const char *CurrentRecording = NULL;
3051 CurrentRecording = ri->Recording()->FileName();
3052 if (!CurrentRecording)
3060 for (
const cRecording *Recording = Recordings->
First(); Recording; Recording = Recordings->
Next(Recording)) {
3067 if (p->Name() && strcmp(p->Name(), Item->
Name()) == 0) {
3073 if (*Item->
Text() && !LastDir) {
3081 if (LastItem || LastDir) {
3083 if (strcmp(
path, Recording->Folder()) == 0)
3084 CurrentItem = LastDir ? LastDir : LastItem;
3086 else if (CurrentRecording && strcmp(CurrentRecording, Recording->FileName()) == 0)
3087 CurrentItem = LastDir ? LastDir : LastItem;
3128 const char *t = ri->
Name();
3174 if (
cTimer *Timer = rc->Timer()) {
3177 if (Timer->IsSingleEvent()) {
3179 isyslog(
"deleted timer %s", *Timer->ToDescr());
3191 char *RemoteBuf = NULL;
3193 if (2 == sscanf(TimerId,
"%d@%m[^ \n]", &Id, &RemoteBuf)) {
3198 if (
cTimer *Timer = Timers->GetById(Id, Remote)) {
3199 cTimer OldTimer = *Timer;
3202 if (Timer->IsSingleEvent()) {
3233 FileName = Recording->FileName();
3246 if (!Recording || Recording->
Delete()) {
3272 if (ri->IsDirectory())
3350 ri->SetRecording(riSub->Recording());
3378 virtual void Store(
void);
3413 virtual void Set(
void);
3504 bool ModifiedAppearance =
false;
3513 ModifiedAppearance =
true;
3522 ModifiedAppearance =
true;
3524 ModifiedAppearance =
true;
3529 ModifiedAppearance =
true;
3531 ModifiedAppearance =
true;
3533 ModifiedAppearance =
true;
3536 Recordings->ClearSortNames();
3544 if (ModifiedAppearance)
3638 for (k = 0; k < oldnumLanguages; k++) {
3642 if (k >= oldnumLanguages) {
3699 SetHelp(NULL,
tr(
"Button$Audio"),
tr(
"Button$Subtitles"), NULL);
3735 int oldVideoDisplayFormat =
::Setup.VideoDisplayFormat;
3736 bool oldVideoFormat =
::Setup.VideoFormat;
3738 bool oldStandardCompliance =
::Setup.StandardCompliance;
3739 bool oldDisplaySubtitles =
::Setup.DisplaySubtitles;
3761 for (k = 0; k < oldnumAudioLanguages; k++) {
3765 if (k >= oldnumAudioLanguages) {
3779 for (k = 0; k < oldnumSubtitleLanguages; k++) {
3783 if (k >= oldnumSubtitleLanguages) {
3798 if (::
Setup.VideoDisplayFormat != oldVideoDisplayFormat)
3800 if (::
Setup.VideoFormat != oldVideoFormat)
3802 if (::
Setup.DisplaySubtitles != oldDisplaySubtitles)
3804 if (::
Setup.StandardCompliance != oldStandardCompliance) {
3806 Channels->SetExplicitModify();
3807 Channels->ReNumber();
3847 int NumSatDevices = 0;
3852 if (NumSatDevices > 1) {
3877 bool DeviceBondingsChanged =
false;
3887 else if (DeviceBondingsChanged)
3913 const char *Activating =
"";
3917 case msReset: CamName =
tr(
"CAM reset");
break;
3918 case msPresent: CamName =
tr(
"CAM present");
break;
3919 case msReady: CamName =
tr(
"CAM ready");
break;
3920 default: CamName =
"-";
break;
3925 Activating =
tr(
" (activating)");
3931 if (CardIndexes.
Size() > 0) {
3934 for (
int i = 0; i < CardIndexes.
Size(); i++)
3935 AssignedDevice =
cString::sprintf(
"%s %d", *AssignedDevice, CardIndexes[i] + 1);
3939 if (strcmp(buffer,
Text()) != 0) {
3968 if (CamSlot->IsMasterSlot())
3979 const char *NewActivationHelp =
"";
3983 NewActivationHelp =
tr(
"Button$Cancel activation");
3985 NewActivationHelp =
tr(
"Button$Activate");
3999 time_t t0 = time(NULL);
4033 if (Device->ProvidesChannel(Channel)) {
4035 if (CamSlot->
Assign(Device,
true)) {
4038 if (CamSlot->
Assign(Device)) {
4039 if (Device->SwitchChannel(Channel,
true)) {
4140 virtual void Store(
void);
4170 Recordings->ResetResume();
4235 bool ModifiedSVDRPSettings =
false;
4241 if (ModifiedSVDRPSettings) {
4245 Timers->SetExplicitModify();
4246 if (Timers->StoreRemoteTimers(NULL, NULL))
4247 Timers->SetModified();
4283 for (
int i = 0; ; i++) {
4325 virtual void Set(
void);
4343 snprintf(buffer,
sizeof(buffer),
"%s - VDR %s",
tr(
"Setup"),
VDRVERSION);
4413 #define STOP_RECORDING trNOOP(" Stop recording ") 4478 for (
int i = 0; ; i++) {
4502 bool result =
false;
4505 if (Force || NewReplaying !=
replaying) {
4540 const char *s = NULL;
4620 default:
switch (Key) {
4622 case kRed:
if (!HadSubMenu)
4625 case kGreen:
if (!HadSubMenu) {
4630 case kYellow:
if (!HadSubMenu)
4633 case kBlue:
if (!HadSubMenu)
4665 if (
const cChannel *Channel = Channels->GetByNumber(LiveChannel)) {
4667 if (
const cSchedule *Schedule = Schedules->GetSchedule(Channel)) {
4668 const cEvent *Present = Schedule->GetPresentEvent();
4677 Components = Recording->Info()->Components();
4682 int indexSubtitle = 0;
4686 case 2:
if (p->
type == 0x05)
4718 channel = Channels->GetByNumber(Number);
4767 const cEvent *Present = Schedule->GetPresentEvent();
4768 const cEvent *Following = Schedule->GetFollowingEvent();
4792 Channel = Direction > 0 ? Channels->
Next(Channel) : Channels->
Prev(Channel);
4794 Channel = Direction > 0 ? Channels->First() : Channels->Last();
4833 while (ch && (ch = Channels->
Next(ch)) != NULL) {
4835 if (n <= ch->Number() && ch->
Number() < n + m) {
4867 group = Channel->Index();
4870 int SaveGroup =
group;
4932 channel = Channels->Get(Channels->GetNextNormal(
group));
4969 Channels->SwitchTo(NewChannel->
Number());
4974 bool PositionerMoving = Positioner && Positioner->
IsMoving();
4976 if (!PositionerMoving) {
4992 #define VOLUMETIMEOUT 1000 //ms 4993 #define MUTETIMEOUT 5000 //ms 5059 #define TRACKTIMEOUT 5000 //ms 5074 if (TrackId && TrackId->
id) {
5077 if (i == CurrentAudioTrack)
5126 int oldTrack =
track;
5143 static int ac[] = { 1, 0, 2 };
5170 if (
track != oldTrack) {
5195 if (TrackId && TrackId->
id) {
5198 if (i == CurrentSubtitleTrack)
5244 int oldTrack =
track;
5271 if (
track != oldTrack) {
5308 fileName = strdup(Recording.FileName());
5324 SchedulesStateKey.
Remove();
5331 Recording.WriteInfo();
5336 if (!
Timer && !LastReplayed)
5338 SchedulesStateKey.
Remove();
5353 SchedulesStateKey.
Remove();
5362 #define INSTANT_REC_EPG_LOOKAHEAD 300 // seconds to look into the EPG data for an instant recording 5371 if (
const cSchedule *Schedule = Schedules->GetSchedule(Channel)) {
5372 event = Schedule->GetEventAround(Time);
5375 dsyslog(
"got EPG info after %d seconds", seconds);
5381 dsyslog(
"waiting for EPG info...");
5384 dsyslog(
"no EPG info available");
5396 if (ExecuteUserCommand)
5418 static time_t LastNoDiskSpaceMessage = 0;
5427 isyslog(
"not enough disk space to start recording%s%s", Timer ?
" timer " :
"", Timer ? *Timer->
ToDescr() :
"");
5429 LastNoDiskSpaceMessage = time(NULL);
5433 LastNoDiskSpaceMessage = 0;
5438 if (
const cChannel *Channel = Channels->GetByNumber(ch)) {
5442 dsyslog(
"switching device %d to channel %d %s (%s)", device->
DeviceNumber() + 1, Channel->Number(), *Channel->GetChannelID().ToString(), Channel->Name());
5447 if (!Timer || Timer->
Matches()) {
5456 else if (!Timer || !Timer->
Pending()) {
5457 isyslog(
"no free DVB device to record channel %d (%s)!", ch, Channel->Name());
5462 esyslog(
"ERROR: channel %d not defined!", ch);
5469 return Start(Timers, NULL, Pause);
5479 if (
id && strcmp(
id, InstantId) == 0) {
5526 if (LastInstantId && LastInstantId ==
RecordControls[i]->InstantId())
5527 LastInstantId = NULL;
5555 bool Result =
false;
5574 isyslog(
"stopping recording due to modification of channel %d (%s)", Channel->
Number(), Channel->
Name());
5603 int NewState =
state;
5604 bool Result = State != NewState;
5692 Timers->SetExplicitModify();
5697 Timers->SetModified();
5705 Recordings->SetExplicitModify();
5707 if (Recording->Delete()) {
5710 Recordings->SetModified();
5750 if (!Recordings->GetByName(
fileName))
5803 bool NormalPlay = (
Play && Speed == -1);
5846 Index = Current - Index;
5866 strcpy(buf,
tr(
"Jump: "));
5867 int len = strlen(buf);
5876 sprintf(buf + len,
"%c%c:%c%c", ch10, ch1, cm10, cm1);
5882 #define STAY_SECONDS_OFF_END 10 5955 if (
GetIndex(Current, Total,
true)) {
5966 Goto(Current,
true);
5987 Goto(m->Position());
5991 Goto(m->Position(),
true);
6035 else if (!MarkRequired)
6126 bool DoShowMode =
true;
cDisplaySubtitleTracks(void)
const cTimer * GetMatch(time_t t) const
void ShowTimed(int Seconds=0)
const cChannel * GetByChannelID(tChannelID ChannelID, bool TryWithoutRid=false, bool TryWithoutPolarization=false) const
static cString ToString(int Code)
const char * Title(char Delimiter=' ', bool NewIndicator=false, int Level=-1) const
virtual void SetTrack(int Index, const char *const *Tracks)=0
< This class implements the track display.
static const cChannels * GetChannelsRead(cStateKey &StateKey, int TimeoutMs=0)
Gets the list of channels for read access.
cOsdItem * stopReplayItem
eOSState ProcessKey(eKeys Key)
bool Contains(const cListObject *Object) const
If a pointer to an object contained in this list has been obtained while holding a lock...
cList< cNestedItem > * commands
cCamSlot * MtdSpawn(void)
If this CAM slot can do MTD ("Multi Transponder Decryption"), a call to this function returns a cMtdC...
bool Devices(cVector< int > &CardIndexes)
Adds the card indexes of any devices that currently use this CAM to the given CardIndexes.
const cOsdItem * Get(int Index) const
Returns the list element at the given Index, or NULL if no such element exists.
virtual cSkinDisplayVolume * DisplayVolume(void)=0
Creates and returns a new object for displaying the current volume.
virtual eOSState ProcessKey(eKeys Key)
const char * Provider(void) const
time_t StartTime(void) const
void TimeSearchDisplay(void)
const int * Caids(void) const
bool Confirm(const char *s, int Seconds=10, bool WaitForTimeout=false)
static void ResetVersions(void)
int I18nCurrentLanguage(void)
Returns the index of the current language.
void SetRecording(bool Recording)
virtual void StartActivation(void)
Puts the CAM in this slot into a mode where an inserted smart card can be activated.
static const cSchedules * GetSchedulesRead(cStateKey &StateKey, int TimeoutMs=0)
Gets the list of schedules for read access.
void DisplayChannel(void)
virtual void GetData(cChannel *Channel)=0
Copies all source specific parameters to the given Channel.
bool Load(const char *SkinName)
virtual const cRecording * GetRecording(void)
Returns the cRecording that is currently being replayed, or NULL if this player is not playing a cRec...
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...
void SetRecordingTimerId(const char *Directory, const char *TimerId)
cOsdItem * stopRecordingItem
void Add(cListObject *Object, cListObject *After=NULL)
const cRecording * GetByName(const char *FileName) const
cString ToText(bool UseChannelID=false) const
static cString ToText(const cChannel *Channel)
int NumComponents(void) const
const char * Description(void) const
virtual void SetVolume(int Current, int Total, bool Mute)=0
< This class implements the volume/mute display.
cString BaseName(void) const
Returns the base name of this recording (without the video directory and folder). ...
static void Shutdown(void)
static void InvokeCommand(const char *State, const char *RecordingFileName, const char *SourceFileName=NULL)
virtual const char * Version(void)=0
eRecordingsSortMode RecordingsSortMode
char language[MAXLANGCODE2]
bool HasFlags(uint Flags) const
const char * FileName(void) const
Returns the full path name to the recording directory, including the video directory and the actual '...
#define RUC_BEFORERECORDING
bool Lock(cStateKey &StateKey, bool Write=false, int TimeoutMs=0) const
Tries to get a lock on this list and returns true if successful.
bool Matches(time_t t=0, bool Directly=false, int Margin=0) const
uint64_t Elapsed(void) const
#define TIMERMACRO_EPISODE
static cString sprintf(const char *fmt,...) __attribute__((format(printf
virtual void Append(T Data)
const char * DefaultFontSml
const char * Name(void) const
Returns the full name of the recording (without the video directory).
virtual cOsdObject * MainMenuAction(void)
cString ToDescr(void) const
static cDisplayVolume * Create(void)
cMenuMain(eOSState State=osUnknown, bool OpenSubMenus=false)
char SVDRPDefaultHost[HOST_NAME_MAX]
void Remove(bool IncState=true)
Removes this key from the lock it was previously used with.
static void SetupChanged(void)
virtual void SetVideoDisplayFormat(eVideoDisplayFormat VideoDisplayFormat)
Sets the video display format to the given one (only useful if this device has an MPEG decoder)...
bool ChangePriorityLifetime(int NewPriority, int NewLifetime)
Changes the priority and lifetime of this recording to the given values.
bool Parse(const char *s)
static const cRecordings * GetRecordingsRead(cStateKey &StateKey, int TimeoutMs=0)
Gets the list of recordings for read access.
static cDevice * GetDevice(int Index)
Gets the device with the given Index.
static cControl * Control(bool Hidden=false)
Returns the current replay control (if any) in case it is currently visible.
bool AttachReceiver(cReceiver *Receiver)
Attaches the given receiver to this device.
virtual bool CanActivate(void)
Returns true if there is a CAM in this slot that can be put into activation mode. ...
char FontSml[MAXFONTNAME]
int AlwaysSortFoldersFirst
bool SetAvailableTrack(eTrackType Type, int Index, uint16_t Id, const char *Language=NULL, const char *Description=NULL)
Sets the track of the given Type and Index to the given values.
void SetExplicitModify(void)
If you have obtained a write lock on this list, and you don't want it to be automatically marked as m...
int GetNumSequences(void) const
Returns the actual number of sequences to be cut from the recording.
int EPGLanguages[I18N_MAX_LANGUAGES+1]
virtual eOSState ProcessKey(eKeys Key)
eTrackType types[ttMaxTrackTypes]
void SetSubItems(bool On)
bool SetEventFromSchedule(const cSchedules *Schedules)
cSkinDisplayReplay * displayReplay
eOSState ProcessKey(eKeys Key)
static void Process(eKeys Key)
void ReNumber(void)
Recalculate 'number' based on channel type.
static cDisplayChannel * currentDisplayChannel
static int NumDevices(void)
Returns the total number of devices.
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...
void SetPending(bool Pending)
const cPositioner * positioner
static cRecordings * GetRecordingsWrite(cStateKey &StateKey, int TimeoutMs=0)
Gets the list of recordings for write access.
cString Folder(void) const
Returns the name of the folder this recording is stored in (without the video directory).
const cRecordingInfo * Info(void) const
void Exit(int ExitCode)
Set VDR exit code and initiate end of VDR main loop.
int weekdays
bitmask, lowest bits: SSFTWTM (the 'M' is the LSB)
virtual void ClearEditingMarks(void)
Clears any editing marks this player might be showing.
void SetPosition(int Position)
void SetText(const char *Text)
static bool StateChanged(int &State)
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)...
cString ChannelString(const cChannel *Channel, int Number)
static bool OsdSizeChanged(int &State)
Checks if the OSD size has changed and a currently displayed OSD needs to be redrawn.
int GetThemeIndex(const char *Description)
#define LOCK_CHANNELS_WRITE
virtual void SetJump(const char *Jump)=0
Sets the prompt that allows the user to enter a jump point.
static int MaxNumber(void)
void Add(cTimer *Timer, cTimer *After=NULL)
eTrackType GetCurrentAudioTrack(void) const
virtual eOSState ProcessKey(eKeys Key)
virtual bool ProvidesSource(int Source) const
Returns true if this device can provide the given source.
void SetNeedsFastResponse(bool NeedsFastResponse)
void I18nSetLocale(const char *Locale)
Sets the current locale to Locale.
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...
void SetSyncStateKey(cStateKey &StateKey)
When making changes to this list (while holding a write lock) that shall not affect some other code t...
virtual eModuleStatus ModuleStatus(void)
Returns the status of the CAM in this slot.
const cChannel * NextAvailableChannel(const cChannel *Channel, int Direction)
virtual bool IsMoving(void) const
Returns true if the dish is currently moving as a result of a call to GotoPosition() or GotoAngle()...
void StopSVDRPHandler(void)
const int * Apids(void) const
virtual void SetRecording(const cRecording *Recording)
Sets the recording that is currently being played.
cNestedItemList RecordingCommands
static cTimers * GetTimersWrite(cStateKey &StateKey, int TimeoutMs=0)
Gets the list of timers for write access.
cString IndexToHMSF(int Index, bool WithFrame, double FramesPerSecond)
bool SetCurrentAudioTrack(eTrackType Type)
Sets the current audio track to the given Type.
static void SetRecording(const char *FileName)
static int CurrentVolume(void)
cString PrintFirstDay(void) const
bool ChangeName(const char *NewName)
Changes the name of this recording to the given value.
A steerable satellite dish generally points to the south on the northern hemisphere, and to the north on the southern hemisphere (unless you're located directly on the equator, in which case the general direction is "up").
void EnsureSubtitleTrack(void)
Makes sure one of the preferred language subtitle tracks is selected.
static const char * Name(void)
virtual const char * Description(void)=0
static cChannels * GetChannelsWrite(cStateKey &StateKey, int TimeoutMs=0)
Gets the list of channels for write access.
cDisplayChannel(int Number, bool Switched)
virtual void SetMarks(const cMarks *Marks)
Sets the editing marks to Marks, which shall be used to display the progress bar through a cProgressB...
static int CurrentChannel(void)
Returns the number of the current channel on the primary device.
const char * I18nLocale(int Language)
Returns the locale code of the given Language (which is an index as returned by I18nCurrentLanguage()...
void Del(cChannel *Channel)
Delete the given Channel from the list.
static cPlugin * CallFirstService(const char *Id, void *Data=NULL)
static cDisplayTracks * currentDisplayTracks
void MarkMove(int Frames, bool MarkRequired)
void GetRecordingsSortMode(const char *Directory)
cMenuCommands(const char *Title, cList< cNestedItem > *Commands, const char *Parameters=NULL)
const cMark * Get(int Position) const
virtual void Flush(void)
Actually draws the OSD display to the output device.
const int * Dpids(void) const
static bool BondDevices(const char *Bondings)
Bonds the devices as defined in the given Bondings string.
char * descriptions[ttMaxTrackTypes+1]
virtual cOsdItem * GetOsdItem(void)=0
Returns all the OSD items necessary for editing the source specific parameters of the channel that wa...
virtual void Insert(T Data, int Before=0)
void SetRemote(const char *Remote)
time_t FirstDay(void) const
bool HasUniqueChannelID(const cChannel *NewChannel, const cChannel *OldChannel=NULL) const
int AdaptiveSkipAlternate
int SubtitleFgTransparency
const char *const * Descriptions(void)
virtual ~cDisplayVolume()
void SetMarks(const cMarks *Marks)
cStateKey StateKeySVDRPRemoteTimersPoll
Controls whether a change to the local list of timers needs to result in sending a POLL to the remote...
void StartSVDRPHandler(void)
virtual bool HasUserIO(void)
Returns true if there is a pending user interaction, which shall be retrieved via GetMenu() or GetEnq...
double FramesPerSecond(void) const
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...
cListObject * Prev(void) const
virtual cOsdObject * GetInfo(void)
Returns an OSD object that displays information about the currently played programme.
virtual cCiMenu * GetMenu(void)
Gets a pending menu, or NULL if there is no menu.
cSkinDisplayTracks * displayTracks
bool FromString(const char *s)
bool SwitchChannel(const cChannel *Channel, bool LiveView)
Switches the device to the given Channel, initiating transfer mode if necessary.
virtual cSkinDisplayReplay * DisplayReplay(bool ModeOnly)=0
Creates and returns a new object for displaying replay progress.
const char * Text(void) const
#define LOCK_CHANNELS_READ
char FontOsd[MAXFONTNAME]
const char * Description(void)
Returns a user visible, single line description of this theme.
#define LOCK_RECORDINGS_WRITE
static cString EditedFileName(const char *FileName)
Returns the full path name of the edited version of the recording with the given FileName.
bool GroupSep(void) const
static int GetMDay(time_t t)
static void SleepMs(int TimeoutMs)
Creates a cCondWait object and uses it to sleep for TimeoutMs milliseconds, immediately giving up the...
cOsdItem * cancelEditingItem
void SetText(const char *Text, bool Copy=true)
cSkinDisplayVolume * displayVolume
void SetSelectable(bool Selectable)
bool IsAttached(void)
Returns true if this receiver is (still) attached to a device.
static void MsgSetAudioChannel(int AudioChannel)
bool Load(const char *FileName, bool OnlyDescriptions=false)
Loads the theme data from the given file.
void ClrAvailableTracks(bool DescriptionsOnly=false, bool IdsOnly=false)
Clears the list of currently available tracks.
static void UpdateOsdSize(bool Force=false)
Inquires the actual size of the video display and adjusts the OSD and font sizes accordingly.
const char * ShortText(void) const
cSourceParams SourceParams
static const cCursesFont Font
bool Open(const char *Command, const char *Mode)
#define LOCK_TIMERS_WRITE
#define IS_AUDIO_TRACK(t)
static bool Process(cTimers *Timers, time_t t)
int SubtitleLanguages[I18N_MAX_LANGUAGES+1]
virtual cMenuSetupPage * SetupMenu(void)
virtual ~cDisplayChannel()
bool Delete(void)
Changes the file name so that it will no longer be visible in the "Recordings" menu Returns false in ...
cList< cNestedItem > * SubItems(void)
bool Put(uint64_t Code, bool Repeat=false, bool Release=false)
cShutdownHandler ShutdownHandler
const char * InstantId(void)
cSkinDisplayTracks * displayTracks
static int IsOpen(void)
Returns true if there is currently a level 0 OSD open.
const cSchedule * GetSchedule(tChannelID ChannelID) const
virtual ~cReplayControl()
const T * Last(void) const
Returns the last element in this list, or NULL if the list is empty.
int Find(const char *s) const
static void Stop(const char *InstantId)
void Sort(__compar_fn_t Compare)
const cChannel * Channel(void) const
static cDisplaySubtitleTracks * Create(void)
cRecordingsHandler RecordingsHandler
bool HasMarks(void) const
Returns true if this recording has any editing marks.
virtual ~cRecordControl()
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...
#define RUC_AFTERRECORDING
int CardIndex(void) const
Returns the card index of this device (0 ... MAXDEVICES - 1).
static void TouchUpdate(void)
Touches the '.update' file in the video directory, so that other instances of VDR that access the sam...
cString & CompactChars(char c)
Compact any sequence of characters 'c' to a single character, and strip all of them from the beginnin...
void Stop(bool ExecuteUserCommand=true)
const T * Prev(const T *Object) const
cCamSlot * MasterSlot(void)
Returns this CAM slot's master slot, or a pointer to itself if it is a master slot.
bool GetIndex(int &Current, int &Total, bool SnapToIFrame=false)
static void Launch(cControl *Control)
void MarkJump(bool Forward)
static const char * LastReplayed(void)
const cChannel * GetByNumber(int Number, int SkipGap=0) const
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 void MsgOsdTextItem(const char *Text, bool Scroll=false)
virtual eOSState ProcessKey(eKeys Key)
const T * First(void) const
Returns the first element in this list, or NULL if the list is empty.
bool ShowProgress(bool Initial)
bool IsPesRecording(void) const
virtual bool Reset(void)
Resets the CAM in this slot.
tChannelID ChannelID(void) const
static cDisplaySubtitleTracks * currentDisplayTracks
const char * Name(void) const
int GetUsage(const char *FileName)
Returns the usage type for the given FileName.
eOSState ProcessKey(eKeys Key)
bool GetReplayMode(bool &Play, bool &Forward, int &Speed)
static const char * GetInstantId(const char *LastInstantId)
int GetNextNormal(int Idx) const
Get next normal channel (not group)
const char * DefaultFontFix
static bool HasPlugins(void)
static void TriggerLastActivity(void)
Simulates user activity, for instance to keep the current menu open even if no remote control key has...
static void MsgSetAudioTrack(int Index, const char *const *Tracks)
static void MsgOsdProgramme(time_t PresentTime, const char *PresentTitle, const char *PresentSubtitle, time_t FollowingTime, const char *FollowingTitle, const char *FollowingSubtitle)
const char * Name(int Index)
const cComponents * Components(void) const
static cRecordControl * RecordControls[]
cString GetRecordingTimerId(const char *Directory)
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...
void TimeSearchProcess(eKeys Key)
char SVDRPHostName[HOST_NAME_MAX]
virtual cCiEnquiry * GetEnquiry(void)
Gets a pending enquiry, or NULL if there is no enquiry.
static void ClearLastReplayed(const char *FileName)
static int VideoDiskSpace(int *FreeMB=NULL, int *UsedMB=NULL)
static void MsgOsdChannel(const char *Text)
static void MsgSetSubtitleTrack(int Index, const char *const *Tracks)
const cMark * GetPrev(int Position) const
const char * Title(void) const
const cEvent * lastFollowing
cAdaptiveSkipper adaptiveSkipper
static bool DeleteMarksFile(const cRecording *Recording)
virtual eOSState ProcessKey(eKeys Key)
virtual const char * MainMenuEntry(void)
void Del(cListObject *Object, bool DeleteObject=true)
static void Process(eKeys Key)
time_t StopTime(void) const
void DelAll(void)
Deletes/terminates all operations.
char FontFix[MAXFONTNAME]
int ShowChannelNamesWithSource
int DeviceNumber(void) const
Returns the number of this device (0 ... numDevices - 1).
const cMark * GetNext(int Position) const
static void Process(eKeys Key)
static void MsgOsdClear(void)
const cEvent * Event(void) const
void EnsureAudioTrack(bool Force=false)
Makes sure an audio track is selected that is actually available.
int AudioLanguages[I18N_MAX_LANGUAGES+1]
static cOsdObject * pluginOsdObject
void Reply(const char *s)
static cDevice * PrimaryDevice(void)
Returns the primary device.
#define LOCK_RECORDINGS_READ
void SetFlags(uint Flags)
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".
bool Active(void)
Checks whether the thread is still alive.
static bool GetAvailableFontNames(cStringList *FontNames, bool Monospaced=false)
Queries the font configuration for a list of available font names, which is returned in FontNames...
#define MAXEPGBUGFIXLEVEL
const cStringList * I18nLanguages(void)
Returns the list of available languages.
virtual bool HasMMI(void)
Returns 'true' if the CAM in this slot has an active MMI.
void SetDeferred(int Seconds)
virtual ~cDisplayTracks()
cSourceParam * Get(char Source)
bool Recording(void) const
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...
const char * Remote(void) const
static cDisplayTracks * Create(void)
void StopReplay(void)
Stops the current replay session (if any).
bool Selectable(void) const
const tTrackId * GetTrack(eTrackType Type)
Returns a pointer to the given track id, or NULL if Type is not less than ttMaxTrackTypes.
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...
cSkinDisplayChannel * displayChannel
int GetAudioChannel(void)
Gets the current audio channel, which is stereo (0), mono left (1) or mono right (2).
int I18nNumLanguagesWithLocale(void)
Returns the number of entries in the list returned by I18nLanguages() that actually have a locale...
virtual void Move(int From, int To)
bool Transferring(void) const
Returns true if we are currently in Transfer Mode.
const char * Description(void) const
cListObject * Next(void) const
bool ConfirmRestart(bool Ask)
Check for background activity that blocks restart.
static cReplayControl * currentReplayControl
static void SetCurrentChannel(const cChannel *Channel)
void Add(int Position)
If this cMarks object is used by multiple threads, the caller must Lock() it before calling Add() and...
void IncRecordingsSortMode(const char *Directory)
virtual void CancelActivation(void)
Cancels a previously started activation (if any).
static void MsgMarksModified(const cMarks *Marks)
static void ChangeState(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...
virtual void SetAudioChannel(int AudioChannel)=0
Sets the audio channel indicator.
eTrackType types[ttMaxTrackTypes]
static cRecordControl * GetRecordControl(const char *FileName)
void DelByName(const char *FileName)
static cPlugin * GetPlugin(int Index)
bool IsSingleEvent(void) const
virtual ~cDisplaySubtitleTracks()
void Sort(bool IgnoreCase=false)
int SecondsToFrames(int Seconds, double FramesPerSecond)
static cDevice * ActualDevice(void)
Returns the actual receiving device in case of Transfer Mode, or the primary device otherwise...
virtual bool Filter(const cRecording *Recording) const =0
Returns true if the given Recording shall be displayed in the Recordings menu.
int Priority(void)
Returns the priority of the device this slot is currently assigned to, or IDLEPRIORITY if it is not a...
cString GetTimeString(void) const
void SetKeepTracks(bool KeepTracks)
Controls whether the current audio and subtitle track settings shall be kept as they currently are...
double FramesPerSecond(void) const
virtual void SetPositioner(const cPositioner *Positioner)
Sets the Positioner used to move the satellite dish.
int IsInUse(void) const
Checks whether this recording is currently in use and therefore shall not be tampered with...
char language[MAXLANGCODE2]
bool HandleRemoteTimerModifications(cTimer *NewTimer, cTimer *OldTimer, cString *Msg)
Performs any operations necessary to synchronize changes to a timer between peer VDR machines...
void I18nSetLanguage(int Language)
Sets the current language index to Language.
bool Load(const char *RecordingFileName, double FramesPerSecond=DEFAULTFRAMESPERSECOND, bool IsPesRecording=false)
static cOsdObject * PluginOsdObject(void)
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...
char NameInstantRecord[NAME_MAX+1]
virtual bool EnterMenu(void)
Requests the CAM in this slot to start its menu.
virtual void SetEvents(const cEvent *Present, const cEvent *Following)=0
Sets the Present and Following EPG events.
void SetAudioChannel(int AudioChannel)
Sets the audio channel to stereo (0), mono left (1) or mono right (2).
cReplayControl(bool PauseLive=false)
virtual int Compare(const cListObject &ListObject) const
Must return 0 if this object is equal to ListObject, a positive value if it is "greater", and a negative value if it is "smaller".
static bool Start(cTimers *Timers, cTimer *Timer, bool Pause=false)
void Goto(int Index, bool Still=false)
bool SwitchTo(int Number) const
int SkipFrames(int Frames)
#define IS_DOLBY_TRACK(t)
void Initialize(int *InitialValue, double FramesPerSecond)
char * ExchangeChars(char *s, bool ToFileSystem)
const char * FileName(int Index)
tComponent * Component(int Index) const
#define LOCK_SCHEDULES_READ
bool GetFrameNumber(int &Current, int &Total)
const char * ShortName(bool OrName=false) const
char OSDTheme[MaxThemeName]
bool SetCurrentSubtitleTrack(eTrackType Type, bool Manual=false)
Sets the current subtitle track to the given Type.
const char * DefaultFontOsd
#define MAXVIDEOFILESIZETS
char OSDSkin[MaxSkinName]
static bool PauseLiveVideo(void)
cSkin * Current(void)
Returns a pointer to the current skin.
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)
static void ForceCheck(void)
To avoid unnecessary load, the video disk usage is only actually checked every DISKSPACECHEK seconds...
static const cTimers * GetTimersRead(cStateKey &StateKey, int TimeoutMs=0)
Gets the list of timers for read access.
virtual bool IsActivating(void)
Returns true if this CAM slot is currently activating a smart card.
void Del(cTimer *Timer, bool DeleteObject=true)
void SkipSeconds(int Seconds)
bool Update(bool Force=false)
const cEvent * lastPresent
virtual cSkinDisplayTracks * DisplayTracks(const char *Title, int NumTracks, const char *const *Tracks)=0
Creates and returns a new object for displaying the available tracks.
bool SetCurrent(const char *Name=NULL)
Sets the current skin to the one indicated by name.
void SetModified(void)
Unconditionally marks this list as modified.
static void Shutdown(void)
virtual cSkinDisplayChannel * DisplayChannel(bool WithInfo)=0
Creates and returns a new object for displaying the current channel.
static void ChannelDataModified(const cChannel *Channel)
void Del(const char *FileName)
Deletes the given FileName from the list of operations.
bool Replaying(void) const
Returns true if we are currently replaying.
char OSDLanguage[I18N_MAX_LOCALE_LEN]
void SetModifiedByUser(void)
void RequestEmergencyExit(void)
Requests an emergency exit of the VDR main loop.
static cDisplayVolume * currentDisplayVolume
int SubtitleBgTransparency
int SlotNumber(void)
Returns the number of this CAM slot within the whole system.
bool Add(int Usage, const char *FileNameSrc, const char *FileNameDst=NULL)
Adds the given FileNameSrc to the recordings handler for (later) processing.
static void MsgRecording(const cDevice *Device, const char *Name, const char *FileName, bool On)
time_t StartTime(void) const
cRecordControl(cDevice *Device, cTimers *Timers, cTimer *Timer=NULL, bool Pause=false)
static const char * NowReplaying(void)
char * descriptions[ttMaxTrackTypes+1]
const char * Text(void) const
virtual void SetData(cChannel *Channel)=0
Sets all source specific parameters to those of the given Channel.
static void MsgReplaying(const cControl *Control, const char *Name, const char *FileName, bool On)
static cString PrintDay(time_t Day, int WeekDays, bool SingleByteChars)
virtual void SetChannel(const cChannel *Channel, int Number)=0
Sets the current channel to Channel.
cDevice * Device(void)
Returns the device this CAM slot is currently assigned to.
const char * File(void) const
int SVDRPCode(const char *s)
Returns the value of the three digit reply code of the given SVDRP response string.
bool TimedOut(void) const
const char * Description(void) const
const T * Next(const T *Object) const
< Returns the element immediately before Object in this list, or NULL if Object is the first element ...
eTrackType GetCurrentSubtitleTrack(void) const