aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/dvb/frontend.cpp44
-rw-r--r--lib/dvb/frontend.h2
-rw-r--r--lib/dvb/idvb.h2
-rw-r--r--lib/dvb/scan.cpp13
-rw-r--r--lib/dvb/scan.h5
5 files changed, 51 insertions, 15 deletions
diff --git a/lib/dvb/frontend.cpp b/lib/dvb/frontend.cpp
index 352f3388..25eb9766 100644
--- a/lib/dvb/frontend.cpp
+++ b/lib/dvb/frontend.cpp
@@ -263,7 +263,7 @@ RESULT eDVBFrontendParameters::setDVBT(const eDVBFrontendParametersTerrestrial &
return 0;
}
-RESULT eDVBFrontendParameters::calculateDifference(const iDVBFrontendParameters *parm, int &diff) const
+RESULT eDVBFrontendParameters::calculateDifference(const iDVBFrontendParameters *parm, int &diff, bool exact) const
{
if (!parm)
return -1;
@@ -288,6 +288,8 @@ RESULT eDVBFrontendParameters::calculateDifference(const iDVBFrontendParameters
diff = 1<<29;
else if (sat.polarisation != osat.polarisation)
diff = 1<<28;
+ else if (exact && sat.fec != osat.fec && sat.fec != eDVBFrontendParametersSatellite::FEC::fAuto && osat.fec != eDVBFrontendParametersSatellite::FEC::fAuto)
+ diff = 1<<27;
else
{
diff = abs(sat.frequency - osat.frequency);
@@ -300,24 +302,54 @@ RESULT eDVBFrontendParameters::calculateDifference(const iDVBFrontendParameters
if (parm->getDVBC(ocable))
return -2;
- if (cable.modulation != ocable.modulation && cable.modulation != eDVBFrontendParametersCable::Modulation::Auto && ocable.modulation != eDVBFrontendParametersCable::Modulation::Auto)
+ if (exact && cable.modulation != ocable.modulation
+ && cable.modulation != eDVBFrontendParametersCable::Modulation::Auto
+ && ocable.modulation != eDVBFrontendParametersCable::Modulation::Auto)
diff = 1 << 29;
- else if (cable.inversion != ocable.inversion && cable.inversion != eDVBFrontendParametersCable::Inversion::Unknown && ocable.inversion != eDVBFrontendParametersCable::Inversion::Unknown)
- diff = 1 << 28;
+ else if (exact && cable.fec_inner != ocable.fec_inner && cable.fec_inner != eDVBFrontendParametersCable::FEC::fAuto && ocable.fec_inner != eDVBFrontendParametersCable::FEC::fAuto)
+ diff = 1 << 27;
else
{
diff = abs(cable.frequency - ocable.frequency);
diff += abs(cable.symbol_rate - ocable.symbol_rate);
}
-
return 0;
case iDVBFrontend::feTerrestrial:
eDVBFrontendParametersTerrestrial oterrestrial;
if (parm->getDVBT(oterrestrial))
return -2;
- diff = abs(terrestrial.frequency - oterrestrial.frequency);
+ if (exact && oterrestrial.bandwidth != terrestrial.bandwidth &&
+ oterrestrial.bandwidth != eDVBFrontendParametersTerrestrial::Bandwidth::BwAuto &&
+ terrestrial.bandwidth != eDVBFrontendParametersTerrestrial::Bandwidth::BwAuto)
+ diff = 1 << 30;
+ else if (exact && oterrestrial.modulation != terrestrial.modulation &&
+ oterrestrial.modulation != eDVBFrontendParametersTerrestrial::Modulation::Auto &&
+ terrestrial.modulation != eDVBFrontendParametersTerrestrial::Modulation::Auto)
+ diff = 1 << 30;
+ else if (exact && oterrestrial.transmission_mode != terrestrial.transmission_mode &&
+ oterrestrial.transmission_mode != eDVBFrontendParametersTerrestrial::TransmissionMode::TMAuto &&
+ terrestrial.transmission_mode != eDVBFrontendParametersTerrestrial::TransmissionMode::TMAuto)
+ diff = 1 << 30;
+ else if (exact && oterrestrial.guard_interval != terrestrial.guard_interval &&
+ oterrestrial.guard_interval != eDVBFrontendParametersTerrestrial::GuardInterval::GI_Auto &&
+ terrestrial.guard_interval != eDVBFrontendParametersTerrestrial::GuardInterval::GI_Auto)
+ diff = 1 << 30;
+ else if (exact && oterrestrial.hierarchy != terrestrial.hierarchy &&
+ oterrestrial.hierarchy != eDVBFrontendParametersTerrestrial::Hierarchy::HAuto &&
+ terrestrial.hierarchy != eDVBFrontendParametersTerrestrial::Hierarchy::HAuto)
+ diff = 1 << 30;
+ else if (exact && oterrestrial.code_rate_LP != terrestrial.code_rate_LP &&
+ oterrestrial.code_rate_LP != eDVBFrontendParametersTerrestrial::FEC::fAuto &&
+ terrestrial.code_rate_LP != eDVBFrontendParametersTerrestrial::FEC::fAuto)
+ diff = 1 << 30;
+ else if (exact && oterrestrial.code_rate_HP != terrestrial.code_rate_HP &&
+ oterrestrial.code_rate_HP != eDVBFrontendParametersTerrestrial::FEC::fAuto &&
+ terrestrial.code_rate_HP != eDVBFrontendParametersTerrestrial::FEC::fAuto)
+ diff = 1 << 30;
+ else
+ diff = abs(terrestrial.frequency - oterrestrial.frequency);
return 0;
default:
return -1;
diff --git a/lib/dvb/frontend.h b/lib/dvb/frontend.h
index 3670ceb8..ab8c4479 100644
--- a/lib/dvb/frontend.h
+++ b/lib/dvb/frontend.h
@@ -24,7 +24,7 @@ public:
RESULT setDVBC(const eDVBFrontendParametersCable &p);
RESULT setDVBT(const eDVBFrontendParametersTerrestrial &p);
- RESULT calculateDifference(const iDVBFrontendParameters *parm, int &SWIG_OUTPUT) const;
+ RESULT calculateDifference(const iDVBFrontendParameters *parm, int &SWIG_OUTPUT, bool exact) const;
RESULT getHash(unsigned long &SWIG_OUTPUT) const;
};
diff --git a/lib/dvb/idvb.h b/lib/dvb/idvb.h
index 2c80a9b8..5c427e7a 100644
--- a/lib/dvb/idvb.h
+++ b/lib/dvb/idvb.h
@@ -362,7 +362,7 @@ public:
virtual RESULT getDVBC(eDVBFrontendParametersCable &SWIG_OUTPUT) const = 0;
virtual RESULT getDVBT(eDVBFrontendParametersTerrestrial &SWIG_OUTPUT) const = 0;
- virtual RESULT calculateDifference(const iDVBFrontendParameters *parm, int &SWIG_OUTPUT) const = 0;
+ virtual RESULT calculateDifference(const iDVBFrontendParameters *parm, int &SWIG_OUTPUT, bool exact) const = 0;
virtual RESULT getHash(unsigned long &SWIG_OUTPUT) const = 0;
};
diff --git a/lib/dvb/scan.cpp b/lib/dvb/scan.cpp
index c4d4c6f4..e981123c 100644
--- a/lib/dvb/scan.cpp
+++ b/lib/dvb/scan.cpp
@@ -250,20 +250,23 @@ void eDVBScan::addKnownGoodChannel(const eDVBChannelID &chid, iDVBFrontendParame
void eDVBScan::addChannelToScan(const eDVBChannelID &chid, iDVBFrontendParameters *feparm)
{
/* check if we don't already have that channel ... */
-
+
/* ... in the list of channels to scan */
for (std::list<ePtr<iDVBFrontendParameters> >::const_iterator i(m_ch_toScan.begin()); i != m_ch_toScan.end(); ++i)
if (sameChannel(*i, feparm))
+ {
+ *i = feparm; // update
return;
+ }
/* ... in the list of successfully scanned channels */
for (std::list<ePtr<iDVBFrontendParameters> >::const_iterator i(m_ch_scanned.begin()); i != m_ch_scanned.end(); ++i)
if (sameChannel(*i, feparm))
return;
-
+
/* ... in the list of unavailable channels */
for (std::list<ePtr<iDVBFrontendParameters> >::const_iterator i(m_ch_unavailable.begin()); i != m_ch_unavailable.end(); ++i)
- if (sameChannel(*i, feparm))
+ if (sameChannel(*i, feparm, true))
return;
/* ... on the current channel */
@@ -274,10 +277,10 @@ void eDVBScan::addChannelToScan(const eDVBChannelID &chid, iDVBFrontendParameter
m_ch_toScan.push_front(feparm); // better.. then the rotor not turning wild from east to west :)
}
-int eDVBScan::sameChannel(iDVBFrontendParameters *ch1, iDVBFrontendParameters *ch2) const
+int eDVBScan::sameChannel(iDVBFrontendParameters *ch1, iDVBFrontendParameters *ch2, bool exact) const
{
int diff;
- if (ch1->calculateDifference(ch2, diff))
+ if (ch1->calculateDifference(ch2, diff, exact))
return 0;
if (diff < 4000) // more than 4mhz difference?
return 1;
diff --git a/lib/dvb/scan.h b/lib/dvb/scan.h
index 0f32d678..656817f9 100644
--- a/lib/dvb/scan.h
+++ b/lib/dvb/scan.h
@@ -59,8 +59,9 @@ private:
void addKnownGoodChannel(const eDVBChannelID &chid, iDVBFrontendParameters *feparm);
void addChannelToScan(const eDVBChannelID &chid, iDVBFrontendParameters *feparm);
- int sameChannel(iDVBFrontendParameters *ch1, iDVBFrontendParameters *ch2) const;
-
+
+ int sameChannel(iDVBFrontendParameters *ch1, iDVBFrontendParameters *ch2, bool exact=false) const;
+
void channelDone();
Signal1<void,int> m_event;