From: Lars Op den Kamp Date: Wed, 21 Dec 2011 23:21:29 +0000 (+0100) Subject: cec: don't keep trying the same command/request after receiving a feature abort message X-Git-Tag: upstream/2.2.0~1^2~43^2~24 X-Git-Url: https://git.piment-noir.org/?p=deb_libcec.git;a=commitdiff_plain;h=4d738fe33e079f027bfd8688875779b1f035c99f cec: don't keep trying the same command/request after receiving a feature abort message --- diff --git a/src/lib/devices/CECBusDevice.cpp b/src/lib/devices/CECBusDevice.cpp index 794829a..1f612c4 100644 --- a/src/lib/devices/CECBusDevice.cpp +++ b/src/lib/devices/CECBusDevice.cpp @@ -194,7 +194,8 @@ cec_menu_language &CCECBusDevice::GetMenuLanguage(bool bUpdate /* = false */) bool CCECBusDevice::RequestMenuLanguage(void) { bool bReturn(false); - if (!MyLogicalAddressContains(m_iLogicalAddress)) + if (!MyLogicalAddressContains(m_iLogicalAddress) && + !IsUnsupportedFeature(CEC_OPCODE_GET_MENU_LANGUAGE)) { CStdString strLog; strLog.Format("<< requesting menu language of '%s' (%X)", GetLogicalAddressName(), m_iLogicalAddress); @@ -228,7 +229,8 @@ CStdString CCECBusDevice::GetOSDName(bool bUpdate /* = false */) bool CCECBusDevice::RequestOSDName(void) { bool bReturn(false); - if (!MyLogicalAddressContains(m_iLogicalAddress)) + if (!MyLogicalAddressContains(m_iLogicalAddress) && + !IsUnsupportedFeature(CEC_OPCODE_GIVE_OSD_NAME)) { CStdString strLog; strLog.Format("<< requesting OSD name of '%s' (%X)", GetLogicalAddressName(), m_iLogicalAddress); @@ -277,7 +279,8 @@ cec_power_status CCECBusDevice::GetPowerStatus(bool bUpdate /* = false */) bool CCECBusDevice::RequestPowerStatus(void) { bool bReturn(false); - if (!MyLogicalAddressContains(m_iLogicalAddress)) + if (!MyLogicalAddressContains(m_iLogicalAddress) && + !IsUnsupportedFeature(CEC_OPCODE_GIVE_DEVICE_POWER_STATUS)) { CStdString strLog; strLog.Format("<< requesting power status of '%s' (%X)", GetLogicalAddressName(), m_iLogicalAddress); @@ -689,11 +692,15 @@ bool CCECBusDevice::TransmitOSDName(cec_logical_address dest) bool CCECBusDevice::TransmitOSDString(cec_logical_address dest, cec_display_control duration, const char *strMessage) { - CStdString strLog; - strLog.Format("<< %s (%X) -> %s (%X): display OSD message '%s'", GetLogicalAddressName(), m_iLogicalAddress, ToString(dest), dest, strMessage); - AddLog(CEC_LOG_NOTICE, strLog.c_str()); + if (!IsUnsupportedFeature(CEC_OPCODE_SET_OSD_STRING)) + { + CStdString strLog; + strLog.Format("<< %s (%X) -> %s (%X): display OSD message '%s'", GetLogicalAddressName(), m_iLogicalAddress, ToString(dest), dest, strMessage); + AddLog(CEC_LOG_NOTICE, strLog.c_str()); - return m_handler->TransmitOSDString(m_iLogicalAddress, dest, duration, strMessage); + return m_handler->TransmitOSDString(m_iLogicalAddress, dest, duration, strMessage); + } + return false; } bool CCECBusDevice::TransmitPhysicalAddress(void) @@ -797,4 +804,14 @@ bool CCECBusDevice::TransmitKeyRelease(bool bWait /* = true */) { return m_handler->TransmitKeyRelease(m_processor->GetLogicalAddress(), m_iLogicalAddress, bWait); } + +bool CCECBusDevice::IsUnsupportedFeature(cec_opcode opcode) const +{ + return m_unsupportedFeatures.find(opcode) != m_unsupportedFeatures.end(); +} + +void CCECBusDevice::SetUnsupportedFeature(cec_opcode opcode) +{ + m_unsupportedFeatures.insert(opcode); +} //@} diff --git a/src/lib/devices/CECBusDevice.h b/src/lib/devices/CECBusDevice.h index 23b6c15..c259663 100644 --- a/src/lib/devices/CECBusDevice.h +++ b/src/lib/devices/CECBusDevice.h @@ -32,6 +32,7 @@ */ #include +#include #include "../platform/threads.h" #include "../util/StdString.h" @@ -73,7 +74,8 @@ namespace CEC virtual bool MyLogicalAddressContains(cec_logical_address address) const; virtual cec_bus_device_status GetStatus(bool bForcePoll = false); virtual bool IsActiveSource(void) const { return m_bActiveSource; } - + virtual bool IsUnsupportedFeature(cec_opcode opcode) const; + virtual void SetUnsupportedFeature(cec_opcode opcode); virtual void SetInactiveSource(void); virtual void SetActiveSource(void); @@ -127,6 +129,7 @@ namespace CEC uint64_t m_iLastActive; cec_version m_cecVersion; cec_bus_device_status m_deviceStatus; + std::set m_unsupportedFeatures; CMutex m_writeMutex; CMutex m_mutex; }; diff --git a/src/lib/implementations/CECCommandHandler.cpp b/src/lib/implementations/CECCommandHandler.cpp index 3906060..8d16a02 100644 --- a/src/lib/implementations/CECCommandHandler.cpp +++ b/src/lib/implementations/CECCommandHandler.cpp @@ -158,6 +158,9 @@ bool CCECCommandHandler::HandleCommand(const cec_command &command) case CEC_OPCODE_TEXT_VIEW_ON: HandleTextViewOn(command); break; + case CEC_OPCODE_FEATURE_ABORT: + HandleFeatureAbort(command); + break; default: UnhandledCommand(command); bHandled = false; @@ -221,6 +224,14 @@ bool CCECCommandHandler::HandleDeviceVendorId(const cec_command &command) return SetVendorId(command); } +bool CCECCommandHandler::HandleFeatureAbort(const cec_command &command) +{ + if (command.parameters.size == 2) + { + m_processor->m_busDevices[command.initiator]->SetUnsupportedFeature((cec_opcode)command.parameters[0]); + } +} + bool CCECCommandHandler::HandleGetCecVersion(const cec_command &command) { if (m_processor->IsStarted() && m_busDevice->MyLogicalAddressContains(command.destination)) diff --git a/src/lib/implementations/CECCommandHandler.h b/src/lib/implementations/CECCommandHandler.h index 5da9823..762052b 100644 --- a/src/lib/implementations/CECCommandHandler.h +++ b/src/lib/implementations/CECCommandHandler.h @@ -86,6 +86,7 @@ namespace CEC virtual bool HandleDeviceCecVersion(const cec_command &command); virtual bool HandleDeviceVendorCommandWithId(const cec_command &command); virtual bool HandleDeviceVendorId(const cec_command &command); + virtual bool HandleFeatureAbort(const cec_command &command); virtual bool HandleGetCecVersion(const cec_command &command); virtual bool HandleGiveAudioStatus(const cec_command &command); virtual bool HandleGiveDeckStatus(const cec_command &command);