cec: keep the 'busy state' of the command handler in CCECBusDevice
[deb_libcec.git] / src / lib / implementations / CECCommandHandler.cpp
index 7be147d8ab49f1775b10b87538bb8d361cc7bcb2..9f9c882336e6ebcd16046600255fe880169a8058 100644 (file)
@@ -48,10 +48,10 @@ CCECCommandHandler::CCECCommandHandler(CCECBusDevice *busDevice) :
     m_iTransmitWait(CEC_DEFAULT_TRANSMIT_WAIT),
     m_iTransmitRetries(CEC_DEFAULT_TRANSMIT_RETRIES),
     m_bHandlerInited(false),
-    m_iUseCounter(0),
     m_expectedResponse(CEC_OPCODE_NONE),
     m_bOPTSendDeckStatusUpdateOnActiveSource(false),
-    m_vendorId(CEC_VENDOR_UNKNOWN)
+    m_vendorId(CEC_VENDOR_UNKNOWN),
+    m_bRcvSignal(false)
 {
 }
 
@@ -66,7 +66,6 @@ bool CCECCommandHandler::HandleCommand(const cec_command &command)
 {
   bool bHandled(true);
 
-  MarkBusy();
   CLibCEC::AddCommand(command);
 
   switch(command.opcode)
@@ -195,10 +194,12 @@ bool CCECCommandHandler::HandleCommand(const cec_command &command)
     CLockObject lock(m_receiveMutex);
     if (m_expectedResponse == CEC_OPCODE_NONE ||
         m_expectedResponse == command.opcode)
+    {
+      m_bRcvSignal = true;
       m_condition.Signal();
+    }
   }
 
-  MarkReady();
   return bHandled;
 }
 
@@ -899,6 +900,16 @@ bool CCECCommandHandler::TransmitSetSystemAudioMode(const cec_logical_address iI
   return Transmit(command, false);
 }
 
+bool CCECCommandHandler::TransmitSetStreamPath(uint16_t iStreamPath)
+{
+  cec_command command;
+  cec_command::Format(command, m_busDevice->GetLogicalAddress(), CECDEVICE_BROADCAST, CEC_OPCODE_SET_STREAM_PATH);
+  command.parameters.PushBack((uint8_t) ((iStreamPath >> 8) & 0xFF));
+  command.parameters.PushBack((uint8_t) (iStreamPath        & 0xFF));
+
+  return Transmit(command, false);
+}
+
 bool CCECCommandHandler::TransmitSystemAudioModeStatus(const cec_logical_address iInitiator, const cec_logical_address iDestination, cec_system_audio_status state)
 {
   cec_command command;
@@ -937,14 +948,12 @@ bool CCECCommandHandler::TransmitKeyRelease(const cec_logical_address iInitiator
 bool CCECCommandHandler::Transmit(cec_command &command, bool bExpectResponse /* = true */, cec_opcode expectedResponse /* = CEC_OPCODE_NONE */)
 {
   bool bReturn(false);
-  MarkBusy();
   command.transmit_timeout = m_iTransmitTimeout;
 
   {
     uint8_t iTries(0), iMaxTries(command.opcode == CEC_OPCODE_NONE ? 1 : m_iTransmitRetries + 1);
     CLockObject writeLock(m_processor->m_transmitMutex);
     CLockObject receiveLock(m_receiveMutex);
-    ++m_iUseCounter;
     while (!bReturn && ++iTries <= iMaxTries)
     {
       m_expectedResponse = expectedResponse;
@@ -952,13 +961,13 @@ bool CCECCommandHandler::Transmit(cec_command &command, bool bExpectResponse /*
       {
         CLibCEC::AddLog(CEC_LOG_DEBUG, "command transmitted");
         if (bExpectResponse)
-          bReturn = m_condition.Wait(m_receiveMutex, m_iTransmitWait);
+          bReturn = m_condition.Wait(m_receiveMutex, m_bRcvSignal, m_iTransmitWait);
+        if (bReturn)
+          m_bRcvSignal = false;
       }
     }
-    --m_iUseCounter;
   }
 
-  MarkReady();
   return bReturn;
 }
 
@@ -979,21 +988,3 @@ bool CCECCommandHandler::ActivateSource(void)
   }
   return true;
 }
-
-void CCECCommandHandler::MarkBusy(void)
-{
-  CLockObject receiveLock(m_receiveMutex);
-  ++m_iUseCounter;
-}
-
-bool CCECCommandHandler::MarkReady(void)
-{
-  CLockObject receiveLock(m_receiveMutex);
-  return m_iUseCounter > 0 ? (--m_iUseCounter == 0) : true;
-}
-
-bool CCECCommandHandler::InUse(void)
-{
-  CLockObject receiveLock(m_receiveMutex);
-  return m_iUseCounter > 0;
-}