From dba8122997839f5084ebb20594f28ac9ceff207a Mon Sep 17 00:00:00 2001 From: hschang Date: Wed, 12 Feb 2014 11:38:24 +0900 Subject: [PATCH] [Customize] add preferred tuner option. --- data/setup.xml | 1 + lib/dvb/db.cpp | 3 +- lib/dvb/dvb.cpp | 16 +++++----- lib/dvb/dvb.h | 2 +- lib/dvb/frontend.cpp | 57 +++++++++++++++++++++++++++--------- lib/dvb/frontend.h | 3 ++ lib/python/Components/UsageConfig.py | 13 +++++++- lib/python/enigma_python.i | 8 +++++ lib/service/servicedvb.cpp | 34 +++++++++++---------- 9 files changed, 97 insertions(+), 40 deletions(-) diff --git a/data/setup.xml b/data/setup.xml index d040545..f5342ee 100755 --- a/data/setup.xml +++ b/data/setup.xml @@ -57,6 +57,7 @@ config.seek.on_pause config.usage.pip_zero_button config.usage.alternatives_priority + config.usage.frontend_priority config.recording.ascii_filenames config.recording.filename_composition diff --git a/lib/dvb/db.cpp b/lib/dvb/db.cpp index fb0b66c..0f367be 100755 --- a/lib/dvb/db.cpp +++ b/lib/dvb/db.cpp @@ -160,9 +160,10 @@ int eDVBService::isPlayable(const eServiceReference &ref, const eServiceReferenc else { eDVBChannelID chid, chid_ignore; + int system; ((const eServiceReferenceDVB&)ref).getChannelID(chid); ((const eServiceReferenceDVB&)ignore).getChannelID(chid_ignore); - return res_mgr->canAllocateChannel(chid, chid_ignore, simulate); + return res_mgr->canAllocateChannel(chid, chid_ignore, system, simulate); } return 0; } diff --git a/lib/dvb/dvb.cpp b/lib/dvb/dvb.cpp index a1fe247..f07a986 100755 --- a/lib/dvb/dvb.cpp +++ b/lib/dvb/dvb.cpp @@ -824,17 +824,17 @@ int eDVBResourceManager::canAllocateFrontend(ePtr &fepar return bestval; } -int tuner_type_channel_default(ePtr &channellist, const eDVBChannelID &chid) +int tuner_type_channel_default(ePtr &channellist, const eDVBChannelID &chid, int &system) { + system = iDVBFrontend::feSatellite; if (channellist) { ePtr feparm; if (!channellist->getChannelFrontendData(chid, feparm)) { - int system; if (!feparm->getSystem(system)) { - switch(system) + switch (system) { case iDVBFrontend::feSatellite: return 50000; @@ -851,15 +851,16 @@ int tuner_type_channel_default(ePtr &channellist, const eDVBCha return 0; } -int eDVBResourceManager::canAllocateChannel(const eDVBChannelID &channelid, const eDVBChannelID& ignore, bool simulate) +int eDVBResourceManager::canAllocateChannel(const eDVBChannelID &channelid, const eDVBChannelID& ignore, int &system, bool simulate) { std::list &active_channels = simulate ? m_active_simulate_channels : m_active_channels; - int ret=0; + int ret = 0; + system = iDVBFrontend::feSatellite; if (!simulate && m_cached_channel) { eDVBChannel *cache_chan = (eDVBChannel*)&(*m_cached_channel); if(channelid==cache_chan->getChannelID()) - return tuner_type_channel_default(m_list, channelid); + return tuner_type_channel_default(m_list, channelid, system); } /* first, check if a channel is already existing. */ @@ -870,7 +871,7 @@ int eDVBResourceManager::canAllocateChannel(const eDVBChannelID &channelid, cons if (i->m_channel_id == channelid) { // eDebug("found shared channel.."); - return tuner_type_channel_default(m_list, channelid); + return tuner_type_channel_default(m_list, channelid, system); } } @@ -950,6 +951,7 @@ int eDVBResourceManager::canAllocateChannel(const eDVBChannelID &channelid, cons eDebug("channel not found!"); goto error; } + feparm->getSystem(system); ret = canAllocateFrontend(feparm, simulate); diff --git a/lib/dvb/dvb.h b/lib/dvb/dvb.h index fb90ae5..8d72d2e 100644 --- a/lib/dvb/dvb.h +++ b/lib/dvb/dvb.h @@ -191,7 +191,7 @@ public: }; RESULT connectChannelAdded(const Slot1 &channelAdded, ePtr &connection); - int canAllocateChannel(const eDVBChannelID &channelid, const eDVBChannelID &ignore, bool simulate=false); + int canAllocateChannel(const eDVBChannelID &channelid, const eDVBChannelID &ignore, int &system, bool simulate=false); /* allocate channel... */ RESULT allocateChannel(const eDVBChannelID &channelid, eUsePtr &channel, bool simulate=false); diff --git a/lib/dvb/frontend.cpp b/lib/dvb/frontend.cpp index 21d897e..65712c6 100755 --- a/lib/dvb/frontend.cpp +++ b/lib/dvb/frontend.cpp @@ -496,6 +496,8 @@ RESULT eDVBFrontendParameters::calcLockTimeout(unsigned int &timeout) const DEFINE_REF(eDVBFrontend); int eDVBFrontend::PriorityOrder=0; +int eDVBFrontend::PreferredFrontendIndex=-1; + eDVBFrontend::eDVBFrontend(int adap, int fe, int &ok, bool simulate, eDVBFrontend *simulate_fe) :m_simulate(simulate), m_enabled(false), m_type(-1), m_simulate_fe(simulate_fe), m_dvbid(fe), m_slotid(fe) @@ -3086,40 +3088,67 @@ RESULT eDVBFrontend::setData(int num, long val) int eDVBFrontend::isCompatibleWith(ePtr &feparm) { int type; + int score = 0; + bool preferred = (eDVBFrontend::getPreferredFrontend() >= 0 && m_slotid == eDVBFrontend::getPreferredFrontend()); + if (feparm->getSystem(type) || type != m_type || !m_enabled) return 0; + if (m_type == eDVBFrontend::feSatellite) { - ASSERT(m_sec); eDVBFrontendParametersSatellite sat_parm; - int ret = feparm->getDVBS(sat_parm); - ASSERT(!ret); + if (feparm->getDVBS(sat_parm) < 0) + { + return 0; + } if (sat_parm.system == eDVBFrontendParametersSatellite::System_DVB_S2 && !m_can_handle_dvbs2) + { return 0; - ret = m_sec->canTune(sat_parm, this, 1 << m_slotid); - if (ret > 1 && sat_parm.system == eDVBFrontendParametersSatellite::System_DVB_S && m_can_handle_dvbs2) - ret -= 1; - return ret; + } + score = m_sec ? m_sec->canTune(sat_parm, this, 1 << m_slotid) : 0; + if (score > 1 && sat_parm.system == eDVBFrontendParametersSatellite::System_DVB_S && m_can_handle_dvbs2) + { + /* prefer to use a S tuner, try to keep S2 free for S2 transponders */ + score--; + } } + else if (m_type == eDVBFrontend::feCable) - return 2; // more prio for cable frontends + { + eDVBFrontendParametersCable cab_parm; + if (feparm->getDVBC(cab_parm) < 0) + { + return 0; + } + score = 2; + } + else if (m_type == eDVBFrontend::feTerrestrial) { eDVBFrontendParametersTerrestrial ter_parm; - if ( feparm->getDVBT(ter_parm) ) + if (feparm->getDVBT(ter_parm) < 0) { return 0; } - if (ter_parm.system == eDVBFrontendParametersTerrestrial::System_DVB_T2) + if (ter_parm.system == eDVBFrontendParametersTerrestrial::System_DVB_T2 && !m_can_handle_dvbt2) { - return m_can_handle_dvbt2 ? 1 : 0; + return 0; } - else // DVB-T + score = 2; + if (ter_parm.system == eDVBFrontendParametersTerrestrial::System_DVB_T && m_can_handle_dvbt2) { - return m_can_handle_dvbt2 ? 1 : 2; + /* prefer to use a T tuner, try to keep T2 free for T2 transponders */ + score--; } } - return 0; + + if (score && preferred) + { + /* make 'sure' we always prefer this frontend */ + score += 100000; + } + + return score; } bool eDVBFrontend::setSlotInfo(ePyObject obj) diff --git a/lib/dvb/frontend.h b/lib/dvb/frontend.h index da7be52..50648b9 100644 --- a/lib/dvb/frontend.h +++ b/lib/dvb/frontend.h @@ -116,6 +116,7 @@ private: void setFrontend(bool recvEvents=true); bool setSecSequencePos(int steps); static int PriorityOrder; + static int PreferredFrontendIndex; public: eDVBFrontend(int adap, int fe, int &ok, bool simulate=false, eDVBFrontend *simulate_fe=NULL); virtual ~eDVBFrontend(); @@ -148,6 +149,8 @@ public: bool setSlotInfo(ePyObject obj); // get a tuple (slotid, slotdescr) static void setTypePriorityOrder(int val) { PriorityOrder = val; } static int getTypePriorityOrder() { return PriorityOrder; } + static void setPreferredFrontend(int index) { PreferredFrontendIndex = index; } + static int getPreferredFrontend() { return PreferredFrontendIndex; } void reopenFrontend(); int openFrontend(); diff --git a/lib/python/Components/UsageConfig.py b/lib/python/Components/UsageConfig.py index ce56f0f..b98be60 100644 --- a/lib/python/Components/UsageConfig.py +++ b/lib/python/Components/UsageConfig.py @@ -1,7 +1,9 @@ from Components.Harddisk import harddiskmanager +from Components.NimManager import nimmanager from config import ConfigSubsection, ConfigYesNo, config, ConfigSelection, ConfigText, ConfigNumber, ConfigSet, ConfigLocations from Tools.Directories import resolveFilename, SCOPE_HDD -from enigma import Misc_Options, setTunerTypePriorityOrder, eEnv; +from enigma import Misc_Options, eEnv +from enigma import setTunerTypePriorityOrder, setPreferredTuner from SystemInfo import SystemInfo import os @@ -70,6 +72,11 @@ def InitUsageConfig(): ("4", "DVB-T/-C/-S"), ("5", "DVB-T/-S/-C") ]) + nims = [ ("-1", _("auto")) ] + for x in nimmanager.nim_slots: + nims.append( (str(x.slot), x.getSlotName()) ) + config.usage.frontend_priority = ConfigSelection(default = "-1", choices = nims) + config.usage.show_event_progress_in_servicelist = ConfigYesNo(default = False) config.usage.blinking_display_clock_during_recording = ConfigYesNo(default = False) @@ -82,6 +89,10 @@ def InitUsageConfig(): setTunerTypePriorityOrder(int(configElement.value)) config.usage.alternatives_priority.addNotifier(TunerTypePriorityOrderChanged, immediate_feedback=False) + def PreferredTunerChanged(configElement): + setPreferredTuner(int(configElement.value)) + config.usage.frontend_priority.addNotifier(PreferredTunerChanged) + def setHDDStandby(configElement): for hdd in harddiskmanager.HDDList(): hdd[1].setIdleTime(int(configElement.value)) diff --git a/lib/python/enigma_python.i b/lib/python/enigma_python.i index 7a42f76..6386702 100755 --- a/lib/python/enigma_python.i +++ b/lib/python/enigma_python.i @@ -326,6 +326,14 @@ void setTunerTypePriorityOrder(int order) } %} +void setPreferredTuner(int); +%{ +void setPreferredTuner(int index) +{ + eDVBFrontend::setPreferredFrontend(index); +} +%} + /************** temp *****************/ /* need a better place for this, i agree. */ diff --git a/lib/service/servicedvb.cpp b/lib/service/servicedvb.cpp index ca2fb29..1bd8e65 100755 --- a/lib/service/servicedvb.cpp +++ b/lib/service/servicedvb.cpp @@ -90,9 +90,10 @@ int eStaticServiceDVBInformation::isPlayable(const eServiceReference &ref, const else { eDVBChannelID chid, chid_ignore; + int system; ((const eServiceReferenceDVB&)ref).getChannelID(chid); ((const eServiceReferenceDVB&)ignore).getChannelID(chid_ignore); - return res_mgr->canAllocateChannel(chid, chid_ignore); + return res_mgr->canAllocateChannel(chid, chid_ignore, system); } return false; } @@ -240,23 +241,24 @@ int eStaticServiceDVBBouquetInformation::isPlayable(const eServiceReference &ref { 1, 2, 3 }, // -T -C -S { 2, 1, 3 } // -T -S -C }; + int system; ((const eServiceReferenceDVB&)*it).getChannelID(chid); - int tmp=res->canAllocateChannel(chid, chid_ignore, simulate); - switch(tmp) + int tmp = res->canAllocateChannel(chid, chid_ignore, system, simulate); + if (tmp > 0) { - case 0: - break; - case 30000: // cached DVB-T channel - case 1: // DVB-T frontend - tmp = prio_map[prio_order][2]; - break; - case 40000: // cached DVB-C channel - case 2: - tmp = prio_map[prio_order][1]; - break; - default: // DVB-S - tmp = prio_map[prio_order][0]; - break; + switch (system) + { + case iDVBFrontend::feTerrestrial: + tmp = prio_map[prio_order][2]; + break; + case iDVBFrontend::feCable: + tmp = prio_map[prio_order][1]; + break; + default: + case iDVBFrontend::feSatellite: + tmp = prio_map[prio_order][0]; + break; + } } if (tmp > cur) { -- 2.7.4