X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Flib%2FCECProcessor.cpp;h=e3f75173f7ca619e184582e11bb6f9fe0792d3c2;hb=e4613795644dcebc6601fe65b148f05f97ad48e2;hp=eea66ee1e638d268e0ec682a5f2a6df70deb2e26;hpb=44c74256f77e455f9ef241351ecde43fd53d5c35;p=deb_libcec.git diff --git a/src/lib/CECProcessor.cpp b/src/lib/CECProcessor.cpp index eea66ee..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) @@ -209,17 +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, "???")); + 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) +{ + 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); @@ -232,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"); @@ -460,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)