X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Flib%2Fimplementations%2FCECCommandHandler.cpp;h=9f442be160d6ebf52711cc507c15e932dbb791f7;hb=ff684fefaafa31a52e1b785623f36dba2ee52f81;hp=91a60a334949b0b4c4619c13bf71aa74c0f1acdb;hpb=446c0cfc3e477a36a63dcd0af3d3414374d751dc;p=deb_libcec.git diff --git a/src/lib/implementations/CECCommandHandler.cpp b/src/lib/implementations/CECCommandHandler.cpp index 91a60a3..9f442be 100644 --- a/src/lib/implementations/CECCommandHandler.cpp +++ b/src/lib/implementations/CECCommandHandler.cpp @@ -47,7 +47,9 @@ CCECCommandHandler::CCECCommandHandler(CCECBusDevice *busDevice) : m_iTransmitRetries(CEC_DEFAULT_TRANSMIT_RETRIES), m_bHandlerInited(false), m_iUseCounter(0), - m_expectedResponse(CEC_OPCODE_NONE) + m_expectedResponse(CEC_OPCODE_NONE), + m_bOPTSendDeckStatusUpdateOnActiveSource(true), + m_vendorId(CEC_VENDOR_UNKNOWN) { } @@ -60,7 +62,7 @@ CCECCommandHandler::~CCECCommandHandler(void) bool CCECCommandHandler::HandleCommand(const cec_command &command) { - bool bHandled(true), bHandlerChanged(false); + bool bHandled(true); MarkBusy(); CStdString strLog; @@ -81,49 +83,61 @@ bool CCECCommandHandler::HandleCommand(const cec_command &command) HandleSetMenuLanguage(command); break; case CEC_OPCODE_GIVE_PHYSICAL_ADDRESS: - HandleGivePhysicalAddress(command); + if (m_processor->IsInitialised()) + HandleGivePhysicalAddress(command); break; case CEC_OPCODE_GIVE_OSD_NAME: - HandleGiveOSDName(command); + if (m_processor->IsInitialised()) + HandleGiveOSDName(command); break; case CEC_OPCODE_GIVE_DEVICE_VENDOR_ID: - HandleGiveDeviceVendorId(command); + if (m_processor->IsInitialised()) + HandleGiveDeviceVendorId(command); break; case CEC_OPCODE_DEVICE_VENDOR_ID: - bHandlerChanged = HandleDeviceVendorId(command); + HandleDeviceVendorId(command); break; case CEC_OPCODE_VENDOR_COMMAND_WITH_ID: HandleDeviceVendorCommandWithId(command); break; case CEC_OPCODE_GIVE_DECK_STATUS: - HandleGiveDeckStatus(command); + if (m_processor->IsInitialised()) + HandleGiveDeckStatus(command); break; case CEC_OPCODE_DECK_CONTROL: HandleDeckControl(command); break; case CEC_OPCODE_MENU_REQUEST: - HandleMenuRequest(command); + if (m_processor->IsInitialised()) + HandleMenuRequest(command); break; case CEC_OPCODE_GIVE_DEVICE_POWER_STATUS: - HandleGiveDevicePowerStatus(command); + if (m_processor->IsInitialised()) + HandleGiveDevicePowerStatus(command); break; case CEC_OPCODE_GET_CEC_VERSION: - HandleGetCecVersion(command); + if (m_processor->IsInitialised()) + HandleGetCecVersion(command); break; case CEC_OPCODE_USER_CONTROL_PRESSED: - HandleUserControlPressed(command); + if (m_processor->IsInitialised()) + HandleUserControlPressed(command); break; case CEC_OPCODE_USER_CONTROL_RELEASE: - HandleUserControlRelease(command); + if (m_processor->IsInitialised()) + HandleUserControlRelease(command); break; case CEC_OPCODE_GIVE_AUDIO_STATUS: - HandleGiveAudioStatus(command); + if (m_processor->IsInitialised()) + HandleGiveAudioStatus(command); break; case CEC_OPCODE_GIVE_SYSTEM_AUDIO_MODE_STATUS: - HandleGiveSystemAudioModeStatus(command); + if (m_processor->IsInitialised()) + HandleGiveSystemAudioModeStatus(command); break; case CEC_OPCODE_SYSTEM_AUDIO_MODE_REQUEST: - HandleSystemAudioModeRequest(command); + if (m_processor->IsInitialised()) + HandleSystemAudioModeRequest(command); break; case CEC_OPCODE_REPORT_AUDIO_STATUS: HandleReportAudioStatus(command); @@ -135,7 +149,8 @@ bool CCECCommandHandler::HandleCommand(const cec_command &command) HandleSetSystemAudioMode(command); break; case CEC_OPCODE_REQUEST_ACTIVE_SOURCE: - HandleRequestActiveSource(command); + if (m_processor->IsInitialised()) + HandleRequestActiveSource(command); break; case CEC_OPCODE_SET_STREAM_PATH: HandleSetStreamPath(command); @@ -147,7 +162,8 @@ bool CCECCommandHandler::HandleCommand(const cec_command &command) HandleRoutingInformation(command); break; case CEC_OPCODE_STANDBY: - HandleStandby(command); + if (m_processor->IsInitialised()) + HandleStandby(command); break; case CEC_OPCODE_ACTIVE_SOURCE: HandleActiveSource(command); @@ -176,7 +192,7 @@ bool CCECCommandHandler::HandleCommand(const cec_command &command) break; } - if (bHandled && !bHandlerChanged) + if (bHandled) { CLockObject lock(&m_receiveMutex); if (m_expectedResponse == CEC_OPCODE_NONE || @@ -736,7 +752,7 @@ bool CCECCommandHandler::TransmitRequestCecVersion(const cec_logical_address iIn cec_command command; cec_command::Format(command, iInitiator, iDestination, CEC_OPCODE_GET_CEC_VERSION); - return Transmit(command); + return Transmit(command, true, CEC_OPCODE_CEC_VERSION); } bool CCECCommandHandler::TransmitRequestMenuLanguage(const cec_logical_address iInitiator, const cec_logical_address iDestination) @@ -744,7 +760,7 @@ bool CCECCommandHandler::TransmitRequestMenuLanguage(const cec_logical_address i cec_command command; cec_command::Format(command, iInitiator, iDestination, CEC_OPCODE_GET_MENU_LANGUAGE); - return Transmit(command); + return Transmit(command, true, CEC_OPCODE_SET_MENU_LANGUAGE); } bool CCECCommandHandler::TransmitRequestOSDName(const cec_logical_address iInitiator, const cec_logical_address iDestination) @@ -752,7 +768,7 @@ bool CCECCommandHandler::TransmitRequestOSDName(const cec_logical_address iIniti cec_command command; cec_command::Format(command, iInitiator, iDestination, CEC_OPCODE_GIVE_OSD_NAME); - return Transmit(command); + return Transmit(command, true, CEC_OPCODE_SET_OSD_NAME); } bool CCECCommandHandler::TransmitRequestPhysicalAddress(const cec_logical_address iInitiator, const cec_logical_address iDestination) @@ -760,7 +776,7 @@ bool CCECCommandHandler::TransmitRequestPhysicalAddress(const cec_logical_addres cec_command command; cec_command::Format(command, iInitiator, iDestination, CEC_OPCODE_GIVE_PHYSICAL_ADDRESS); - return Transmit(command); + return Transmit(command, true, CEC_OPCODE_REPORT_PHYSICAL_ADDRESS); } bool CCECCommandHandler::TransmitRequestPowerStatus(const cec_logical_address iInitiator, const cec_logical_address iDestination) @@ -768,7 +784,7 @@ bool CCECCommandHandler::TransmitRequestPowerStatus(const cec_logical_address iI cec_command command; cec_command::Format(command, iInitiator, iDestination, CEC_OPCODE_GIVE_DEVICE_POWER_STATUS); - return Transmit(command); + return Transmit(command, true, CEC_OPCODE_REPORT_POWER_STATUS); } bool CCECCommandHandler::TransmitRequestVendorId(const cec_logical_address iInitiator, const cec_logical_address iDestination) @@ -776,7 +792,7 @@ bool CCECCommandHandler::TransmitRequestVendorId(const cec_logical_address iInit cec_command command; cec_command::Format(command, iInitiator, iDestination, CEC_OPCODE_GIVE_DEVICE_VENDOR_ID); - return Transmit(command); + return Transmit(command, true, CEC_OPCODE_DEVICE_VENDOR_ID); } bool CCECCommandHandler::TransmitActiveSource(const cec_logical_address iInitiator, uint16_t iPhysicalAddress) @@ -938,6 +954,7 @@ bool CCECCommandHandler::TransmitKeyRelease(const cec_logical_address iInitiator bool CCECCommandHandler::Transmit(cec_command &command, bool bExpectResponse /* = true */, cec_opcode expectedResponse /* = CEC_OPCODE_NONE */) { bool bReturn(false); + MarkBusy(); command.transmit_timeout = m_iTransmitTimeout; { @@ -959,10 +976,11 @@ bool CCECCommandHandler::Transmit(cec_command &command, bool bExpectResponse /* --m_iUseCounter; } + MarkReady(); return bReturn; } -bool CCECCommandHandler::InitHandler(void) +bool CCECCommandHandler::ActivateSource(void) { if (m_busDevice->GetLogicalAddress() == CECDEVICE_TV) {