cec: request the active source if it's unknown in CCECProcessor::GetActiveSource()
[deb_libcec.git] / src / lib / CECProcessor.cpp
index efe038f1498eb17f433fa0c7f8191673411dc031..a1603e8243a26b92cbed4d2080639eaa044fdf28 100644 (file)
@@ -542,6 +542,10 @@ bool CCECProcessor::SetActiveSource(uint16_t iStreamPath)
     device->SetActiveSource();
     bReturn = true;
   }
+  else
+  {
+    CLibCEC::AddLog(CEC_LOG_DEBUG, "device with PA '%04x' not found", iStreamPath);
+  }
 
   return bReturn;
 }
@@ -812,20 +816,17 @@ uint8_t CCECProcessor::MuteAudio(bool bSendRelease /* = true */)
 
 CCECBusDevice *CCECProcessor::GetDeviceByPhysicalAddress(uint16_t iPhysicalAddress, bool bSuppressUpdate /* = true */)
 {
-  if (m_configuration.logicalAddresses.primary != CECDEVICE_UNKNOWN)
-  {
-    if (m_busDevices[m_configuration.logicalAddresses.primary]->GetPhysicalAddress() == iPhysicalAddress)
-      return m_busDevices[m_configuration.logicalAddresses.primary];
-  }
+  CCECBusDevice *device(NULL);
 
-  CCECBusDevice *device = NULL;
-  for (unsigned int iPtr = 0; iPtr < 16; iPtr++)
+  // invalid PA
+  if (iPhysicalAddress == 0xFFFF)
+    return device;
+
+  // check each device until we found a match
+  for (unsigned int iPtr = 0; !device && iPtr < 16; iPtr++)
   {
     if (m_busDevices[iPtr]->GetPhysicalAddress(bSuppressUpdate) == iPhysicalAddress)
-    {
       device = m_busDevices[iPtr];
-      break;
-    }
   }
 
   return device;
@@ -899,7 +900,7 @@ uint64_t CCECProcessor::GetDeviceVendorId(cec_logical_address iAddress)
 uint16_t CCECProcessor::GetDevicePhysicalAddress(cec_logical_address iAddress)
 {
   if (m_busDevices[iAddress])
-    return m_busDevices[iAddress]->GetPhysicalAddress();
+    return m_busDevices[iAddress]->GetPhysicalAddress(false);
   return false;
 }
 
@@ -910,7 +911,7 @@ cec_power_status CCECProcessor::GetDevicePowerStatus(cec_logical_address iAddres
   return CEC_POWER_STATUS_UNKNOWN;
 }
 
-cec_logical_address CCECProcessor::GetActiveSource(void)
+cec_logical_address CCECProcessor::GetActiveSource(bool bRequestActiveSource /* = true */)
 {
   for (uint8_t iPtr = 0; iPtr <= 11; iPtr++)
   {
@@ -918,6 +919,15 @@ cec_logical_address CCECProcessor::GetActiveSource(void)
       return (cec_logical_address)iPtr;
   }
 
+  if (bRequestActiveSource && m_configuration.logicalAddresses.primary != CECDEVICE_UNKNOWN)
+  {
+    CCECBusDevice *primary = m_busDevices[m_configuration.logicalAddresses.primary];
+    if (primary)
+      primary->RequestActiveSource();
+
+    return GetActiveSource(false);
+  }
+
   return CECDEVICE_UNKNOWN;
 }