int eCableScan::nextChannel() { ePtr<iDVBFrontend> fe; m_SDT = NULL; if (scanChannels.empty()) { m_channel = NULL; createBouquets(); return 1; } scanProgress(100 - (scanChannels.size() * 90) / totalChannels); currentScanChannel = scanChannels.front(); scanChannels.pop_front(); if (m_channel->getFrontend(fe)) { m_channel = NULL; scanCompleted(-1); return -1; } if (fe->tune(*currentScanChannel)) return nextChannel(); m_SDT = new eTable<ServiceDescriptionSection>; CONNECT(m_SDT->tableReady, eCableScan::SDTReady); m_SDT->start(m_demux, eDVBSDTSpec()); return 0; }
RESULT eDVBScan::startFilter() { bool startSDT=true; int system; ASSERT(m_demux); /* only start required filters filter */ if (m_ready_all & readyPAT) startSDT = m_ready & readyPAT; // m_ch_current is not set, when eDVBScan is just used for a SDT update if (!m_ch_current) { unsigned int channelFlags; m_channel->getCurrentFrontendParameters(m_ch_current); m_ch_current->getFlags(channelFlags); if (channelFlags & iDVBFrontendParameters::flagOnlyFree) m_flags |= scanOnlyFree; } m_VCT = 0; m_ch_current->getSystem(system); if (system == iDVBFrontend::feATSC) { m_VCT = new eTable<VirtualChannelTableSection>; if (m_VCT->start(m_demux, eDVBVCTSpec())) return -1; CONNECT(m_VCT->tableReady, eDVBScan::VCTready); startSDT = false; } m_SDT = 0; if (startSDT && (m_ready_all & readySDT)) { m_SDT = new eTable<ServiceDescriptionSection>; int tsid=-1; if (m_ready & readyPAT && m_ready & validPAT) { std::vector<ProgramAssociationSection*>::const_iterator i = m_PAT->getSections().begin(); ASSERT(i != m_PAT->getSections().end()); tsid = (*i)->getTableIdExtension(); // in PAT this is the transport stream id m_pat_tsid = eTransportStreamID(tsid); for (; i != m_PAT->getSections().end(); ++i) { const ProgramAssociationSection &pat = **i; ProgramAssociationConstIterator program = pat.getPrograms()->begin(); for (; program != pat.getPrograms()->end(); ++program) m_pmts_to_read.insert(std::pair<unsigned short, service>((*program)->getProgramNumber(), service((*program)->getProgramMapPid()))); } m_PMT = new eTable<ProgramMapSection>; CONNECT(m_PMT->tableReady, eDVBScan::PMTready); PMTready(-2); // KabelBW HACK ... on 618Mhz and 626Mhz the transport stream id in PAT and SDT is different { int type; m_ch_current->getSystem(type); if (type == iDVBFrontend::feCable) { eDVBFrontendParametersCable parm; m_ch_current->getDVBC(parm); if ((tsid == 0x00d7 && absdiff(parm.frequency, 618000) < 2000) || (tsid == 0x00d8 && absdiff(parm.frequency, 626000) < 2000)) tsid = -1; } } } if (tsid == -1) { if (m_SDT->start(m_demux, eDVBSDTSpec())) return -1; } else if (m_SDT->start(m_demux, eDVBSDTSpec(tsid, true))) return -1; CONNECT(m_SDT->tableReady, eDVBScan::SDTready); } if (!(m_ready & readyPAT)) { m_PAT = 0; if (m_ready_all & readyPAT) { m_PAT = new eTable<ProgramAssociationSection>; if (m_PAT->start(m_demux, eDVBPATSpec(4000))) return -1; CONNECT(m_PAT->tableReady, eDVBScan::PATready); } m_NIT = 0; if (m_ready_all & readyNIT) { m_NIT = new eTable<NetworkInformationSection>; if (m_NIT->start(m_demux, eDVBNITSpec(m_networkid))) 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; }