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
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
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);
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);
TEMPLATE_TYPEDEF(ePtr<iAudioTrackSelection>, iAudioTrackSelectionPtr);
+
class iPlayableService: public iObject
{
friend class iServiceHandler;
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;
return -1;
}
+int iServiceInformation::getInfo(int w)
+{
+ return -1;
+}
+
+std::string iServiceInformation::getInfoString(int w)
+{
+ return "";
+}
eAutoInitPtr<eServiceCenter> init_eServiceCenter(eAutoInitNumbers::service, "eServiceCenter");
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);
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;
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)
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;
}
// 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();
Signal2<void,iPlayableService*,int> m_event;
int m_is_pvr, m_is_paused;
+
+ int m_current_audio_stream;
+ int selectAudioStream(int n);
};
#endif