aboutsummaryrefslogtreecommitdiff
path: root/lib/dvb
diff options
context:
space:
mode:
authorFelix Domke <tmbinc@elitedvb.net>2005-11-16 10:24:13 +0000
committerFelix Domke <tmbinc@elitedvb.net>2005-11-16 10:24:13 +0000
commitb0e09a2cd9a05a002222d79fb71848f4c7820ff3 (patch)
treef6ab15a7e93756b299c68b633439f030648a767a /lib/dvb
parent68b90d5fc4598225d38579634686a3a16083fa69 (diff)
downloadenigma2-b0e09a2cd9a05a002222d79fb71848f4c7820ff3.tar.gz
enigma2-b0e09a2cd9a05a002222d79fb71848f4c7820ff3.zip
scan: add flags for optional network search. drop transponders on foreign satellites.
Diffstat (limited to 'lib/dvb')
-rw-r--r--lib/dvb/scan.cpp77
-rw-r--r--lib/dvb/scan.h9
2 files changed, 57 insertions, 29 deletions
diff --git a/lib/dvb/scan.cpp b/lib/dvb/scan.cpp
index b30f702e..1c98dce0 100644
--- a/lib/dvb/scan.cpp
+++ b/lib/dvb/scan.cpp
@@ -83,7 +83,17 @@ RESULT eDVBScan::nextChannel()
m_SDT = 0; m_BAT = 0; m_NIT = 0;
- m_ready = readyBAT;
+ m_ready = 0;
+
+ /* check what we need */
+ m_ready_all = readySDT;
+
+ if (m_flags & scanNetworkSearch)
+ m_ready_all |= readyNIT;
+
+ if (m_flags & scanSearchBAT)
+ m_ready_all |= readyBAT;
+
if (m_ch_toScan.empty())
{
eDebug("no channels left to scan.");
@@ -121,21 +131,35 @@ RESULT eDVBScan::startFilter()
{
assert(m_demux);
- m_SDT = new eTable<ServiceDescriptionSection>();
- if (m_SDT->start(m_demux, eDVBSDTSpec()))
- return -1;
- CONNECT(m_SDT->tableReady, eDVBScan::SDTready);
+ /* only start required filters filter */
+
+ m_SDT = 0;
+
+ if (m_ready_all & readySDT)
+ {
+ m_SDT = new eTable<ServiceDescriptionSection>();
+ if (m_SDT->start(m_demux, eDVBSDTSpec()))
+ return -1;
+ CONNECT(m_SDT->tableReady, eDVBScan::SDTready);
+ }
m_NIT = 0;
- m_NIT = new eTable<NetworkInformationSection>();
- if (m_NIT->start(m_demux, eDVBNITSpec()))
- return -1;
- CONNECT(m_NIT->tableReady, eDVBScan::NITready);
-
- m_BAT = new eTable<BouquetAssociationSection>();
- if (m_BAT->start(m_demux, eDVBBATSpec()))
- return -1;
- CONNECT(m_BAT->tableReady, eDVBScan::BATready);
+ if (m_ready_all & readyNIT)
+ {
+ m_NIT = new eTable<NetworkInformationSection>();
+ if (m_NIT->start(m_demux, eDVBNITSpec()))
+ return -1;
+ CONNECT(m_NIT->tableReady, eDVBScan::NITready);
+ }
+
+ m_BAT = 0;
+ if (m_ready_all & readyBAT)
+ {
+ m_BAT = new eTable<BouquetAssociationSection>();
+ if (m_BAT->start(m_demux, eDVBBATSpec()))
+ return -1;
+ CONNECT(m_BAT->tableReady, eDVBScan::BATready);
+ }
return 0;
}
@@ -277,10 +301,15 @@ void eDVBScan::channelDone()
feparm->getHash(hash);
eDVBNamespace ns = buildNamespace(onid, tsid, hash);
-
- addChannelToScan(
- eDVBChannelID(ns, tsid, onid),
- feparm);
+
+ if (m_chid_current && ((ns.get() ^ m_chid_current.dvbnamespace.get()) & 0xFFFF0000))
+ eDebug("dropping this transponder, it's on another satellite.");
+ else
+ {
+ addChannelToScan(
+ eDVBChannelID(ns, tsid, onid),
+ feparm);
+ }
break;
}
default:
@@ -294,7 +323,7 @@ void eDVBScan::channelDone()
m_ready &= ~validNIT;
}
- if ((m_ready & readyAll) != readyAll)
+ if ((m_ready & m_ready_all) != m_ready_all)
return;
SCAN_eDebug("channel done!");
@@ -328,8 +357,9 @@ void eDVBScan::channelDone()
nextChannel();
}
-void eDVBScan::start(const eSmartPtrList<iDVBFrontendParameters> &known_transponders)
+void eDVBScan::start(const eSmartPtrList<iDVBFrontendParameters> &known_transponders, int flags)
{
+ m_flags = flags;
m_ch_toScan.clear();
m_ch_scanned.clear();
m_ch_unavailable.clear();
@@ -389,12 +419,7 @@ RESULT eDVBScan::processSDT(eDVBNamespace dvbnamespace, const ServiceDescription
{
ServiceDescriptor &d = (ServiceDescriptor&)**desc;
service->m_service_name = convertDVBUTF8(d.getServiceName());
- service->m_service_name_sort = convertDVBUTF8(d.getServiceName());
-
- service->m_service_name_sort = removeDVBChars(service->m_service_name);
- makeUpper(service->m_service_name_sort);
- while ((!service->m_service_name_sort.empty()) && service->m_service_name_sort[0] == ' ')
- service->m_service_name_sort.erase(0, 1);
+ service->genSortName();
service->m_provider_name = convertDVBUTF8(d.getServiceProviderName());
SCAN_eDebug("name '%s', provider_name '%s'", service->m_service_name.c_str(), service->m_provider_name.c_str());
diff --git a/lib/dvb/scan.h b/lib/dvb/scan.h
index 07422a46..df832bd6 100644
--- a/lib/dvb/scan.h
+++ b/lib/dvb/scan.h
@@ -31,12 +31,12 @@ private:
RESULT nextChannel();
RESULT startFilter();
- enum { readySDT=1, readyNIT=2, readyBAT=4, readyAll=7,
+ enum { readySDT=1, readyNIT=2, readyBAT=4,
validSDT=8, validNIT=16, validBAT=32};
/* scan state variables */
int m_channel_state;
- int m_ready;
+ int m_ready, m_ready_all;
std::map<eDVBChannelID, ePtr<iDVBFrontendParameters> > m_new_channels;
std::map<eServiceReferenceDVB, ePtr<eDVBService> > m_new_services;
@@ -61,11 +61,14 @@ private:
Signal1<void,int> m_event;
RESULT processSDT(eDVBNamespace dvbnamespace, const ServiceDescriptionSection &sdt);
+
+ int m_flags;
public:
eDVBScan(iDVBChannel *channel);
~eDVBScan();
- void start(const eSmartPtrList<iDVBFrontendParameters> &known_transponders);
+ enum { scanNetworkSearch = 1, scanSearchBAT = 2 };
+ void start(const eSmartPtrList<iDVBFrontendParameters> &known_transponders, int flags);
enum { evtUpdate, evtFinish, evtFail };
RESULT connectEvent(const Slot1<void,int> &event, ePtr<eConnection> &connection);