<item level="2" text="Show infobar on event change">config.usage.show_infobar_on_event_change</item>
<item level="2" text="Custom skip time for '1'/'3'-keys">config.usage.self_defined_seek</item>
<item level="2" text="Behaviour 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>
</setup>
<setup key="harddisk" title="Harddisk setup">
<item level="0" text="Harddisk standby after">config.usage.hdd_standby</item>
return bestval;
}
+int tuner_type_channel_default(ePtr<iDVBChannelList> &channellist, const eDVBChannelID &chid)
+{
+ if (channellist)
+ {
+ ePtr<iDVBFrontendParameters> feparm;
+ if (!channellist->getChannelFrontendData(chid, feparm))
+ {
+ int system;
+ if (!feparm->getSystem(system))
+ {
+ switch(system)
+ {
+ case iDVBFrontend::feSatellite:
+ return 50000;
+ case iDVBFrontend::feCable:
+ return 40000;
+ case iDVBFrontend::feTerrestrial:
+ return 30000;
+ default:
+ break;
+ }
+ }
+ }
+ }
+ return 0;
+}
+
int eDVBResourceManager::canAllocateChannel(const eDVBChannelID &channelid, const eDVBChannelID& ignore)
{
- int ret=30000;
+ int ret=0;
if (m_cached_channel)
{
eDVBChannel *cache_chan = (eDVBChannel*)&(*m_cached_channel);
if(channelid==cache_chan->getChannelID())
- return ret;
+ return tuner_type_channel_default(m_list, channelid);
}
/* first, check if a channel is already existing. */
if (i->m_channel_id == channelid)
{
// eDebug("found shared channel..");
- return ret;
+ return tuner_type_channel_default(m_list, channelid);
}
}
if (!m_list)
{
eDebug("no channel list set!");
- ret = 0;
goto error;
}
if (m_list->getChannelFrontendData(channelid, feparm))
{
eDebug("channel not found!");
- ret = 0;
goto error;
}
DEFINE_REF(eDVBFrontend);
+int eDVBFrontend::PriorityOrder=0;
+
eDVBFrontend::eDVBFrontend(int adap, int fe, int &ok)
:m_enabled(false), m_type(-1), m_dvbid(fe), m_slotid(fe)
,m_fd(-1), m_need_rotor_workaround(false), m_sn(0), m_timeout(0), m_tuneTimer(0)
int readInputpower();
bool setSecSequencePos(int steps);
void setRotorData(int pos, int cmd);
+ static int PriorityOrder;
public:
eDVBFrontend(int adap, int fe, int &ok);
virtual ~eDVBFrontend();
int getDVBID() { return m_dvbid; }
int getSlotID() { return m_slotid; }
bool setSlotInfo(ePyObject obj); // get a tuple (slotid, slotdescr)
+ static void setTypePriorityOrder(int val) { PriorityOrder = val; }
+ static int getTypePriorityOrder() { return PriorityOrder; }
int openFrontend();
int closeFrontend();
from config import ConfigSubsection, ConfigYesNo, config, ConfigSelection, ConfigText, ConfigInteger
-from enigma import Misc_Options
+from enigma import Misc_Options, setTunerTypePriorityOrder;
import os
def InitUsageConfig():
("show_menu", _("show shutdown menu")),
("shutdown", _("immediate shutdown")) ] )
+ config.usage.alternatives_priority = ConfigSelection(default = "0", choices = [
+ ("0", "DVB-S/-C/-T"),
+ ("1", "DVB-S/-T/-C"),
+ ("2", "DVB-C/-S/-T"),
+ ("3", "DVB-C/-T/-S"),
+ ("4", "DVB-T/-C/-S"),
+ ("5", "DVB-T/-S/-C") ])
+
+ def TunerTypePriorityOrderChanged(configElement):
+ setTunerTypePriorityOrder(int(configElement.value))
+ config.usage.alternatives_priority.addNotifier(TunerTypePriorityOrderChanged)
+
def setHDDStandby(configElement):
os.system("hdparm -S" + configElement.value + " /dev/ide/host0/bus0/target0/lun0/disc")
config.usage.hdd_standby.addNotifier(setHDDStandby)
}
%}
+void setTunerTypePriorityOrder(int);
+%{
+void setTunerTypePriorityOrder(int order)
+{
+ eDVBFrontend::setTypePriorityOrder(order);
+}
+%}
+
/************** temp *****************/
/* need a better place for this, i agree. */
return 0;
}
+ int prio_order = eDVBFrontend::getTypePriorityOrder();
int cur=0;
eDVBChannelID chid, chid_ignore;
((const eServiceReferenceDVB&)ignore).getChannelID(chid_ignore);
for (std::list<eServiceReference>::iterator it(bouquet->m_services.begin()); it != bouquet->m_services.end(); ++it)
{
+ static unsigned char prio_map[6][3] = {
+ { 3, 2, 1 }, // -S -C -T
+ { 3, 1, 2 }, // -S -T -C
+ { 2, 3, 1 }, // -C -S -T
+ { 1, 3, 2 }, // -C -T -S
+ { 1, 2, 3 }, // -T -C -S
+ { 2, 1, 3 } // -T -S -C
+ };
((const eServiceReferenceDVB&)*it).getChannelID(chid);
int tmp=res->canAllocateChannel(chid, chid_ignore);
+ switch(tmp)
+ {
+ 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;
+ }
if (tmp > cur)
{
m_playable_service = *it;