From: Lars Op den Kamp Date: Mon, 13 Feb 2012 23:29:26 +0000 (+0100) Subject: cec: cleanups in ActivateSource() and CSLCommandHandler X-Git-Tag: upstream/2.2.0~1^2~35^2~66 X-Git-Url: https://git.piment-noir.org/?p=deb_libcec.git;a=commitdiff_plain;h=bbc71623d650a4f17057da7d218a824c0c95b3d3 cec: cleanups in ActivateSource() and CSLCommandHandler --- diff --git a/.gitignore b/.gitignore index a535243..2a282e9 100644 --- a/.gitignore +++ b/.gitignore @@ -73,6 +73,9 @@ src/CecSharpTester/bin src/CecSharpTester/obj src/cec-config-gui/obj +src/cec-config/cec-config +src/cec-config/*.o +src/cec-config/.deps src/libcec-wmc/bin src/libcec-wmc/obj diff --git a/src/lib/CECProcessor.cpp b/src/lib/CECProcessor.cpp index bf23d94..ebd1772 100644 --- a/src/lib/CECProcessor.cpp +++ b/src/lib/CECProcessor.cpp @@ -459,23 +459,7 @@ bool CCECProcessor::SetActiveSource(cec_device_type type /* = CEC_DEVICE_TYPE_RE m_busDevices[addr]->SetActiveSource(); if (m_busDevices[addr]->GetPhysicalAddress(false) != 0xFFFF) - { - bReturn = m_busDevices[addr]->TransmitImageViewOn() && - m_busDevices[addr]->TransmitActiveSource(); - - if (bReturn) - { - m_busDevices[addr]->SetMenuState(CEC_MENU_STATE_ACTIVATED); - m_busDevices[addr]->TransmitMenuState(CECDEVICE_TV); - } - - if (bReturn && (m_busDevices[addr]->GetType() == CEC_DEVICE_TYPE_PLAYBACK_DEVICE || - m_busDevices[addr]->GetType() == CEC_DEVICE_TYPE_RECORDING_DEVICE) && - m_busDevices[addr]->GetHandler()->SendDeckStatusUpdateOnActiveSource()) - { - bReturn = ((CCECPlaybackDevice *)m_busDevices[addr])->TransmitDeckStatus(CECDEVICE_TV); - } - } + bReturn = m_busDevices[addr]->ActivateSource(); return bReturn; } diff --git a/src/lib/devices/CECBusDevice.cpp b/src/lib/devices/CECBusDevice.cpp index b6ca75c..ce0c086 100644 --- a/src/lib/devices/CECBusDevice.cpp +++ b/src/lib/devices/CECBusDevice.cpp @@ -864,6 +864,9 @@ bool CCECBusDevice::TransmitPowerState(cec_logical_address dest) cec_power_status state; { CLockObject lock(m_mutex); + if (!IsActiveSource()) + SetPowerStatus(CEC_POWER_STATUS_STANDBY); + CLibCEC::AddLog(CEC_LOG_NOTICE, "<< %s (%X) -> %s (%X): %s", GetLogicalAddressName(), m_iLogicalAddress, ToString(dest), dest, ToString(m_powerStatus)); state = m_powerStatus; } diff --git a/src/lib/implementations/CECCommandHandler.cpp b/src/lib/implementations/CECCommandHandler.cpp index 561819f..d03ffd9 100644 --- a/src/lib/implementations/CECCommandHandler.cpp +++ b/src/lib/implementations/CECCommandHandler.cpp @@ -980,10 +980,14 @@ bool CCECCommandHandler::ActivateSource(void) primary->SetPowerStatus(CEC_POWER_STATUS_ON); primary->SetMenuState(CEC_MENU_STATE_ACTIVATED); - if (m_processor->GetPrimaryDevice()->GetPhysicalAddress(false) != 0xffff) + if (m_busDevice->GetStatus(false) == CEC_DEVICE_STATUS_HANDLED_BY_LIBCEC) { - m_processor->SetActiveSource(); - primary->TransmitMenuState(m_busDevice->GetLogicalAddress()); + m_busDevice->TransmitMenuState(CECDEVICE_TV); + + if ((m_busDevice->GetType() == CEC_DEVICE_TYPE_PLAYBACK_DEVICE || + m_busDevice->GetType() == CEC_DEVICE_TYPE_RECORDING_DEVICE) && + SendDeckStatusUpdateOnActiveSource()) + ((CCECPlaybackDevice *)m_busDevice)->TransmitDeckStatus(CECDEVICE_TV); m_bHandlerInited = true; } } diff --git a/src/lib/implementations/SLCommandHandler.cpp b/src/lib/implementations/SLCommandHandler.cpp index 0d14802..e8cdf43 100644 --- a/src/lib/implementations/SLCommandHandler.cpp +++ b/src/lib/implementations/SLCommandHandler.cpp @@ -102,21 +102,21 @@ bool CSLCommandHandler::InitHandler(void) bool CSLCommandHandler::ActivateSource(void) { - if (!SLInitialised()) + if (!m_processor->GetPrimaryDevice()->IsActiveSource()) { - CLibCEC::AddLog(CEC_LOG_NOTICE, "not activating the source until SL has been initialised"); + CLibCEC::AddLog(CEC_LOG_NOTICE, "not activating the source because we're not marked as active"); return true; } { CLockObject lock(m_SLMutex); - if (m_bActiveSourceSent) - return true; m_bActiveSourceSent = true; } CCECBusDevice *primary = m_processor->GetPrimaryDevice(); primary->SetActiveSource(); + primary->SetPowerStatus(CEC_POWER_STATUS_ON); + primary->TransmitPowerState(CECDEVICE_TV); primary->TransmitImageViewOn(); primary->TransmitActiveSource(); return true; @@ -127,15 +127,22 @@ bool CSLCommandHandler::HandleActiveSource(const cec_command &command) if (command.parameters.size == 2) { uint16_t iAddress = ((uint16_t)command.parameters[0] << 8) | ((uint16_t)command.parameters[1]); - if (iAddress != m_processor->GetPrimaryDevice()->GetPhysicalAddress(false)) + CCECBusDevice *primary = m_processor->GetPrimaryDevice(); + bool bSendPowerOffState(iAddress != primary->GetPhysicalAddress(false) && primary->IsActiveSource()); + + m_processor->SetActiveSource(iAddress); + if (bSendPowerOffState) { - CLockObject lock(m_SLMutex); - m_bActiveSourceSent = false; + { + CLockObject lock(m_SLMutex); + m_bActiveSourceSent = false; + } + primary->TransmitPowerState(CECDEVICE_TV); } - return m_processor->SetActiveSource(iAddress); } return true; + } bool CSLCommandHandler::HandleDeviceVendorId(const cec_command &command) @@ -221,13 +228,8 @@ void CSLCommandHandler::HandleVendorCommandPowerOn(const cec_command &command) if (device) { SetSLInitialised(); - - device->SetPowerStatus(CEC_POWER_STATUS_IN_TRANSITION_STANDBY_TO_ON); //XXX - device->TransmitPowerState(command.initiator); - device->SetPowerStatus(CEC_POWER_STATUS_ON); - device->SetActiveSource(); - TransmitImageViewOn(device->GetLogicalAddress(), command.initiator); + ActivateSource(); } } void CSLCommandHandler::HandleVendorCommandPowerOnStatus(const cec_command &command) @@ -267,23 +269,11 @@ bool CSLCommandHandler::HandleGiveDeckStatus(const cec_command &command) { if (command.parameters.size > 0) { - if (!SLInitialised()) - { - cec_command response; - cec_command::Format(response, command.destination, command.initiator, CEC_OPCODE_FEATURE_ABORT); - response.PushBack(CEC_OPCODE_GIVE_DECK_STATUS); - response.PushBack(CEC_ABORT_REASON_NOT_IN_CORRECT_MODE_TO_RESPOND); - return Transmit(response); - } ((CCECPlaybackDevice *) device)->SetDeckStatus(!device->IsActiveSource() ? CEC_DECK_INFO_OTHER_STATUS : CEC_DECK_INFO_OTHER_STATUS_LG); if (command.parameters[0] == CEC_STATUS_REQUEST_ON) { bool bReturn = ((CCECPlaybackDevice *) device)->TransmitDeckStatus(command.initiator); - if (device->IsActiveSource()) - { - bReturn &= device->TransmitImageViewOn() && - device->TransmitPhysicalAddress(); - } + ActivateSource(); return bReturn; } else if (command.parameters[0] == CEC_STATUS_REQUEST_ONCE) @@ -409,6 +399,7 @@ bool CSLCommandHandler::PowerOn(const cec_logical_address iInitiator, const cec_ { if (iDestination != CECDEVICE_TV) { + /* LG devices only allow themselves to be woken up by the TV with a vendor command */ cec_command command; cec_command::Format(command, CECDEVICE_TV, iDestination, CEC_OPCODE_VENDOR_COMMAND); command.PushBack(SL_COMMAND_POWER_ON);