fix marking non playable services in channellist
[enigma2.git] / lib / dvb / idvb.h
index f5d3d2ee374e3456f2bf6881f369cc74a8095258..a14e0af5a59cf623f44a9f98ffd2ea1a55627085 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:
@@ -184,6 +207,8 @@ public:
        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;
@@ -193,8 +218,9 @@ public:
        
        // iStaticServiceInformation
        RESULT getName(const eServiceReference &ref, std::string &name);
-       int getLength(const eServiceReference &ref);
-       
+       RESULT getEvent(const eServiceReference &ref, ePtr<eServiceEvent> &ptr);
+       bool isPlayable(const eServiceReference &ref, const eServiceReference &ignore);
+
                /* for filtering: */
        int checkFilter(const eServiceReferenceDVB &ref, const eDVBChannelQuery &query);
 };
@@ -237,6 +263,7 @@ public:
        
                /* 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);
        
@@ -253,101 +280,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;
-
-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
-               };
-       };
+       virtual RESULT getBouquet(const eServiceReference &ref,  eBouquet* &bouquet)=0;
 
-       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
@@ -391,7 +328,8 @@ public:
                stateIdle = 0,
                stateTuning = 1,
                stateFailed = 2,
-               stateLock = 3
+               stateLock = 3,
+               stateLostLock = 4,
        };
        virtual RESULT getState(int &state)=0;
        enum {
@@ -408,12 +346,17 @@ 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;
+       virtual void setRotorMoving(bool)=0;
 };
 
 struct eDVBCIRouting
@@ -428,6 +371,7 @@ 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. */
@@ -452,7 +396,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
 {
@@ -467,10 +412,14 @@ public:
        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;
        
-       // 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;