X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Flib%2FCECProcessor.cpp;h=798c38a422cda0c8a855cac235a898d849961cc3;hb=1fe867c5130bfa2aa5b25425e288350f5e1ca4fd;hp=68e8fbf8ff9e2e4777054401f2b44d4aa53b496d;hpb=1de6617c9b9b4c83f7d1318038dcd9a20b9612e6;p=deb_libcec.git diff --git a/src/lib/CECProcessor.cpp b/src/lib/CECProcessor.cpp index 68e8fbf..798c38a 100644 --- a/src/lib/CECProcessor.cpp +++ b/src/lib/CECProcessor.cpp @@ -527,12 +527,16 @@ bool CCECProcessor::SetHDMIPort(cec_logical_address iBaseDevice, uint8_t iPort, else if (iPhysicalAddress % 0x10 == 0) iPhysicalAddress += iPort; - SetPhysicalAddress(iPhysicalAddress); bReturn = true; } if (!bReturn) m_controller->AddLog(CEC_LOG_ERROR, "failed to set the physical address"); + else + { + lock.Leave(); + SetPhysicalAddress(iPhysicalAddress); + } return bReturn; } @@ -601,23 +605,38 @@ bool CCECProcessor::SetMenuState(cec_menu_state state, bool bSendUpdate /* = tru bool CCECProcessor::SetPhysicalAddress(uint16_t iPhysicalAddress, bool bSendUpdate /* = true */) { - bool bWasActiveSource(false); - CLockObject lock(&m_mutex); - if (!m_logicalAddresses.IsEmpty()) + bool bSendActiveView(false); + bool bReturn(false); + cec_logical_addresses sendUpdatesTo; + { - for (uint8_t iPtr = 0; iPtr < 15; iPtr++) - if (m_logicalAddresses[iPtr]) - { - bWasActiveSource |= m_busDevices[iPtr]->IsActiveSource(); - m_busDevices[iPtr]->SetInactiveSource(); - m_busDevices[iPtr]->SetPhysicalAddress(iPhysicalAddress); - if (bSendUpdate) - m_busDevices[iPtr]->TransmitPhysicalAddress(); - } + CLockObject lock(&m_mutex); + if (!m_logicalAddresses.IsEmpty()) + { + bool bWasActiveSource(false); + for (uint8_t iPtr = 0; iPtr < 15; iPtr++) + if (m_logicalAddresses[iPtr]) + { + bWasActiveSource |= m_busDevices[iPtr]->IsActiveSource(); + m_busDevices[iPtr]->SetInactiveSource(); + m_busDevices[iPtr]->SetPhysicalAddress(iPhysicalAddress); + if (bSendUpdate) + sendUpdatesTo.Set((cec_logical_address)iPtr); + } - return bWasActiveSource && bSendUpdate ? SetActiveView() : true; + bSendActiveView = bWasActiveSource && bSendUpdate; + bReturn = true; + } } - return false; + + for (uint8_t iPtr = 0; iPtr < 15; iPtr++) + if (sendUpdatesTo[iPtr]) + m_busDevices[iPtr]->TransmitPhysicalAddress(); + + if (bSendActiveView) + SetActiveView(); + + return bReturn; } bool CCECProcessor::SwitchMonitoring(bool bEnable) @@ -1421,6 +1440,8 @@ const char *CCECProcessor::ToString(const cec_vendor_id vendor) return "Yamaha"; case CEC_VENDOR_PHILIPS: return "Philips"; + case CEC_VENDOR_SONY: + return "Sony"; default: return "Unknown"; }