#include <dvbsi++/descriptor_tag.h>
#include <dvbsi++/service_descriptor.h>
#include <dvbsi++/satellite_delivery_system_descriptor.h>
+#include <dvbsi++/terrestrial_delivery_system_descriptor.h>
+#include <dvbsi++/cable_delivery_system_descriptor.h>
#include <dvbsi++/ca_identifier_descriptor.h>
#include <lib/dvb/specs.h>
#include <lib/dvb/esection.h>
return;
/* otherwise, add it to the todo list. */
- m_ch_toScan.push_back(feparm);
+ 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
{
switch ((*desc)->getTag())
{
-// case SERVICE_LIST_DESCRIPTOR:
+ case CABLE_DELIVERY_SYSTEM_DESCRIPTOR:
+ {
+ CableDeliverySystemDescriptor &d = (CableDeliverySystemDescriptor&)**desc;
+ ePtr<eDVBFrontendParameters> feparm = new eDVBFrontendParameters;
+ eDVBFrontendParametersCable cable;
+ cable.set(d);
+ feparm->setDVBC(cable);
+
+ unsigned long hash=0;
+ feparm->getHash(hash);
+ eDVBNamespace ns = buildNamespace(onid, tsid, hash);
+
+ addChannelToScan(
+ eDVBChannelID(ns, tsid, onid),
+ feparm);
+ break;
+ }
+ case TERRESTRIAL_DELIVERY_SYSTEM_DESCRIPTOR:
+ {
+ TerrestrialDeliverySystemDescriptor &d = (TerrestrialDeliverySystemDescriptor&)**desc;
+ ePtr<eDVBFrontendParameters> feparm = new eDVBFrontendParameters;
+ eDVBFrontendParametersTerrestrial terr;
+ terr.set(d);
+ feparm->setDVBT(terr);
+
+ unsigned long hash=0;
+ feparm->getHash(hash);
+ eDVBNamespace ns = buildNamespace(onid, tsid, hash);
+
+ addChannelToScan(
+ eDVBChannelID(ns, tsid, onid),
+ feparm);
+ break;
+ }
case SATELLITE_DELIVERY_SYSTEM_DESCRIPTOR:
{
SatelliteDeliverySystemDescriptor &d = (SatelliteDeliverySystemDescriptor&)**desc;
- SCAN_eDebug("%d kHz, %d%d%d.%d%c %s MOD:%d %d symb/s, fec %d",
- d.getFrequency(),
- (d.getOrbitalPosition()>>12)&0xF,
- (d.getOrbitalPosition()>>8)&0xF,
- (d.getOrbitalPosition()>>4)&0xF,
- d.getOrbitalPosition()&0xF, d.getWestEastFlag()?'E':'W',
- d.getPolarization() ? "hor" : "vert",
- d.getModulation(), d.getSymbolRate(), d.getFecInner());
-
- /* some sanity checking: below 100MHz is invalid */
if (d.getFrequency() < 10000)
break;
m_ch_unavailable.clear();
m_new_channels.clear();
m_new_services.clear();
+ m_last_service = m_new_services.end();
for (eSmartPtrList<iDVBFrontendParameters>::const_iterator i(known_transponders.begin()); i != known_transponders.end(); ++i)
{
}
}
- m_new_services.insert(std::pair<eServiceReferenceDVB, ePtr<eDVBService> >(ref, service));
+ std::pair<std::map<eServiceReferenceDVB, ePtr<eDVBService> >::iterator, bool> i = m_new_services.insert(std::pair<eServiceReferenceDVB, ePtr<eDVBService> >(ref, service));
+
+ if (i.second)
+ {
+ m_last_service = i.first;
+ m_event(evtNewService);
+ }
}
return 0;
}
transponders_total = m_ch_toScan.size() + transponders_done;
services = m_new_services.size();
}
+
+void eDVBScan::getLastServiceName(std::string &last_service_name)
+{
+ if (m_last_service == m_new_services.end())
+ last_service_name = "";
+ else
+ last_service_name = m_last_service->second->m_service_name;
+}