X-Git-Url: http://code.vuplus.com/gitweb/?p=vuplus_dvbapp;a=blobdiff_plain;f=lib%2Fdvb%2Ffrontend.cpp;h=a183e374f5fbd196e23a79be50229dd10193a9cf;hp=21d897edeac463c66b3ae5cfb24510fa4301bf99;hb=fe619dbed1c9bf14a0d442cc16d7e968769bbcc0;hpb=a74f068a8eeea42990ac5261dcb7da2da577f2da diff --git a/lib/dvb/frontend.cpp b/lib/dvb/frontend.cpp index 21d897e..a183e37 100755 --- a/lib/dvb/frontend.cpp +++ b/lib/dvb/frontend.cpp @@ -1,3 +1,5 @@ +#include + #include #include #include @@ -496,6 +498,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) @@ -782,7 +786,7 @@ void eDVBFrontend::timeout() m_tuning = 0; if (m_state == stateTuning) { -#ifdef BUILD_VUPLUS /* ikseong */ +#ifdef BUILD_VUPLUS eDVBFrontend *sec_fe = this; sec_fe->m_data[CSW] = sec_fe->m_data[UCSW] = sec_fe->m_data[TONEBURST] = -1; // reset diseqc #endif @@ -1243,7 +1247,7 @@ static void fillDictWithTerrestrialData(ePyObject dict, struct dtv_property *p) case SYS_DVBT: tmp = eDVBFrontendParametersTerrestrial::System_DVB_T; break; case SYS_DVBT2: { -#ifdef DTV_DVBT2_PLP_ID +#if DVB_API_VERSION > 5 || DVB_API_VERSION == 5 && DVB_API_VERSION_MINOR >= 3 tmp = p[10].u.data; PutToDict(dict, "plp_id", tmp); #endif @@ -1628,7 +1632,10 @@ void eDVBFrontend::getTransponderData(ePyObject dest, bool original) p[7].cmd = DTV_GUARD_INTERVAL; p[8].cmd = DTV_HIERARCHY; p[9].cmd = DTV_INVERSION; -#ifdef DTV_DVBT2_PLP_ID +#if DVB_API_VERSION > 5 || DVB_API_VERSION == 5 && DVB_API_VERSION_MINOR >= 9 + p[10].cmd = DTV_STREAM_ID; + cmdseq.num = 11; +#elif DVB_API_VERSION > 5 || DVB_API_VERSION == 5 && DVB_API_VERSION_MINOR >= 3 p[10].cmd = DTV_DVBT2_PLP_ID; cmdseq.num = 11; #else @@ -2320,7 +2327,9 @@ void eDVBFrontend::setFrontend(bool recvEvents) p[cmdseq.num].cmd = DTV_HIERARCHY, p[cmdseq.num].u.data = parm_u_ofdm_hierarchy_information, cmdseq.num++; p[cmdseq.num].cmd = DTV_BANDWIDTH_HZ, p[cmdseq.num].u.data = bandwidth, cmdseq.num++; p[cmdseq.num].cmd = DTV_INVERSION, p[cmdseq.num].u.data = parm_inversion, cmdseq.num++; -#ifdef DTV_DVBT2_PLP_ID +#if DVB_API_VERSION > 5 || DVB_API_VERSION == 5 && DVB_API_VERSION_MINOR >= 9 + p[cmdseq.num].cmd = DTV_STREAM_ID , p[cmdseq.num].u.data = oparm.ter.plpid, cmdseq.num++; +#elif DVB_API_VERSION > 5 || DVB_API_VERSION == 5 && DVB_API_VERSION_MINOR >= 3 p[cmdseq.num].cmd = DTV_DVBT2_PLP_ID , p[cmdseq.num].u.data = oparm.ter.plpid, cmdseq.num++; #endif p[cmdseq.num].cmd = DTV_TUNE, cmdseq.num++; @@ -3086,40 +3095,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)