[Customize] add preferred tuner option.
authorhschang <chang@dev3>
Wed, 12 Feb 2014 02:38:24 +0000 (11:38 +0900)
committerhschang <chang@dev3>
Fri, 7 Mar 2014 04:50:32 +0000 (13:50 +0900)
data/setup.xml
lib/dvb/db.cpp
lib/dvb/dvb.cpp
lib/dvb/dvb.h
lib/dvb/frontend.cpp
lib/dvb/frontend.h
lib/python/Components/UsageConfig.py
lib/python/enigma_python.i
lib/service/servicedvb.cpp

index d040545..f5342ee 100755 (executable)
@@ -57,6 +57,7 @@
                        <item level="2" text="Behavior of 'pause' when paused">config.seek.on_pause</item>
                        <item level="2" text="Behavior of 0 key in PiP-mode">config.usage.pip_zero_button</item>
                        <item level="2" text="Alternative services tuner priority">config.usage.alternatives_priority</item>
                        <item level="2" text="Behavior of 'pause' when paused">config.seek.on_pause</item>
                        <item level="2" text="Behavior of 0 key in PiP-mode">config.usage.pip_zero_button</item>
                        <item level="2" text="Alternative services tuner priority">config.usage.alternatives_priority</item>
+                       <item level="2" text="Preferred tuner">config.usage.frontend_priority</item>
                        <item level="2" text="Limited character set for recording filenames">config.recording.ascii_filenames</item>
                        <item level="2" text="Composition of the recording filenames">config.recording.filename_composition</item>
                </setup>
                        <item level="2" text="Limited character set for recording filenames">config.recording.ascii_filenames</item>
                        <item level="2" text="Composition of the recording filenames">config.recording.filename_composition</item>
                </setup>
index fb0b66c..0f367be 100755 (executable)
@@ -160,9 +160,10 @@ int eDVBService::isPlayable(const eServiceReference &ref, const eServiceReferenc
        else
        {
                eDVBChannelID chid, chid_ignore;
        else
        {
                eDVBChannelID chid, chid_ignore;
+               int system;
                ((const eServiceReferenceDVB&)ref).getChannelID(chid);
                ((const eServiceReferenceDVB&)ignore).getChannelID(chid_ignore);
                ((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;
 }
        }
        return 0;
 }
index a1fe247..f07a986 100755 (executable)
@@ -824,17 +824,17 @@ int eDVBResourceManager::canAllocateFrontend(ePtr<iDVBFrontendParameters> &fepar
        return bestval;
 }
 
        return bestval;
 }
 
-int tuner_type_channel_default(ePtr<iDVBChannelList> &channellist, const eDVBChannelID &chid)
+int tuner_type_channel_default(ePtr<iDVBChannelList> &channellist, const eDVBChannelID &chid, int &system)
 {
 {
+       system = iDVBFrontend::feSatellite;
        if (channellist)
        {
                ePtr<iDVBFrontendParameters> feparm;
                if (!channellist->getChannelFrontendData(chid, feparm))
                {
        if (channellist)
        {
                ePtr<iDVBFrontendParameters> feparm;
                if (!channellist->getChannelFrontendData(chid, feparm))
                {
-                       int system;
                        if (!feparm->getSystem(system))
                        {
                        if (!feparm->getSystem(system))
                        {
-                               switch(system)
+                               switch (system)
                                {
                                        case iDVBFrontend::feSatellite:
                                                return 50000;
                                {
                                        case iDVBFrontend::feSatellite:
                                                return 50000;
@@ -851,15 +851,16 @@ int tuner_type_channel_default(ePtr<iDVBChannelList> &channellist, const eDVBCha
        return 0;
 }
 
        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_channel> &active_channels = simulate ? m_active_simulate_channels : m_active_channels;
 {
        std::list<active_channel> &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())
        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. */
        }
 
                /* 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..");
                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;
        }
                eDebug("channel not found!");
                goto error;
        }
+       feparm->getSystem(system);
 
        ret = canAllocateFrontend(feparm, simulate);
 
 
        ret = canAllocateFrontend(feparm, simulate);
 
index fb90ae5..8d72d2e 100644 (file)
@@ -191,7 +191,7 @@ public:
        };
        
        RESULT connectChannelAdded(const Slot1<void,eDVBChannel*> &channelAdded, ePtr<eConnection> &connection);
        };
        
        RESULT connectChannelAdded(const Slot1<void,eDVBChannel*> &channelAdded, ePtr<eConnection> &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<iDVBChannel> &channel, bool simulate=false);
 
                /* allocate channel... */
        RESULT allocateChannel(const eDVBChannelID &channelid, eUsePtr<iDVBChannel> &channel, bool simulate=false);
index 21d897e..65712c6 100755 (executable)
@@ -496,6 +496,8 @@ RESULT eDVBFrontendParameters::calcLockTimeout(unsigned int &timeout) const
 DEFINE_REF(eDVBFrontend);
 
 int eDVBFrontend::PriorityOrder=0;
 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)
 
 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<iDVBFrontendParameters> &feparm)
 {
        int type;
 int eDVBFrontend::isCompatibleWith(ePtr<iDVBFrontendParameters> &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 (feparm->getSystem(type) || type != m_type || !m_enabled)
                return 0;
+
        if (m_type == eDVBFrontend::feSatellite)
        {
        if (m_type == eDVBFrontend::feSatellite)
        {
-               ASSERT(m_sec);
                eDVBFrontendParametersSatellite sat_parm;
                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)
                if (sat_parm.system == eDVBFrontendParametersSatellite::System_DVB_S2 && !m_can_handle_dvbs2)
+               {
                        return 0;
                        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)
        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;
        else if (m_type == eDVBFrontend::feTerrestrial)
        {
                eDVBFrontendParametersTerrestrial ter_parm;
-               if ( feparm->getDVBT(ter_parm) )
+               if (feparm->getDVBT(ter_parm) < 0)
                {
                        return 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)
 }
 
 bool eDVBFrontend::setSlotInfo(ePyObject obj)
index da7be52..50648b9 100644 (file)
@@ -116,6 +116,7 @@ private:
        void setFrontend(bool recvEvents=true);
        bool setSecSequencePos(int steps);
        static int PriorityOrder;
        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();
 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; }
        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();
 
        void reopenFrontend();
        int openFrontend();
index ce56f0f..b98be60 100644 (file)
@@ -1,7 +1,9 @@
 from Components.Harddisk import harddiskmanager
 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 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
 
 from SystemInfo import SystemInfo
 import os
 
@@ -70,6 +72,11 @@ def InitUsageConfig():
                ("4", "DVB-T/-C/-S"),
                ("5", "DVB-T/-S/-C") ])
 
                ("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)
        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)
 
                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))
        def setHDDStandby(configElement):
                for hdd in harddiskmanager.HDDList():
                        hdd[1].setIdleTime(int(configElement.value))
index 7a42f76..6386702 100755 (executable)
@@ -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. */
 /************** temp *****************/
 
        /* need a better place for this, i agree. */
index ca2fb29..1bd8e65 100755 (executable)
@@ -90,9 +90,10 @@ int eStaticServiceDVBInformation::isPlayable(const eServiceReference &ref, const
        else
        {
                eDVBChannelID chid, chid_ignore;
        else
        {
                eDVBChannelID chid, chid_ignore;
+               int system;
                ((const eServiceReferenceDVB&)ref).getChannelID(chid);
                ((const eServiceReferenceDVB&)ignore).getChannelID(chid_ignore);
                ((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;
 }
        }
        return false;
 }
@@ -240,23 +241,24 @@ int eStaticServiceDVBBouquetInformation::isPlayable(const eServiceReference &ref
                                { 1, 2, 3 }, // -T -C -S
                                { 2, 1, 3 }  // -T -S -C
                        };
                                { 1, 2, 3 }, // -T -C -S
                                { 2, 1, 3 }  // -T -S -C
                        };
+                       int system;
                        ((const eServiceReferenceDVB&)*it).getChannelID(chid);
                        ((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)
                        {
                        }
                        if (tmp > cur)
                        {