X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/3353982034f151f4615cb1842873d99a7a6fa0ca..669088fb85f6d0e6c0f7c424df2d1c5dc1141d84:/lib/service/servicedvb.cpp diff --git a/lib/service/servicedvb.cpp b/lib/service/servicedvb.cpp index 39c4407d..0de13215 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); @@ -652,8 +653,14 @@ RESULT eDVBServicePlay::seekRelative(int direction, pts_t to) if (m_service_handler.getPVRChannel(pvr_channel)) return -1; - /* this is of couse wrong: PTS values don't match with bytes. */ - return pvr_channel->seekToPosition(SEEK_CUR, direction * to); + to *= direction; + + ePtr demux; + m_service_handler.getDemux(demux); + if (!demux) + return -1; + + return pvr_channel->seekTo(demux, 1, to); } RESULT eDVBServicePlay::getPlayPosition(pts_t &pos) @@ -663,7 +670,12 @@ RESULT eDVBServicePlay::getPlayPosition(pts_t &pos) if (m_service_handler.getPVRChannel(pvr_channel)) return -1; - return pvr_channel->getCurrentPosition(pos); + ePtr demux; + m_service_handler.getDemux(demux); + if (!demux) + return -1; + + return pvr_channel->getCurrentPosition(demux, pos); } RESULT eDVBServicePlay::info(ePtr &ptr) @@ -695,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.audioStreams[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; @@ -704,6 +753,16 @@ int eDVBServicePlay::getNumberOfTracks() } RESULT eDVBServicePlay::selectTrack(unsigned int i) +{ + int ret = selectAudioStream(i); + + if (m_decoder->start()) + return -5; + + return ret; +} + +RESULT eDVBServicePlay::getTrackInfo(struct iAudioTrackInfo &info, unsigned int i) { eDVBServicePMTHandler::program program; @@ -713,16 +772,22 @@ RESULT eDVBServicePlay::selectTrack(unsigned int i) if (i >= program.audioStreams.size()) return -2; - if (!m_decoder) - return -3; + if (program.audioStreams[i].type == eDVBServicePMTHandler::audioStream::atMPEG) + info.m_description = "MPEG"; + else if (program.audioStreams[i].type == eDVBServicePMTHandler::audioStream::atAC3) + info.m_description = "AC3"; + else if (program.audioStreams[i].type == eDVBServicePMTHandler::audioStream::atDTS) + info.m_description = "DTS"; + else + info.m_description = "???"; - if (m_decoder->setAudioPID(program.audioStreams[i].pid, program.audioStreams[i].type)) - return -4; + /* CHECK here for component tag override. */ + info.m_language = program.audioStreams[i].language_code; return 0; } -RESULT eDVBServicePlay::getTrackInfo(struct iAudioTrackInfo &info, unsigned int i) +int eDVBServicePlay::selectAudioStream(int i) { eDVBServicePMTHandler::program program; @@ -732,15 +797,14 @@ RESULT eDVBServicePlay::getTrackInfo(struct iAudioTrackInfo &info, unsigned int if (i >= program.audioStreams.size()) return -2; - if (program.audioStreams[i].type == eDVBServicePMTHandler::audioStream::atMPEG) - info.m_description = "MPEG"; - else if (program.audioStreams[i].type == eDVBServicePMTHandler::audioStream::atAC3) - info.m_description = "AC3"; - else if (program.audioStreams[i].type == eDVBServicePMTHandler::audioStream::atDTS) - info.m_description = "DTS"; - else - info.m_description = "???"; + 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; }