small fixes for loopthrough
authorAndreas Monzner <andreas.monzner@multimedia-labs.de>
Fri, 24 Oct 2008 11:13:31 +0000 (11:13 +0000)
committerAndreas Monzner <andreas.monzner@multimedia-labs.de>
Fri, 24 Oct 2008 11:13:31 +0000 (11:13 +0000)
lib/dvb/frontend.cpp
lib/dvb/sec.cpp

index bfb82a9246c8e29f236fe6fdd3b89fe258cbd70c..bfbd9b57934ee89dc89c9febcf5ab079b05c5449 100644 (file)
@@ -1418,11 +1418,13 @@ void eDVBFrontend::tuneLoop()  // called by m_tuneTimer
                tmp = prev->m_frontend->m_data[LINKED_PREV_PTR];
                if (tmp == -1 && sec_fe != this && !prev->m_inuse) {
                        int state = sec_fe->m_state;
                tmp = prev->m_frontend->m_data[LINKED_PREV_PTR];
                if (tmp == -1 && sec_fe != this && !prev->m_inuse) {
                        int state = sec_fe->m_state;
+                       // workaround to put the kernel frontend thread into idle state!
                        if (state != eDVBFrontend::stateIdle && state != stateClosed)
                        {
                                sec_fe->closeFrontend(true);
                                state = sec_fe->m_state;
                        }
                        if (state != eDVBFrontend::stateIdle && state != stateClosed)
                        {
                                sec_fe->closeFrontend(true);
                                state = sec_fe->m_state;
                        }
+                       // sec_fe is closed... we must reopen it here..
                        if (state == eDVBFrontend::stateClosed)
                        {
                                regFE = prev;
                        if (state == eDVBFrontend::stateClosed)
                        {
                                regFE = prev;
index c1caa3801f596f33e3b2d918751ee90c1d21327b..ca9e4ec8ffbbb75b4120479b2c5d527abddae9b7 100644 (file)
@@ -371,6 +371,7 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA
                        bool doSetFrontend = true;
                        bool doSetVoltageToneFrontend = true;
                        bool sendDiSEqC = false;
                        bool doSetFrontend = true;
                        bool doSetVoltageToneFrontend = true;
                        bool sendDiSEqC = false;
+                       bool forceChanged = false;
                        long band=0,
                                voltage = iDVBFrontend::voltageOff,
                                tone = iDVBFrontend::toneOff,
                        long band=0,
                                voltage = iDVBFrontend::voltageOff,
                                tone = iDVBFrontend::toneOff,
@@ -384,6 +385,7 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA
                                curRotorPos = -1,
                                satposDependPtr = -1;
                        iDVBFrontend *sec_fe=&frontend;
                                curRotorPos = -1,
                                satposDependPtr = -1;
                        iDVBFrontend *sec_fe=&frontend;
+                       eDVBRegisteredFrontend *linked_fe = 0;
                        eDVBSatelliteDiseqcParameters::t_diseqc_mode diseqc_mode = di_param.m_diseqc_mode;
 
                        frontend.getData(eDVBFrontend::SATPOS_DEPENDS_PTR, satposDependPtr);
                        eDVBSatelliteDiseqcParameters::t_diseqc_mode diseqc_mode = di_param.m_diseqc_mode;
 
                        frontend.getData(eDVBFrontend::SATPOS_DEPENDS_PTR, satposDependPtr);
@@ -394,12 +396,20 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA
                                frontend.getData(eDVBFrontend::LINKED_PREV_PTR, linked_prev_ptr);
                                while (linked_prev_ptr != -1)
                                {
                                frontend.getData(eDVBFrontend::LINKED_PREV_PTR, linked_prev_ptr);
                                while (linked_prev_ptr != -1)
                                {
-                                       eDVBRegisteredFrontend *linked_fe = (eDVBRegisteredFrontend*) linked_prev_ptr;
+                                       linked_fe = (eDVBRegisteredFrontend*) linked_prev_ptr;
                                        sec_fe = linked_fe->m_frontend;
                                        sec_fe->getData(eDVBFrontend::LINKED_PREV_PTR, (long&)linked_prev_ptr);
                                }
                                if (satposDependPtr != -1)  // we dont need uncommitted switch and rotor cmds on second output of a rotor lnb
                                        diseqc_mode = eDVBSatelliteDiseqcParameters::V1_0;
                                        sec_fe = linked_fe->m_frontend;
                                        sec_fe->getData(eDVBFrontend::LINKED_PREV_PTR, (long&)linked_prev_ptr);
                                }
                                if (satposDependPtr != -1)  // we dont need uncommitted switch and rotor cmds on second output of a rotor lnb
                                        diseqc_mode = eDVBSatelliteDiseqcParameters::V1_0;
+                               else {
+                                       // in eDVBFrontend::tuneLoop we call closeFrontend and ->inc_use() in this this condition (to put the kernel frontend thread into idle state)
+                                       // so we must resend all diseqc stuff (voltage is disabled when the frontend is closed)
+                                       int state;
+                                       sec_fe->getState(state);
+                                       if (!linked_fe->m_inuse && state != eDVBFrontend::stateIdle)
+                                               forceChanged = true;
+                               }
                        }
 
                        sec_fe->getData(eDVBFrontend::CSW, lastcsw);
                        }
 
                        sec_fe->getData(eDVBFrontend::CSW, lastcsw);
@@ -450,15 +460,15 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA
 
                                bool send_csw =
                                        (di_param.m_committed_cmd != eDVBSatelliteDiseqcParameters::SENDNO);
 
                                bool send_csw =
                                        (di_param.m_committed_cmd != eDVBSatelliteDiseqcParameters::SENDNO);
-                               bool changed_csw = send_csw && csw != lastcsw;
+                               bool changed_csw = send_csw && (forceChanged || csw != lastcsw);
 
                                bool send_ucsw =
                                        (di_param.m_uncommitted_cmd && diseqc_mode > eDVBSatelliteDiseqcParameters::V1_0);
 
                                bool send_ucsw =
                                        (di_param.m_uncommitted_cmd && diseqc_mode > eDVBSatelliteDiseqcParameters::V1_0);
-                               bool changed_ucsw = send_ucsw && ucsw != lastucsw;
+                               bool changed_ucsw = send_ucsw && (forceChanged || ucsw != lastucsw);
 
                                bool send_burst =
                                        (di_param.m_toneburst_param != eDVBSatelliteDiseqcParameters::NO);
 
                                bool send_burst =
                                        (di_param.m_toneburst_param != eDVBSatelliteDiseqcParameters::NO);
-                               bool changed_burst = send_burst && toneburst != lastToneburst;
+                               bool changed_burst = send_burst && (forceChanged || toneburst != lastToneburst);
 
                                int send_mask = 0; /*
                                        1 must send csw
 
                                int send_mask = 0; /*
                                        1 must send csw