+bool CCECProcessor::TryLogicalAddress(cec_logical_address address, const char *strLabel)
+{
+ CStdString strLog;
+ strLog.Format("trying logical address '%s'", strLabel);
+ AddLog(CEC_LOG_DEBUG, strLog);
+
+ SetAckMask(0x1 << address);
+ if (!m_busDevices[address]->PollDevice(address))
+ {
+
+ strLog.Format("using logical address '%s'", strLabel);
+ AddLog(CEC_LOG_NOTICE, strLog);
+ m_logicalAddresses.set(address);
+
+ // TODO
+ m_busDevices[address]->SetPhysicalAddress(CEC_DEFAULT_PHYSICAL_ADDRESS);
+
+ return true;
+ }
+
+ strLog.Format("logical address '%s' already taken", strLabel);
+ AddLog(CEC_LOG_DEBUG, strLog);
+ return false;
+}
+
+bool CCECProcessor::FindLogicalAddressRecordingDevice(void)
+{
+ AddLog(CEC_LOG_DEBUG, "detecting logical address for type 'recording device'");
+ return TryLogicalAddress(CECDEVICE_RECORDINGDEVICE1, "recording 1") ||
+ TryLogicalAddress(CECDEVICE_RECORDINGDEVICE2, "recording 2") ||
+ TryLogicalAddress(CECDEVICE_RECORDINGDEVICE3, "recording 3");
+}
+
+bool CCECProcessor::FindLogicalAddressTuner(void)
+{
+ AddLog(CEC_LOG_DEBUG, "detecting logical address for type 'tuner'");
+ return TryLogicalAddress(CECDEVICE_TUNER1, "tuner 1") ||
+ TryLogicalAddress(CECDEVICE_TUNER2, "tuner 2") ||
+ TryLogicalAddress(CECDEVICE_TUNER3, "tuner 3") ||
+ TryLogicalAddress(CECDEVICE_TUNER4, "tuner 4");
+}
+
+bool CCECProcessor::FindLogicalAddressPlaybackDevice(void)
+{
+ AddLog(CEC_LOG_DEBUG, "detecting logical address for type 'playback device'");
+ return TryLogicalAddress(CECDEVICE_PLAYBACKDEVICE1, "playback 1") ||
+ TryLogicalAddress(CECDEVICE_PLAYBACKDEVICE2, "playback 2") ||
+ TryLogicalAddress(CECDEVICE_PLAYBACKDEVICE3, "playback 3");
+}
+
+bool CCECProcessor::FindLogicalAddressAudioSystem(void)
+{
+ AddLog(CEC_LOG_DEBUG, "detecting logical address for type 'audio'");
+ return TryLogicalAddress(CECDEVICE_AUDIOSYSTEM, "audio");
+}
+
+bool CCECProcessor::FindLogicalAddresses(void)
+{
+ bool bReturn(true);
+ m_logicalAddresses.clear();
+ CStdString strLog;
+
+ for (unsigned int iPtr = 0; iPtr < 5; iPtr++)
+ {
+ if (m_types.types[iPtr] == CEC_DEVICE_TYPE_RESERVED)
+ continue;
+
+ strLog.Format("%s - device %d: type %d", __FUNCTION__, iPtr, m_types.types[iPtr]);
+ AddLog(CEC_LOG_DEBUG, strLog);
+
+ if (m_types.types[iPtr] == CEC_DEVICE_TYPE_RECORDING_DEVICE)
+ bReturn &= FindLogicalAddressRecordingDevice();
+ if (m_types.types[iPtr] == CEC_DEVICE_TYPE_TUNER)
+ bReturn &= FindLogicalAddressTuner();
+ if (m_types.types[iPtr] == CEC_DEVICE_TYPE_PLAYBACK_DEVICE)
+ bReturn &= FindLogicalAddressPlaybackDevice();
+ if (m_types.types[iPtr] == CEC_DEVICE_TYPE_AUDIO_SYSTEM)
+ bReturn &= FindLogicalAddressAudioSystem();
+ }
+
+ return bReturn;
+}
+