35 #include <sys/capability.h>
36 #include <sys/prctl.h>
70 #define MINCHANNELWAIT 10 // seconds to wait between failed channel switchings
71 #define ACTIVITYTIMEOUT 60 // seconds before starting housekeeping
72 #define SHUTDOWNWAIT 300 // seconds to wait in user prompt before automatic shutdown
73 #define SHUTDOWNRETRY 360 // seconds before trying again to shut down
74 #define SHUTDOWNFORCEPROMPT 5 // seconds to wait in user prompt to allow forcing shutdown
75 #define SHUTDOWNCANCELPROMPT 5 // seconds to wait in user prompt to allow canceling shutdown
76 #define RESTARTCANCELPROMPT 5 // seconds to wait in user prompt before restarting on SIGHUP
77 #define MANUALSTART 600 // seconds the next timer must be in the future to assume manual start
78 #define CHANNELSAVEDELTA 600 // seconds before saving channels.conf after automatic modifications
79 #define DEVICEREADYTIMEOUT 30 // seconds to wait until all devices are ready
80 #define MENUTIMEOUT 120 // seconds of user inactivity after which an OSD display is closed
81 #define TIMERCHECKDELTA 10 // seconds between checks for timers that need to see their channel
82 #define TIMERDEVICETIMEOUT 8 // seconds before a device used for timer check may be reused
83 #define TIMERLOOKAHEADTIME 60 // seconds before a non-VPS timer starts and the channel is switched if possible
84 #define VPSLOOKAHEADTIME 24 // hours within which VPS timers will make sure their events are up to date
85 #define VPSUPTODATETIME 3600 // seconds before the event or schedule of a VPS timer needs to be refreshed
87 #define EXIT(v) { ShutdownHandler.Exit(v); goto Exit; }
91 static bool SetUser(
const char *UserName,
bool UserDump)
94 struct passwd *user = getpwnam(UserName);
96 fprintf(stderr,
"vdr: unknown user: '%s'\n", UserName);
99 if (setgid(user->pw_gid) < 0) {
100 fprintf(stderr,
"vdr: cannot set group id %u: %s\n", (
unsigned int)user->pw_gid, strerror(errno));
103 if (initgroups(user->pw_name, user->pw_gid) < 0) {
104 fprintf(stderr,
"vdr: cannot set supplemental group ids for user %s: %s\n", user->pw_name, strerror(errno));
107 if (setuid(user->pw_uid) < 0) {
108 fprintf(stderr,
"vdr: cannot set user id %u: %s\n", (
unsigned int)user->pw_uid, strerror(errno));
111 if (UserDump && prctl(PR_SET_DUMPABLE, 1, 0, 0, 0) < 0)
112 fprintf(stderr,
"vdr: warning - cannot set dumpable: %s\n", strerror(errno));
113 setenv(
"HOME", user->pw_dir, 1);
114 setenv(
"USER", user->pw_name, 1);
115 setenv(
"LOGNAME", user->pw_name, 1);
116 setenv(
"SHELL", user->pw_shell, 1);
124 cap_t caps = cap_from_text(
"= cap_sys_nice,cap_sys_time,cap_net_raw=ep");
126 fprintf(stderr,
"vdr: cap_from_text failed: %s\n", strerror(errno));
129 if (cap_set_proc(caps) == -1) {
130 fprintf(stderr,
"vdr: cap_set_proc failed: %s\n", strerror(errno));
141 if (prctl(PR_SET_KEEPCAPS, On ? 1 : 0, 0, 0, 0) != 0) {
142 fprintf(stderr,
"vdr: prctl failed\n");
168 esyslog(
"PANIC: watchdog timer expired - exiting!");
172 int main(
int argc,
char *argv[])
176 struct termios savedTm;
177 bool HasStdin = (tcgetpgrp(STDIN_FILENO) == getpid() || getppid() != (pid_t)1) && tcgetattr(STDIN_FILENO, &savedTm) == 0;
181 setlocale(LC_ALL,
"");
185 #define dd(a, b) (*a ? a : b)
186 #define DEFAULTSVDRPPORT 6419
187 #define DEFAULTWATCHDOG 0 // seconds
188 #define DEFAULTVIDEODIR VIDEODIR
189 #define DEFAULTCONFDIR dd(CONFDIR, VideoDirectory)
190 #define DEFAULTCACHEDIR dd(CACHEDIR, VideoDirectory)
191 #define DEFAULTRESDIR dd(RESDIR, ConfigDirectory)
192 #define DEFAULTPLUGINDIR PLUGINDIR
193 #define DEFAULTLOCDIR LOCDIR
194 #define DEFAULTEPGDATAFILENAME "epg.data"
196 bool StartedAsRoot =
false;
197 const char *VdrUser = NULL;
198 bool UserDump =
false;
200 const char *AudioCommand = NULL;
202 const char *ConfigDirectory = NULL;
203 const char *CacheDirectory = NULL;
204 const char *ResourceDirectory = NULL;
207 bool DisplayHelp =
false;
208 bool DisplayVersion =
false;
209 bool DaemonMode =
false;
210 int SysLogTarget = LOG_USER;
211 bool MuteAudio =
false;
213 const char *Terminal = NULL;
216 const char *LircDevice = NULL;
217 #if !defined(REMOTE_KBD)
220 #if defined(REMOTE_LIRC)
221 LircDevice = LIRC_DEVICE;
223 #if defined(VDR_USER)
230 static struct option long_options[] = {
231 {
"audio", required_argument, NULL,
'a' },
232 {
"cachedir", required_argument, NULL,
'c' | 0x100 },
233 {
"config", required_argument, NULL,
'c' },
234 {
"daemon", no_argument, NULL,
'd' },
235 {
"device", required_argument, NULL,
'D' },
236 {
"dirnames", required_argument, NULL,
'd' | 0x100 },
237 {
"edit", required_argument, NULL,
'e' | 0x100 },
238 {
"epgfile", required_argument, NULL,
'E' },
239 {
"filesize", required_argument, NULL,
'f' | 0x100 },
240 {
"genindex", required_argument, NULL,
'g' | 0x100 },
241 {
"grab", required_argument, NULL,
'g' },
242 {
"help", no_argument, NULL,
'h' },
243 {
"instance", required_argument, NULL,
'i' },
244 {
"lib", required_argument, NULL,
'L' },
245 {
"lirc", optional_argument, NULL,
'l' | 0x100 },
246 {
"localedir",required_argument, NULL,
'l' | 0x200 },
247 {
"log", required_argument, NULL,
'l' },
248 {
"mute", no_argument, NULL,
'm' },
249 {
"no-kbd", no_argument, NULL,
'n' | 0x100 },
250 {
"plugin", required_argument, NULL,
'P' },
251 {
"port", required_argument, NULL,
'p' },
252 {
"record", required_argument, NULL,
'r' },
253 {
"resdir", required_argument, NULL,
'r' | 0x100 },
254 {
"shutdown", required_argument, NULL,
's' },
255 {
"split", no_argument, NULL,
's' | 0x100 },
256 {
"terminal", required_argument, NULL,
't' },
257 {
"user", required_argument, NULL,
'u' },
258 {
"userdump", no_argument, NULL,
'u' | 0x100 },
259 {
"version", no_argument, NULL,
'V' },
260 {
"vfat", no_argument, NULL,
'v' | 0x100 },
261 {
"video", required_argument, NULL,
'v' },
262 {
"watchdog", required_argument, NULL,
'w' },
263 { NULL, no_argument, NULL, 0 }
267 while ((c = getopt_long(argc, argv,
"a:c:dD:e:E:g:hi:l:L:mp:P:r:s:t:u:v:Vw:", long_options, NULL)) != -1) {
269 case 'a': AudioCommand = optarg;
272 CacheDirectory = optarg;
274 case 'c': ConfigDirectory = optarg;
276 case 'd': DaemonMode =
true;
279 int n = atoi(optarg);
285 fprintf(stderr,
"vdr: invalid DVB device number: %s\n", optarg);
290 int n = strtol(s, &s, 10);
291 if (n <= 0 || n >= PATH_MAX) {
292 fprintf(stderr,
"vdr: invalid directory path length: %s\n", optarg);
299 fprintf(stderr,
"vdr: invalid delimiter: %s\n", optarg);
307 int n = strtol(s, &s, 10);
308 if (n <= 0 || n > NAME_MAX) {
309 fprintf(stderr,
"vdr: invalid directory name length: %s\n", optarg);
316 fprintf(stderr,
"vdr: invalid delimiter: %s\n", optarg);
323 int n = strtol(s, &s, 10);
324 if (n != 0 && n != 1) {
325 fprintf(stderr,
"vdr: invalid directory encoding: %s\n", optarg);
330 fprintf(stderr,
"vdr: unexpected data: %s\n", optarg);
337 case 'E': EpgDataFileName = (*optarg !=
'-' ? optarg : NULL);
350 case 'h': DisplayHelp =
true;
357 fprintf(stderr,
"vdr: invalid instance id: %s\n", optarg);
360 char *p = strchr(optarg,
'.');
364 int l = atoi(optarg);
365 if (0 <= l && l <= 3) {
371 if (0 <= l && l <= 7) {
372 int targets[] = { LOG_LOCAL0, LOG_LOCAL1, LOG_LOCAL2, LOG_LOCAL3, LOG_LOCAL4, LOG_LOCAL5, LOG_LOCAL6, LOG_LOCAL7 };
373 SysLogTarget = targets[l];
381 fprintf(stderr,
"vdr: invalid log level: %s\n", optarg);
384 case 'L':
if (access(optarg, R_OK | X_OK) == 0)
387 fprintf(stderr,
"vdr: can't access plugin directory: %s\n", optarg);
392 LircDevice = optarg ? optarg : LIRC_DEVICE;
395 if (access(optarg, R_OK | X_OK) == 0)
396 LocaleDirectory = optarg;
398 fprintf(stderr,
"vdr: can't access locale directory: %s\n", optarg);
402 case 'm': MuteAudio =
true;
408 SVDRPport = atoi(optarg);
410 fprintf(stderr,
"vdr: invalid port number: %s\n", optarg);
414 case 'P': PluginManager.
AddPlugin(optarg);
419 ResourceDirectory = optarg;
426 case 't': Terminal = optarg;
427 if (access(Terminal, R_OK | W_OK) < 0) {
428 fprintf(stderr,
"vdr: can't access terminal: %s\n", Terminal);
432 case 'u':
if (*optarg)
438 case 'V': DisplayVersion =
true;
445 case 'v': VideoDirectory = optarg;
446 while (optarg && *optarg && optarg[strlen(optarg) - 1] ==
'/')
447 optarg[strlen(optarg) - 1] = 0;
451 int t = atoi(optarg);
457 fprintf(stderr,
"vdr: invalid watchdog timeout: %s\n", optarg);
465 if (VdrUser && geteuid() == 0) {
466 StartedAsRoot =
true;
467 if (strcmp(VdrUser,
"root")) {
470 if (!
SetUser(VdrUser, UserDump))
481 if (DisplayHelp || DisplayVersion) {
486 printf(
"Usage: vdr [OPTIONS]\n\n"
487 " -a CMD, --audio=CMD send Dolby Digital audio to stdin of command CMD\n"
488 " --cachedir=DIR save cache files in DIR (default: %s)\n"
489 " -c DIR, --config=DIR read config files from DIR (default: %s)\n"
490 " -d, --daemon run in daemon mode\n"
491 " -D NUM, --device=NUM use only the given DVB device (NUM = 0, 1, 2...)\n"
492 " there may be several -D options (default: all DVB\n"
493 " devices will be used)\n"
494 " --dirnames=PATH[,NAME[,ENC]]\n"
495 " set the maximum directory path length to PATH\n"
496 " (default: %d); if NAME is also given, it defines\n"
497 " the maximum directory name length (default: %d);\n"
498 " the optional ENC can be 0 or 1, and controls whether\n"
499 " special characters in directory names are encoded as\n"
500 " hex values (default: 0); if PATH or NAME are left\n"
501 " empty (as in \",,1\" to only set ENC), the defaults\n"
503 " --edit=REC cut recording REC and exit\n"
504 " -E FILE, --epgfile=FILE write the EPG data into the given FILE (default is\n"
505 " '%s' in the cache directory)\n"
506 " '-E-' disables this\n"
507 " if FILE is a directory, the default EPG file will be\n"
508 " created in that directory\n"
509 " --filesize=SIZE limit video files to SIZE bytes (default is %dM)\n"
510 " only useful in conjunction with --edit\n"
511 " --genindex=REC generate index for recording REC and exit\n"
512 " -g DIR, --grab=DIR write images from the SVDRP command GRAB into the\n"
513 " given DIR; DIR must be the full path name of an\n"
514 " existing directory, without any \"..\", double '/'\n"
515 " or symlinks (default: none, same as -g-)\n"
516 " -h, --help print this help and exit\n"
517 " -i ID, --instance=ID use ID as the id of this VDR instance (default: 0)\n"
518 " -l LEVEL, --log=LEVEL set log level (default: 3)\n"
519 " 0 = no logging, 1 = errors only,\n"
520 " 2 = errors and info, 3 = errors, info and debug\n"
521 " if logging should be done to LOG_LOCALn instead of\n"
522 " LOG_USER, add '.n' to LEVEL, as in 3.7 (n=0..7)\n"
523 " -L DIR, --lib=DIR search for plugins in DIR (default is %s)\n"
524 " --lirc[=PATH] use a LIRC remote control device, attached to PATH\n"
526 " --localedir=DIR search for locale files in DIR (default is\n"
528 " -m, --mute mute audio of the primary DVB device at startup\n"
529 " --no-kbd don't use the keyboard as an input device\n"
530 " -p PORT, --port=PORT use PORT for SVDRP (default: %d)\n"
531 " 0 turns off SVDRP\n"
532 " -P OPT, --plugin=OPT load a plugin defined by the given options\n"
533 " -r CMD, --record=CMD call CMD before and after a recording, and after\n"
534 " a recording has been edited or deleted\n"
535 " --resdir=DIR read resource files from DIR (default: %s)\n"
536 " -s CMD, --shutdown=CMD call CMD to shutdown the computer\n"
537 " --split split edited files at the editing marks (only\n"
538 " useful in conjunction with --edit)\n"
539 " -t TTY, --terminal=TTY controlling tty\n"
540 " -u USER, --user=USER run as user USER; only applicable if started as\n"
542 " --userdump allow coredumps if -u is given (debugging)\n"
543 " -v DIR, --video=DIR use DIR as video directory (default: %s)\n"
544 " -V, --version print version information and exit\n"
545 " --vfat for backwards compatibility (same as\n"
546 " --dirnames=250,40,1)\n"
547 " -w SEC, --watchdog=SEC activate the watchdog timer with a timeout of SEC\n"
548 " seconds (default: %d); '0' disables the watchdog\n"
569 printf(
"Plugins: vdr -P\"name [OPTIONS]\"\n\n");
570 for (
int i = 0; ; i++) {
575 if (DisplayHelp && help) {
590 openlog(
"vdr", LOG_CONS, SysLogTarget);
595 fprintf(stderr,
"vdr: can't access video directory %s\n", VideoDirectory);
602 if (daemon(1, 0) == -1) {
603 fprintf(stderr,
"vdr: %m\n");
610 stdin = freopen(Terminal,
"r", stdin);
611 stdout = freopen(Terminal,
"w", stdout);
612 stderr = freopen(Terminal,
"w", stderr);
614 tcgetattr(STDIN_FILENO, &savedTm);
618 if (StartedAsRoot && VdrUser)
619 isyslog(
"switched to user '%s'", VdrUser);
626 char *CodeSet = NULL;
627 if (setlocale(LC_CTYPE,
""))
628 CodeSet = nl_langinfo(CODESET);
630 char *LangEnv = getenv(
"LANG");
632 CodeSet = strchr(LangEnv,
'.');
639 isyslog(
"codeset is '%s' - %s", CodeSet, known ?
"known" :
"unknown");
652 int LastTimerChannel = -1;
653 int PreviousChannel[2] = { 1, 1 };
654 int PreviousChannelIndex = 0;
655 time_t LastChannelChanged = time(NULL);
656 time_t LastInteract = 0;
657 int MaxLatencyTime = 0;
658 bool InhibitEpgScan =
false;
659 bool IsInfoMenu =
false;
660 cSkin *CurrentSkin = NULL;
669 if (!ConfigDirectory)
675 if (!ResourceDirectory)
697 const char *msg =
"no fonts available - OSD will not show any text!";
698 fprintf(stderr,
"vdr: %s\n", msg);
709 if (EpgDataFileName) {
710 const char *EpgDirectory = NULL;
712 EpgDirectory = EpgDataFileName;
715 else if (*EpgDataFileName !=
'/' && *EpgDataFileName !=
'.')
716 EpgDirectory = CacheDirectory;
721 EpgDataReader.
Start();
743 isyslog(
"trying device number %d instead", i + 1);
751 const char *msg =
"no primary device found - using first device!";
752 fprintf(stderr,
"vdr: %s\n", msg);
757 const char *msg =
"no primary device found - giving up!";
758 fprintf(stderr,
"vdr: %s\n", msg);
797 if (!DaemonMode && HasStdin && UseKbd)
828 if (signal(SIGHUP,
SignalHandler) == SIG_IGN) signal(SIGHUP, SIG_IGN);
829 if (signal(SIGINT,
SignalHandler) == SIG_IGN) signal(SIGINT, SIG_IGN);
830 if (signal(SIGTERM,
SignalHandler) == SIG_IGN) signal(SIGTERM, SIG_IGN);
831 if (signal(SIGPIPE,
SignalHandler) == SIG_IGN) signal(SIGPIPE, SIG_IGN);
832 if (WatchdogTimeout > 0)
833 if (signal(SIGALRM,
Watchdog) == SIG_IGN) signal(SIGALRM, SIG_IGN);
837 if (WatchdogTimeout > 0) {
838 dsyslog(
"setting watchdog timer to %d seconds", WatchdogTimeout);
839 alarm(WatchdogTimeout);
844 #define DELETE_MENU ((IsInfoMenu &= (Menu == NULL)), delete Menu, Menu = NULL)
847 #ifdef DEBUGRINGBUFFERS
848 cRingBufferLinear::PrintDebugRBL();
853 time_t Now = time(NULL);
857 static time_t lastTime = 0;
861 if (Channel && (Channel->
Vpid() || Channel->
Apid(0) || Channel->
Dpid(0))) {
864 else if (LastTimerChannel > 0) {
871 LastTimerChannel = -1;
879 static time_t lastOsdSizeUpdate = 0;
880 if (Now != lastOsdSizeUpdate) {
882 lastOsdSizeUpdate = Now;
886 if (WatchdogTimeout > 0) {
887 int LatencyTime = WatchdogTimeout - alarm(WatchdogTimeout);
888 if (LatencyTime > MaxLatencyTime) {
889 MaxLatencyTime = LatencyTime;
890 dsyslog(
"max. latency time %d seconds", MaxLatencyTime);
896 static time_t ChannelSaveTimeout = 0;
897 static int TimerState = 0;
901 ChannelSaveTimeout = 1;
902 else if (modified && !ChannelSaveTimeout)
904 bool timeout = ChannelSaveTimeout == 1 || ChannelSaveTimeout && Now > ChannelSaveTimeout && !
cRecordControls::Active();
905 if ((modified || timeout) &&
Channels.
Lock(
false, 100)) {
909 ChannelSaveTimeout = 0;
917 isyslog(
"retuning due to modification of channel %d", Channel->Number());
932 LastChannelChanged = Now;
934 if (Now - LastChannelChanged >=
Setup.
ZapTimeout && LastChannel != PreviousChannel[PreviousChannelIndex])
935 PreviousChannel[PreviousChannelIndex ^= 1] = LastChannel;
952 static time_t LastTimerCheck = 0;
954 InhibitEpgScan =
false;
956 bool InVpsMargin =
false;
957 bool NeedsTransponder =
false;
964 else if (Timer->
Event()) {
973 InVpsMargin = !Schedule;
977 InhibitEpgScan |= InVpsMargin | NeedsTransponder;
982 if (NeedsTransponder || InVpsMargin) {
985 if (!Device && InVpsMargin)
1002 LastTimerCheck = Now;
1033 bool WasOpen = Interact != NULL;
1034 bool WasMenu = Interact && Interact->
IsMenu();
1072 #define DirectMainFunction(function)\
1074 if (cControl::Control())\
1075 cControl::Control()->Hide();\
1076 Menu = new cMenuMain(function);\
1077 key = kNone; } // nobody else needs to see this key
1098 esyslog(
"ERROR: unknown plugin '%s'", PluginName);
1185 isyslog(
"Power button pressed");
1219 if (state ==
osEnd) {
1262 case osEnd:
if (Interact == Menu)
1280 if (PreviousChannel[PreviousChannelIndex ^ 1] == LastChannel || LastChannel != PreviousChannel[0] && LastChannel != PreviousChannel[1])
1281 PreviousChannelIndex ^= 1;
1305 case kOk: LastChannel = -1;
break;
1319 if (!InhibitEpgScan)
1385 esyslog(
"emergency exit requested - shutting down");
1390 signal(SIGHUP, SIG_DFL);
1391 signal(SIGINT, SIG_DFL);
1392 signal(SIGTERM, SIG_DFL);
1393 signal(SIGPIPE, SIG_DFL);
1394 signal(SIGALRM, SIG_DFL);
1418 if (WatchdogTimeout > 0)
1419 dsyslog(
"max. latency time %d seconds", MaxLatencyTime);
1428 tcsetattr(STDIN_FILENO, TCSANOW, &savedTm);
static void Watchdog(int signum)
void ClearVanishedRecordings(void)
bool Replaying(void) const
Returns true if we are currently replaying.
int DeviceNumber(void) const
Returns the number of this device (0 ... numDevices).
int Modified(void)
Returns 0 if no channels have been modified, 1 if an automatic modification has been made...
bool Update(bool Wait=false)
Triggers an update of the list of recordings, which will run as a separate thread if Wait is false...
void SetOccupied(int Seconds)
Sets the occupied timeout for this device to the given number of Seconds, This can be used to tune a ...
static void SetThemesDirectory(const char *ThemesDirectory)
static tChannelID FromString(const char *s)
bool ToggleMute(void)
Turns the volume off or on and returns the new mute state.
void CheckManualStart(int ManualStart)
Check whether the next timer is in ManualStart time window.
#define TIMERDEVICETIMEOUT
#define SHUTDOWNFORCEPROMPT
time_t EndTime(void) const
bool Confirm(const char *s, int Seconds=10, bool WaitForTimeout=false)
bool IsUserInactive(time_t AtTime=0)
Check whether VDR is in interactive mode or non-interactive mode (waiting for shutdown).
static bool Initialize(void)
Initializes the DVB devices.
bool LoadPlugins(bool Log=false)
bool Load(const char *SkinName)
virtual cOsdObject * GetInfo(void)
Returns an OSD object that displays information about the currently played programme.
void Shutdown(bool Log=false)
static void Shutdown(void)
virtual const char * Version(void)=0
cNestedItemList TimerCommands
static bool DropCaps(void)
#define RESTARTCANCELPROMPT
void SetVideoDirectory(const char *Directory)
const char * VideoDirectory
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.
void ReportEpgBugFixStats(bool Force)
virtual cOsdObject * MainMenuAction(void)
static cDisplayVolume * Create(void)
void ProcessQueuedMessages(void)
Processes the first queued message, if any.
cTimer * GetMatch(time_t t)
const cEvent * Event(void) const
static void ChannelDataModified(cChannel *Channel)
bool Matches(time_t t=0, bool Directly=false, int Margin=0) const
void SetUserInactive(void)
Set VDR manually into non-interactive mode from now on.
static cDevice * GetDevice(int Index)
Gets the device with the given Index.
void SetInVpsMargin(bool InVpsMargin)
static cControl * Control(bool Hidden=false)
Returns the current replay control (if any) in case it is currently visible.
static void Process(time_t t)
bool Load(const char *FileName=NULL, bool AllowComments=false, bool MustExist=false)
static void Process(eKeys Key)
bool Update(void)
Update status display of the countdown.
bool EmergencyExitRequested(void)
Returns true if an emergency exit was requested.
static int NumDevices(void)
Returns the total number of devices.
void SetPending(bool Pending)
bool DoShutdown(bool Force)
Call the shutdown script with data of the next pending timer.
void Exit(int ExitCode)
Set VDR exit code and initiate end of VDR main loop.
bool InitializePlugins(void)
time_t StartTime(void) const
void MainThreadHook(void)
static bool SetKeepCaps(bool On)
static void SetEpgDataFileName(const char *FileName)
bool PresentSeenWithin(int Seconds) const
static void SetCommand(const char *Command)
static const cSchedules * Schedules(cSchedulesLock &SchedulesLock)
Caller must provide a cSchedulesLock which has to survive the entire time the returned cSchedules is ...
cNestedItemList RecordingCommands
#define MAXVIDEOFILESIZEDEFAULT
const cChannel * Channel(void) const
bool Load(const char *FileName, bool AllowComments=false, bool MustExist=false)
static int CurrentVolume(void)
bool IsPrimaryDevice(void) const
#define TIMERLOOKAHEADTIME
virtual const char * Description(void)=0
bool GenerateIndex(const char *FileName)
virtual const char * CommandLineHelp(void)
bool Transferring(void) const
Returns true if we are currently in Transfer Mode.
void Start(const char *Message, int Seconds)
Start the 5 minute shutdown warning countdown.
bool Recording(void) const
static int CurrentChannel(void)
Returns the number of the current channel on the primary device.
static bool PutMacro(eKeys Key)
T * Next(const T *object) const
static bool BondDevices(const char *Bondings)
Bonds the devices as defined in the given Bondings string.
bool Modified(int &State)
Returns true if any of the timers have been modified, which is detected by State being different than...
void SetVolume(int Volume, bool Absolute=false)
Sets the volume to the given value, either absolutely or relative to the current volume.
int GetExitCode(void)
Get the currently set exit code of VDR.
virtual void Clear(void)
Free up all registered skins.
bool SwitchChannel(const cChannel *Channel, bool LiveView)
Switches the device to the given Channel, initiating transfer mode if necessary.
static bool SetUser(const char *UserName, bool UserDump)
char FontOsd[MAXFONTNAME]
void RemoveDeletedRecordings(void)
bool HasFlags(uint Flags) const
bool DoExit(void)
Check if an exit code was set, and VDR should exit.
int main(int argc, char *argv[])
const cKeyMacro * Get(eKeys Key)
void bool Start(void)
Actually starts the thread.
static void UpdateOsdSize(bool Force=false)
Inquires the actual size of the video display and adjusts the OSD and font sizes accordingly.
cSourceParams SourceParams
virtual bool HasProgramme(void) const
Returns true if the device is currently showing any programme to the user, either through replaying o...
bool ConfirmShutdown(bool Ask)
Check for background activity that blocks shutdown.
bool Put(uint64_t Code, bool Repeat=false, bool Release=false)
static void Cleanup(bool Force=false)
cShutdownHandler ShutdownHandler
bool Lock(bool Write, int TimeoutMs=0)
static int IsOpen(void)
Returns true if there is currently a level 0 OSD open.
static const char * GetPlugin(void)
Returns the name of the plugin that was set with a previous call to PutMacro() or CallPlugin()...
static void SetSystemCharacterTable(const char *CharacterTable)
static bool WaitForAllDevicesReady(int Timeout=0)
Waits until all devices have become ready, or the given Timeout (seconds) has expired.
static tThreadId ThreadId(void)
static cDisplaySubtitleTracks * Create(void)
#define DEVICEREADYTIMEOUT
bool IsOpen(void)
Returns true if there is currently a skin display object active.
cChannel * GetByChannelID(tChannelID ChannelID, bool TryWithoutRid=false, bool TryWithoutPolarization=false)
static void Launch(cControl *Control)
virtual bool ProvidesTransponder(const cChannel *Channel) const
Returns true if this device can provide the transponder of the given Channel (which implies that it c...
static const char * LastReplayed(void)
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...
bool SetSystemCharacterTable(const char *CharacterTable)
cRecordings DeletedRecordings
static bool HasPlugins(void)
static cDevice * GetDeviceForTransponder(const cChannel *Channel, int Priority)
Returns a device that is not currently "occupied" and can be tuned to the transponder of the given Ch...
virtual eOSState ProcessKey(eKeys Key)
bool HasSVDRPConnection(void)
const cSchedule * GetSchedule(tChannelID ChannelID) const
static bool Active(const char *FileName=NULL)
Returns true if the cutter is currently active.
static void SetMainThreadId(void)
#define DEFAULTEPGDATAFILENAME
#define CHANNELMOD_RETUNE
static time_t LastActivity(void)
Absolute time when last key was delivered by Get().
static void Process(eKeys Key)
static void SetCacheDirectory(const char *Dir)
static void Process(eKeys Key)
static cString GetFontFileName(const char *FontName)
Returns the actual font file name for the given FontName.
cChannel * GetByNumber(int Number, int SkipGap=0)
bool CutRecording(const char *FileName)
eKeys GetKey(bool Wait=true)
static cDevice * PrimaryDevice(void)
Returns the primary device.
bool Load(const char *FileName)
void SetUserInactiveTimeout(int Seconds=-1, bool Force=false)
Set the time in the future when VDR will switch into non-interactive mode or power down...
void AddPlugin(const char *Args)
static bool SetPrimaryDevice(int n)
Sets the primary device to 'n'.
static cDisplayTracks * Create(void)
void StopReplay(void)
Stops the current replay session (if any).
virtual bool NeedsFastResponse(void)
bool Retry(time_t AtTime=0)
Check whether its time to re-try the shutdown.
cRecordings Recordings
Any access to Recordings that loops through the list of recordings needs to hold a thread lock on thi...
bool ConfirmRestart(bool Ask)
Check for background activity that blocks restart.
static void SetGrabImageDir(const char *GrabImageDir)
void SetDirectory(const char *Directory)
virtual bool IsTunedToTransponder(const cChannel *Channel) const
Returns true if this device is currently tuned to the given Channel's transponder.
static void SignalHandler(int signum)
static cPlugin * GetPlugin(int Index)
static void Shutdown(void)
Closes down all devices.
static cDevice * ActualDevice(void)
Returns the actual receiving device in case of Transfer Mode, or the primary device otherwise...
bool SwitchTo(int Number)
static cOsdObject * PluginOsdObject(void)
#define SHUTDOWNCANCELPROMPT
virtual bool HasDecoder(void) const
Tells whether this device has an MPEG decoder.
bool Load(const char *FileName)
bool SeenWithin(int Seconds) const
void SetRetry(int Seconds)
Set shutdown retry so that VDR will not try to automatically shut down within Seconds.
char OSDTheme[MaxThemeName]
void SetShutdownCommand(const char *ShutdownCommand)
Set the command string for shutdown command.
#define MAXVIDEOFILESIZETS
char OSDSkin[MaxSkinName]
static bool PauseLiveVideo(void)
cSkin * Current(void)
Returns a pointer to the current skin.
static void SetResourceDirectory(const char *Dir)
bool SetCurrent(const char *Name=NULL)
Sets the current skin to the one indicated by name.
static void Shutdown(void)
#define DirectMainFunction(function)
static void SetUseDevice(int n)
Sets the 'useDevice' flag of the given device.
void I18nInitialize(const char *LocaleDir)
Detects all available locales and loads the language names and codes.
The cDevice class is the base from which actual devices can be derived.
static void Shutdown(void)
Shuts down the OSD provider facility by deleting the current OSD provider.
void Cancel(void)
Cancel the 5 minute shutdown warning countdown.
static void SetConfigDirectory(const char *Dir)
virtual void Hide(void)=0
bool Done(void)
Check if countdown timer has run out without canceling.
static bool Start(cTimer *Timer=NULL, bool Pause=false)