From 0329b4216112f4591e758ff2407002500abb0bf6 Mon Sep 17 00:00:00 2001 From: Felix Domke Date: Mon, 28 Nov 2005 01:54:35 +0000 Subject: [PATCH] service: add info --- lib/python/Screens/ServiceInfo.py | 63 ++++++++++++++++-------- lib/service/iservice.h | 39 ++++++++++++++- lib/service/service.cpp | 9 ++++ lib/service/servicedvb.cpp | 80 +++++++++++++++++++++++++------ lib/service/servicedvb.h | 5 ++ 5 files changed, 160 insertions(+), 36 deletions(-) diff --git a/lib/python/Screens/ServiceInfo.py b/lib/python/Screens/ServiceInfo.py index 10f7b28c..9a8abdb1 100644 --- a/lib/python/Screens/ServiceInfo.py +++ b/lib/python/Screens/ServiceInfo.py @@ -5,7 +5,7 @@ from Components.ActionMap import ActionMap 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 @@ -39,33 +39,58 @@ class ServiceInfoList(HTMLComponent, GUIComponent): class ServiceInfo(Screen): def __init__(self, session): Screen.__init__(self, session) - + 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: - try: - value = str(eval(item[1])) - except: - value = "N/A" + value = item[1] 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 diff --git a/lib/service/iservice.h b/lib/service/iservice.h index b7b34fe2..cbfd24a9 100644 --- a/lib/service/iservice.h +++ b/lib/service/iservice.h @@ -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 &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, iServiceInformationPtr); @@ -212,7 +242,10 @@ TEMPLATE_TYPEDEF(ePtr, iSeekableServicePtr); struct iAudioTrackInfo { std::string m_description; + std::string m_language; /* iso639 */ + std::string getDescription() { return m_description; } + std::string getLanguage() { return m_language; } }; SWIG_ALLOW_OUTPUT_SIMPLE(iAudioTrackInfo); @@ -227,6 +260,7 @@ public: TEMPLATE_TYPEDEF(ePtr, iAudioTrackSelectionPtr); + class iPlayableService: public iObject { friend class iServiceHandler; @@ -237,8 +271,9 @@ public: evEnd, evTuneFailed, - // when iServiceInformation is implemented: - evUpdatedEventInfo + // when iServiceInformation is implemented: + evUpdatedEventInfo, + evUpdatedInfo, }; virtual RESULT connectEvent(const Slot2 &event, ePtr &connection)=0; virtual RESULT start()=0; diff --git a/lib/service/service.cpp b/lib/service/service.cpp index 3a59d444..62bbe12d 100644 --- a/lib/service/service.cpp +++ b/lib/service/service.cpp @@ -139,5 +139,14 @@ RESULT iServiceInformation::getEvent(ePtr &evt, int m_nownext) return -1; } +int iServiceInformation::getInfo(int w) +{ + return -1; +} + +std::string iServiceInformation::getInfoString(int w) +{ + return ""; +} eAutoInitPtr init_eServiceCenter(eAutoInitNumbers::service, "eServiceCenter"); diff --git a/lib/service/servicedvb.cpp b/lib/service/servicedvb.cpp index d8206b9a..a49ce5c4 100644 --- a/lib/service/servicedvb.cpp +++ b/lib/service/servicedvb.cpp @@ -535,6 +535,7 @@ void eDVBServicePlay::serviceEvent(int event) 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); @@ -706,6 +707,43 @@ RESULT eDVBServicePlay::getEvent(ePtr &evt, int 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; @@ -716,24 +754,12 @@ int eDVBServicePlay::getNumberOfTracks() 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; - - return 0; + + return ret; } 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 = "???"; + /* 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; } diff --git a/lib/service/servicedvb.h b/lib/service/servicedvb.h index 31eee1fe..44d920f8 100644 --- a/lib/service/servicedvb.h +++ b/lib/service/servicedvb.h @@ -82,6 +82,8 @@ public: // iServiceInformation RESULT getName(std::string &name); RESULT getEvent(ePtr &evt, int nownext); + int getInfo(int w); + std::string getInfoString(int w); // iAudioTrackSelection int getNumberOfTracks(); @@ -107,6 +109,9 @@ private: Signal2 m_event; int m_is_pvr, m_is_paused; + + int m_current_audio_stream; + int selectAudioStream(int n); }; #endif -- 2.30.2