X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Flib%2Fimplementations%2FVLCommandHandler.cpp;h=f57925b80fc87247f959d8fd50474e127dddc088;hb=ebcedb051be7d8e1e19ecd3f0aa164baae252400;hp=072d71182ec2c92ca7c780ab68b41ecb0330c249;hpb=217b236882e3f4e5303a135aae39f6207bfbd279;p=deb_libcec.git diff --git a/src/lib/implementations/VLCommandHandler.cpp b/src/lib/implementations/VLCommandHandler.cpp index 072d711..f57925b 100644 --- a/src/lib/implementations/VLCommandHandler.cpp +++ b/src/lib/implementations/VLCommandHandler.cpp @@ -79,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(); @@ -90,6 +90,9 @@ bool CVLCommandHandler::InitHandler(void) int CVLCommandHandler::HandleDeviceVendorCommandWithId(const cec_command &command) { + if (!m_processor->IsHandledByLibCEC(command.destination)) + return CEC_ABORT_REASON_INVALID_OPERAND; + if (command.parameters[0] != 0x00 || command.parameters[1] != 0x80 || command.parameters[2] != 0x45) @@ -158,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()); @@ -194,6 +200,7 @@ int CVLCommandHandler::HandleStandby(const cec_command &command) { CLockObject lock(m_mutex); m_iPowerUpEventReceived = 0; + m_bCapabilitiesSent = false; } return CCECCommandHandler::HandleStandby(command); @@ -204,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); @@ -212,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; @@ -233,7 +240,8 @@ int CVLCommandHandler::HandleVendorCommand(const cec_command &command) if (command.parameters.size == 3 && command.parameters[0] == 0x10 && command.parameters[1] == 0x01 && - command.parameters[2] == 0x05) + command.parameters[2] == 0x05 && + m_processor->IsHandledByLibCEC(command.destination)) { SendVendorCommandCapabilities(m_processor->GetLogicalAddress(), command.initiator); return COMMAND_HANDLED; @@ -244,6 +252,9 @@ int CVLCommandHandler::HandleVendorCommand(const cec_command &command) bool CVLCommandHandler::SourceSwitchAllowed(void) { + if (!PowerUpEventReceived()) + TransmitRequestPowerStatus(m_processor->GetPrimaryDevice()->GetLogicalAddress(), CECDEVICE_TV, false); + return PowerUpEventReceived(); }