win32: don't include the .pdb in the installer. only include include/cec*
[deb_libcec.git] / src / lib / CECProcessor.cpp
index cd8176df7a92551fe2f01b653539cd9eb20c34d9..e3f75173f7ca619e184582e11bb6f9fe0792d3c2 100644 (file)
@@ -42,11 +42,12 @@ 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(CECDEVICE_UNKNOWN),
+    m_iLogicalAddress(iLogicalAddress),
     m_strDeviceName(strDeviceName),
     m_communication(serComm),
     m_controller(controller),
-    m_bMonitor(false)
+    m_bMonitor(false),
+    m_bLogicalAddressSet(false)
 {
   for (int iPtr = 0; iPtr < 16; iPtr++)
     m_busDevices[iPtr] = new CCECBusDevice(this, (cec_logical_address) iPtr, iPtr == iLogicalAddress ? iPhysicalAddress : 0);
@@ -147,7 +148,9 @@ bool CCECProcessor::SetActiveView(void)
   if (!IsRunning())
     return false;
 
-  return m_busDevices[m_iLogicalAddress]->BroadcastActiveView();
+  if (m_iLogicalAddress != CECDEVICE_UNKNOWN && m_busDevices[m_iLogicalAddress])
+    return m_busDevices[m_iLogicalAddress]->BroadcastActiveView();
+  return false;
 }
 
 bool CCECProcessor::SetInactiveView(void)
@@ -155,7 +158,9 @@ bool CCECProcessor::SetInactiveView(void)
   if (!IsRunning())
     return false;
 
-  return m_busDevices[m_iLogicalAddress]->BroadcastInactiveView();
+  if (m_iLogicalAddress != CECDEVICE_UNKNOWN && m_busDevices[m_iLogicalAddress])
+    return m_busDevices[m_iLogicalAddress]->BroadcastInactiveView();
+  return false;
 }
 
 void CCECProcessor::LogOutput(const cec_command &data)
@@ -168,25 +173,31 @@ void CCECProcessor::LogOutput(const cec_command &data)
   m_controller->AddLog(CEC_LOG_TRAFFIC, strTx.c_str());
 }
 
-bool CCECProcessor::SetLogicalAddress(cec_logical_address iLogicalAddress)
+bool CCECProcessor::SetLogicalAddress(cec_logical_address iLogicalAddress /* = CECDEVICE_UNKNOWN */)
 {
-  if (m_iLogicalAddress != iLogicalAddress)
+  if (iLogicalAddress != CECDEVICE_UNKNOWN)
   {
     CStdString strLog;
     strLog.Format("<< setting logical address to %1x", iLogicalAddress);
     m_controller->AddLog(CEC_LOG_NOTICE, strLog.c_str());
-
     m_iLogicalAddress = iLogicalAddress;
-    return m_communication && m_communication->SetAckMask(0x1 << (uint8_t)m_iLogicalAddress);
+    m_bLogicalAddressSet = false;
   }
 
-  return true;
+  if (!m_bLogicalAddressSet && m_iLogicalAddress != CECDEVICE_UNKNOWN)
+    m_bLogicalAddressSet = m_communication && m_communication->SetAckMask(0x1 << (uint8_t)m_iLogicalAddress);
+
+  return m_bLogicalAddressSet;
 }
 
 bool CCECProcessor::SetPhysicalAddress(uint16_t iPhysicalAddress)
 {
-  m_busDevices[m_iLogicalAddress]->SetPhysicalAddress(iPhysicalAddress);
-  return m_busDevices[m_iLogicalAddress]->BroadcastActiveView();
+  if (m_iLogicalAddress != CECDEVICE_UNKNOWN && m_busDevices[m_iLogicalAddress])
+  {
+    m_busDevices[m_iLogicalAddress]->SetPhysicalAddress(iPhysicalAddress);
+    return m_busDevices[m_iLogicalAddress]->BroadcastActiveView();
+  }
+  return false;
 }
 
 bool CCECProcessor::SwitchMonitoring(bool bEnable)
@@ -209,22 +220,32 @@ cec_version CCECProcessor::GetDeviceCecVersion(cec_logical_address iAddress)
 
 bool CCECProcessor::GetDeviceMenuLanguage(cec_logical_address iAddress, cec_menu_language *language)
 {
-  *language = m_busDevices[iAddress]->GetMenuLanguage();
-  return (strcmp(language->language, "???") == 0);
+  if (m_busDevices[iAddress])
+  {
+    *language = m_busDevices[iAddress]->GetMenuLanguage();
+    return (strcmp(language->language, "???") == 0);
+  }
+  return false;
 }
 
 uint64_t CCECProcessor::GetDeviceVendorId(cec_logical_address iAddress)
 {
-  return m_busDevices[iAddress]->GetVendorId();
+  if (m_busDevices[iAddress])
+    return m_busDevices[iAddress]->GetVendorId();
+  return false;
 }
 
 cec_power_status CCECProcessor::GetDevicePowerStatus(cec_logical_address iAddress)
 {
-  return m_busDevices[iAddress]->GetPowerStatus();
+  if (m_busDevices[iAddress])
+    return m_busDevices[iAddress]->GetPowerStatus();
+  return CEC_POWER_STATUS_UNKNOWN;
 }
 
 bool CCECProcessor::Transmit(const cec_command &data)
 {
+  SetLogicalAddress();
+
   bool bReturn(false);
   LogOutput(data);
 
@@ -237,7 +258,7 @@ bool CCECProcessor::Transmit(const cec_command &data)
       return bReturn;
     else
     {
-      output->condition.Wait(&output->mutex);
+      output->condition.Wait(&output->mutex, 1000);
       if (output->state != ADAPTER_MESSAGE_STATE_SENT)
       {
         m_controller->AddLog(CEC_LOG_ERROR, "command was not sent");
@@ -465,7 +486,9 @@ void CCECProcessor::ParseCommand(cec_command &command)
 
 uint16_t CCECProcessor::GetPhysicalAddress(void) const
 {
-  return m_busDevices[m_iLogicalAddress]->GetPhysicalAddress();
+  if (m_iLogicalAddress != CECDEVICE_UNKNOWN && m_busDevices[m_iLogicalAddress])
+    return m_busDevices[m_iLogicalAddress]->GetPhysicalAddress();
+  return false;
 }
 
 void CCECProcessor::SetCurrentButton(cec_user_control_code iButtonCode)