add a blinking point to the infobar
[enigma2.git] / lib / dvb / idvb.h
index 518525f9e09c253755eb65594c1fcf12b1255dcb..699474d3981593638e5e93b628ac287c98ff9036 100644 (file)
@@ -9,13 +9,36 @@
 #include <linux/dvb/frontend.h>
 #define FRONTENDPARAMETERS struct dvb_frontend_parameters
 #endif
+#include <lib/dvb/frontendparms.h>
 #include <lib/base/object.h>
 #include <lib/base/ebase.h>
 #include <lib/service/service.h>
 #include <libsig_comp.h>
 #include <connection.h>
 
-               // bitte KEINE operator int() definieren, sonst bringt das ganze nix!
+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);
+};
+
+               /* these structures have by intention no operator int() defined.
+                  the reason of these structures is to avoid mixing for example
+                  a onid and a tsid (as there's no general order for them).
+                  
+                  defining an operator int() would implicitely convert values
+                  between them over the constructor with the int argument.
+                  
+                  'explicit' doesn't here - eTransportStreamID(eOriginalNetworkID(n)) 
+                  would still work. */
+
 struct eTransportStreamID
 {
 private:
@@ -180,9 +203,12 @@ public:
        bool cacheEmpty() { return m_cache.empty(); }
 
        eDVBService();
-       std::string m_service_name;
+               /* 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;
        
+       void genSortName();
+       
        int m_flags;
        std::set<int> m_ca;
        std::map<int,int> m_cache;
@@ -194,7 +220,7 @@ public:
        RESULT getName(const eServiceReference &ref, std::string &name);
        int getLength(const eServiceReference &ref);
        
-       // for filtering:
+               /* for filtering: */
        int checkFilter(const eServiceReferenceDVB &ref, const eDVBChannelQuery &query);
 };
 
@@ -208,6 +234,7 @@ class iDVBChannelListQuery: public iObject
 {
 public:
        virtual RESULT getNextResult(eServiceReferenceDVB &ref)=0;
+       virtual int compareLessEqual(const eServiceReferenceDVB &a, const eServiceReferenceDVB &b)=0;
 };
 
 class eDVBChannelQuery: public iObject
@@ -233,6 +260,10 @@ public:
        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;
@@ -248,101 +279,11 @@ public:
        
        virtual RESULT addService(const eServiceReferenceDVB &service, eDVBService *service)=0;
        virtual RESULT getService(const eServiceReferenceDVB &reference, ePtr<eDVBService> &service)=0;
+       virtual RESULT flush()=0;
 
-       virtual RESULT startQuery(ePtr<iDVBChannelListQuery> &query, eDVBChannelQuery *query)=0;
-};
-
-class SatelliteDeliverySystemDescriptor;
-class CableDeliverySystemDescriptor;
-class TerrestrialDeliverySystemDescriptor;
+       virtual RESULT getBouquet(const eServiceReference &ref,  eBouquet* &bouquet)=0;
 
-struct eDVBFrontendParametersSatellite
-{
-       struct Polarisation
-       {
-               enum {
-                       Horizontal, Vertical, CircularLeft, CircularRight
-               };
-       };
-       struct Inversion
-       {
-               enum {
-                       On, Off, Unknown
-               };
-       };
-       struct FEC
-       {
-               enum {
-                       fNone, f1_2, f2_3, f3_4, f5_6, f7_8, fAuto
-               };
-       };
-       unsigned int frequency, symbol_rate;
-       int polarisation, fec, inversion, orbital_position;
-       
-       void set(const SatelliteDeliverySystemDescriptor  &);
-};
-
-struct eDVBFrontendParametersCable
-{
-       unsigned int frequency, symbol_rate;
-       int modulation, inversion, fec_inner;
-       void set(const CableDeliverySystemDescriptor  &);
-};
-
-struct eDVBFrontendParametersTerrestrial
-{
-       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  &);
+       virtual RESULT startQuery(ePtr<iDVBChannelListQuery> &query, eDVBChannelQuery *query, const eServiceReference &source)=0;
 };
 
 class iDVBFrontendParameters: public iObject
@@ -386,7 +327,8 @@ public:
                stateIdle = 0,
                stateTuning = 1,
                stateFailed = 2,
-               stateLock = 3
+               stateLock = 3,
+               stateLostLock = 4,
        };
        virtual RESULT getState(int &state)=0;
        enum {
@@ -403,12 +345,16 @@ public:
        virtual RESULT setSecSequence(const eSecCommandList &list)=0;
        virtual RESULT getData(int num, int &data)=0;
        virtual RESULT setData(int num, int val)=0;
+       
+               /* 0 means: not compatible. other values are a priority. */
+       virtual int isCompatibleWith(ePtr<iDVBFrontendParameters> &feparm)=0;
 };
 
 class iDVBSatelliteEquipmentControl: public iObject
 {
 public:
-       virtual RESULT prepare(iDVBFrontend &frontend, FRONTENDPARAMETERS &parm, eDVBFrontendParametersSatellite &sat)=0;
+       virtual RESULT prepare(iDVBFrontend &frontend, FRONTENDPARAMETERS &parm, eDVBFrontendParametersSatellite &sat, int frontend_id)=0;
+       virtual int canTune(const eDVBFrontendParametersSatellite &feparm, iDVBFrontend *fe, int frontend_id)=0;
 };
 
 struct eDVBCIRouting
@@ -423,19 +369,22 @@ public:
        {
                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_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;
@@ -445,7 +394,8 @@ public:
        virtual void ReleaseUse() = 0;
 };
 
-typedef unsigned long long pts_t;
+       /* signed, so we can express deltas. */
+typedef long long pts_t;
 
 class iDVBPVRChannel: public iDVBChannel
 {
@@ -459,10 +409,15 @@ public:
                /* so this is VERY UGLY. */
        virtual RESULT playFile(const char *file) = 0;
        
-       virtual RESULT getLength(pts_t &len) = 0;
-       virtual RESULT getCurrentPosition(pts_t &pos) = 0;
+       virtual RESULT getLength(pts_t &pts) = 0;
        
-       // seekTo ...
+               /* we explicitely ask for the decoding demux here because a channel
+                  can be shared between multiple decoders.
+                  Of couse skipping doesn't make much sense 
+                  then, but getCurrentPosition does. */
+       virtual RESULT getCurrentPosition(iDVBDemux *decoding_demux, pts_t &pos) = 0;
+       virtual RESULT seekTo(iDVBDemux *decoding_demux, int relative, pts_t &pts) = 0;
+       virtual RESULT seekToPosition(iDVBDemux *decoding_demux, const off_t &pts) = 0;
 };
 
 class iDVBSectionReader;
@@ -475,6 +430,9 @@ 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