From: Lars Op den Kamp Date: Tue, 3 Jan 2012 13:00:33 +0000 (+0100) Subject: cec: don't switch handlers when not needed X-Git-Tag: upstream/2.2.0~1^2~42^2~11 X-Git-Url: https://git.piment-noir.org/?p=deb_libcec.git;a=commitdiff_plain;h=2e49a6e4356ec38cfd91c36e42ed238792b2cc74 cec: don't switch handlers when not needed --- diff --git a/src/lib/devices/CECBusDevice.cpp b/src/lib/devices/CECBusDevice.cpp index 044cd9c..b42967d 100644 --- a/src/lib/devices/CECBusDevice.cpp +++ b/src/lib/devices/CECBusDevice.cpp @@ -627,39 +627,42 @@ bool CCECBusDevice::ReplaceHandler(bool bActivateSource /* = true */) if (m_vendor != m_handler->GetVendorId()) { - CStdString strLog; - if (m_handler->InUse()) + if (CCECCommandHandler::HasSpecificHandler(m_vendor)) { - strLog.Format("handler for device '%s' (%x) is being used. not replacing the command handler", GetLogicalAddressName(), GetLogicalAddress()); - m_processor->AddLog(CEC_LOG_DEBUG, strLog); - return false; - } + CStdString strLog; + if (m_handler->InUse()) + { + strLog.Format("handler for device '%s' (%x) is being used. not replacing the command handler", GetLogicalAddressName(), GetLogicalAddress()); + m_processor->AddLog(CEC_LOG_DEBUG, strLog); + return false; + } - strLog.Format("replacing the command handler for device '%s' (%x)", GetLogicalAddressName(), GetLogicalAddress()); - m_processor->AddLog(CEC_LOG_DEBUG, strLog); - delete m_handler; + strLog.Format("replacing the command handler for device '%s' (%x)", GetLogicalAddressName(), GetLogicalAddress()); + m_processor->AddLog(CEC_LOG_DEBUG, strLog); + delete m_handler; - switch (m_vendor) - { - case CEC_VENDOR_SAMSUNG: - m_handler = new CANCommandHandler(this); - break; - case CEC_VENDOR_LG: - m_handler = new CSLCommandHandler(this); - break; - case CEC_VENDOR_PANASONIC: - m_handler = new CVLCommandHandler(this); - break; - default: - m_handler = new CCECCommandHandler(this); - break; - } + switch (m_vendor) + { + case CEC_VENDOR_SAMSUNG: + m_handler = new CANCommandHandler(this); + break; + case CEC_VENDOR_LG: + m_handler = new CSLCommandHandler(this); + break; + case CEC_VENDOR_PANASONIC: + m_handler = new CVLCommandHandler(this); + break; + default: + m_handler = new CCECCommandHandler(this); + break; + } - m_handler->SetVendorId(m_vendor); - m_handler->InitHandler(); + m_handler->SetVendorId(m_vendor); + m_handler->InitHandler(); - if (bActivateSource && m_processor->GetLogicalAddresses().IsSet(m_iLogicalAddress) && m_processor->IsInitialised()) - m_handler->ActivateSource(); + if (bActivateSource && m_processor->GetLogicalAddresses().IsSet(m_iLogicalAddress) && m_processor->IsInitialised()) + m_handler->ActivateSource(); + } } return true; diff --git a/src/lib/implementations/CECCommandHandler.h b/src/lib/implementations/CECCommandHandler.h index afd1315..0e3602d 100644 --- a/src/lib/implementations/CECCommandHandler.h +++ b/src/lib/implementations/CECCommandHandler.h @@ -52,6 +52,7 @@ namespace CEC virtual void SetVendorId(cec_vendor_id vendorId) { m_vendorId = vendorId; } virtual void HandlePoll(const cec_logical_address iInitiator, const cec_logical_address iDestination); virtual bool HandleReceiveFailed(void); + static bool HasSpecificHandler(cec_vendor_id vendorId) { return vendorId == CEC_VENDOR_LG || vendorId == CEC_VENDOR_SAMSUNG || vendorId == CEC_VENDOR_PANASONIC;} virtual bool InitHandler(void) { return true; } virtual bool ActivateSource(void);