[SEC] Fix 0 byte recording issue in linked tuner.
authorhschang <chang@dev3>
Fri, 4 Mar 2016 02:14:21 +0000 (11:14 +0900)
committerhschang <chang@dev3>
Fri, 4 Mar 2016 02:14:21 +0000 (11:14 +0900)
lib/dvb/frontend.cpp
lib/dvb/frontend.h
lib/dvb/sec.cpp

index 1e7cb6b..7b95149 100755 (executable)
@@ -787,7 +787,10 @@ void eDVBFrontend::feEvent(int w)
                                eDebug("stateLostLock");
                                state = stateLostLock;
                                if (!m_rotor_mode)
                                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[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)
                        }
                }
                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
 #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);
 #endif
                m_state = stateFailed;
                m_stateChanged(this);
@@ -3115,6 +3119,24 @@ RESULT eDVBFrontend::setSecSequence(eSecCommandList &list)
        return 0;
 }
 
        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 )
 RESULT eDVBFrontend::getData(int num, long &data)
 {
        if ( num < NUM_DATA_ENTRIES )
index e6e3aea..aceb856 100644 (file)
@@ -47,6 +47,9 @@ class eDVBFrontend: public iDVBFrontend, public Object
 {
 public:
        enum {
 {
 public:
        enum {
+               LINKABLE_CSW,
+               LINKABLE_UCSW,
+               LINKABLE_TONEBURST,
                NEW_CSW,
                NEW_UCSW,
                NEW_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 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
 };
 
 #endif // SWIG
index d1567ba..878a835 100644 (file)
@@ -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;
        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;
 
                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)
        {
        // 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)
        }
 
        if (highest_score_lnb)
@@ -164,8 +164,8 @@ int eDVBSatelliteEquipmentControl::canTune(const eDVBFrontendParametersSatellite
                                if (linked_in_use && !is_unicable)
                                {
                                        // compare tuner data
                                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;
                                                ( 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;
 
                        int RotorCmd=-1;
                        int send_mask = 0;
 
+                       bool direct_connected = m_not_linked_slot_mask & slot_id;
+
                        lnb_param.guard_offset = 0; //HACK
 
 
                        lnb_param.guard_offset = 0; //HACK
 
 
@@ -326,7 +328,7 @@ RESULT eDVBSatelliteEquipmentControl::prepare(iDVBFrontend &frontend, FRONTENDPA
 
                        frontend.getData(eDVBFrontend::SATPOS_DEPENDS_PTR, satposDependPtr);
 
 
                        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);
                        {
                                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 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 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 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
 
                                /* 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::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)
                        {
 
                        if(is_unicable)
                        {