+bool CCECProcessor::TryLogicalAddress(cec_logical_address address, const char *strLabel, unsigned int iIndex)
+{
+ CStdString strLog;
+ strLog.Format("trying logical address '%s'", strLabel);
+ AddLog(CEC_LOG_DEBUG, strLog);
+
+ SetAckMask(0x1 << address);
+ if (!m_busDevices[address]->TransmitPoll(address))
+ {
+ strLog.Format("using logical address '%s'", strLabel);
+ AddLog(CEC_LOG_NOTICE, strLog);
+
+ /* only set our OSD name for the primary device */
+ if (m_logicalAddresses.empty())
+ m_busDevices[address]->m_strDeviceName = m_strDeviceName;
+ m_busDevices[address]->m_powerStatus = CEC_POWER_STATUS_ON;
+ m_logicalAddresses.set(address);
+
+ // TODO
+ m_busDevices[address]->SetPhysicalAddress(CEC_DEFAULT_PHYSICAL_ADDRESS + (iIndex * 0x100));
+
+ return true;
+ }
+
+ strLog.Format("logical address '%s' already taken", strLabel);
+ AddLog(CEC_LOG_DEBUG, strLog);
+ return false;
+}
+
+bool CCECProcessor::FindLogicalAddressRecordingDevice(unsigned int iIndex)
+{
+ AddLog(CEC_LOG_DEBUG, "detecting logical address for type 'recording device'");
+ return TryLogicalAddress(CECDEVICE_RECORDINGDEVICE1, "recording 1", iIndex) ||
+ TryLogicalAddress(CECDEVICE_RECORDINGDEVICE2, "recording 2", iIndex) ||
+ TryLogicalAddress(CECDEVICE_RECORDINGDEVICE3, "recording 3", iIndex);
+}
+
+bool CCECProcessor::FindLogicalAddressTuner(unsigned int iIndex)