mirror of
https://github.com/vdr-projects/vdr.git
synced 2025-03-01 10:50:46 +00:00
- Adapted the tuning code to the new DVBFE_SET_DELSYS API (thanks to Reinhard Nissl). VDR now uses the driver from http://jusst.de/hg/multiproto_plus. - Updated the Italian OSD texts (thanks to Diego Pierotto). - Removed obsolete $(NCURSESLIB) from the Makefile. - Implemented handling the standard component descriptor for AC3 (stream=4), as it will soon be used by the German ARD channels (thanks to Michael Pennewiß for advance information about this change). The previously used "Premiere pseudo standard" (stream=2, type=5) still works, but has apparently been wrongfully used by broadcasters from the beginning. - Added missing description of the 'S' channel parameter to vdr.5 (reported by Reinhard Nissl). - The SVDRP signon message now indicates the character encoding in use, as in "220 video SVDRP VideoDiskRecorder 1.7.1; Fri May 2 16:17:10 2008; ISO-8859-1". This may be useful for instance for external tools that provide EPG data, so that they can correctly encode the strings. - No longer calling FcFini() to avoid problems with older (broken) versions of fontconfig (suggested by Edgar Toernig). - Removed the compile time option VFAT to allow users of precompiled binary distributions to have full control over whether or not to use the --vfat option at runtime (suggested by Michael Nork). - First step towards switching to TS (Transport Stream) as recording format: + The new function cDevice::PlayTs() is used to play TS packets. + The new functions cDevice::PlayTsVideo() and cDevice::PlayTsAudio() are used to play video and audio TS packets, respectively. + The new function cAudio::PlayTs() is used to play audio TS packets. + The new class cPatPmtGenerator is used to generate a PAT/PMT pair that precedes the TS data in Transfer Mode. + The new class cPatPmtParser is used by cDevice to parse the PAT/PMT data in a TS in order to find out which streams it contains. + The new class cTsToPes is used to convert TS packets to a PES packet. + cTransfer no longer uses cRemux, and doesn't run a separate thread any more. It just generates a PAT/PMT and sends all received TS packets to the primary device's PlayTs(). + Live subtitle display no longer uses a ring buffer and separate thread. + cPesAssembler has been removed. Old VDR recordings only contain complete PES packets. + Since a TS needs to have a PAT/PMT, which requires the video stream type to be explicitly given, the format of the VPID field in the channels.conf file and the SVDRP commands NEWC/MODC/LSTC has been extended. The video stream type now follows the VPID and optional PPID, separated by an '=' sign. - Updated the sources.conf file (thanks to Oleg Roitburd). - Fixed a possible integer overflow in GetAbsTime() (thanks to Alexander Rieger). - Fixed a problem with calling isyslog() from within the SignalHandler() (thanks to Udo Richter). - Replaced the Finnish language code "smi" with "suo" (thanks to Rolf Ahrenberg). - Fixed wrong value for TableIdBAT in libsi/si.h (thanks to Winfried Köhler). - Errors in config files no longer keep VDR from starting. - Removed unneeded include files <linux/dvb/dmx.h> und <time.h> from remux.h (reported by Tobias Grimm).
279 lines
7.0 KiB
C++
279 lines
7.0 KiB
C++
/*
|
|
* config.h: Configuration file handling
|
|
*
|
|
* See the main source file 'vdr.c' for copyright information and
|
|
* how to reach the author.
|
|
*
|
|
* $Id: config.h 2.3 2008/09/06 14:06:56 kls Exp $
|
|
*/
|
|
|
|
#ifndef __CONFIG_H
|
|
#define __CONFIG_H
|
|
|
|
#include <arpa/inet.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <time.h>
|
|
#include <unistd.h>
|
|
#include "i18n.h"
|
|
#include "font.h"
|
|
#include "tools.h"
|
|
|
|
// VDR's own version number:
|
|
|
|
#define VDRVERSION "1.7.1"
|
|
#define VDRVERSNUM 10701 // Version * 10000 + Major * 100 + Minor
|
|
|
|
// The plugin API's version number:
|
|
|
|
#define APIVERSION "1.7.0"
|
|
#define APIVERSNUM 10700 // Version * 10000 + Major * 100 + Minor
|
|
|
|
// When loading plugins, VDR searches them by their APIVERSION, which
|
|
// may be smaller than VDRVERSION in case there have been no changes to
|
|
// VDR header files since the last APIVERSION. This allows compiled
|
|
// plugins to work with newer versions of the core VDR as long as no
|
|
// VDR header files have changed.
|
|
|
|
#define MAXPRIORITY 99
|
|
#define MAXLIFETIME 99
|
|
|
|
#define MINOSDWIDTH 480
|
|
#define MAXOSDWIDTH 672
|
|
#define MINOSDHEIGHT 324
|
|
#define MAXOSDHEIGHT 567
|
|
|
|
#define MaxFileName 256
|
|
#define MaxSkinName 16
|
|
#define MaxThemeName 16
|
|
|
|
class cCommand : public cListObject {
|
|
private:
|
|
char *title;
|
|
char *command;
|
|
bool confirm;
|
|
static char *result;
|
|
public:
|
|
cCommand(void);
|
|
virtual ~cCommand();
|
|
bool Parse(const char *s);
|
|
const char *Title(void) { return title; }
|
|
bool Confirm(void) { return confirm; }
|
|
const char *Execute(const char *Parameters = NULL);
|
|
};
|
|
|
|
typedef uint32_t in_addr_t; //XXX from /usr/include/netinet/in.h (apparently this is not defined on systems with glibc < 2.2)
|
|
|
|
class cSVDRPhost : public cListObject {
|
|
private:
|
|
struct in_addr addr;
|
|
in_addr_t mask;
|
|
public:
|
|
cSVDRPhost(void);
|
|
bool Parse(const char *s);
|
|
bool Accepts(in_addr_t Address);
|
|
};
|
|
|
|
template<class T> class cConfig : public cList<T> {
|
|
private:
|
|
char *fileName;
|
|
bool allowComments;
|
|
void Clear(void)
|
|
{
|
|
free(fileName);
|
|
fileName = NULL;
|
|
cList<T>::Clear();
|
|
}
|
|
public:
|
|
cConfig(void) { fileName = NULL; }
|
|
virtual ~cConfig() { free(fileName); }
|
|
const char *FileName(void) { return fileName; }
|
|
bool Load(const char *FileName = NULL, bool AllowComments = false, bool MustExist = false)
|
|
{
|
|
cConfig<T>::Clear();
|
|
if (FileName) {
|
|
free(fileName);
|
|
fileName = strdup(FileName);
|
|
allowComments = AllowComments;
|
|
}
|
|
bool result = !MustExist;
|
|
if (fileName && access(fileName, F_OK) == 0) {
|
|
isyslog("loading %s", fileName);
|
|
FILE *f = fopen(fileName, "r");
|
|
if (f) {
|
|
char *s;
|
|
int line = 0;
|
|
cReadLine ReadLine;
|
|
result = true;
|
|
while ((s = ReadLine.Read(f)) != NULL) {
|
|
line++;
|
|
if (allowComments) {
|
|
char *p = strchr(s, '#');
|
|
if (p)
|
|
*p = 0;
|
|
}
|
|
stripspace(s);
|
|
if (!isempty(s)) {
|
|
T *l = new T;
|
|
if (l->Parse(s))
|
|
Add(l);
|
|
else {
|
|
esyslog("ERROR: error in %s, line %d", fileName, line);
|
|
delete l;
|
|
result = false;
|
|
}
|
|
}
|
|
}
|
|
fclose(f);
|
|
}
|
|
else {
|
|
LOG_ERROR_STR(fileName);
|
|
result = false;
|
|
}
|
|
}
|
|
if (!result)
|
|
fprintf(stderr, "vdr: error while reading '%s'\n", fileName);
|
|
return result;
|
|
}
|
|
bool Save(void)
|
|
{
|
|
bool result = true;
|
|
T *l = (T *)this->First();
|
|
cSafeFile f(fileName);
|
|
if (f.Open()) {
|
|
while (l) {
|
|
if (!l->Save(f)) {
|
|
result = false;
|
|
break;
|
|
}
|
|
l = (T *)l->Next();
|
|
}
|
|
if (!f.Close())
|
|
result = false;
|
|
}
|
|
else
|
|
result = false;
|
|
return result;
|
|
}
|
|
};
|
|
|
|
class cCommands : public cConfig<cCommand> {};
|
|
|
|
class cSVDRPhosts : public cConfig<cSVDRPhost> {
|
|
public:
|
|
bool Acceptable(in_addr_t Address);
|
|
};
|
|
|
|
extern cCommands Commands;
|
|
extern cCommands RecordingCommands;
|
|
extern cSVDRPhosts SVDRPhosts;
|
|
|
|
class cSetupLine : public cListObject {
|
|
private:
|
|
char *plugin;
|
|
char *name;
|
|
char *value;
|
|
public:
|
|
cSetupLine(void);
|
|
cSetupLine(const char *Name, const char *Value, const char *Plugin = NULL);
|
|
virtual ~cSetupLine();
|
|
virtual int Compare(const cListObject &ListObject) const;
|
|
const char *Plugin(void) { return plugin; }
|
|
const char *Name(void) { return name; }
|
|
const char *Value(void) { return value; }
|
|
bool Parse(char *s);
|
|
bool Save(FILE *f);
|
|
};
|
|
|
|
class cSetup : public cConfig<cSetupLine> {
|
|
friend class cPlugin; // needs to be able to call Store()
|
|
private:
|
|
void StoreLanguages(const char *Name, int *Values);
|
|
bool ParseLanguages(const char *Value, int *Values);
|
|
bool Parse(const char *Name, const char *Value);
|
|
cSetupLine *Get(const char *Name, const char *Plugin = NULL);
|
|
void Store(const char *Name, const char *Value, const char *Plugin = NULL, bool AllowMultiple = false);
|
|
void Store(const char *Name, int Value, const char *Plugin = NULL);
|
|
public:
|
|
// Also adjust cMenuSetup (menu.c) when adding parameters here!
|
|
int __BeginData__;
|
|
char OSDLanguage[I18N_MAX_LOCALE_LEN];
|
|
char OSDSkin[MaxSkinName];
|
|
char OSDTheme[MaxThemeName];
|
|
int PrimaryDVB;
|
|
int ShowInfoOnChSwitch;
|
|
int TimeoutRequChInfo;
|
|
int MenuScrollPage;
|
|
int MenuScrollWrap;
|
|
int MenuKeyCloses;
|
|
int MarkInstantRecord;
|
|
char NameInstantRecord[MaxFileName];
|
|
int InstantRecordTime;
|
|
int LnbSLOF;
|
|
int LnbFrequLo;
|
|
int LnbFrequHi;
|
|
int DiSEqC;
|
|
int SetSystemTime;
|
|
int TimeSource;
|
|
int TimeTransponder;
|
|
int MarginStart, MarginStop;
|
|
int AudioLanguages[I18N_MAX_LANGUAGES + 1];
|
|
int DisplaySubtitles;
|
|
int SubtitleLanguages[I18N_MAX_LANGUAGES + 1];
|
|
int SubtitleOffset;
|
|
int SubtitleFgTransparency, SubtitleBgTransparency;
|
|
int EPGLanguages[I18N_MAX_LANGUAGES + 1];
|
|
int EPGScanTimeout;
|
|
int EPGBugfixLevel;
|
|
int EPGLinger;
|
|
int SVDRPTimeout;
|
|
int ZapTimeout;
|
|
int ChannelEntryTimeout;
|
|
int PrimaryLimit;
|
|
int DefaultPriority, DefaultLifetime;
|
|
int PausePriority, PauseLifetime;
|
|
int UseSubtitle;
|
|
int UseVps;
|
|
int VpsMargin;
|
|
int RecordingDirs;
|
|
int VideoDisplayFormat;
|
|
int VideoFormat;
|
|
int UpdateChannels;
|
|
int UseDolbyDigital;
|
|
int ChannelInfoPos;
|
|
int ChannelInfoTime;
|
|
int OSDLeft, OSDTop, OSDWidth, OSDHeight;
|
|
int OSDMessageTime;
|
|
int UseSmallFont;
|
|
int AntiAlias;
|
|
char FontOsd[MAXFONTNAME];
|
|
char FontSml[MAXFONTNAME];
|
|
char FontFix[MAXFONTNAME];
|
|
int FontOsdSize;
|
|
int FontSmlSize;
|
|
int FontFixSize;
|
|
int MaxVideoFileSize;
|
|
int SplitEditedFiles;
|
|
int MinEventTimeout, MinUserInactivity;
|
|
time_t NextWakeupTime;
|
|
int MultiSpeedMode;
|
|
int ShowReplayMode;
|
|
int ResumeID;
|
|
int CurrentChannel;
|
|
int CurrentVolume;
|
|
int CurrentDolby;
|
|
int InitialChannel;
|
|
int InitialVolume;
|
|
int EmergencyExit;
|
|
int __EndData__;
|
|
cSetup(void);
|
|
cSetup& operator= (const cSetup &s);
|
|
bool Load(const char *FileName);
|
|
bool Save(void);
|
|
};
|
|
|
|
extern cSetup Setup;
|
|
|
|
#endif //__CONFIG_H
|