diff options
| author | ghost <andreas.monzner@multimedia-labs.de> | 2009-04-23 13:01:04 +0200 |
|---|---|---|
| committer | ghost <andreas.monzner@multimedia-labs.de> | 2009-04-23 13:01:04 +0200 |
| commit | 556d6244747ea2b4b3590e682948e9f708b0a069 (patch) | |
| tree | d978475519d4b075c5b13547547041ea12225fef /lib/service/servicedvb.cpp | |
| parent | 41c9e42e428c0216ef2e011985c060f79fcf8ebc (diff) | |
| download | enigma2-556d6244747ea2b4b3590e682948e9f708b0a069.tar.gz enigma2-556d6244747ea2b4b3590e682948e9f708b0a069.zip | |
Add service flags and pid cache to recordings meta file. This adds possibility to playback services without pat/pmt, now also current selected audio pid, subtitles, pcm/ac3 delays are stored for ts playbacks
Diffstat (limited to 'lib/service/servicedvb.cpp')
| -rw-r--r-- | lib/service/servicedvb.cpp | 82 |
1 files changed, 58 insertions, 24 deletions
diff --git a/lib/service/servicedvb.cpp b/lib/service/servicedvb.cpp index 0e6229c5..2cece3eb 100644 --- a/lib/service/servicedvb.cpp +++ b/lib/service/servicedvb.cpp @@ -860,30 +860,41 @@ RESULT eServiceFactoryDVB::offlineOperations(const eServiceReference &ref, ePtr< RESULT eServiceFactoryDVB::lookupService(ePtr<eDVBService> &service, const eServiceReference &ref) { - // TODO: handle the listing itself - // if (ref.... == -1) .. return "... bouquets ..."; - // could be also done in another serviceFactory (with seperate ID) to seperate actual services and lists - // TODO: cache - ePtr<iDVBChannelList> db; - ePtr<eDVBResourceManager> res; - - int err; - if ((err = eDVBResourceManager::getInstance(res)) != 0) + if (!ref.path.empty()) // playback { - eDebug("no resource manager"); - return err; + eDVBMetaParser parser; + int ret=parser.parseFile(ref.path); + service = new eDVBService; + if (!ret) + eDVBDB::getInstance()->parseServiceData(service, parser.m_service_data); } - if ((err = res->getChannelList(db)) != 0) + else { - eDebug("no channel list"); - return err; - } + // TODO: handle the listing itself + // if (ref.... == -1) .. return "... bouquets ..."; + // could be also done in another serviceFactory (with seperate ID) to seperate actual services and lists + // TODO: cache + ePtr<iDVBChannelList> db; + ePtr<eDVBResourceManager> res; + + int err; + if ((err = eDVBResourceManager::getInstance(res)) != 0) + { + eDebug("no resource manager"); + return err; + } + if ((err = res->getChannelList(db)) != 0) + { + eDebug("no channel list"); + return err; + } /* we are sure to have a ..DVB reference as the info() call was forwarded here according to it's ID. */ - if ((err = db->getService((eServiceReferenceDVB&)ref, service)) != 0) - { - eDebug("getService failed!"); - return err; + if ((err = db->getService((eServiceReferenceDVB&)ref, service)) != 0) + { + eDebug("getService failed!"); + return err; + } } return 0; @@ -916,6 +927,29 @@ eDVBServicePlay::eDVBServicePlay(const eServiceReference &ref, eDVBService *serv eDVBServicePlay::~eDVBServicePlay() { + if (m_is_pvr) + { + eDVBMetaParser meta; + int ret=meta.parseFile(m_reference.path); + if (!ret) + { + char tmp[255]; + meta.m_service_data=""; + sprintf(tmp, "f:%x", m_dvb_service->m_flags); + meta.m_service_data += tmp; + // cached pids + for (int x=0; x < eDVBService::cacheMax; ++x) + { + int entry = m_dvb_service->getCacheEntry((eDVBService::cacheID)x); + if (entry != -1) + { + sprintf(tmp, ",c:%02d%04x", x, entry); + meta.m_service_data += tmp; + } + } + meta.updateMeta(m_reference.path); + } + } delete m_subtitle_widget; } @@ -1028,7 +1062,7 @@ RESULT eDVBServicePlay::start() m_first_program_info = 1; eServiceReferenceDVB &service = (eServiceReferenceDVB&)m_reference; - r = m_service_handler.tune(service, m_is_pvr, m_cue); + r = m_service_handler.tune(service, m_is_pvr, m_cue, false, m_dvb_service); /* inject EIT if there is a stored one */ if (m_is_pvr) @@ -1425,7 +1459,7 @@ RESULT eDVBServicePlay::getName(std::string &name) ePtr<iStaticServiceInformation> i = new eStaticServiceDVBPVRInformation(m_reference); return i->getName(m_reference, name); } - if (m_dvb_service) + else if (m_dvb_service) { m_dvb_service->getName(m_reference, name); if (name.empty()) @@ -1708,7 +1742,7 @@ int eDVBServicePlay::selectAudioStream(int i) anything in the best case, or destroy the default setting in case the real default is not yet available.) */ - if (m_dvb_service && !m_is_pvr && ((i != -1) + if (m_dvb_service && ((i != -1) || ((m_dvb_service->getCacheEntry(eDVBService::cAPID) == -1) && (m_dvb_service->getCacheEntry(eDVBService::cAC3PID)==-1)))) { if (apidtype == eDVBAudio::aMPEG) @@ -2271,7 +2305,7 @@ void eDVBServicePlay::updateDecoder() ac3_delay = m_dvb_service->getCacheEntry(eDVBService::cAC3DELAY); pcm_delay = m_dvb_service->getCacheEntry(eDVBService::cPCMDELAY); } - else // subservice or recording + else // subservice { eServiceReferenceDVB ref; m_service_handler.getServiceReference(ref); @@ -2340,7 +2374,7 @@ void eDVBServicePlay::updateDecoder() m_decoder->setAudioChannel(achannel); /* don't worry about non-existing services, nor pvr services */ - if (m_dvb_service && !m_is_pvr) + if (m_dvb_service) { /* (audio pid will be set in selectAudioTrack */ m_dvb_service->setCacheEntry(eDVBService::cVPID, vpid); |
