cec: set controlled mode and retry to send the previous command if it failed with...
authorLars Op den Kamp <lars@opdenkamp.eu>
Thu, 15 Mar 2012 12:27:18 +0000 (13:27 +0100)
committerLars Op den Kamp <lars@opdenkamp.eu>
Thu, 15 Mar 2012 12:27:18 +0000 (13:27 +0100)
src/lib/adapter/USBCECAdapterCommunication.cpp
src/lib/adapter/USBCECAdapterCommunication.h

index 09a3bb2029de81b4774f8c41294014c18398e29d..72abd15833e7c588e58a3e4fd6663cbb5dff1382 100644 (file)
@@ -967,7 +967,7 @@ CStdString CUSBCECAdapterCommunication::GetPortName(void)
   return strName;
 }
 
-bool CUSBCECAdapterCommunication::SendCommand(cec_adapter_messagecode msgCode, CCECAdapterMessage &params, bool bExpectAck /* = true */, bool bIsTransmission /* = false */, bool bSendDirectly /* = true */)
+bool CUSBCECAdapterCommunication::SendCommand(cec_adapter_messagecode msgCode, CCECAdapterMessage &params, bool bExpectAck /* = true */, bool bIsTransmission /* = false */, bool bSendDirectly /* = true */, bool bIsRetry /* = false */)
 {
   CLockObject lock(m_mutex);
 
@@ -990,6 +990,13 @@ bool CUSBCECAdapterCommunication::SendCommand(cec_adapter_messagecode msgCode, C
   {
     CLibCEC::AddLog(CEC_LOG_ERROR, "'%s' failed", CCECAdapterMessage::ToString(msgCode));
     delete output;
+
+    if (!bIsRetry && output->reply == MSGCODE_COMMAND_REJECTED && msgCode != MSGCODE_SET_CONTROLLED)
+    {
+      CLibCEC::AddLog(CEC_LOG_DEBUG, "setting controlled mode and retrying");
+      if (SetControlledMode(true))
+        return SendCommand(msgCode, params, bExpectAck, bIsTransmission, bSendDirectly, true);
+    }
     return false;
   }
 
index dad543a91c42a31880b1ccedd12ad0b237450e44..3e5066b9843caba6d47d86881f490da957eff14c 100644 (file)
@@ -90,7 +90,7 @@ namespace CEC
 
     void *Process(void);
   private:
-    bool SendCommand(cec_adapter_messagecode msgCode, CCECAdapterMessage &params, bool bExpectAck = true, bool bIsTransmission = false, bool bSendDirectly = true);
+    bool SendCommand(cec_adapter_messagecode msgCode, CCECAdapterMessage &params, bool bExpectAck = true, bool bIsTransmission = false, bool bSendDirectly = true, bool bIsRetry = false);
     cec_datapacket GetSetting(cec_adapter_messagecode msgCode, uint8_t iResponseLength);
 
     bool SetSettingAutoEnabled(bool enabled);