add pes parser
[enigma2.git] / lib / dvb / frontend.cpp
index 2274a8fc8b1a63956216e4de21f607239be7e07d..063cbe078b9d110ed202d74d6a20a6b899f5cf5c 100644 (file)
@@ -144,7 +144,7 @@ void eDVBFrontendParametersTerrestrial::set(const TerrestrialDeliverySystemDescr
        if (code_rate_LP > 4)
                code_rate_LP = FEC::fAuto;
        transmission_mode = descriptor.getTransmissionMode();
-       if (transmission_mode > 2)
+       if (transmission_mode > 1) // TM4k forced to auto
                transmission_mode = TransmissionMode::TMAuto;
        guard_interval = descriptor.getGuardInterval();
        if (guard_interval > 3)
@@ -292,7 +292,11 @@ RESULT eDVBFrontendParameters::getHash(unsigned long &hash) const
                return 0;
        }
        case iDVBFrontend::feCable:
+               hash = 0xFFFF0000;
+               return 0;
        case iDVBFrontend::feTerrestrial:
+               hash = 0xEEEE0000;
+               return 0;
        default:
                return -1;
        }
@@ -301,7 +305,7 @@ RESULT eDVBFrontendParameters::getHash(unsigned long &hash) const
 DEFINE_REF(eDVBFrontend);
 
 eDVBFrontend::eDVBFrontend(int adap, int fe, int &ok)
-       :m_type(-1), m_fe(fe), m_fd(-1), m_timeout(0), m_tuneTimer(0)
+       :m_type(-1), m_fe(fe), m_fd(-1), m_sn(0), m_timeout(0), m_tuneTimer(0)
 #if HAVE_DVB_API_VERSION < 3
        ,m_secfd(-1)
 #endif
@@ -330,35 +334,44 @@ eDVBFrontend::eDVBFrontend(int adap, int fe, int &ok)
 
 int eDVBFrontend::openFrontend()
 {
-       if (m_fd >= 0)
+       if (m_sn)
                return -1;  // already opened
 
        m_state=0;
        m_tuning=0;
 
 #if HAVE_DVB_API_VERSION < 3
-       m_secfd = ::open(m_sec_filename, O_RDWR);
        if (m_secfd < 0)
        {
-               eWarning("failed! (%s) %m", m_sec_filename);
-               return -1;
+               m_secfd = ::open(m_sec_filename, O_RDWR);
+               if (m_secfd < 0)
+               {
+                       eWarning("failed! (%s) %m", m_sec_filename);
+                       return -1;
+               }
        }
+       else
+               eWarning("sec %d already opened", m_fe);
        FrontendInfo fe_info;
 #else
        dvb_frontend_info fe_info;
 #endif
        eDebug("opening frontend %d", m_fe);
-       m_fd = ::open(m_filename, O_RDWR|O_NONBLOCK);
        if (m_fd < 0)
        {
-               eWarning("failed! (%s) %m", m_filename);
+               m_fd = ::open(m_filename, O_RDWR|O_NONBLOCK);
+               if (m_fd < 0)
+               {
+                       eWarning("failed! (%s) %m", m_filename);
 #if HAVE_DVB_API_VERSION < 3
-               ::close(m_secfd);
-               m_secfd=-1;
+                       ::close(m_secfd);
+                       m_secfd=-1;
 #endif
-               return -1;
+                       return -1;
+               }
        }
-
+       else
+               eWarning("frontend %d already opened", m_fe);
        if (m_type == -1)
        {
                if (::ioctl(m_fd, FE_GET_INFO, &fe_info) < 0)
@@ -425,17 +438,21 @@ int eDVBFrontend::closeFrontend()
                m_tuneTimer->stop();
                setTone(iDVBFrontend::toneOff);
                setVoltage(iDVBFrontend::voltageOff);
-               if (m_type == iDVBFrontend::feSatellite)
+               if (m_sec)
                        m_sec->setRotorMoving(false);
-               ::close(m_fd);
-               m_fd=-1;
+               if (!::close(m_fd))
+                       m_fd=-1;
+               else
+                       eWarning("couldnt close frontend %d", m_fe);
                m_data[0] = m_data[1] = m_data[2] = -1;
        }
 #if HAVE_DVB_API_VERSION < 3
        if (m_secfd >= 0)
        {
-               ::close(m_secfd);
-               m_secfd=-1;
+               if (!::close(m_secfd))
+                       m_secfd=-1;
+               else
+                       eWarning("couldnt close sec %d", m_fe);
        }
 #endif
        delete m_sn;
@@ -761,6 +778,9 @@ void fillDictWithTerrestrialData(PyObject *dict, const FRONTENDPARAMETERS &parm)
        case QAM_16:
                tmp = "QAM_16";
                break;
+       case QAM_64:
+               tmp = "QAM_64";
+               break;
        default:
        case QAM_AUTO:
                tmp = "QAM_AUTO";
@@ -803,6 +823,9 @@ void fillDictWithTerrestrialData(PyObject *dict, const FRONTENDPARAMETERS &parm)
        PutToDict(dict, "guard_interval", tmp);
        switch (parm_u_ofdm_hierarchy_information)
        {
+               case HIERARCHY_NONE:
+                       tmp = "HIERARCHY_NONE";
+                       break;
                case HIERARCHY_1:
                        tmp = "HIERARCHY_1";
                        break;
@@ -1429,6 +1452,9 @@ RESULT eDVBFrontend::prepare_terrestrial(const eDVBFrontendParametersTerrestrial
        case eDVBFrontendParametersTerrestrial::Modulation::QAM16:
                parm_u_ofdm_constellation = QAM_16;
                break;
+       case eDVBFrontendParametersTerrestrial::Modulation::QAM64:
+               parm_u_ofdm_constellation = QAM_64;
+               break;
        default:
        case eDVBFrontendParametersTerrestrial::Modulation::Auto:
                parm_u_ofdm_constellation = QAM_AUTO;
@@ -1468,6 +1494,9 @@ RESULT eDVBFrontend::prepare_terrestrial(const eDVBFrontendParametersTerrestrial
        }
        switch (feparm.hierarchy)
        {
+               case eDVBFrontendParametersTerrestrial::Hierarchy::HNone:
+                       parm_u_ofdm_hierarchy_information = HIERARCHY_NONE;
+                       break;
                case eDVBFrontendParametersTerrestrial::Hierarchy::H1:
                        parm_u_ofdm_hierarchy_information = HIERARCHY_1;
                        break;
@@ -1482,6 +1511,19 @@ RESULT eDVBFrontend::prepare_terrestrial(const eDVBFrontendParametersTerrestrial
                        parm_u_ofdm_hierarchy_information = HIERARCHY_AUTO;
                        break;
        }
+       switch (feparm.inversion)
+       {
+       case eDVBFrontendParametersTerrestrial::Inversion::On:
+               parm_inversion = INVERSION_ON;
+               break;
+       case eDVBFrontendParametersTerrestrial::Inversion::Off:
+               parm_inversion = INVERSION_OFF;
+               break;
+       default:
+       case eDVBFrontendParametersTerrestrial::Inversion::Unknown:
+               parm_inversion = INVERSION_AUTO;
+               break;
+       }
        return 0;
 }