cec: set the correct ackmask on startup
[deb_libcec.git] / src / lib / CECProcessor.cpp
index 54794c343853a2727d27cd50a56098d439e2bb7f..d5ee321ce90954fa485cd33a978dd610c55f003a 100644 (file)
@@ -42,7 +42,7 @@ using namespace CEC;
 using namespace std;
 
 CCECProcessor::CCECProcessor(CLibCEC *controller, CAdapterCommunication *serComm, const char *strDeviceName, cec_logical_address iLogicalAddress /* = CECDEVICE_PLAYBACKDEVICE1 */, uint16_t iPhysicalAddress /* = CEC_DEFAULT_PHYSICAL_ADDRESS*/) :
-    m_iLogicalAddress(iLogicalAddress),
+    m_iLogicalAddress(CECDEVICE_UNKNOWN),
     m_strDeviceName(strDeviceName),
     m_communication(serComm),
     m_controller(controller),
@@ -91,6 +91,8 @@ void *CCECProcessor::Process(void)
   CCECAdapterMessage    msg;
   CCECAdapterMessagePtr msgPtr;
 
+  m_communication->SetAckMask(0x1 << (uint8_t)m_iLogicalAddress);
+
   while (!IsStopped())
   {
     bool bParseFrame(false);
@@ -187,7 +189,7 @@ bool CCECProcessor::SwitchMonitoring(bool bEnable)
     return m_communication && m_communication->SetAckMask(0x1 << (uint8_t)m_iLogicalAddress);
 }
 
-bool CCECProcessor::Transmit(const cec_command &data, bool bWaitForAck /* = true */)
+bool CCECProcessor::Transmit(const cec_command &data)
 {
   bool bReturn(false);
   LogOutput(data);
@@ -195,13 +197,25 @@ bool CCECProcessor::Transmit(const cec_command &data, bool bWaitForAck /* = true
   CCECAdapterMessagePtr output(new CCECAdapterMessage(data));
 
   CLockObject lock(&m_mutex);
-  if (!m_communication || !m_communication->Write(output))
-    return bReturn;
+  {
+    CLockObject msgLock(&output->mutex);
+    if (!m_communication || !m_communication->Write(output))
+      return bReturn;
+    else
+    {
+      output->condition.Wait(&output->mutex);
+      if (output->state != ADAPTER_MESSAGE_STATE_SENT)
+      {
+        m_controller->AddLog(CEC_LOG_ERROR, "command was not sent");
+        return bReturn;
+      }
+    }
+  }
 
-  if (bWaitForAck)
+  if (data.ack_timeout > 0)
   {
     bool bError(false);
-    if ((bReturn = WaitForAck(&bError, output->size(), 1000)) == false)
+    if ((bReturn = WaitForAck(&bError, output->size(), data.ack_timeout)) == false)
       m_controller->AddLog(CEC_LOG_ERROR, "did not receive ack");
   }
   else