X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Flib%2FCECProcessor.cpp;h=e3f75173f7ca619e184582e11bb6f9fe0792d3c2;hb=465ab2f15fbb14a26f0f7a3139e0fe981fabc8f0;hp=c9e9b7fbaefea442cadaa466478caef8fec41f66;hpb=cc60ab1c2549ae876890a6eea6120d7261276f61;p=deb_libcec.git diff --git a/src/lib/CECProcessor.cpp b/src/lib/CECProcessor.cpp index c9e9b7f..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); @@ -172,19 +173,21 @@ 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) @@ -241,6 +244,8 @@ cec_power_status CCECProcessor::GetDevicePowerStatus(cec_logical_address iAddres bool CCECProcessor::Transmit(const cec_command &data) { + SetLogicalAddress(); + bool bReturn(false); LogOutput(data); @@ -253,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");