service: add info
authorFelix Domke <tmbinc@elitedvb.net>
Mon, 28 Nov 2005 01:54:35 +0000 (01:54 +0000)
committerFelix Domke <tmbinc@elitedvb.net>
Mon, 28 Nov 2005 01:54:35 +0000 (01:54 +0000)
lib/python/Screens/ServiceInfo.py
lib/service/iservice.h
lib/service/service.cpp
lib/service/servicedvb.cpp
lib/service/servicedvb.h

index 10f7b28c58f75c1d5e5318fc53fe4c1c391f725d..9a8abdb13b8bb8382d277664de4c7a6a3a977898 100644 (file)
@@ -5,7 +5,7 @@ from Components.ActionMap import ActionMap
 from Components.Label import Label
 from Components.MenuList import MenuList
 from ServiceReference import ServiceReference
 from Components.Label import Label
 from Components.MenuList import MenuList
 from ServiceReference import ServiceReference
-from enigma import eListboxPythonMultiContent, eListbox, gFont
+from enigma import eListboxPythonMultiContent, eListbox, gFont, iServiceInformation
 
 RT_HALIGN_LEFT = 0
 
 
 RT_HALIGN_LEFT = 0
 
@@ -39,33 +39,58 @@ class ServiceInfoList(HTMLComponent, GUIComponent):
 class ServiceInfo(Screen):
        def __init__(self, session):
                Screen.__init__(self, session)
 class ServiceInfo(Screen):
        def __init__(self, session):
                Screen.__init__(self, session)
-
+               
                self["actions"] = ActionMap(["OkCancelActions"],
                {
                        "ok": self.close,
                        "cancel": self.close
                }, -1)
                self["actions"] = ActionMap(["OkCancelActions"],
                {
                        "ok": self.close,
                        "cancel": self.close
                }, -1)
-       
-               Labels = ( ("Name",  "ServiceReference(self.session.nav.getCurrentlyPlayingServiceReference()).getServiceName()"),
-                                  ("Provider", ),
-                                  ("VideoPID",""),
-                                  ("AudioPID",""),
-                                  ("PCRPID",""),
-                                  ("PMTPID",""),
-                                  ("TXTPID",""),
-                                  ("Videoformat",""),
-                                  ("TSID",""),
-                                  ("ONID",""),
-                                  ("SID",""),
-                                  ("Namespace",""))
+               
+               service = session.nav.getCurrentService()
+               if service is not None:
+                       self.info = service.info()
+               else:
+                       self.info = None
+               
+               Labels = ( ("Name",  ServiceReference(self.session.nav.getCurrentlyPlayingServiceReference()).getServiceName()),
+                                  ("Provider", self.getValue(iServiceInformation.sProvider)),
+                                  ("VideoPID", self.getValue(iServiceInformation.sVideoPID)),
+                                  ("AudioPID", self.getValue(iServiceInformation.sAudioPID)),
+                                  ("PCRPID", self.getValue(iServiceInformation.sPCRPID)),
+                                  ("PMTPID", self.getValue(iServiceInformation.sPMTPID)),
+                                  ("TXTPID", self.getValue(iServiceInformation.sTXTPID)),
+                                  ("Videoformat", self.getValue(iServiceInformation.sAspect)),
+                                  ("TSID", self.getValue(iServiceInformation.sTSID)),
+                                  ("ONID", self.getValue(iServiceInformation.sONID)),
+                                  ("SID", self.getValue(iServiceInformation.sSID)),
+                                  ("Namespace", self.getValue(iServiceInformation.sNamespace)))
        
                tlist = [ ]
 
                for item in Labels:
        
                tlist = [ ]
 
                for item in Labels:
-                       try:
-                               value = str(eval(item[1]))
-                       except:
-                               value = "N/A"
+                       value = item[1]
                        tlist.append(ServiceInfoListEntry(item[0]+":", value))          
 
                self["infolist"] = ServiceInfoList(tlist)
                        tlist.append(ServiceInfoListEntry(item[0]+":", value))          
 
                self["infolist"] = ServiceInfoList(tlist)
+
+       def getValue(self, what):
+               if self.info is None:
+                       return ""
+               
+               v = self.info.getInfo(what)
+               if v == -2:
+                       v = self.info.getInfoString(what)
+               elif v != -1:
+                       if what in [iServiceInformation.sVideoPID, 
+                                       iServiceInformation.sAudioPID, iServiceInformation.sPCRPID, iServiceInformation.sPMTPID, 
+                                       iServiceInformation.sTXTPID, iServiceInformation.sTSID, iServiceInformation.sONID,
+                                       iServiceInformation.sSID]:
+                               v = "0x%04x (%dd)" % (v, v)
+                       elif what in [iServiceInformation.sNamespace]:
+                               v = "0x%08x" % (v)
+                       else:
+                               v = str(v)
+               else:
+                       v = "N/A"
+
+               return v
index b7b34fe211a3df553b6eadf59815990f12fa1bac..cbfd24a9618d809a62966de7420186a05586a0c6 100644 (file)
@@ -184,6 +184,36 @@ class iServiceInformation: public iObject
 public:
        virtual SWIG_VOID(RESULT) getName(std::string &SWIG_OUTPUT)=0;
        virtual SWIG_VOID(RESULT) getEvent(ePtr<eServiceEvent> &SWIG_OUTPUT, int nownext);
 public:
        virtual SWIG_VOID(RESULT) getName(std::string &SWIG_OUTPUT)=0;
        virtual SWIG_VOID(RESULT) getEvent(ePtr<eServiceEvent> &SWIG_OUTPUT, int nownext);
+
+       enum { 
+               sIsCrypted,  /* is encrypted (no indication if decrypt was possible) */
+               sAspect,     /* aspect ratio: 0=4:3, 1=16:9, 2=whatever we need */
+               sIsMultichannel, /* multichannel *available* (probably not selected) */
+               
+                       /* "user serviceable info" - they are not reliable. Don't use them for anything except the service menu!
+                          that's also the reason why they are so globally defined. 
+                          
+                          
+                          again - if somebody EVER tries to use this information for anything else than simply displaying it,
+                          i will change this to return a user-readable text like "zero x zero three three" (and change the
+                          exact spelling in every version) to stop that!
+                       */
+               sVideoPID,
+               sAudioPID,
+               sPCRPID,
+               sPMTPID,
+               sTXTPID,
+               
+               sSID,
+               sONID,
+               sTSID,
+               sNamespace,
+               sProvider,
+       };
+       enum { resNA = -1, resIsString = -2 };
+
+       virtual int getInfo(int w);
+       virtual std::string getInfoString(int w);
 };
 
 TEMPLATE_TYPEDEF(ePtr<iServiceInformation>, iServiceInformationPtr);
 };
 
 TEMPLATE_TYPEDEF(ePtr<iServiceInformation>, iServiceInformationPtr);
@@ -212,7 +242,10 @@ TEMPLATE_TYPEDEF(ePtr<iSeekableService>, iSeekableServicePtr);
 struct iAudioTrackInfo
 {
        std::string m_description;
 struct iAudioTrackInfo
 {
        std::string m_description;
+       std::string m_language; /* iso639 */
+       
        std::string getDescription() { return m_description; }
        std::string getDescription() { return m_description; }
+       std::string getLanguage() { return m_language; }
 };
 
 SWIG_ALLOW_OUTPUT_SIMPLE(iAudioTrackInfo);
 };
 
 SWIG_ALLOW_OUTPUT_SIMPLE(iAudioTrackInfo);
@@ -227,6 +260,7 @@ public:
 
 TEMPLATE_TYPEDEF(ePtr<iAudioTrackSelection>, iAudioTrackSelectionPtr);
 
 
 TEMPLATE_TYPEDEF(ePtr<iAudioTrackSelection>, iAudioTrackSelectionPtr);
 
+
 class iPlayableService: public iObject
 {
        friend class iServiceHandler;
 class iPlayableService: public iObject
 {
        friend class iServiceHandler;
@@ -237,8 +271,9 @@ public:
                evEnd,
                
                evTuneFailed,
                evEnd,
                
                evTuneFailed,
-               // when iServiceInformation is implemented:
-               evUpdatedEventInfo
+                       // when iServiceInformation is implemented:
+               evUpdatedEventInfo,
+               evUpdatedInfo,
        };
        virtual RESULT connectEvent(const Slot2<void,iPlayableService*,int> &event, ePtr<eConnection> &connection)=0;
        virtual RESULT start()=0;
        };
        virtual RESULT connectEvent(const Slot2<void,iPlayableService*,int> &event, ePtr<eConnection> &connection)=0;
        virtual RESULT start()=0;
index 3a59d444fb6b5d5295563b4a59eabfd394282182..62bbe12d8e3d5c1f260b5b454d8119cdfa12c0c9 100644 (file)
@@ -139,5 +139,14 @@ RESULT iServiceInformation::getEvent(ePtr<eServiceEvent> &evt, int m_nownext)
        return -1;
 }
 
        return -1;
 }
 
+int iServiceInformation::getInfo(int w)
+{
+       return -1;
+}
+
+std::string iServiceInformation::getInfoString(int w)
+{
+       return "";
+}
 
 eAutoInitPtr<eServiceCenter> init_eServiceCenter(eAutoInitNumbers::service, "eServiceCenter");
 
 eAutoInitPtr<eServiceCenter> init_eServiceCenter(eAutoInitNumbers::service, "eServiceCenter");
index d8206b9afc7bf86170c4438650f9b4addc8bf616..a49ce5c4e083371c7535eeb89359c4715599e4b8 100644 (file)
@@ -535,6 +535,7 @@ void eDVBServicePlay::serviceEvent(int event)
                if (m_decoder)
                {
                        m_decoder->setVideoPID(vpid);
                if (m_decoder)
                {
                        m_decoder->setVideoPID(vpid);
+                       m_current_audio_stream = 0;
                        m_decoder->setAudioPID(apid, apidtype);
                        if (!m_is_pvr)
                                m_decoder->setSyncPCR(pcrpid);
                        m_decoder->setAudioPID(apid, apidtype);
                        if (!m_is_pvr)
                                m_decoder->setSyncPCR(pcrpid);
@@ -706,6 +707,43 @@ RESULT eDVBServicePlay::getEvent(ePtr<eServiceEvent> &evt, int nownext)
        return m_event_handler.getEvent(evt, nownext);
 }
 
        return m_event_handler.getEvent(evt, nownext);
 }
 
+int eDVBServicePlay::getInfo(int w)
+{
+       eDVBServicePMTHandler::program program;
+
+       if (m_service_handler.getProgramInfo(program))
+               return -1;
+       
+       switch (w)
+       {
+       case sVideoPID: if (program.videoStreams.empty()) return -1; return program.videoStreams[0].pid;
+       case sAudioPID: if (program.audioStreams.empty()) return -1; return program.videoStreams[m_current_audio_stream].pid;
+       case sPCRPID: return program.pcrPid;
+       case sPMTPID: return program.pmtPid;
+       case sTXTPID: return -1;
+               
+       case sSID: return ((const eServiceReferenceDVB&)m_reference).getServiceID().get();
+       case sONID: return ((const eServiceReferenceDVB&)m_reference).getOriginalNetworkID().get();
+       case sTSID: return ((const eServiceReferenceDVB&)m_reference).getTransportStreamID().get();
+       case sNamespace: return ((const eServiceReferenceDVB&)m_reference).getDVBNamespace().get();
+       case sProvider: if (!m_dvb_service) return -1; return -2;
+       default:
+               return -1;
+       }
+}
+
+std::string eDVBServicePlay::getInfoString(int w)
+{      
+       switch (w)
+       {
+       case sProvider:
+               if (!m_dvb_service) return "";
+               return m_dvb_service->m_provider_name;
+       default:
+               return "";
+       }
+}
+
 int eDVBServicePlay::getNumberOfTracks()
 {
        eDVBServicePMTHandler::program program;
 int eDVBServicePlay::getNumberOfTracks()
 {
        eDVBServicePMTHandler::program program;
@@ -716,24 +754,12 @@ int eDVBServicePlay::getNumberOfTracks()
 
 RESULT eDVBServicePlay::selectTrack(unsigned int i)
 {
 
 RESULT eDVBServicePlay::selectTrack(unsigned int i)
 {
-       eDVBServicePMTHandler::program program;
-
-       if (m_service_handler.getProgramInfo(program))
-               return -1;
-       
-       if (i >= program.audioStreams.size())
-               return -2;
-       
-       if (!m_decoder)
-               return -3;
-       
-       if (m_decoder->setAudioPID(program.audioStreams[i].pid, program.audioStreams[i].type))
-               return -4;
+       int ret = selectAudioStream(i);
 
        if (m_decoder->start())
                return -5;
 
        if (m_decoder->start())
                return -5;
-       
-       return 0;
+
+       return ret;
 }
 
 RESULT eDVBServicePlay::getTrackInfo(struct iAudioTrackInfo &info, unsigned int i)
 }
 
 RESULT eDVBServicePlay::getTrackInfo(struct iAudioTrackInfo &info, unsigned int i)
@@ -755,6 +781,30 @@ RESULT eDVBServicePlay::getTrackInfo(struct iAudioTrackInfo &info, unsigned int
        else
                info.m_description = "???";
        
        else
                info.m_description = "???";
        
+               /* CHECK here for component tag override. */
+       info.m_language = program.audioStreams[i].language_code;
+       
+       return 0;
+}
+
+int eDVBServicePlay::selectAudioStream(int i)
+{
+       eDVBServicePMTHandler::program program;
+
+       if (m_service_handler.getProgramInfo(program))
+               return -1;
+       
+       if (i >= program.audioStreams.size())
+               return -2;
+       
+       if (!m_decoder)
+               return -3;
+       
+       if (m_decoder->setAudioPID(program.audioStreams[i].pid, program.audioStreams[i].type))
+               return -4;
+
+       m_current_audio_stream = i;
+
        return 0;
 }
 
        return 0;
 }
 
index 31eee1feff173bf6e34a23fc655783fa441cc1c5..44d920f8d9ef771c9f919ead65e63c046bf8cad4 100644 (file)
@@ -82,6 +82,8 @@ public:
                // iServiceInformation
        RESULT getName(std::string &name);
        RESULT getEvent(ePtr<eServiceEvent> &evt, int nownext);
                // iServiceInformation
        RESULT getName(std::string &name);
        RESULT getEvent(ePtr<eServiceEvent> &evt, int nownext);
+       int getInfo(int w);
+       std::string getInfoString(int w);
 
                // iAudioTrackSelection 
        int getNumberOfTracks();
 
                // iAudioTrackSelection 
        int getNumberOfTracks();
@@ -107,6 +109,9 @@ private:
        Signal2<void,iPlayableService*,int> m_event;
        
        int m_is_pvr, m_is_paused;
        Signal2<void,iPlayableService*,int> m_event;
        
        int m_is_pvr, m_is_paused;
+       
+       int m_current_audio_stream;
+       int selectAudioStream(int n);
 };
 
 #endif
 };
 
 #endif