mirror of
https://github.com/vdr-projects/vdr.git
synced 2025-03-01 10:50:46 +00:00
VDR developer version 1.7.38 is now available at ftp://ftp.tvdr.de/vdr/Developer/vdr-1.7.38.tar.bz2 A 'diff' against the previous version is available at ftp://ftp.tvdr.de/vdr/Developer/vdr-1.7.37-1.7.38.diff MD5 checksums: f4ef0f60ed662f3c983a830da67df9b2 vdr-1.7.38.tar.bz2 e945b0f44e13ed768de726cf6e66317c vdr-1.7.37-1.7.38.diff WARNING: ======== This is a developer version. Even though I use it in my productive environment. I strongly recommend that you only use it under controlled conditions and for testing and debugging. Approaching version 2.0.0: ========================== If all goes well, there should be no more functional or API changes before the final version 2.0.0. There will just be a few more fixes. From the HISTORY file: - Updated the Ukrainian OSD texts (thanks to Yarema Aka Knedlyk). - Updated the Estonian OSD texts (thanks to Arthur Konovalov). - Updated the Romanian OSD texts (thanks to Lucian Muresan). - Updated the French OSD texts (thanks to Marc Perrudin, Bernard Jaulini and Peter Münster). - Updated the Macedonian OSD texts (thanks to Dimitar Petrovski). - Fixed moving editing marks, so that they don't get overwritten with old values through an update of the marks file. - Removed an invalid line from channels.conf.terr (reported by Lars Hanisch). - Fixed an unexpected k_Repeat key event after a k_Release in lirc.c. - Fixed permissions of po/sr_SR.po (reported by Dominic Evans). - Updated the Italian OSD texts (thanks to Diego Pierotto). - Fixed using "Pause" and "Slow motion" near the end of a recording (replay stopped a few seconds after the end of the recording file has been reached). - Fixed selecting the last replayed recording in the Recordings menu in case there are folders and plain recordings with names that differ only in non-alphanumeric characters (reported by Andre Weidemann). - Fixed the description of the OSD drawing functions DrawEllipse() (the values -5...-8 for the Quadrants parameter are not implemented). - Made cOsd::DestroyPixmap() "NULL proof". - Now deleting any previously allocated pixmaps in cOsd::SetAreas(). - Added demos of the DrawEllipse() and DrawSlope() function to the 'osddemo' plugin (press '1' or '2', respectively). - Updated the Lithuanian OSD texts (thanks to Valdemaras Pipiras). - The timeout for trying to switch to a valid programme is now reset immediately once a programme has been found. - No longer checking for EOPNOTSUPP in cDvbTuner::GetSignalQuality() to avoid breaking this function in case the driver suddenly decides to return a different errno value if an operation is not supported. - Moved the definition of TIMERMACRO_TITLE and TIMERMACRO_EPISODE from recording.h to config.h and using them to initialize Setup.NameInstantRecord (avoids having the same information in two places). - Fixed the return value of cOsdProvider::StoreImage() in case there is no OSD provider. - Fixed a crash in cMenuEditChanItem::Set() when entering a channel number that doesn't exist (reported by Mikael Hübsch). - Fixed displaying pending timers in "alert" mode in the LCARS skin. - Added missing $(LDFLAGS) to the Makefile of the dvbhddevice plugin (thanks to Ville Skyttä). - Fixed some spellings in PLUGINS.html and Doxyfile (thanks to Ville Skyttä). - Added '-p' to the cp command in the install-conf target of the Makefile (thanks to Ville Skyttä). - Added missing 'const' to cDevice::HasProgramme() and cDevice::HasLock(). - Fixed determining the priority of the primary device in case it is neither replaying nor receiving a live channel (thanks to Matthias Senzel for reporting a problem with switching back to live viewing after replay in a setup with device bonding). - Removed all \return and \param tags from comment lines marked with "///<" for Doxygen. There was only a rather small number of these, and I would probably always forget to put them in place when writing future comments, so I decided to drop them entirely. - Added Doxyfile.filter to have special characters escaped that would otherwise be dropped by Doxygen (reported by Ville Skyttä). - Using 'cat' instead of 'cp' to copy the Doxyfile to avoid problems in case Doxyfile is write protected. - Updated the Doxyfile with a newer version of Doxygen. - Turned off following symlinks in the Doxyfile. - Removed trailing whitespace. - Expanded tabs in PLUGINS/src/dvbhddevice/setup.c. - Some formatting fixes.
256 lines
9.3 KiB
C++
256 lines
9.3 KiB
C++
/*
|
|
* dvbdevice.h: The DVB device tuner interface
|
|
*
|
|
* See the main source file 'vdr.c' for copyright information and
|
|
* how to reach the author.
|
|
*
|
|
* $Id: dvbdevice.h 2.28 2013/02/16 15:20:17 kls Exp $
|
|
*/
|
|
|
|
#ifndef __DVBDEVICE_H
|
|
#define __DVBDEVICE_H
|
|
|
|
#include <linux/dvb/frontend.h>
|
|
#include <linux/dvb/version.h>
|
|
#include "device.h"
|
|
|
|
#if (DVB_API_VERSION << 8 | DVB_API_VERSION_MINOR) < 0x0503
|
|
#error VDR requires Linux DVB driver API version 5.3 or higher!
|
|
#endif
|
|
|
|
#define MAXDVBDEVICES 8
|
|
#define MAXDELIVERYSYSTEMS 8
|
|
|
|
#define DEV_VIDEO "/dev/video"
|
|
#define DEV_DVB_BASE "/dev/dvb"
|
|
#define DEV_DVB_ADAPTER "adapter"
|
|
#define DEV_DVB_OSD "osd"
|
|
#define DEV_DVB_FRONTEND "frontend"
|
|
#define DEV_DVB_DVR "dvr"
|
|
#define DEV_DVB_DEMUX "demux"
|
|
#define DEV_DVB_VIDEO "video"
|
|
#define DEV_DVB_AUDIO "audio"
|
|
#define DEV_DVB_CA "ca"
|
|
|
|
struct tDvbParameterMap {
|
|
int userValue;
|
|
int driverValue;
|
|
const char *userString;
|
|
};
|
|
|
|
const char *MapToUserString(int Value, const tDvbParameterMap *Map);
|
|
int MapToUser(int Value, const tDvbParameterMap *Map, const char **String = NULL);
|
|
int MapToDriver(int Value, const tDvbParameterMap *Map);
|
|
int UserIndex(int Value, const tDvbParameterMap *Map);
|
|
int DriverIndex(int Value, const tDvbParameterMap *Map);
|
|
|
|
extern const tDvbParameterMap InversionValues[];
|
|
extern const tDvbParameterMap BandwidthValues[];
|
|
extern const tDvbParameterMap CoderateValues[];
|
|
extern const tDvbParameterMap ModulationValues[];
|
|
extern const tDvbParameterMap SystemValuesSat[];
|
|
extern const tDvbParameterMap SystemValuesTerr[];
|
|
extern const tDvbParameterMap TransmissionValues[];
|
|
extern const tDvbParameterMap GuardValues[];
|
|
extern const tDvbParameterMap HierarchyValues[];
|
|
extern const tDvbParameterMap RollOffValues[];
|
|
|
|
class cDvbTransponderParameters {
|
|
friend class cDvbSourceParam;
|
|
private:
|
|
char polarization;
|
|
int inversion;
|
|
int bandwidth;
|
|
int coderateH;
|
|
int coderateL;
|
|
int modulation;
|
|
int system;
|
|
int transmission;
|
|
int guard;
|
|
int hierarchy;
|
|
int rollOff;
|
|
int plpId;
|
|
int PrintParameter(char *p, char Name, int Value) const;
|
|
const char *ParseParameter(const char *s, int &Value, const tDvbParameterMap *Map = NULL);
|
|
public:
|
|
cDvbTransponderParameters(const char *Parameters = NULL);
|
|
char Polarization(void) const { return polarization; }
|
|
int Inversion(void) const { return inversion; }
|
|
int Bandwidth(void) const { return bandwidth; }
|
|
int CoderateH(void) const { return coderateH; }
|
|
int CoderateL(void) const { return coderateL; }
|
|
int Modulation(void) const { return modulation; }
|
|
int System(void) const { return system; }
|
|
int Transmission(void) const { return transmission; }
|
|
int Guard(void) const { return guard; }
|
|
int Hierarchy(void) const { return hierarchy; }
|
|
int RollOff(void) const { return rollOff; }
|
|
int PlpId(void) const { return plpId; }
|
|
void SetPolarization(char Polarization) { polarization = Polarization; }
|
|
void SetInversion(int Inversion) { inversion = Inversion; }
|
|
void SetBandwidth(int Bandwidth) { bandwidth = Bandwidth; }
|
|
void SetCoderateH(int CoderateH) { coderateH = CoderateH; }
|
|
void SetCoderateL(int CoderateL) { coderateL = CoderateL; }
|
|
void SetModulation(int Modulation) { modulation = Modulation; }
|
|
void SetSystem(int System) { system = System; }
|
|
void SetTransmission(int Transmission) { transmission = Transmission; }
|
|
void SetGuard(int Guard) { guard = Guard; }
|
|
void SetHierarchy(int Hierarchy) { hierarchy = Hierarchy; }
|
|
void SetRollOff(int RollOff) { rollOff = RollOff; }
|
|
void SetPlpId(int PlpId) { plpId = PlpId; }
|
|
cString ToString(char Type) const;
|
|
bool Parse(const char *s);
|
|
};
|
|
|
|
class cDvbTuner;
|
|
|
|
/// The cDvbDevice implements a DVB device which can be accessed through the Linux DVB driver API.
|
|
|
|
class cDvbDevice : public cDevice {
|
|
protected:
|
|
static cString DvbName(const char *Name, int Adapter, int Frontend);
|
|
static int DvbOpen(const char *Name, int Adapter, int Frontend, int Mode, bool ReportError = false);
|
|
private:
|
|
static bool Exists(int Adapter, int Frontend);
|
|
///< Checks whether the given adapter/frontend exists.
|
|
static bool Probe(int Adapter, int Frontend);
|
|
///< Probes for existing DVB devices.
|
|
public:
|
|
static bool Initialize(void);
|
|
///< Initializes the DVB devices.
|
|
///< Must be called before accessing any DVB functions.
|
|
///< Returns true if any devices are available.
|
|
protected:
|
|
int adapter, frontend;
|
|
private:
|
|
dvb_frontend_info frontendInfo;
|
|
int deliverySystems[MAXDELIVERYSYSTEMS];
|
|
int numDeliverySystems;
|
|
int numModulations;
|
|
int fd_dvr, fd_ca;
|
|
static cMutex bondMutex;
|
|
cDvbDevice *bondedDevice;
|
|
mutable bool needsDetachBondedReceivers;
|
|
bool QueryDeliverySystems(int fd_frontend);
|
|
public:
|
|
cDvbDevice(int Adapter, int Frontend);
|
|
virtual ~cDvbDevice();
|
|
int Adapter(void) const { return adapter; }
|
|
int Frontend(void) const { return frontend; }
|
|
virtual bool Ready(void);
|
|
virtual cString DeviceType(void) const;
|
|
virtual cString DeviceName(void) const;
|
|
static bool BondDevices(const char *Bondings);
|
|
///< Bonds the devices as defined in the given Bondings string.
|
|
///< A bonding is a sequence of device numbers (starting at 1),
|
|
///< separated by '+' characters. Several bondings are separated by
|
|
///< commas, as in "1+2,3+4+5".
|
|
///< Returns false if an error occurred.
|
|
static void UnBondDevices(void);
|
|
///< Unbonds all devices.
|
|
bool Bond(cDvbDevice *Device);
|
|
///< Bonds this device with the given Device, making both of them use
|
|
///< the same satellite cable and LNB. Only DVB-S(2) devices can be
|
|
///< bonded. When this function is called, the calling device must
|
|
///< not be bonded to any other device. The given Device, however,
|
|
///< may already be bonded to an other device. That way several devices
|
|
///< can be bonded together.
|
|
///< Returns true if the bonding was successful.
|
|
void UnBond(void);
|
|
///< Removes this device from any bonding it might have with other
|
|
///< devices. If this device is not bonded with any other device,
|
|
///< nothing happens.
|
|
bool BondingOk(const cChannel *Channel, bool ConsiderOccupied = false) const;
|
|
///< Returns true if this device is either not bonded to any other
|
|
///< device, or the given Channel is on the same satellite, polarization
|
|
///< and band as those the bonded devices are tuned to (if any).
|
|
///< If ConsiderOccupied is true, any bonded devices that are currently
|
|
///< occupied but not otherwise receiving will cause this function to
|
|
///< return false.
|
|
|
|
// Common Interface facilities:
|
|
|
|
private:
|
|
cCiAdapter *ciAdapter;
|
|
|
|
// Channel facilities
|
|
|
|
private:
|
|
cDvbTuner *dvbTuner;
|
|
public:
|
|
virtual bool ProvidesDeliverySystem(int DeliverySystem) const;
|
|
virtual bool ProvidesSource(int Source) const;
|
|
virtual bool ProvidesTransponder(const cChannel *Channel) const;
|
|
virtual bool ProvidesChannel(const cChannel *Channel, int Priority = IDLEPRIORITY, bool *NeedsDetachReceivers = NULL) const;
|
|
virtual bool ProvidesEIT(void) const;
|
|
virtual int NumProvidedSystems(void) const;
|
|
virtual int SignalStrength(void) const;
|
|
virtual int SignalQuality(void) const;
|
|
virtual const cChannel *GetCurrentlyTunedTransponder(void) const;
|
|
virtual bool IsTunedToTransponder(const cChannel *Channel) const;
|
|
virtual bool MaySwitchTransponder(const cChannel *Channel) const;
|
|
protected:
|
|
virtual bool SetChannelDevice(const cChannel *Channel, bool LiveView);
|
|
public:
|
|
virtual bool HasLock(int TimeoutMs = 0) const;
|
|
|
|
// PID handle facilities
|
|
|
|
protected:
|
|
virtual bool SetPid(cPidHandle *Handle, int Type, bool On);
|
|
|
|
// Section filter facilities
|
|
|
|
protected:
|
|
virtual int OpenFilter(u_short Pid, u_char Tid, u_char Mask);
|
|
virtual void CloseFilter(int Handle);
|
|
|
|
// Common Interface facilities:
|
|
|
|
public:
|
|
virtual bool HasCi(void);
|
|
|
|
// Audio facilities
|
|
|
|
protected:
|
|
static int setTransferModeForDolbyDigital;
|
|
public:
|
|
static void SetTransferModeForDolbyDigital(int Mode); // needs to be here for backwards compatibility
|
|
///< Controls how the DVB device handles Transfer Mode when replaying
|
|
///< Dolby Digital audio.
|
|
///< 0 = don't set "audio bypass" in driver/firmware, don't force Transfer Mode
|
|
///< 1 = set "audio bypass" in driver/firmware, force Transfer Mode (default)
|
|
///< 2 = don't set "audio bypass" in driver/firmware, force Transfer Mode
|
|
|
|
// Receiver facilities
|
|
|
|
private:
|
|
cTSBuffer *tsBuffer;
|
|
protected:
|
|
virtual bool OpenDvr(void);
|
|
virtual void CloseDvr(void);
|
|
virtual bool GetTSPacket(uchar *&Data);
|
|
virtual void DetachAllReceivers(void);
|
|
};
|
|
|
|
// A plugin that implements a DVB device derived from cDvbDevice needs to create
|
|
// a cDvbDeviceProbe derived object on the heap in order to have its Probe()
|
|
// function called, where it can actually create the appropriate device.
|
|
// The cDvbDeviceProbe object must be created in the plugin's constructor,
|
|
// and deleted in its destructor.
|
|
|
|
class cDvbDeviceProbe : public cListObject {
|
|
public:
|
|
cDvbDeviceProbe(void);
|
|
virtual ~cDvbDeviceProbe();
|
|
static uint32_t GetSubsystemId(int Adapter, int Frontend);
|
|
virtual bool Probe(int Adapter, int Frontend) = 0;
|
|
///< Probes for a DVB device at the given Adapter and creates the appropriate
|
|
///< object derived from cDvbDevice if applicable.
|
|
///< Returns true if a device has been created.
|
|
};
|
|
|
|
extern cList<cDvbDeviceProbe> DvbDeviceProbes;
|
|
|
|
#endif //__DVBDEVICE_H
|