From 4e6bb28e14b621f0e818db84150522549dc7b6d4 Mon Sep 17 00:00:00 2001 From: Andreas Monzner Date: Fri, 24 Oct 2008 11:13:31 +0000 Subject: [PATCH] small fixes for loopthrough --- lib/dvb/frontend.cpp | 2 ++ lib/dvb/sec.cpp | 18 ++++++++++++++---- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/lib/dvb/frontend.cpp b/lib/dvb/frontend.cpp index bfb82a92..bfbd9b57 100644 --- a/lib/dvb/frontend.cpp +++ b/lib/dvb/frontend.cpp @@ -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; + // 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; } + // sec_fe is closed... we must reopen it here.. if (state == eDVBFrontend::stateClosed) { regFE = prev; diff --git a/lib/dvb/sec.cpp b/lib/dvb/sec.cpp index c1caa380..ca9e4ec8 100644 --- a/lib/dvb/sec.cpp +++ b/lib/dvb/sec.cpp @@ -371,6 +371,7 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA bool doSetFrontend = true; bool doSetVoltageToneFrontend = true; bool sendDiSEqC = false; + bool forceChanged = false; 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; + eDVBRegisteredFrontend *linked_fe = 0; 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) { - 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; + 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); @@ -450,15 +460,15 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA 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 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 changed_burst = send_burst && toneburst != lastToneburst; + bool changed_burst = send_burst && (forceChanged || toneburst != lastToneburst); int send_mask = 0; /* 1 must send csw -- 2.30.2