X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Flib%2Fimplementations%2FVLCommandHandler.cpp;h=f57925b80fc87247f959d8fd50474e127dddc088;hb=ebcedb051be7d8e1e19ecd3f0aa164baae252400;hp=227d8a0aa3b67e25ebe4ec8f71a4f51c85a22d1a;hpb=51cf495d05ba1cce3edb750d3afdc60067f9e7af;p=deb_libcec.git diff --git a/src/lib/implementations/VLCommandHandler.cpp b/src/lib/implementations/VLCommandHandler.cpp index 227d8a0..f57925b 100644 --- a/src/lib/implementations/VLCommandHandler.cpp +++ b/src/lib/implementations/VLCommandHandler.cpp @@ -61,8 +61,7 @@ CVLCommandHandler::CVLCommandHandler(CCECBusDevice *busDevice, int64_t iActiveSourcePending /* = 0 */) : CCECCommandHandler(busDevice, iTransmitTimeout, iTransmitWait, iTransmitRetries, iActiveSourcePending), m_iPowerUpEventReceived(0), - m_bCapabilitiesSent(false), - m_bPowerStatusRequested(false) + m_bCapabilitiesSent(false) { m_vendorId = CEC_VENDOR_PANASONIC; } @@ -80,10 +79,10 @@ bool CVLCommandHandler::InitHandler(void) primary->SetVendorId(CEC_VENDOR_PANASONIC); primary->ReplaceHandler(false); } - } - if (primary->GetType() == CEC_DEVICE_TYPE_RECORDING_DEVICE) - return m_processor->GetPrimaryClient()->ChangeDeviceType(CEC_DEVICE_TYPE_RECORDING_DEVICE, CEC_DEVICE_TYPE_PLAYBACK_DEVICE); + if (primary->GetType() == CEC_DEVICE_TYPE_RECORDING_DEVICE) + return m_processor->GetPrimaryClient()->ChangeDeviceType(CEC_DEVICE_TYPE_RECORDING_DEVICE, CEC_DEVICE_TYPE_PLAYBACK_DEVICE); + } } return CCECCommandHandler::InitHandler(); @@ -162,8 +161,11 @@ bool CVLCommandHandler::PowerUpEventReceived(void) if (m_busDevice->GetLogicalAddress() != CECDEVICE_TV) { + CCECBusDevice* tv = m_processor->GetTV(); + if (tv && tv->GetStatus() != CEC_DEVICE_STATUS_PRESENT) + return true; + // get the status from the TV - CCECBusDevice *tv = m_processor->GetTV(); if (tv && tv->GetCurrentVendorId() == CEC_VENDOR_PANASONIC) { CVLCommandHandler *handler = static_cast(tv->GetHandler()); @@ -198,6 +200,7 @@ int CVLCommandHandler::HandleStandby(const cec_command &command) { CLockObject lock(m_mutex); m_iPowerUpEventReceived = 0; + m_bCapabilitiesSent = false; } return CCECCommandHandler::HandleStandby(command); @@ -208,7 +211,7 @@ void CVLCommandHandler::VendorPreActivateSourceHook(void) bool bTransmit(false); { CLockObject lock(m_mutex); - bTransmit = m_bCapabilitiesSent; + bTransmit = !m_bCapabilitiesSent; } if (bTransmit) SendVendorCommandCapabilities(m_processor->GetLogicalAddress(), CECDEVICE_TV); @@ -216,14 +219,14 @@ void CVLCommandHandler::VendorPreActivateSourceHook(void) void CVLCommandHandler::SendVendorCommandCapabilities(const cec_logical_address initiator, const cec_logical_address destination) { - cec_command response; - cec_command::Format(response, initiator, destination, CEC_OPCODE_VENDOR_COMMAND); - uint8_t iResponseData[] = {0x10, 0x02, 0xFF, 0xFF, 0x00, 0x05, 0x05, 0x45, 0x55, 0x5c, 0x58, 0x32}; - response.PushArray(12, iResponseData); - - if (Transmit(response, false, true)) + if (PowerUpEventReceived()) { - if (PowerUpEventReceived()) + cec_command response; + cec_command::Format(response, initiator, destination, CEC_OPCODE_VENDOR_COMMAND); + uint8_t iResponseData[] = {0x10, 0x02, 0xFF, 0xFF, 0x00, 0x05, 0x05, 0x45, 0x55, 0x5c, 0x58, 0x32}; + response.PushArray(12, iResponseData); + + if (Transmit(response, false, true)) { CLockObject lock(m_mutex); m_bCapabilitiesSent = true; @@ -247,15 +250,9 @@ int CVLCommandHandler::HandleVendorCommand(const cec_command &command) return CEC_ABORT_REASON_INVALID_OPERAND; } -bool CVLCommandHandler::TransmitRequestPowerStatus(const cec_logical_address iInitiator, const cec_logical_address iDestination, bool bWaitForResponse /* = true */) -{ - m_bPowerStatusRequested = true; - return CCECCommandHandler::TransmitRequestPowerStatus(iInitiator, iDestination, bWaitForResponse); -} - bool CVLCommandHandler::SourceSwitchAllowed(void) { - if (!PowerUpEventReceived() && !m_bPowerStatusRequested) + if (!PowerUpEventReceived()) TransmitRequestPowerStatus(m_processor->GetPrimaryDevice()->GetLogicalAddress(), CECDEVICE_TV, false); return PowerUpEventReceived();