From 2d0d9ad2cf4891c5386a3d8ca040c2738b5c2532 Mon Sep 17 00:00:00 2001 From: Andreas Monzner Date: Wed, 29 Nov 2006 21:31:27 +0000 Subject: [PATCH] code cleanup in ChannelSelection, prepare for new service groups --- lib/dvb/db.cpp | 4 +- lib/dvb/dvb.cpp | 6 +-- lib/dvb/dvb.h | 4 +- lib/dvb/frontend.cpp | 2 + lib/dvb/idvb.h | 2 +- lib/python/Screens/ChannelSelection.py | 72 ++++++++++++++++++++------ lib/service/iservice.h | 5 +- lib/service/service.cpp | 4 +- lib/service/servicedvb.cpp | 62 ++++++++++++++++++++++ 9 files changed, 133 insertions(+), 28 deletions(-) diff --git a/lib/dvb/db.cpp b/lib/dvb/db.cpp index eb0221a3..39a0d3ee 100644 --- a/lib/dvb/db.cpp +++ b/lib/dvb/db.cpp @@ -168,7 +168,7 @@ RESULT eDVBService::getEvent(const eServiceReference &ref, ePtr & return eEPGCache::getInstance()->lookupEventTime(ref, start_time, ptr); } -bool eDVBService::isPlayable(const eServiceReference &ref, const eServiceReference &ignore) +int eDVBService::isPlayable(const eServiceReference &ref, const eServiceReference &ignore) { ePtr res_mgr; if ( eDVBResourceManager::getInstance( res_mgr ) ) @@ -180,7 +180,7 @@ bool eDVBService::isPlayable(const eServiceReference &ref, const eServiceReferen ((const eServiceReferenceDVB&)ignore).getChannelID(chid_ignore); return res_mgr->canAllocateChannel(chid, chid_ignore); } - return false; + return 0; } int eDVBService::checkFilter(const eServiceReferenceDVB &ref, const eDVBChannelQuery &query) diff --git a/lib/dvb/dvb.cpp b/lib/dvb/dvb.cpp index ff3e4712..c3c0a026 100644 --- a/lib/dvb/dvb.cpp +++ b/lib/dvb/dvb.cpp @@ -511,7 +511,7 @@ RESULT eDVBResourceManager::connectChannelAdded(const Slot1 & return 0; } -bool eDVBResourceManager::canAllocateFrontend(ePtr &feparm) +int eDVBResourceManager::canAllocateFrontend(ePtr &feparm) { ePtr best; int bestval = 0; @@ -524,10 +524,10 @@ bool eDVBResourceManager::canAllocateFrontend(ePtr &fepa bestval = c; } - return bestval>0; + return bestval; } -bool eDVBResourceManager::canAllocateChannel(const eDVBChannelID &channelid, const eDVBChannelID& ignore) +int eDVBResourceManager::canAllocateChannel(const eDVBChannelID &channelid, const eDVBChannelID& ignore) { bool ret=true; if (m_cached_channel) diff --git a/lib/dvb/dvb.h b/lib/dvb/dvb.h index 4ca986b1..037c1974 100644 --- a/lib/dvb/dvb.h +++ b/lib/dvb/dvb.h @@ -175,7 +175,7 @@ class eDVBResourceManager: public iObject, public Object Signal1 m_channelAdded; - bool canAllocateFrontend(ePtr &feparm); + int canAllocateFrontend(ePtr &feparm); eUsePtr m_cached_channel; Connection m_cached_channel_state_changed_conn; @@ -199,7 +199,7 @@ public: }; RESULT connectChannelAdded(const Slot1 &channelAdded, ePtr &connection); - bool canAllocateChannel(const eDVBChannelID &channelid, const eDVBChannelID &ignore); + int canAllocateChannel(const eDVBChannelID &channelid, const eDVBChannelID &ignore); /* allocate channel... */ RESULT allocateChannel(const eDVBChannelID &channelid, eUsePtr &channel); diff --git a/lib/dvb/frontend.cpp b/lib/dvb/frontend.cpp index 133aa0f7..c4d64122 100644 --- a/lib/dvb/frontend.cpp +++ b/lib/dvb/frontend.cpp @@ -2002,5 +2002,7 @@ int eDVBFrontend::isCompatibleWith(ePtr &feparm) ASSERT(!feparm->getDVBS(sat_parm)); return m_sec->canTune(sat_parm, this, 1 << m_fe); } + else if (m_type == eDVBFrontend::feCable) + return 2; // more prio for cable frontends return 1; } diff --git a/lib/dvb/idvb.h b/lib/dvb/idvb.h index 1f8aebda..997b2a88 100644 --- a/lib/dvb/idvb.h +++ b/lib/dvb/idvb.h @@ -272,7 +272,7 @@ public: // iStaticServiceInformation RESULT getName(const eServiceReference &ref, std::string &name); RESULT getEvent(const eServiceReference &ref, ePtr &ptr, time_t start_time); - bool isPlayable(const eServiceReference &ref, const eServiceReference &ignore); + int isPlayable(const eServiceReference &ref, const eServiceReference &ignore); /* for filtering: */ int checkFilter(const eServiceReferenceDVB &ref, const eDVBChannelQuery &query); diff --git a/lib/python/Screens/ChannelSelection.py b/lib/python/Screens/ChannelSelection.py index c75c421a..acd53bc5 100644 --- a/lib/python/Screens/ChannelSelection.py +++ b/lib/python/Screens/ChannelSelection.py @@ -3,8 +3,9 @@ from Components.Button import Button from Components.ServiceList import ServiceList from Components.ActionMap import NumberActionMap, ActionMap from Components.MenuList import MenuList +from Components.ServiceEventTracker import ServiceEventTracker from EpgSelection import EPGSelection -from enigma import eServiceReference, eEPGCache, eServiceCenter, eServiceCenterPtr, iMutableServiceListPtr, iStaticServiceInformationPtr, eTimer, eDVBDB +from enigma import eServiceReference, eEPGCache, eServiceCenter, eServiceCenterPtr, iMutableServiceListPtr, iStaticServiceInformationPtr, eTimer, eDVBDB, iPlayableService, iServiceInformation from Components.config import config, ConfigSubsection, ConfigText from Screens.FixedMenu import FixedMenu from Tools.NumericalTextInput import NumericalTextInput @@ -866,23 +867,40 @@ class ChannelSelectionBase(Screen): serviceHandler = eServiceCenter.getInstance() if config.usage.multibouquet.value: list = serviceHandler.list(self.bouquet_root) - if not list is None: + if list: while True: s = list.getNext() if not s.valid(): break - if ((s.flags & eServiceReference.flagDirectory) == eServiceReference.flagDirectory): + if (s.flags & eServiceReference.isGroup): + continue + if (s.flags & eServiceReference.flagDirectory) == eServiceReference.flagDirectory: info = serviceHandler.info(s) - if not info is None: + if info: bouquets.append((info.getName(s), s)) return bouquets else: info = serviceHandler.info(self.bouquet_root) - if not info is None: + if info: bouquets.append((info.getName(self.bouquet_root), self.bouquet_root)) return bouquets return None + def getGroupList(self): + groups = [ ] + serviceHandler = eServiceCenter.getInstance() + list = serviceHandler.list(self.bouquet_root) + if list: + while True: + s = list.getNext() + if not s.valid(): + break + if (s.flags & eServiceReference.isGroup) and (s.flags & eServiceReference.flagDirectory) == eServiceReference.flagDirectory: + info = serviceHandler.info(s) + if info: + groups.append((info.getName(s), s)) + return groups + def keyNumber0(self, num): if len(self.servicePath) > 1: self.keyGoUp() @@ -936,7 +954,11 @@ class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelect "keyTV": self.setModeTv, }) - self.onShown.append(self.__onShown) + self.__event_tracker = ServiceEventTracker(screen=self, eventmap= + { + iPlayableService.evStart: self.__evServiceStart, + iPlayableService.evEnd: self.__evServiceEnd + }) self.lastChannelRootTimer = eTimer() self.lastChannelRootTimer.timeout.get().append(self.__onCreate) @@ -951,6 +973,17 @@ class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelect self.lastroot = config.tv.lastroot self.revertMode = None + def __evServiceStart(self): + service = self.session.nav.getCurrentService() + if service: + info = service.info() + if info: + refstr = info.getInfoString(iServiceInformation.sServiceref) + self.servicelist.setPlayableIgnoreService(eServiceReference(refstr)) + + def __evServiceEnd(self): + self.servicelist.setPlayableIgnoreService(eServiceReference()) + def setMode(self): self.restoreRoot() lastservice=eServiceReference(self.lastservice.value) @@ -990,14 +1023,6 @@ class ChannelSelection(ChannelSelectionBase, ChannelSelectionEdit, ChannelSelect if lastservice.valid(): self.zap() - def __onShown(self): - self.recallBouquetMode() - ref = self.session.nav.getCurrentlyPlayingServiceReference() - if ref is not None and ref.valid() and ref.getPath() == "": - self.servicelist.setPlayableIgnoreService(ref) - else: - self.servicelist.setPlayableIgnoreService(eServiceReference()) - def channelSelected(self): ref = self.getCurrentSelection() if self.movemode: @@ -1183,6 +1208,23 @@ class ChannelSelectionRadio(ChannelSelectionBase, ChannelSelectionEdit, ChannelS "ok": self.channelSelected, }) + self.__event_tracker = ServiceEventTracker(screen=self, eventmap= + { + iPlayableService.evStart: self.__evServiceStart, + iPlayableService.evEnd: self.__evServiceEnd + }) + + def __evServiceStart(self): + service = self.session.nav.getCurrentService() + if service: + info = service.info() + if info: + refstr = info.getInfoString(iServiceInformation.sServiceref) + self.servicelist.setPlayableIgnoreService(eServiceReference(refstr)) + + def __evServiceEnd(self): + self.servicelist.setPlayableIgnoreService(eServiceReference()) + def saveRoot(self): path = '' for i in self.servicePathRadio: @@ -1225,7 +1267,6 @@ class ChannelSelectionRadio(ChannelSelectionBase, ChannelSelectionEdit, ChannelS if lastservice.valid(): self.servicelist.setCurrent(lastservice) self.session.nav.playService(lastservice) - self.servicelist.setPlayableIgnoreService(lastservice) self.info.show() def channelSelected(self): # just return selected service @@ -1240,7 +1281,6 @@ class ChannelSelectionRadio(ChannelSelectionBase, ChannelSelectionEdit, ChannelS playingref = self.session.nav.getCurrentlyPlayingServiceReference() if playingref is None or playingref != ref: self.session.nav.playService(ref) - self.servicelist.setPlayableIgnoreService(ref) config.radio.lastservice.value = ref.toString() config.radio.lastservice.save() self.saveRoot() diff --git a/lib/service/iservice.h b/lib/service/iservice.h index 0d11dd7e..6cb904e6 100644 --- a/lib/service/iservice.h +++ b/lib/service/iservice.h @@ -39,7 +39,8 @@ public: shouldSort=8, // should be ASCII-sorted according to service_name. great for directories. hasSortKey=16, // has a sort key in data[3]. not having a sort key implies 0. sort1=32, // sort key is 1 instead of 0 - isMarker=64 // Marker + isMarker=64, // Marker + isGroup=128 // is a group of services }; int flags; // flags will NOT be compared. @@ -238,7 +239,7 @@ public: virtual int getLength(const eServiceReference &ref); virtual SWIG_VOID(RESULT) getEvent(const eServiceReference &ref, ePtr &SWIG_OUTPUT, time_t start_time=-1); // returns true when not implemented - virtual bool isPlayable(const eServiceReference &ref, const eServiceReference &ignore); + virtual int isPlayable(const eServiceReference &ref, const eServiceReference &ignore); virtual int getInfo(const eServiceReference &ref, int w); virtual std::string getInfoString(const eServiceReference &ref,int w); diff --git a/lib/service/service.cpp b/lib/service/service.cpp index 181ec22f..82957c81 100644 --- a/lib/service/service.cpp +++ b/lib/service/service.cpp @@ -171,9 +171,9 @@ int iStaticServiceInformation::getLength(const eServiceReference &ref) return -1; } -bool iStaticServiceInformation::isPlayable(const eServiceReference &ref, const eServiceReference &ignore) +int iStaticServiceInformation::isPlayable(const eServiceReference &ref, const eServiceReference &ignore) { - return true; + return 0; } RESULT iServiceInformation::getEvent(ePtr &evt, int m_nownext) diff --git a/lib/service/servicedvb.cpp b/lib/service/servicedvb.cpp index 871a0b26..4b7d63a0 100644 --- a/lib/service/servicedvb.cpp +++ b/lib/service/servicedvb.cpp @@ -39,6 +39,7 @@ class eStaticServiceDVBInformation: public iStaticServiceInformation public: RESULT getName(const eServiceReference &ref, std::string &name); int getLength(const eServiceReference &ref); + int isPlayable(const eServiceReference &ref, const eServiceReference &ignore); }; DEFINE_REF(eStaticServiceDVBInformation); @@ -90,12 +91,30 @@ int eStaticServiceDVBInformation::getLength(const eServiceReference &ref) return -1; } +int eStaticServiceDVBInformation::isPlayable(const eServiceReference &ref, const eServiceReference &ignore) +{ + ePtr res_mgr; + if ( eDVBResourceManager::getInstance( res_mgr ) ) + eDebug("isPlayble... no res manager!!"); + else + { + eDVBChannelID chid, chid_ignore; + ((const eServiceReferenceDVB&)ref).getChannelID(chid); + ((const eServiceReferenceDVB&)ignore).getChannelID(chid_ignore); + return res_mgr->canAllocateChannel(chid, chid_ignore); + } + return false; +} + + class eStaticServiceDVBBouquetInformation: public iStaticServiceInformation { DECLARE_REF(eStaticServiceDVBBouquetInformation); public: + eServiceReference m_playable_service; RESULT getName(const eServiceReference &ref, std::string &name); int getLength(const eServiceReference &ref); + int isPlayable(const eServiceReference &ref, const eServiceReference &ignore); }; DEFINE_REF(eStaticServiceDVBBouquetInformation); @@ -133,6 +152,46 @@ RESULT eStaticServiceDVBBouquetInformation::getName(const eServiceReference &ref return -1; } +int eStaticServiceDVBBouquetInformation::isPlayable(const eServiceReference &ref, const eServiceReference &ignore) +{ + if (ref.flags & eServiceReference::isGroup) + { + ePtr db; + ePtr res; + + if (eDVBResourceManager::getInstance(res)) + { + eDebug("eStaticServiceDVBBouquetInformation::isPlayable failed.. no resource manager!"); + return false; + } + + if (res->getChannelList(db)) + { + eDebug("eStaticServiceDVBBouquetInformation::isPlayable failed.. no channel list!"); + return false; + } + + eBouquet *bouquet=0; + if (db->getBouquet(ref, bouquet)) + { + eDebug("eStaticServiceDVBBouquetInformation::isPlayable failed.. getBouquet failed!"); + return false; + } + + eDVBChannelID chid, chid_ignore; + ((const eServiceReferenceDVB&)ignore).getChannelID(chid_ignore); + for (std::list::iterator it(bouquet->m_services.begin()); it != bouquet->m_services.end(); ++it) + { + m_playable_service = *it; + ((const eServiceReferenceDVB&)*it).getChannelID(chid); + if (res->canAllocateChannel(chid, chid_ignore)) + return true; + } + } + m_playable_service = eServiceReference(); + return false; +} + int eStaticServiceDVBBouquetInformation::getLength(const eServiceReference &ref) { return -1; @@ -1211,6 +1270,7 @@ int eDVBServicePlay::getInfo(int w) 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; + case sServiceref: return resIsString; default: return -1; } @@ -1223,6 +1283,8 @@ std::string eDVBServicePlay::getInfoString(int w) case sProvider: if (!m_dvb_service) return ""; return m_dvb_service->m_provider_name; + case sServiceref: + return m_reference.toString(); default: break; } -- 2.30.2