From: hschang Date: Fri, 4 Mar 2016 02:14:21 +0000 (+0900) Subject: [SEC] Fix 0 byte recording issue in linked tuner. X-Git-Url: http://code.vuplus.com/gitweb/?p=vuplus_dvbapp;a=commitdiff_plain;h=685c5b7ac4501dbb62a9bb3f526da558fd06da39 [SEC] Fix 0 byte recording issue in linked tuner. --- diff --git a/lib/dvb/frontend.cpp b/lib/dvb/frontend.cpp index 1e7cb6b..7b95149 100755 --- a/lib/dvb/frontend.cpp +++ b/lib/dvb/frontend.cpp @@ -787,7 +787,10 @@ void eDVBFrontend::feEvent(int w) eDebug("stateLostLock"); state = stateLostLock; if (!m_rotor_mode) + { sec_fe->m_data[CSW] = sec_fe->m_data[UCSW] = sec_fe->m_data[TONEBURST] = -1; // reset diseqc + sec_fe->m_data[LINKABLE_CSW] = sec_fe->m_data[LINKABLE_UCSW] = sec_fe->m_data[LINKABLE_TONEBURST] = -1; + } } } if (m_state != state) @@ -806,6 +809,7 @@ void eDVBFrontend::timeout() #ifdef BUILD_VUPLUS eDVBFrontend *sec_fe = this; sec_fe->m_data[CSW] = sec_fe->m_data[UCSW] = sec_fe->m_data[TONEBURST] = -1; // reset diseqc + sec_fe->m_data[LINKABLE_CSW] = sec_fe->m_data[LINKABLE_UCSW] = sec_fe->m_data[LINKABLE_TONEBURST] = -1; #endif m_state = stateFailed; m_stateChanged(this); @@ -3115,6 +3119,24 @@ RESULT eDVBFrontend::setSecSequence(eSecCommandList &list) return 0; } +bool eDVBFrontend::isScheduledSendDiseqc() +{ + bool has_senddiseqc = false; + if ( m_sec_sequence && m_sec_sequence.current() != m_sec_sequence.end() ) + { + eSecCommandList::iterator cur = m_sec_sequence.current(); + while(cur != m_sec_sequence.end()) + { + if (((cur++)->cmd == eSecCommand::SEND_DISEQC)) + { + has_senddiseqc = true; + break; + } + } + } + return has_senddiseqc; +} + RESULT eDVBFrontend::getData(int num, long &data) { if ( num < NUM_DATA_ENTRIES ) diff --git a/lib/dvb/frontend.h b/lib/dvb/frontend.h index e6e3aea..aceb856 100644 --- a/lib/dvb/frontend.h +++ b/lib/dvb/frontend.h @@ -47,6 +47,9 @@ class eDVBFrontend: public iDVBFrontend, public Object { public: enum { + LINKABLE_CSW, + LINKABLE_UCSW, + LINKABLE_TONEBURST, NEW_CSW, NEW_UCSW, NEW_TONEBURST, @@ -159,6 +162,8 @@ public: bool is_FBCTuner() { return m_fbc; } bool getEnabled() { return m_enabled; } void setEnabled(bool enable) { m_enabled = enable; } + bool isLoopTimerActive() { return m_tuneTimer->isActive(); } + bool isScheduledSendDiseqc(); }; #endif // SWIG diff --git a/lib/dvb/sec.cpp b/lib/dvb/sec.cpp index d1567ba..878a835 100644 --- a/lib/dvb/sec.cpp +++ b/lib/dvb/sec.cpp @@ -55,7 +55,7 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite bool simulate = ((eDVBFrontend*)fe)->is_simulate(); bool direct_connected = m_not_linked_slot_mask & slot_id; int score=0, satcount=0; - long linked_prev_ptr=-1, linked_next_ptr=-1, linked_csw=-1, linked_ucsw=-1, linked_toneburst=-1, + long linked_prev_ptr=-1, linked_next_ptr=-1, linkable_csw=-1, linkable_ucsw=-1, linkable_toneburst=-1, fe_satpos_depends_ptr=-1, fe_rotor_pos=-1; bool linked_in_use = false; @@ -89,9 +89,9 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite // when a linked in use tuner is found we get the tuner data... if (linked_in_use) { - fe->getData(eDVBFrontend::CSW, linked_csw); - fe->getData(eDVBFrontend::UCSW, linked_ucsw); - fe->getData(eDVBFrontend::TONEBURST, linked_toneburst); + fe->getData(eDVBFrontend::LINKABLE_CSW, linkable_csw); + fe->getData(eDVBFrontend::LINKABLE_UCSW, linkable_ucsw); + fe->getData(eDVBFrontend::LINKABLE_TONEBURST, linkable_toneburst); } if (highest_score_lnb) @@ -164,8 +164,8 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite if (linked_in_use && !is_unicable) { // compare tuner data - if ( (csw != linked_csw) || - ( diseqc && (ucsw != linked_ucsw || toneburst != linked_toneburst) ) || + if ( (csw != linkable_csw) || + ( diseqc && (ucsw != linkable_ucsw || toneburst != linkable_toneburst) ) || ( rotor && rotor_pos != sat.orbital_position ) ) { ret = 0; @@ -318,6 +318,8 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA int RotorCmd=-1; int send_mask = 0; + bool direct_connected = m_not_linked_slot_mask & slot_id; + lnb_param.guard_offset = 0; //HACK @@ -326,7 +328,7 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA frontend.getData(eDVBFrontend::SATPOS_DEPENDS_PTR, satposDependPtr); - if (!(m_not_linked_slot_mask & slot_id)) // frontend with direct connection? + if (!direct_connected) // frontend with direct connection? { long linked_prev_ptr; frontend.getData(eDVBFrontend::LINKED_PREV_PTR, linked_prev_ptr); @@ -448,15 +450,22 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA bool send_csw = (di_param.m_committed_cmd != eDVBSatelliteDiseqcParameters::SENDNO); - 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 && (forceChanged || ucsw != lastucsw); bool send_burst = (di_param.m_toneburst_param != eDVBSatelliteDiseqcParameters::NO); - bool changed_burst = send_burst && (forceChanged || toneburst != lastToneburst); + + bool changed_csw = false; + bool changed_ucsw = false; + bool changed_burst = false; + if (direct_connected || (!linked_fe->m_frontend->isLoopTimerActive() || !linked_fe->m_frontend->isScheduledSendDiseqc())) + { + changed_csw = send_csw && (forceChanged || csw != lastcsw); + changed_ucsw = send_ucsw && (forceChanged || ucsw != lastucsw); + changed_burst = send_burst && (forceChanged || toneburst != lastToneburst); + } /* send_mask 1 must send csw @@ -717,6 +726,9 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA sec_fe->setData(eDVBFrontend::NEW_CSW, csw); sec_fe->setData(eDVBFrontend::NEW_UCSW, ucsw); sec_fe->setData(eDVBFrontend::NEW_TONEBURST, di_param.m_toneburst_param); + sec_fe->setData(eDVBFrontend::LINKABLE_CSW, csw); + sec_fe->setData(eDVBFrontend::LINKABLE_UCSW, ucsw); + sec_fe->setData(eDVBFrontend::LINKABLE_TONEBURST, di_param.m_toneburst_param); if(is_unicable) {