vdr
1.7.27
|
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