X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Flib%2FCECProcessor.cpp;h=e3f75173f7ca619e184582e11bb6f9fe0792d3c2;hb=465ab2f15fbb14a26f0f7a3139e0fe981fabc8f0;hp=ce2432db179270fd0edadbf6792ce6d824a6e88c;hpb=6a1c0009842a1857b863655813595292422a512b;p=deb_libcec.git diff --git a/src/lib/CECProcessor.cpp b/src/lib/CECProcessor.cpp index ce2432d..e3f7517 100644 --- a/src/lib/CECProcessor.cpp +++ b/src/lib/CECProcessor.cpp @@ -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) @@ -207,8 +218,34 @@ cec_version CCECProcessor::GetDeviceCecVersion(cec_logical_address iAddress) return m_busDevices[iAddress]->GetCecVersion(); } +bool CCECProcessor::GetDeviceMenuLanguage(cec_logical_address iAddress, cec_menu_language *language) +{ + if (m_busDevices[iAddress]) + { + *language = m_busDevices[iAddress]->GetMenuLanguage(); + return (strcmp(language->language, "???") == 0); + } + return false; +} + +uint64_t CCECProcessor::GetDeviceVendorId(cec_logical_address iAddress) +{ + if (m_busDevices[iAddress]) + return m_busDevices[iAddress]->GetVendorId(); + return false; +} + +cec_power_status CCECProcessor::GetDevicePowerStatus(cec_logical_address iAddress) +{ + 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); @@ -221,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"); @@ -449,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)