add return code
[enigma2.git] / lib / dvb / idvb.h
index c4ae488dc311684c586fb512615560ae0c25c7ec..a23960af5607858547c5a5253ca54b78b4d035ae 100644 (file)
@@ -1,12 +1,33 @@
 #ifndef __dvb_idvb_h
 #define __dvb_idvb_h
 
+#include <config.h>
+#if HAVE_DVB_API_VERSION < 3
+#include <ost/frontend.h>
+#define FRONTENDPARAMETERS FrontendParameters
+#else
+#include <linux/dvb/frontend.h>
+#define FRONTENDPARAMETERS struct dvb_frontend_parameters
+#endif
 #include <lib/base/object.h>
 #include <lib/base/ebase.h>
 #include <lib/service/service.h>
 #include <libsig_comp.h>
 #include <connection.h>
 
+struct eBouquet
+{
+       std::string m_bouquet_name;
+       std::string m_path;
+       typedef std::list<eServiceReference> list;
+       list m_services;
+// the following four methods are implemented in db.cpp
+       RESULT flushChanges();
+       RESULT addService(const eServiceReference &);
+       RESULT removeService(const eServiceReference &);
+       RESULT moveService(const eServiceReference &, unsigned int);
+};
+
                // bitte KEINE operator int() definieren, sonst bringt das ganze nix!
 struct eTransportStreamID
 {
@@ -69,6 +90,14 @@ struct eDVBChannelID
        eDVBNamespace dvbnamespace;
        eTransportStreamID transport_stream_id;
        eOriginalNetworkID original_network_id;
+       
+       bool operator==(const eDVBChannelID &c) const
+       {
+               return dvbnamespace == c.dvbnamespace &&
+                       transport_stream_id == c.transport_stream_id &&
+                       original_network_id == c.original_network_id;
+       }
+       
        bool operator<(const eDVBChannelID &c) const
        {
                if (dvbnamespace < c.dvbnamespace)
@@ -131,7 +160,7 @@ struct eServiceReferenceDVB: public eServiceReference
                setTransportStreamID(chid.transport_stream_id);
        }
        
-       void getChannelID(eDVBChannelID &chid)
+       void getChannelID(eDVBChannelID &chid) const
        {
                chid = eDVBChannelID(getDVBNamespace(), getTransportStreamID(), getOriginalNetworkID());
        }
@@ -143,32 +172,105 @@ struct eServiceReferenceDVB: public eServiceReference
 };
 
 
+////////////////// TODO: we need an interface here, but what exactly?
+
+#include <set>
+// btw, still implemented in db.cpp. FIX THIS, TOO.
+
+class eDVBChannelQuery;
+
+class eDVBService: public iStaticServiceInformation
+{
+       DECLARE_REF(eDVBService);
+public:
+       enum cacheID
+       {
+               cVPID, cAPID, cTPID, cPCRPID, cAC3PID, cacheMax
+       };
+
+       int getCachePID(cacheID);
+       void setCachePID(cacheID, int);
+       bool cacheEmpty() { return m_cache.empty(); }
+
+       eDVBService();
+               /* m_service_name_sort is uppercase, with special chars removed, to increase sort performance. */
+       std::string m_service_name, m_service_name_sort;
+       std::string m_provider_name;
+       
+       int m_flags;
+       std::set<int> m_ca;
+       std::map<int,int> m_cache;
+       virtual ~eDVBService();
+       
+       eDVBService &operator=(const eDVBService &);
+       
+       // iStaticServiceInformation
+       RESULT getName(const eServiceReference &ref, std::string &name);
+       int getLength(const eServiceReference &ref);
+       
+               /* for filtering: */
+       int checkFilter(const eServiceReferenceDVB &ref, const eDVBChannelQuery &query);
+};
+
+//////////////////
+
 class iDVBChannel;
 class iDVBDemux;
 class iDVBFrontendParameters;
 
-class iDVBChannelList: public virtual iObject
+class iDVBChannelListQuery: public iObject
 {
 public:
-       virtual RESULT getChannelFrontendData(const eDVBChannelID &id, ePtr<iDVBFrontendParameters> &parm)=0;
+       virtual RESULT getNextResult(eServiceReferenceDVB &ref)=0;
+       virtual int compareLessEqual(const eServiceReferenceDVB &a, const eServiceReferenceDVB &b)=0;
+};
+
+class eDVBChannelQuery: public iObject
+{
+       DECLARE_REF(eDVBChannelQuery);
+public:
+       enum
+       {
+               tName,
+               tProvider,
+               tType,
+               tBouquet,
+               tSatellitePosition,
+               tChannelID,
+               tAND,
+               tOR
+       };
+       
+       int m_type;
+       int m_inverse;
+       
+       std::string m_string;
+       int m_int;
+       eDVBChannelID m_channelid;
+       
+               /* sort is only valid in root, and must be from the enum above. */
+       int m_sort;
+       std::string m_bouquet_name;
+       
+       static RESULT compile(ePtr<eDVBChannelQuery> &res, std::string query);
+       
+       ePtr<eDVBChannelQuery> m_p1, m_p2;
 };
 
-class iDVBResourceManager: public virtual iObject
+class iDVBChannelList: public iObject
 {
 public:
-       /*
-                       solange rumloopen bis eine resource gefunden wurde, die eine frequenz
-                       tunen will
-                       
-                       wenn natuerlich sowas schon vorhanden ist, dann einfach ne ref darauf
-                       geben. (zwei services auf dem gleichen transponder teilen sich einen
-                       channel)
-       */
-       virtual RESULT setChannelList(iDVBChannelList *list)=0;
-       virtual RESULT getChannelList(ePtr<iDVBChannelList> &list)=0;
-       virtual RESULT allocateChannel(const eDVBChannelID &channel, ePtr<iDVBChannel> &channel)=0;
-       virtual RESULT allocateRawChannel(ePtr<iDVBChannel> &channel)=0;
-       virtual RESULT allocatePVRChannel(int caps)=0;
+       virtual RESULT addChannelToList(const eDVBChannelID &id, iDVBFrontendParameters *feparm)=0;
+       virtual RESULT removeChannel(const eDVBChannelID &id)=0;
+       
+       virtual RESULT getChannelFrontendData(const eDVBChannelID &id, ePtr<iDVBFrontendParameters> &parm)=0;
+       
+       virtual RESULT addService(const eServiceReferenceDVB &service, eDVBService *service)=0;
+       virtual RESULT getService(const eServiceReferenceDVB &reference, ePtr<eDVBService> &service)=0;
+
+       virtual RESULT getBouquet(const eServiceReference &ref,  eBouquet* &bouquet)=0;
+
+       virtual RESULT startQuery(ePtr<iDVBChannelListQuery> &query, eDVBChannelQuery *query, const eServiceReference &source)=0;
 };
 
 class SatelliteDeliverySystemDescriptor;
@@ -210,11 +312,61 @@ struct eDVBFrontendParametersCable
 
 struct eDVBFrontendParametersTerrestrial
 {
-       int unknown;
+       unsigned int frequency;
+       struct Bandwidth {
+               enum { Bw8MHz, Bw7MHz, Bw6MHz, BwAuto };
+       };
+       
+       struct FEC
+       {
+               enum {
+                       fNone, f1_2, f2_3, f3_4, f5_6, f7_8, fAuto
+               };
+       };
+       
+       struct TransmissionMode {
+               enum {
+                       TM2k, TM8k, TMAuto
+               };
+       };
+       
+       struct GuardInterval {
+               enum {
+                       GI_1_32, GI_1_16, GI_1_8, GI_1_4, GI_Auto
+               };
+       };
+       
+       struct Hierarchy {
+               enum {
+                       HNone, H1, H2, H4, HAuto
+               };
+       };
+       
+       struct Modulation {
+               enum {
+                       QPSK, QAM16, Auto
+               };
+       };
+
+       struct Inversion
+       {
+               enum {
+                       On, Off, Unknown
+               };
+       };
+       
+       int bandwidth;
+       int code_rate_HP, code_rate_LP;
+       int modulation;
+       int transmission_mode;
+       int guard_interval;
+       int hierarchy;
+       int inversion;
+       
        void set(const TerrestrialDeliverySystemDescriptor  &);
 };
 
-class iDVBFrontendParameters: public virtual iObject
+class iDVBFrontendParameters: public iObject
 {
 public:
        virtual RESULT getSystem(int &type) const = 0;
@@ -228,15 +380,21 @@ public:
 
 #define MAX_DISEQC_LENGTH  16
 
-struct eDVBDiseqcCommand
+class eDVBDiseqcCommand
 {
+public:
        int len;
        __u8 data[MAX_DISEQC_LENGTH];
+#if HAVE_DVB_API_VERSION < 3
+       int tone;
+       int voltage;
+#endif
 };
 
 class iDVBSatelliteEquipmentControl;
+class eSecCommandList;
 
-class iDVBFrontend: public virtual iObject
+class iDVBFrontend: public iObject
 {
 public:
        enum {
@@ -249,11 +407,12 @@ public:
                stateIdle = 0,
                stateTuning = 1,
                stateFailed = 2,
-               stateLock = 3
+               stateLock = 3,
+               stateLostLock = 4,
        };
        virtual RESULT getState(int &state)=0;
        enum {
-               toneOn, toneOff
+               toneOff, toneOn
        };
        virtual RESULT setTone(int tone)=0;
        enum {
@@ -261,13 +420,17 @@ public:
        };
        virtual RESULT setVoltage(int voltage)=0;
        virtual RESULT sendDiseqc(const eDVBDiseqcCommand &diseqc)=0;
+       virtual RESULT sendToneburst(int burst)=0;
        virtual RESULT setSEC(iDVBSatelliteEquipmentControl *sec)=0;
+       virtual RESULT setSecSequence(const eSecCommandList &list)=0;
+       virtual RESULT getData(int num, int &data)=0;
+       virtual RESULT setData(int num, int val)=0;
 };
 
 class iDVBSatelliteEquipmentControl: public iObject
 {
 public:
-       virtual RESULT prepare(iDVBFrontend &frontend, struct dvb_frontend_parameters &parm, eDVBFrontendParametersSatellite &sat)=0;
+       virtual RESULT prepare(iDVBFrontend &frontend, FRONTENDPARAMETERS &parm, eDVBFrontendParametersSatellite &sat)=0;
 };
 
 struct eDVBCIRouting
@@ -275,38 +438,71 @@ struct eDVBCIRouting
        int enabled;
 };
 
-class iDVBChannel: public virtual iObject
+class iDVBChannel: public iObject
 {
 public:
        enum
        {
                state_idle,        /* not yet tuned */
                state_tuning,      /* currently tuning (first time) */
+               state_failed,      /* tuning failed. */
                state_unavailable, /* currently unavailable, will be back without further interaction */
-               state_ok           /* ok */
+               state_ok,          /* ok */
+               state_release      /* channel is being shut down. */
        };
        virtual RESULT connectStateChange(const Slot1<void,iDVBChannel*> &stateChange, ePtr<eConnection> &connection)=0;
        virtual RESULT getState(int &state)=0;
+       
+               /* demux capabilities */
        enum
        {
-               cap_decode,
-               cap_ci
+               capDecode = 1,
+               /* capCI = 2 */
        };
        virtual RESULT setCIRouting(const eDVBCIRouting &routing)=0;
-       virtual RESULT getDemux(ePtr<iDVBDemux> &demux)=0;
+       virtual RESULT getDemux(ePtr<iDVBDemux> &demux, int cap=0)=0;
        
                /* direct frontend access for raw channels and/or status inquiries. */
        virtual RESULT getFrontend(ePtr<iDVBFrontend> &frontend)=0;
+       
+               /* use count handling */
+       virtual void AddUse() = 0;
+       virtual void ReleaseUse() = 0;
+};
+
+typedef unsigned long long pts_t;
+
+class iDVBPVRChannel: public iDVBChannel
+{
+public:
+       enum
+       {
+               state_eof = state_release + 1  /* end-of-file reached. */
+       };
+       
+               /* FIXME: there are some very ugly buffer-end and ... related problems */
+               /* so this is VERY UGLY. */
+       virtual RESULT playFile(const char *file) = 0;
+       
+       virtual RESULT getLength(pts_t &pts) = 0;
+       virtual RESULT getCurrentPosition(pts_t &pos) = 0;
+       virtual RESULT seekTo(pts_t &pts) = 0;
+       virtual RESULT seekToPosition(int relative, const off_t &pts) = 0;
 };
 
 class iDVBSectionReader;
+class iDVBTSRecorder;
 class iTSMPEGDecoder;
 
-class iDVBDemux: public virtual iObject
+class iDVBDemux: public iObject
 {
 public:
        virtual RESULT createSectionReader(eMainloop *context, ePtr<iDVBSectionReader> &reader)=0;
+       virtual RESULT createTSRecorder(ePtr<iDVBTSRecorder> &recorder)=0;
        virtual RESULT getMPEGDecoder(ePtr<iTSMPEGDecoder> &reader)=0;
+       virtual RESULT getSTC(pts_t &pts)=0;
+       virtual RESULT getCADemuxID(uint8_t &id)=0;
+       virtual RESULT flush()=0;
 };
 
 class iTSMPEGDecoder: public iObject