X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/2e2cf81de863a180f7d27dca89e5122e1eb0acaa..20fdb2a2af40da98427a702a03a79b1fbec3d7af:/lib/service/servicedvb.cpp diff --git a/lib/service/servicedvb.cpp b/lib/service/servicedvb.cpp index 94833f44..96f942ab 100644 --- a/lib/service/servicedvb.cpp +++ b/lib/service/servicedvb.cpp @@ -25,7 +25,7 @@ DEFINE_REF(eStaticServiceDVBInformation); RESULT eStaticServiceDVBInformation::getName(const eServiceReference &ref, std::string &name) { - if ( ref.name.length() ) + if ( !ref.name.empty() ) { name = ref.name; return 0; @@ -66,7 +66,7 @@ RESULT eStaticServiceDVBBouquetInformation::getName(const eServiceReference &ref return err; } - const eBouquet *bouquet=0; + eBouquet *bouquet=0; if ((err = db->getBouquet(ref, bouquet)) != 0) { eDebug("eStaticServiceDVBBouquetInformation::getName failed.. getBouquet failed!"); @@ -280,10 +280,9 @@ RESULT eDVBServiceList::startEdit(ePtr &res) if (eDVBResourceManager::getInstance(resm) || resm->getChannelList(db)) return -1; - // FIXME! - if (db->getBouquet(m_parent, (const eBouquet*&)m_bouquet) != 0) + if (db->getBouquet(m_parent, m_bouquet) != 0) return -1; - + res = this; return 0; @@ -294,24 +293,30 @@ RESULT eDVBServiceList::startEdit(ePtr &res) RESULT eDVBServiceList::addService(eServiceReference &ref) { - ASSERT(m_bouquet); -// return m_bouquet->addService(ref); - return -1; + if (!m_bouquet) + return -1; + return m_bouquet->addService(ref); } RESULT eDVBServiceList::removeService(eServiceReference &ref) { - ASSERT(m_bouquet); -// return m_bouquet->removeService(ref); - return -1; + if (!m_bouquet) + return -1; + return m_bouquet->removeService(ref); } RESULT eDVBServiceList::moveService(eServiceReference &ref, int pos) { - ASSERT(m_bouquet); - -// return m_bouquet->moveService(ref, pos); - return -1; + if (!m_bouquet) + return -1; + return m_bouquet->moveService(ref, pos); +} + +RESULT eDVBServiceList::flushChanges() +{ + if (!m_bouquet) + return -1; + return m_bouquet->flushChanges(); } RESULT eServiceFactoryDVB::play(const eServiceReference &ref, ePtr &ptr) @@ -353,22 +358,25 @@ RESULT eServiceFactoryDVB::list(const eServiceReference &ref, ePtr &ptr) { - /* do we have a PVR service? */ - if (ref.flags & eServiceReference::flagDirectory) // bouquet + /* is a listable service? */ + if ((ref.flags & eServiceReference::flagDirectory) == eServiceReference::flagDirectory) // bouquet { - ptr = new eStaticServiceDVBBouquetInformation; + if ( !ref.name.empty() ) // satellites or providers list + ptr = new eStaticServiceDVBInformation; + else // a dvb bouquet + ptr = new eStaticServiceDVBBouquetInformation; return 0; } - else if (!ref.path.empty()) + else if (!ref.path.empty()) /* do we have a PVR service? */ { ptr = new eStaticServiceDVBPVRInformation(ref); return 0; } - else + else // normal dvb service { ePtr service; int r = lookupService(service, ref); - if (r) + if (r) // no eDVBService avail for this reference ( Linkage Services... ) ptr = new eStaticServiceDVBInformation; else /* eDVBService has the iStaticServiceInformation interface, so we pass it here. */ @@ -473,7 +481,7 @@ void eDVBServicePlay::serviceEvent(int event) } case eDVBServicePMTHandler::eventNewProgramInfo: { - int vpid = -1, apid = -1, pcrpid = -1; + int vpid = -1, apid = -1, apidtype = -1, pcrpid = -1; eDVBServicePMTHandler::program program; if (m_service_handler.getProgramInfo(program)) eDebug("getting program info failed."); @@ -504,7 +512,10 @@ void eDVBServicePlay::serviceEvent(int event) i != program.audioStreams.end(); ++i) { if (apid == -1) + { apid = i->pid; + apidtype = i->type; + } if (i != program.audioStreams.begin()) eDebugNoNewLine(", "); eDebugNoNewLine("%04x", i->pid); @@ -527,7 +538,8 @@ void eDVBServicePlay::serviceEvent(int event) if (m_decoder) { m_decoder->setVideoPID(vpid); - m_decoder->setAudioPID(apid, 0); + m_current_audio_stream = 0; + m_decoder->setAudioPID(apid, apidtype); if (!m_is_pvr) m_decoder->setSyncPCR(pcrpid); else @@ -644,7 +656,14 @@ RESULT eDVBServicePlay::seekRelative(int direction, pts_t to) if (m_service_handler.getPVRChannel(pvr_channel)) return -1; - return pvr_channel->seekToPosition(SEEK_CUR, 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) @@ -654,7 +673,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) @@ -663,6 +687,12 @@ RESULT eDVBServicePlay::info(ePtr &ptr) return 0; } +RESULT eDVBServicePlay::audioTracks(ePtr &ptr) +{ + ptr = this; + return 0; +} + RESULT eDVBServicePlay::getName(std::string &name) { if (m_dvb_service) @@ -680,6 +710,107 @@ 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; + if (m_service_handler.getProgramInfo(program)) + return 0; + return program.audioStreams.size(); +} + +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; + + if (m_service_handler.getProgramInfo(program)) + return -1; + + 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 = "???"; + + /* 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; +} + DEFINE_REF(eDVBServicePlay) eAutoInitPtr init_eServiceFactoryDVB(eAutoInitNumbers::service+1, "eServiceFactoryDVB");