35 #include <sys/capability.h>
36 #include <sys/prctl.h>
69 #define MINCHANNELWAIT 10 // seconds to wait between failed channel switchings
70 #define ACTIVITYTIMEOUT 60 // seconds before starting housekeeping
71 #define SHUTDOWNWAIT 300 // seconds to wait in user prompt before automatic shutdown
72 #define SHUTDOWNRETRY 360 // seconds before trying again to shut down
73 #define SHUTDOWNFORCEPROMPT 5 // seconds to wait in user prompt to allow forcing shutdown
74 #define SHUTDOWNCANCELPROMPT 5 // seconds to wait in user prompt to allow canceling shutdown
75 #define RESTARTCANCELPROMPT 5 // seconds to wait in user prompt before restarting on SIGHUP
76 #define MANUALSTART 600 // seconds the next timer must be in the future to assume manual start
77 #define CHANNELSAVEDELTA 600 // seconds before saving channels.conf after automatic modifications
78 #define DEVICEREADYTIMEOUT 30 // seconds to wait until all devices are ready
79 #define MENUTIMEOUT 120 // seconds of user inactivity after which an OSD display is closed
80 #define TIMERCHECKDELTA 10 // seconds between checks for timers that need to see their channel
81 #define TIMERDEVICETIMEOUT 8 // seconds before a device used for timer check may be reused
82 #define TIMERLOOKAHEADTIME 60 // seconds before a non-VPS timer starts and the channel is switched if possible
83 #define VPSLOOKAHEADTIME 24 // hours within which VPS timers will make sure their events are up to date
84 #define VPSUPTODATETIME 3600 // seconds before the event or schedule of a VPS timer needs to be refreshed
86 #define EXIT(v) { ShutdownHandler.Exit(v); goto Exit; }
90 static bool SetUser(
const char *UserName,
bool UserDump)
93 struct passwd *user = getpwnam(UserName);
95 fprintf(stderr,
"vdr: unknown user: '%s'\n", UserName);
98 if (setgid(user->pw_gid) < 0) {
99 fprintf(stderr,
"vdr: cannot set group id %u: %s\n", (
unsigned int)user->pw_gid, strerror(errno));
102 if (initgroups(user->pw_name, user->pw_gid) < 0) {
103 fprintf(stderr,
"vdr: cannot set supplemental group ids for user %s: %s\n", user->pw_name, strerror(errno));
106 if (setuid(user->pw_uid) < 0) {
107 fprintf(stderr,
"vdr: cannot set user id %u: %s\n", (
unsigned int)user->pw_uid, strerror(errno));
110 if (UserDump && prctl(PR_SET_DUMPABLE, 1, 0, 0, 0) < 0)
111 fprintf(stderr,
"vdr: warning - cannot set dumpable: %s\n", strerror(errno));
112 setenv(
"HOME", user->pw_dir, 1);
113 setenv(
"USER", user->pw_name, 1);
114 setenv(
"LOGNAME", user->pw_name, 1);
115 setenv(
"SHELL", user->pw_shell, 1);
123 cap_t caps = cap_from_text(
"= cap_sys_nice,cap_sys_time,cap_net_raw=ep");
125 fprintf(stderr,
"vdr: cap_from_text failed: %s\n", strerror(errno));
128 if (cap_set_proc(caps) == -1) {
129 fprintf(stderr,
"vdr: cap_set_proc failed: %s\n", strerror(errno));
140 if (prctl(PR_SET_KEEPCAPS, On ? 1 : 0, 0, 0, 0) != 0) {
141 fprintf(stderr,
"vdr: prctl failed\n");
167 esyslog(
"PANIC: watchdog timer expired - exiting!");
171 int main(
int argc,
char *argv[])
175 struct termios savedTm;
176 bool HasStdin = (tcgetpgrp(STDIN_FILENO) == getpid() || getppid() != (pid_t)1) && tcgetattr(STDIN_FILENO, &savedTm) == 0;
180 setlocale(LC_ALL,
"");
184 #define dd(a, b) (*a ? a : b)
185 #define DEFAULTSVDRPPORT 6419
186 #define DEFAULTWATCHDOG 0 // seconds
187 #define DEFAULTVIDEODIR VIDEODIR
188 #define DEFAULTCONFDIR dd(CONFDIR, VideoDirectory)
189 #define DEFAULTCACHEDIR dd(CACHEDIR, VideoDirectory)
190 #define DEFAULTRESDIR dd(RESDIR, ConfigDirectory)
191 #define DEFAULTPLUGINDIR PLUGINDIR
192 #define DEFAULTLOCDIR LOCDIR
193 #define DEFAULTEPGDATAFILENAME "epg.data"
195 bool StartedAsRoot =
false;
196 const char *VdrUser = NULL;
197 bool UserDump =
false;
199 const char *AudioCommand = NULL;
201 const char *ConfigDirectory = NULL;
202 const char *CacheDirectory = NULL;
203 const char *ResourceDirectory = NULL;
206 bool DisplayHelp =
false;
207 bool DisplayVersion =
false;
208 bool DaemonMode =
false;
209 int SysLogTarget = LOG_USER;
210 bool MuteAudio =
false;
212 const char *Terminal = NULL;
215 const char *LircDevice = NULL;
216 #if !defined(REMOTE_KBD)
219 #if defined(REMOTE_LIRC)
220 LircDevice = LIRC_DEVICE;
222 #if defined(VDR_USER)
229 static struct option long_options[] = {
230 {
"audio", required_argument, NULL,
'a' },
231 {
"cachedir", required_argument, NULL,
'c' | 0x100 },
232 {
"config", required_argument, NULL,
'c' },
233 {
"daemon", no_argument, NULL,
'd' },
234 {
"device", required_argument, NULL,
'D' },
235 {
"dirnames", required_argument, NULL,
'd' | 0x100 },
236 {
"edit", required_argument, NULL,
'e' | 0x100 },
237 {
"epgfile", required_argument, NULL,
'E' },
238 {
"filesize", required_argument, NULL,
'f' | 0x100 },
239 {
"genindex", required_argument, NULL,
'g' | 0x100 },
240 {
"grab", required_argument, NULL,
'g' },
241 {
"help", no_argument, NULL,
'h' },
242 {
"instance", required_argument, NULL,
'i' },
243 {
"lib", required_argument, NULL,
'L' },
244 {
"lirc", optional_argument, NULL,
'l' | 0x100 },
245 {
"localedir",required_argument, NULL,
'l' | 0x200 },
246 {
"log", required_argument, NULL,
'l' },
247 {
"mute", no_argument, NULL,
'm' },
248 {
"no-kbd", no_argument, NULL,
'n' | 0x100 },
249 {
"plugin", required_argument, NULL,
'P' },
250 {
"port", required_argument, NULL,
'p' },
251 {
"record", required_argument, NULL,
'r' },
252 {
"resdir", required_argument, NULL,
'r' | 0x100 },
253 {
"shutdown", required_argument, NULL,
's' },
254 {
"split", no_argument, NULL,
's' | 0x100 },
255 {
"terminal", required_argument, NULL,
't' },
256 {
"user", required_argument, NULL,
'u' },
257 {
"userdump", no_argument, NULL,
'u' | 0x100 },
258 {
"version", no_argument, NULL,
'V' },
259 {
"vfat", no_argument, NULL,
'v' | 0x100 },
260 {
"video", required_argument, NULL,
'v' },
261 {
"watchdog", required_argument, NULL,
'w' },
262 { NULL, no_argument, NULL, 0 }
266 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) {
268 case 'a': AudioCommand = optarg;
271 CacheDirectory = optarg;
273 case 'c': ConfigDirectory = optarg;
275 case 'd': DaemonMode =
true;
278 int n = atoi(optarg);
284 fprintf(stderr,
"vdr: invalid DVB device number: %s\n", optarg);
289 int n = strtol(s, &s, 10);
290 if (n <= 0 || n >= PATH_MAX) {
291 fprintf(stderr,
"vdr: invalid directory path length: %s\n", optarg);
298 fprintf(stderr,
"vdr: invalid delimiter: %s\n", optarg);
306 int n = strtol(s, &s, 10);
307 if (n <= 0 || n > NAME_MAX) {
308 fprintf(stderr,
"vdr: invalid directory name length: %s\n", optarg);
315 fprintf(stderr,
"vdr: invalid delimiter: %s\n", optarg);
322 int n = strtol(s, &s, 10);
323 if (n != 0 && n != 1) {
324 fprintf(stderr,
"vdr: invalid directory encoding: %s\n", optarg);
329 fprintf(stderr,
"vdr: unexpected data: %s\n", optarg);
336 case 'E': EpgDataFileName = (*optarg !=
'-' ? optarg : NULL);
349 case 'h': DisplayHelp =
true;
356 fprintf(stderr,
"vdr: invalid instance id: %s\n", optarg);
359 char *p = strchr(optarg,
'.');
363 int l = atoi(optarg);
364 if (0 <= l && l <= 3) {
370 if (0 <= l && l <= 7) {
371 int targets[] = { LOG_LOCAL0, LOG_LOCAL1, LOG_LOCAL2, LOG_LOCAL3, LOG_LOCAL4, LOG_LOCAL5, LOG_LOCAL6, LOG_LOCAL7 };
372 SysLogTarget = targets[l];
380 fprintf(stderr,
"vdr: invalid log level: %s\n", optarg);
383 case 'L':
if (access(optarg, R_OK | X_OK) == 0)
386 fprintf(stderr,
"vdr: can't access plugin directory: %s\n", optarg);
391 LircDevice = optarg ? optarg : LIRC_DEVICE;
394 if (access(optarg, R_OK | X_OK) == 0)
395 LocaleDirectory = optarg;
397 fprintf(stderr,
"vdr: can't access locale directory: %s\n", optarg);
401 case 'm': MuteAudio =
true;
407 SVDRPport = atoi(optarg);
409 fprintf(stderr,
"vdr: invalid port number: %s\n", optarg);
413 case 'P': PluginManager.
AddPlugin(optarg);
418 ResourceDirectory = optarg;
425 case 't': Terminal = optarg;
426 if (access(Terminal, R_OK | W_OK) < 0) {
427 fprintf(stderr,
"vdr: can't access terminal: %s\n", Terminal);
431 case 'u':
if (*optarg)
437 case 'V': DisplayVersion =
true;
444 case 'v': VideoDirectory = optarg;
445 while (optarg && *optarg && optarg[strlen(optarg) - 1] ==
'/')
446 optarg[strlen(optarg) - 1] = 0;
450 int t = atoi(optarg);
456 fprintf(stderr,
"vdr: invalid watchdog timeout: %s\n", optarg);
464 if (VdrUser && geteuid() == 0) {
465 StartedAsRoot =
true;
466 if (strcmp(VdrUser,
"root")) {
469 if (!
SetUser(VdrUser, UserDump))
480 if (DisplayHelp || DisplayVersion) {
485 printf(
"Usage: vdr [OPTIONS]\n\n"
486 " -a CMD, --audio=CMD send Dolby Digital audio to stdin of command CMD\n"
487 " --cachedir=DIR save cache files in DIR (default: %s)\n"
488 " -c DIR, --config=DIR read config files from DIR (default: %s)\n"
489 " -d, --daemon run in daemon mode\n"
490 " -D NUM, --device=NUM use only the given DVB device (NUM = 0, 1, 2...)\n"
491 " there may be several -D options (default: all DVB\n"
492 " devices will be used)\n"
493 " --dirnames=PATH[,NAME[,ENC]]\n"
494 " set the maximum directory path length to PATH\n"
495 " (default: %d); if NAME is also given, it defines\n"
496 " the maximum directory name length (default: %d);\n"
497 " the optional ENC can be 0 or 1, and controls whether\n"
498 " special characters in directory names are encoded as\n"
499 " hex values (default: 0); if PATH or NAME are left\n"
500 " empty (as in \",,1\" to only set ENC), the defaults\n"
502 " --edit=REC cut recording REC and exit\n"
503 " -E FILE, --epgfile=FILE write the EPG data into the given FILE (default is\n"
504 " '%s' in the cache directory)\n"
505 " '-E-' disables this\n"
506 " if FILE is a directory, the default EPG file will be\n"
507 " created in that directory\n"
508 " --filesize=SIZE limit video files to SIZE bytes (default is %dM)\n"
509 " only useful in conjunction with --edit\n"
510 " --genindex=REC generate index for recording REC and exit\n"
511 " -g DIR, --grab=DIR write images from the SVDRP command GRAB into the\n"
512 " given DIR; DIR must be the full path name of an\n"
513 " existing directory, without any \"..\", double '/'\n"
514 " or symlinks (default: none, same as -g-)\n"
515 " -h, --help print this help and exit\n"
516 " -i ID, --instance=ID use ID as the id of this VDR instance (default: 0)\n"
517 " -l LEVEL, --log=LEVEL set log level (default: 3)\n"
518 " 0 = no logging, 1 = errors only,\n"
519 " 2 = errors and info, 3 = errors, info and debug\n"
520 " if logging should be done to LOG_LOCALn instead of\n"
521 " LOG_USER, add '.n' to LEVEL, as in 3.7 (n=0..7)\n"
522 " -L DIR, --lib=DIR search for plugins in DIR (default is %s)\n"
523 " --lirc[=PATH] use a LIRC remote control device, attached to PATH\n"
525 " --localedir=DIR search for locale files in DIR (default is\n"
527 " -m, --mute mute audio of the primary DVB device at startup\n"
528 " --no-kbd don't use the keyboard as an input device\n"
529 " -p PORT, --port=PORT use PORT for SVDRP (default: %d)\n"
530 " 0 turns off SVDRP\n"
531 " -P OPT, --plugin=OPT load a plugin defined by the given options\n"
532 " -r CMD, --record=CMD call CMD before and after a recording, and after\n"
533 " a recording has been edited or deleted\n"
534 " --resdir=DIR read resource files from DIR (default: %s)\n"
535 " -s CMD, --shutdown=CMD call CMD to shutdown the computer\n"
536 " --split split edited files at the editing marks (only\n"
537 " useful in conjunction with --edit)\n"
538 " -t TTY, --terminal=TTY controlling tty\n"
539 " -u USER, --user=USER run as user USER; only applicable if started as\n"
541 " --userdump allow coredumps if -u is given (debugging)\n"
542 " -v DIR, --video=DIR use DIR as video directory (default: %s)\n"
543 " -V, --version print version information and exit\n"
544 " --vfat for backwards compatibility (same as\n"
545 " --dirnames=250,40,1)\n"
546 " -w SEC, --watchdog=SEC activate the watchdog timer with a timeout of SEC\n"
547 " seconds (default: %d); '0' disables the watchdog\n"
568 printf(
"Plugins: vdr -P\"name [OPTIONS]\"\n\n");
569 for (
int i = 0; ; i++) {
574 if (DisplayHelp && help) {
589 openlog(
"vdr", LOG_CONS, SysLogTarget);
594 fprintf(stderr,
"vdr: can't access video directory %s\n", VideoDirectory);
601 if (daemon(1, 0) == -1) {
602 fprintf(stderr,
"vdr: %m\n");
609 stdin = freopen(Terminal,
"r", stdin);
610 stdout = freopen(Terminal,
"w", stdout);
611 stderr = freopen(Terminal,
"w", stderr);
613 tcgetattr(STDIN_FILENO, &savedTm);
617 if (StartedAsRoot && VdrUser)
618 isyslog(
"switched to user '%s'", VdrUser);
625 char *CodeSet = NULL;
626 if (setlocale(LC_CTYPE,
""))
627 CodeSet = nl_langinfo(CODESET);
629 char *LangEnv = getenv(
"LANG");
631 CodeSet = strchr(LangEnv,
'.');
638 isyslog(
"codeset is '%s' - %s", CodeSet, known ?
"known" :
"unknown");
651 int LastTimerChannel = -1;
652 int PreviousChannel[2] = { 1, 1 };
653 int PreviousChannelIndex = 0;
654 time_t LastChannelChanged = time(NULL);
655 time_t LastInteract = 0;
656 int MaxLatencyTime = 0;
657 bool InhibitEpgScan =
false;
658 bool IsInfoMenu =
false;
659 cSkin *CurrentSkin = NULL;
668 if (!ConfigDirectory)
674 if (!ResourceDirectory)
695 const char *msg =
"no fonts available - OSD will not show any text!";
696 fprintf(stderr,
"vdr: %s\n", msg);
707 if (EpgDataFileName) {
708 const char *EpgDirectory = NULL;
710 EpgDirectory = EpgDataFileName;
713 else if (*EpgDataFileName !=
'/' && *EpgDataFileName !=
'.')
714 EpgDirectory = CacheDirectory;
719 EpgDataReader.
Start();
741 isyslog(
"trying device number %d instead", i + 1);
749 const char *msg =
"no primary device found - using first device!";
750 fprintf(stderr,
"vdr: %s\n", msg);
755 const char *msg =
"no primary device found - giving up!";
756 fprintf(stderr,
"vdr: %s\n", msg);
795 if (!DaemonMode && HasStdin && UseKbd)
826 if (signal(SIGHUP,
SignalHandler) == SIG_IGN) signal(SIGHUP, SIG_IGN);
827 if (signal(SIGINT,
SignalHandler) == SIG_IGN) signal(SIGINT, SIG_IGN);
828 if (signal(SIGTERM,
SignalHandler) == SIG_IGN) signal(SIGTERM, SIG_IGN);
829 if (signal(SIGPIPE,
SignalHandler) == SIG_IGN) signal(SIGPIPE, SIG_IGN);
830 if (WatchdogTimeout > 0)
831 if (signal(SIGALRM,
Watchdog) == SIG_IGN) signal(SIGALRM, SIG_IGN);
835 if (WatchdogTimeout > 0) {
836 dsyslog(
"setting watchdog timer to %d seconds", WatchdogTimeout);
837 alarm(WatchdogTimeout);
842 #define DELETE_MENU ((IsInfoMenu &= (Menu == NULL)), delete Menu, Menu = NULL)
845 #ifdef DEBUGRINGBUFFERS
846 cRingBufferLinear::PrintDebugRBL();
851 time_t Now = time(NULL);
855 static time_t lastTime = 0;
859 if (Channel && (Channel->
Vpid() || Channel->
Apid(0) || Channel->
Dpid(0))) {
862 else if (LastTimerChannel > 0) {
869 LastTimerChannel = -1;
877 static time_t lastOsdSizeUpdate = 0;
878 if (Now != lastOsdSizeUpdate) {
880 lastOsdSizeUpdate = Now;
884 if (WatchdogTimeout > 0) {
885 int LatencyTime = WatchdogTimeout - alarm(WatchdogTimeout);
886 if (LatencyTime > MaxLatencyTime) {
887 MaxLatencyTime = LatencyTime;
888 dsyslog(
"max. latency time %d seconds", MaxLatencyTime);
894 static time_t ChannelSaveTimeout = 0;
895 static int TimerState = 0;
899 ChannelSaveTimeout = 1;
900 else if (modified && !ChannelSaveTimeout)
902 bool timeout = ChannelSaveTimeout == 1 || ChannelSaveTimeout && Now > ChannelSaveTimeout && !
cRecordControls::Active();
903 if ((modified || timeout) &&
Channels.
Lock(
false, 100)) {
907 ChannelSaveTimeout = 0;
915 isyslog(
"retuning due to modification of channel %d", Channel->Number());
930 LastChannelChanged = Now;
932 if (Now - LastChannelChanged >=
Setup.
ZapTimeout && LastChannel != PreviousChannel[PreviousChannelIndex])
933 PreviousChannel[PreviousChannelIndex ^= 1] = LastChannel;
950 static time_t LastTimerCheck = 0;
952 InhibitEpgScan =
false;
954 bool InVpsMargin =
false;
955 bool NeedsTransponder =
false;
962 else if (Timer->
Event()) {
971 InVpsMargin = !Schedule;
975 InhibitEpgScan |= InVpsMargin | NeedsTransponder;
980 if (NeedsTransponder || InVpsMargin) {
983 if (!Device && InVpsMargin)
1000 LastTimerCheck = Now;
1031 bool WasOpen = Interact != NULL;
1032 bool WasMenu = Interact && Interact->
IsMenu();
1070 #define DirectMainFunction(function)\
1072 if (cControl::Control())\
1073 cControl::Control()->Hide();\
1074 Menu = new cMenuMain(function);\
1075 key = kNone; } // nobody else needs to see this key
1096 esyslog(
"ERROR: unknown plugin '%s'", PluginName);
1183 isyslog(
"Power button pressed");
1217 if (state ==
osEnd) {
1260 case osEnd:
if (Interact == Menu)
1278 if (PreviousChannel[PreviousChannelIndex ^ 1] == LastChannel || LastChannel != PreviousChannel[0] && LastChannel != PreviousChannel[1])
1279 PreviousChannelIndex ^= 1;
1303 case kOk: LastChannel = -1;
break;
1317 if (!InhibitEpgScan)
1377 esyslog(
"emergency exit requested - shutting down");
1382 signal(SIGHUP, SIG_DFL);
1383 signal(SIGINT, SIG_DFL);
1384 signal(SIGTERM, SIG_DFL);
1385 signal(SIGPIPE, SIG_DFL);
1386 signal(SIGALRM, SIG_DFL);
1409 if (WatchdogTimeout > 0)
1410 dsyslog(
"max. latency time %d seconds", MaxLatencyTime);
1419 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
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)