fix DVB-T inversion
[enigma2.git] / lib / dvb / db.cpp
index 2d609bdc584217a2950959ca55c94bd0c56994b2..0b1d4b543c7be80d5d50b3193829a72439e9f058 100644 (file)
@@ -114,6 +114,7 @@ RESULT eBouquet::setListName(const std::string &name)
 }
 
 eDVBService::eDVBService()
+       :m_flags(0)
 {
 }
 
@@ -244,8 +245,11 @@ void eDVBDB::reloadServicelist()
                struct stat s;
                if ( !stat("lamedb", &s) )
                {
-                       rename("lamedb", CONFIGDIR"/enigma2/lamedb" );
-                       reloadServicelist();
+                       if ( !stat(CONFIGDIR"/enigma2", &s) )
+                       {
+                               rename("lamedb", CONFIGDIR"/enigma2/lamedb" );
+                               reloadServicelist();
+                       }
                }
                return;
        }
@@ -314,18 +318,20 @@ void eDVBDB::reloadServicelist()
                                ter.guard_interval = guard_interval;
                                ter.hierarchy = hierarchy;
                                ter.inversion = inversion;
-
                                feparm->setDVBT(ter);
                        } else if (line[1]=='c')
                        {
                                eDVBFrontendParametersCable cab;
-                               int frequency, symbol_rate, inversion=0, modulation=3;
-                               sscanf(line+2, "%d:%d:%d:%d", &frequency, &symbol_rate, &inversion, &modulation);
+                               int frequency, symbol_rate,
+                                       inversion=eDVBFrontendParametersCable::Inversion::Unknown,
+                                       modulation=eDVBFrontendParametersCable::Modulation::Auto,
+                                       fec_inner=eDVBFrontendParametersCable::FEC::fAuto;
+                               sscanf(line+2, "%d:%d:%d:%d:%d", &frequency, &symbol_rate, &inversion, &modulation, &fec_inner);
                                cab.frequency = frequency;
+                               cab.fec_inner = fec_inner;
+                               cab.inversion = inversion;
                                cab.symbol_rate = symbol_rate;
                                cab.modulation = modulation;
-                               cab.fec_inner = 6;
-                               cab.inversion = inversion;
                                feparm->setDVBC(cab);
                        }
                }
@@ -455,8 +461,8 @@ void eDVBDB::saveServicelist()
                }
                if (!ch.m_frontendParameters->getDVBC(cab))
                {
-                       fprintf(f, "\tc %d:%d:%d:%d\n",
-                               cab.frequency, cab.symbol_rate, cab.inversion, cab.modulation);
+                       fprintf(f, "\tc %d:%d:%d:%d:%d\n",
+                               cab.frequency, cab.symbol_rate, cab.inversion, cab.modulation, cab.fec_inner);
                }
                fprintf(f, "/\n");
                channels++;
@@ -474,6 +480,7 @@ void eDVBDB::saveServicelist()
                                0);
 
                fprintf(f, "%s\n", i->second->m_service_name.c_str());
+
                fprintf(f, "p:%s", i->second->m_provider_name.c_str());
 
                // write cached pids
@@ -486,6 +493,9 @@ void eDVBDB::saveServicelist()
                        ca != i->second->m_ca.end(); ++ca)
                        fprintf(f, ",C:%04x", *ca);
 
+               if (i->second->m_flags)
+                       fprintf(f, ",f:%x", i->second->m_flags);
+
                fprintf(f, "\n");
                services++;
        }
@@ -758,6 +768,22 @@ RESULT eDVBDB::startQuery(ePtr<iDVBChannelListQuery> &query, eDVBChannelQuery *q
        return 0;
 }
 
+eServiceReference eDVBDB::searchReference(int tsid, int onid, int sid)
+{
+       eServiceID Sid(sid);
+       eTransportStreamID Tsid(tsid);
+       eOriginalNetworkID Onid(onid);
+       for (std::map<eServiceReferenceDVB, ePtr<eDVBService> >::iterator sit(m_services.begin());
+               sit != m_services.end(); ++sit)
+       {
+               if (sit->first.getTransportStreamID() == Tsid &&
+                       sit->first.getOriginalNetworkID() == Onid &&
+                       sit->first.getServiceID() == Sid)
+                       return sit->first;
+       }
+       return eServiceReference();
+}
+
 DEFINE_REF(eDVBDBQueryBase);
 
 eDVBDBQueryBase::eDVBDBQueryBase(eDVBDB *db, const eServiceReference &source, eDVBChannelQuery *query)