<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>
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;
}
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))
{
- int system;
if (!feparm->getSystem(system))
{
- switch(system)
+ switch (system)
{
case iDVBFrontend::feSatellite:
return 50000;
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;
- 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. */
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);
}
}
eDebug("channel not found!");
goto error;
}
+ feparm->getSystem(system);
ret = canAllocateFrontend(feparm, simulate);
};
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);
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)
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 (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)
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();
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();
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
("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)
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))
}
%}
+void setPreferredTuner(int);
+%{
+void setPreferredTuner(int index)
+{
+ eDVBFrontend::setPreferredFrontend(index);
+}
+%}
+
/************** temp *****************/
/* need a better place for this, i agree. */
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;
}
{ 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)
{