X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/7427772dbd7bd10ad6d59801f4628552f5eac6ab..d3f4cf09ab23a7a8945730679b1d3b36e41cf870:/lib/dvb/frontend.cpp diff --git a/lib/dvb/frontend.cpp b/lib/dvb/frontend.cpp index 79b56e1e..d114f568 100644 --- a/lib/dvb/frontend.cpp +++ b/lib/dvb/frontend.cpp @@ -275,7 +275,7 @@ eDVBFrontend::eDVBFrontend(int adap, int fe, int &ok): m_type(-1), m_fe(fe), m_c ok = 0; return; } - eDebug("detected %s frontend", "satellite\0cable\0 terrestrial"+fe_info.type*9); + eDebug("detected %s frontend", "satellite\0cable\0 terrestrial"+fe_info.type*10); ok = 1; m_sn = new eSocketNotifier(eApp, m_fd, eSocketNotifier::Read); @@ -633,7 +633,7 @@ RESULT eDVBFrontend::tune(const iDVBFrontendParameters &where) return -ENOENT; } - res = m_sec->prepare(*this, parm, feparm); + res = m_sec->prepare(*this, parm, feparm, 1 << m_fe); if (res) return res; #if HAVE_DVB_API_VERSION < 3 @@ -648,7 +648,96 @@ RESULT eDVBFrontend::tune(const iDVBFrontendParameters &where) eDVBFrontendParametersCable feparm; if (where.getDVBC(feparm)) return -EINVAL; - eFatal("cable tuning nyi"); +#if HAVE_DVB_API_VERSION < 3 + parm.Frequency = feparm.frequency * 1000; +#else + parm.frequency = feparm.frequency * 1000; +#endif + + parm.u.qam.symbol_rate = feparm.symbol_rate; + + switch (feparm.modulation) + { + case eDVBFrontendParametersCable::Modulation::QAM16: + parm.u.qam.modulation = QAM_16; + break; + case eDVBFrontendParametersCable::Modulation::QAM32: + parm.u.qam.modulation = QAM_32; + break; + case eDVBFrontendParametersCable::Modulation::QAM64: + parm.u.qam.modulation = QAM_64; + break; + case eDVBFrontendParametersCable::Modulation::QAM128: + parm.u.qam.modulation = QAM_128; + break; + case eDVBFrontendParametersCable::Modulation::QAM256: + parm.u.qam.modulation = QAM_256; + break; + case eDVBFrontendParametersCable::Modulation::Auto: + parm.u.qam.modulation = QAM_AUTO; + break; + } + switch (feparm.modulation) + { + case eDVBFrontendParametersCable::Inversion::On: + #if HAVE_DVB_API_VERSION < 3 + parm.Inversion = + #else + parm.inversion = + #endif + INVERSION_ON; + break; + case eDVBFrontendParametersCable::Inversion::Off: + #if HAVE_DVB_API_VERSION < 3 + parm.Inversion = + #else + parm.inversion = + #endif + INVERSION_OFF; + break; + case eDVBFrontendParametersCable::Inversion::Unknown: + #if HAVE_DVB_API_VERSION < 3 + parm.Inversion = + #else + parm.inversion = + #endif + INVERSION_AUTO; + break; + } + switch (feparm.fec_inner) + { + case eDVBFrontendParametersCable::FEC::fNone: + parm.u.qam.fec_inner = FEC_NONE; + break; + case eDVBFrontendParametersCable::FEC::f1_2: + parm.u.qam.fec_inner = FEC_1_2; + break; + case eDVBFrontendParametersCable::FEC::f2_3: + parm.u.qam.fec_inner = FEC_2_3; + break; + case eDVBFrontendParametersCable::FEC::f3_4: + parm.u.qam.fec_inner = FEC_3_4; + break; + case eDVBFrontendParametersCable::FEC::f4_5: + parm.u.qam.fec_inner = FEC_4_5; + break; + case eDVBFrontendParametersCable::FEC::f5_6: + parm.u.qam.fec_inner = FEC_5_6; + break; + case eDVBFrontendParametersCable::FEC::f6_7: + parm.u.qam.fec_inner = FEC_6_7; + break; + case eDVBFrontendParametersCable::FEC::f7_8: + parm.u.qam.fec_inner = FEC_7_8; + break; + case eDVBFrontendParametersCable::FEC::f8_9: + parm.u.qam.fec_inner = FEC_8_9; + break; + case eDVBFrontendParametersCable::FEC::fAuto: + parm.u.qam.fec_inner = FEC_AUTO; + break; + } + break; } case feTerrestrial: { @@ -908,7 +997,16 @@ RESULT eDVBFrontend::setData(int num, int val) return -EINVAL; } -int eDVBFrontend::isCompatibleWith(const eDVBChannelID &chid) +int eDVBFrontend::isCompatibleWith(ePtr &feparm) { - return 1; + if (m_type != eDVBFrontend::feSatellite) + return 1; + + ASSERT(m_sec); + + eDVBFrontendParametersSatellite sat_parm; + + ASSERT(!feparm->getDVBS(sat_parm)); + + return m_sec->canTune(sat_parm, this, 1 << m_fe); }