add hack for Kabel-BW 618Mhz Transponder.. (tsid is difference in PAT and
[enigma2.git] / lib / dvb / scan.cpp
index a57fd53b38c683eda42021faabc311bd7a6e5e72..25be7005ae11e026e9a3c896a18976395608d528 100644 (file)
@@ -84,7 +84,7 @@ RESULT eDVBScan::nextChannel()
 {
        ePtr<iDVBFrontend> 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<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());
-                       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<eDVBFrontendParameters> 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<iDVBFrontend> &fe)
+{
+       if (m_channel)
+               return m_channel->getFrontend(fe);
+       fe = 0;
+       return -1;
+}
+
+RESULT eDVBScan::getCurrentTransponder(ePtr<iDVBFrontendParameters> &tp)
+{
+       if (m_ch_current)
+       {
+               tp = m_ch_current;
+               return 0;
+       }
+       tp = 0;
+       return -1;
+}