X-Git-Url: https://git.cweiske.de/enigma2.git/blobdiff_plain/46f910a175efeaf9558cdc4b59e826d0a5f5f34d..0855ea4ed4197c0fc6a8f8fff5820741d80c6d41:/lib/dvb/scan.cpp diff --git a/lib/dvb/scan.cpp b/lib/dvb/scan.cpp index a57fd53b..25be7005 100644 --- a/lib/dvb/scan.cpp +++ b/lib/dvb/scan.cpp @@ -84,7 +84,7 @@ RESULT eDVBScan::nextChannel() { ePtr fe; - m_SDT = 0; m_BAT = 0; m_NIT = 0; + m_SDT = 0; m_PAT = 0; m_BAT = 0; m_NIT = 0; m_ready = 0; @@ -123,13 +123,10 @@ RESULT eDVBScan::nextChannel() m_chid_current = eDVBChannelID(); m_channel_state = iDVBChannel::state_idle; + if (fe->tune(*m_ch_current)) - { return nextChannel(); - m_event(evtFail); - return -EINVAL; - } - + m_event(evtUpdate); return 0; } @@ -148,16 +145,30 @@ RESULT eDVBScan::startFilter() if (startSDT && (m_ready_all & readySDT)) { m_SDT = new eTable(); + int tsid=-1; if (m_ready & readyPAT && m_ready & validPAT) { std::vector::const_iterator i = m_PAT->getSections().begin(); assert(i != m_PAT->getSections().end()); - int tsid = (*i)->getTableIdExtension(); // in PAT this is the transport stream id - if (m_SDT->start(m_demux, eDVBSDTSpec(tsid, true))) - return -1; + tsid = (*i)->getTableIdExtension(); // in PAT this is the transport stream id + + // KabelBW HACK ... on 618 Mhz 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 & abs(parm.frequency-618000) < 2000) + tsid = -1; + } + } } - else if (m_SDT->start(m_demux, eDVBSDTSpec())) + if (tsid == -1 && 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); } @@ -444,12 +455,22 @@ void eDVBScan::channelDone() ePtr feparm = new eDVBFrontendParameters; eDVBFrontendParametersSatellite sat; sat.set(d); - feparm->setDVBS(sat); eDVBFrontendParametersSatellite p; m_ch_current->getDVBS(p); - if ( p.orbital_position != sat.orbital_position ) + if ( abs(p.orbital_position - sat.orbital_position) < 5 ) + sat.orbital_position = p.orbital_position; + + if ( abs(abs(3600 - p.orbital_position) - sat.orbital_position) < 5 ) + { + eDebug("found transponder with incorrect west/east flag ... correct this"); + sat.orbital_position = p.orbital_position; + } + + feparm->setDVBS(sat); + + if ( p.orbital_position != sat.orbital_position) SCAN_eDebug("dropping this transponder, it's on another satellite."); else { @@ -670,7 +691,8 @@ void eDVBScan::insertInto(iDVBChannelList *db, bool dontRemoveOldFlags) else { db->addService(service->first, service->second); - service->second->m_flags |= eDVBService::dxNewFound; + if (!(m_flags & scanRemoveServices)) + service->second->m_flags |= eDVBService::dxNewFound; } } } @@ -764,3 +786,22 @@ void eDVBScan::getLastServiceName(std::string &last_service_name) else last_service_name = m_last_service->second->m_service_name; } + +RESULT eDVBScan::getFrontend(ePtr &fe) +{ + if (m_channel) + return m_channel->getFrontend(fe); + fe = 0; + return -1; +} + +RESULT eDVBScan::getCurrentTransponder(ePtr &tp) +{ + if (m_ch_current) + { + tp = m_ch_current; + return 0; + } + tp = 0; + return -1; +}