cec: add an 'expectedResponse' parameter to CCECCommandHandler::Transmit()
authorLars Op den Kamp <lars@opdenkamp.eu>
Thu, 29 Dec 2011 01:44:30 +0000 (02:44 +0100)
committerLars Op den Kamp <lars@opdenkamp.eu>
Thu, 29 Dec 2011 01:44:30 +0000 (02:44 +0100)
src/lib/implementations/CECCommandHandler.cpp
src/lib/implementations/CECCommandHandler.h

index c72155cccdb3a9efc616297ef5b4efe11de6e0f4..91a60a334949b0b4c4619c13bf71aa74c0f1acdb 100644 (file)
@@ -46,7 +46,8 @@ CCECCommandHandler::CCECCommandHandler(CCECBusDevice *busDevice) :
     m_iTransmitWait(CEC_DEFAULT_TRANSMIT_WAIT),
     m_iTransmitRetries(CEC_DEFAULT_TRANSMIT_RETRIES),
     m_bHandlerInited(false),
-    m_iUseCounter(0)
+    m_iUseCounter(0),
+    m_expectedResponse(CEC_OPCODE_NONE)
 {
 }
 
@@ -178,7 +179,9 @@ bool CCECCommandHandler::HandleCommand(const cec_command &command)
   if (bHandled && !bHandlerChanged)
   {
     CLockObject lock(&m_receiveMutex);
-    m_condition.Signal();
+    if (m_expectedResponse == CEC_OPCODE_NONE ||
+        m_expectedResponse == command.opcode)
+      m_condition.Signal();
   }
 
   MarkReady();
@@ -932,7 +935,7 @@ bool CCECCommandHandler::TransmitKeyRelease(const cec_logical_address iInitiator
   return Transmit(command, bWait);
 }
 
-bool CCECCommandHandler::Transmit(cec_command &command, bool bExpectResponse /* = true */)
+bool CCECCommandHandler::Transmit(cec_command &command, bool bExpectResponse /* = true */, cec_opcode expectedResponse /* = CEC_OPCODE_NONE */)
 {
   bool bReturn(false);
   command.transmit_timeout = m_iTransmitTimeout;
@@ -944,6 +947,7 @@ bool CCECCommandHandler::Transmit(cec_command &command, bool bExpectResponse /*
     ++m_iUseCounter;
     while (!bReturn && ++iTries <= iMaxTries)
     {
+      m_expectedResponse = expectedResponse;
       if (m_processor->Transmit(command))
       {
         m_processor->AddLog(CEC_LOG_DEBUG, "command transmitted");
index c84424f4f34424843b8d065c72d1c49baaef1e95..c99d569ff95f989a4e05e51f42d0a91d14927185 100644 (file)
@@ -128,7 +128,7 @@ namespace CEC
     virtual bool SetVendorId(const cec_command &command);
     virtual void SetPhysicalAddress(cec_logical_address iAddress, uint16_t iNewAddress);
 
-    virtual bool Transmit(cec_command &command, bool bExpectResponse = true);
+    virtual bool Transmit(cec_command &command, bool bExpectResponse = true, cec_opcode expectedResponse = CEC_OPCODE_NONE);
 
     CCECBusDevice *m_busDevice;
     CCECProcessor *m_processor;
@@ -137,6 +137,7 @@ namespace CEC
     int8_t         m_iTransmitRetries;
     bool           m_bHandlerInited;
     uint8_t        m_iUseCounter;
+    cec_opcode     m_expectedResponse;
     CMutex         m_receiveMutex;
     CCondition     m_condition;
   };