vdr  1.7.27
dvbdevice.h
Go to the documentation of this file.
00001 /*
00002  * dvbdevice.h: The DVB device tuner interface
00003  *
00004  * See the main source file 'vdr.c' for copyright information and
00005  * how to reach the author.
00006  *
00007  * $Id: dvbdevice.h 2.25 2012/03/13 10:11:15 kls Exp $
00008  */
00009 
00010 #ifndef __DVBDEVICE_H
00011 #define __DVBDEVICE_H
00012 
00013 #include <linux/dvb/frontend.h>
00014 #include <linux/dvb/version.h>
00015 #include "device.h"
00016 
00017 #if (DVB_API_VERSION << 8 | DVB_API_VERSION_MINOR) < 0x0503
00018 #error VDR requires Linux DVB driver API version 5.3 or higher!
00019 #endif
00020 
00021 #define MAXDVBDEVICES  8
00022 #define MAXDELIVERYSYSTEMS 8
00023 
00024 #define DEV_VIDEO         "/dev/video"
00025 #define DEV_DVB_BASE      "/dev/dvb"
00026 #define DEV_DVB_ADAPTER   "adapter"
00027 #define DEV_DVB_OSD       "osd"
00028 #define DEV_DVB_FRONTEND  "frontend"
00029 #define DEV_DVB_DVR       "dvr"
00030 #define DEV_DVB_DEMUX     "demux"
00031 #define DEV_DVB_VIDEO     "video"
00032 #define DEV_DVB_AUDIO     "audio"
00033 #define DEV_DVB_CA        "ca"
00034 
00035 struct tDvbParameterMap {
00036   int userValue;
00037   int driverValue;
00038   const char *userString;
00039   };
00040 
00041 const char *MapToUserString(int Value, const tDvbParameterMap *Map);
00042 int MapToUser(int Value, const tDvbParameterMap *Map, const char **String = NULL);
00043 int MapToDriver(int Value, const tDvbParameterMap *Map);
00044 int UserIndex(int Value, const tDvbParameterMap *Map);
00045 int DriverIndex(int Value, const tDvbParameterMap *Map);
00046 
00047 extern const tDvbParameterMap InversionValues[];
00048 extern const tDvbParameterMap BandwidthValues[];
00049 extern const tDvbParameterMap CoderateValues[];
00050 extern const tDvbParameterMap ModulationValues[];
00051 extern const tDvbParameterMap SystemValuesSat[];
00052 extern const tDvbParameterMap SystemValuesTerr[];
00053 extern const tDvbParameterMap TransmissionValues[];
00054 extern const tDvbParameterMap GuardValues[];
00055 extern const tDvbParameterMap HierarchyValues[];
00056 extern const tDvbParameterMap RollOffValues[];
00057 
00058 class cDvbTransponderParameters {
00059 friend class cDvbSourceParam;
00060 private:
00061   char polarization;
00062   int inversion;
00063   int bandwidth;
00064   int coderateH;
00065   int coderateL;
00066   int modulation;
00067   int system;
00068   int transmission;
00069   int guard;
00070   int hierarchy;
00071   int rollOff;
00072   int plpId;
00073   int PrintParameter(char *p, char Name, int Value) const;
00074   const char *ParseParameter(const char *s, int &Value, const tDvbParameterMap *Map = NULL);
00075 public:
00076   cDvbTransponderParameters(const char *Parameters = NULL);
00077   char Polarization(void) const { return polarization; }
00078   int Inversion(void) const { return inversion; }
00079   int Bandwidth(void) const { return bandwidth; }
00080   int CoderateH(void) const { return coderateH; }
00081   int CoderateL(void) const { return coderateL; }
00082   int Modulation(void) const { return modulation; }
00083   int System(void) const { return system; }
00084   int Transmission(void) const { return transmission; }
00085   int Guard(void) const { return guard; }
00086   int Hierarchy(void) const { return hierarchy; }
00087   int RollOff(void) const { return rollOff; }
00088   int PlpId(void) const { return plpId; }
00089   void SetPolarization(char Polarization) { polarization = Polarization; }
00090   void SetInversion(int Inversion) { inversion = Inversion; }
00091   void SetBandwidth(int Bandwidth) { bandwidth = Bandwidth; }
00092   void SetCoderateH(int CoderateH) { coderateH = CoderateH; }
00093   void SetCoderateL(int CoderateL) { coderateL = CoderateL; }
00094   void SetModulation(int Modulation) { modulation = Modulation; }
00095   void SetSystem(int System) { system = System; }
00096   void SetTransmission(int Transmission) { transmission = Transmission; }
00097   void SetGuard(int Guard) { guard = Guard; }
00098   void SetHierarchy(int Hierarchy) { hierarchy = Hierarchy; }
00099   void SetRollOff(int RollOff) { rollOff = RollOff; }
00100   void SetPlpId(int PlpId) { plpId = PlpId; }
00101   cString ToString(char Type) const;
00102   bool Parse(const char *s);
00103   };
00104 
00105 class cDvbTuner;
00106 
00108 
00109 class cDvbDevice : public cDevice {
00110 protected:
00111   static cString DvbName(const char *Name, int Adapter, int Frontend);
00112   static int DvbOpen(const char *Name, int Adapter, int Frontend, int Mode, bool ReportError = false);
00113 private:
00114   static bool Exists(int Adapter, int Frontend);
00116   static bool Probe(int Adapter, int Frontend);
00118 public:
00119   static bool Initialize(void);
00123 protected:
00124   int adapter, frontend;
00125 private:
00126   dvb_frontend_info frontendInfo;
00127   int deliverySystems[MAXDELIVERYSYSTEMS];
00128   int numDeliverySystems;
00129   int numModulations;
00130   int fd_dvr, fd_ca;
00131   static cMutex bondMutex;
00132   cDvbDevice *bondedDevice;
00133   mutable bool needsDetachBondedReceivers;
00134   bool QueryDeliverySystems(int fd_frontend);
00135 public:
00136   cDvbDevice(int Adapter, int Frontend);
00137   virtual ~cDvbDevice();
00138   int Adapter(void) const { return adapter; }
00139   int Frontend(void) const { return frontend; }
00140   virtual bool Ready(void);
00141   virtual cString DeviceName(void) const;
00142   static bool BondDevices(const char *Bondings);
00148   static void UnBondDevices(void);
00150   bool Bond(cDvbDevice *Device);
00158   void UnBond(void);
00162   bool BondingOk(const cChannel *Channel, bool ConsiderOccupied = false) const;
00169 
00170 // Common Interface facilities:
00171 
00172 private:
00173   cCiAdapter *ciAdapter;
00174 
00175 // Channel facilities
00176 
00177 private:
00178   cDvbTuner *dvbTuner;
00179 public:
00180   virtual bool ProvidesDeliverySystem(int DeliverySystem) const;
00181   virtual bool ProvidesSource(int Source) const;
00182   virtual bool ProvidesTransponder(const cChannel *Channel) const;
00183   virtual bool ProvidesChannel(const cChannel *Channel, int Priority = IDLEPRIORITY, bool *NeedsDetachReceivers = NULL) const;
00184   virtual bool ProvidesEIT(void) const;
00185   virtual int NumProvidedSystems(void) const;
00186   virtual int SignalStrength(void) const;
00187   virtual int SignalQuality(void) const;
00188   virtual const cChannel *GetCurrentlyTunedTransponder(void) const;
00189   virtual bool IsTunedToTransponder(const cChannel *Channel) const;
00190   virtual bool MaySwitchTransponder(const cChannel *Channel) const;
00191 protected:
00192   virtual bool SetChannelDevice(const cChannel *Channel, bool LiveView);
00193 public:
00194   virtual bool HasLock(int TimeoutMs = 0);
00195 
00196 // PID handle facilities
00197 
00198 protected:
00199   virtual bool SetPid(cPidHandle *Handle, int Type, bool On);
00200 
00201 // Section filter facilities
00202 
00203 protected:
00204   virtual int OpenFilter(u_short Pid, u_char Tid, u_char Mask);
00205   virtual void CloseFilter(int Handle);
00206 
00207 // Common Interface facilities:
00208 
00209 public:
00210   virtual bool HasCi(void);
00211 
00212 // Audio facilities
00213 
00214 protected:
00215   static int setTransferModeForDolbyDigital;
00216 public:
00217   static void SetTransferModeForDolbyDigital(int Mode); // needs to be here for backwards compatibility
00223 
00224 // Receiver facilities
00225 
00226 private:
00227   cTSBuffer *tsBuffer;
00228 protected:
00229   virtual bool OpenDvr(void);
00230   virtual void CloseDvr(void);
00231   virtual bool GetTSPacket(uchar *&Data);
00232   virtual void DetachAllReceivers(void);
00233   };
00234 
00235 // A plugin that implements a DVB device derived from cDvbDevice needs to create
00236 // a cDvbDeviceProbe derived object on the heap in order to have its Probe()
00237 // function called, where it can actually create the appropriate device.
00238 // The cDvbDeviceProbe object must be created in the plugin's constructor,
00239 // and deleted in its destructor.
00240 
00241 class cDvbDeviceProbe : public cListObject {
00242 public:
00243   cDvbDeviceProbe(void);
00244   virtual ~cDvbDeviceProbe();
00245   static uint32_t GetSubsystemId(int Adapter, int Frontend);
00246   virtual bool Probe(int Adapter, int Frontend) = 0;
00250   };
00251 
00252 extern cList<cDvbDeviceProbe> DvbDeviceProbes;
00253 
00254 #endif //__DVBDEVICE_H