From 616383bb39b8bfd896e28d8d504d8309350774de Mon Sep 17 00:00:00 2001 From: Deepikasri N Date: Wed, 24 Jun 2026 10:09:44 +0530 Subject: [PATCH] RDKEMW-20220: Fix for WPEWebProcess during deepsleep wakeup scenario --- externals/rdk/IIarm/DeviceIARMInterface.cpp | 27 ++++++++++++++++++- externals/rdk/PlayerExternalsRdkInterface.cpp | 6 +++++ externals/rdk/PlayerExternalsRdkInterface.h | 3 ++- 3 files changed, 34 insertions(+), 2 deletions(-) diff --git a/externals/rdk/IIarm/DeviceIARMInterface.cpp b/externals/rdk/IIarm/DeviceIARMInterface.cpp index 234e6a06..165da049 100644 --- a/externals/rdk/IIarm/DeviceIARMInterface.cpp +++ b/externals/rdk/IIarm/DeviceIARMInterface.cpp @@ -38,13 +38,13 @@ Remove the entire folder externals/rdk/IARM #include #include #include +#include #include "libIBusDaemon.h" #include #include "tr181api.h" #include "_base64.h" #ifdef USE_PREINIT_DECODING #include "power_controller.h" -#include #include // for std::system_error #include // for std::exception base class #endif @@ -244,6 +244,18 @@ static void IARM_PowerChangeHandler (const PowerController_PowerState_t currentS { MW_LOG_INFO("Entering IARM_PowerChangeHandler:State Changed currentState: %d, newState: %d", currentState, newState); + + + std::shared_ptr pInstance = + PlayerExternalsRdkInterface::GetPlayerExternalsRdkInterfaceInstance(); + if (newState != POWER_STATE_ON) { + pInstance->SetPowerEvent(true); + MW_LOG_INFO(" Power transition to non-ON state, blocking HDMI events\n"); + } else { + pInstance->SetPowerEvent(false); + MW_LOG_INFO(" Power transition to ON, allowing HDMI events\n"); + } + bool isOnOrStandby = (newState == POWER_STATE_STANDBY || newState == POWER_STATE_ON); if((currentState == POWER_STATE_STANDBY_DEEP_SLEEP && isOnOrStandby) || (prevState == POWER_STATE_STANDBY_DEEP_SLEEP && currentState == POWER_STATE_STANDBY_LIGHT_SLEEP && isOnOrStandby)) @@ -415,6 +427,12 @@ static void HDMIEventHandler(const char *owner, IARM_EventId_t eventId, void *da { std::shared_ptr pInstance = PlayerExternalsRdkInterface::GetPlayerExternalsRdkInterfaceInstance(); + + if (pInstance->GetPowerEvent()) + { + MW_LOG_WARN(" Skipping HDMI event processing during power transition\n"); + return; + } switch (eventId) { case IARM_BUS_DSMGR_EVENT_HDMI_HOTPLUG : @@ -428,6 +446,10 @@ static void HDMIEventHandler(const char *owner, IARM_EventId_t eventId, void *da pInstance->SetHDMIStatus(); + // Dispatch to detached worker thread — do NOT block IARM dispatch thread + std::thread([pInstance]() { + pInstance->SetHDMIStatus(); + }).detach(); break; } case IARM_BUS_DSMGR_EVENT_HDCP_STATUS : @@ -439,6 +461,9 @@ static void HDMIEventHandler(const char *owner, IARM_EventId_t eventId, void *da hdcpStatus, hdcpStatusStr); pInstance->SetHDMIStatus(); + std::thread([pInstance]() { + pInstance->SetHDMIStatus(); + }).detach(); break; } default: diff --git a/externals/rdk/PlayerExternalsRdkInterface.cpp b/externals/rdk/PlayerExternalsRdkInterface.cpp index 107f202b..1b015ca9 100644 --- a/externals/rdk/PlayerExternalsRdkInterface.cpp +++ b/externals/rdk/PlayerExternalsRdkInterface.cpp @@ -228,6 +228,11 @@ void PlayerExternalsRdkInterface::SetResolution(int width, int height) */ void PlayerExternalsRdkInterface::SetHDMIStatus() { + std::unique_lock lock(m_hdmiStatusMutex, std::try_to_lock); + if (!lock.owns_lock()) { + MW_LOG_WARN("SetHDMIStatus: Already in progress on another thread, skipping\n"); + return; + } bool isConnected = false; bool isHDCPCompliant = false; bool isHDCPEnabled = true; @@ -306,6 +311,7 @@ void PlayerExternalsRdkInterface::SetHDMIStatus() } catch (...) { MW_LOG_WARN("DeviceSettings unknown exception caught\n"); + try { device::Manager::DeInitialize(); } catch (...) {} } m_isHDCPEnabled = isHDCPEnabled; diff --git a/externals/rdk/PlayerExternalsRdkInterface.h b/externals/rdk/PlayerExternalsRdkInterface.h index 2f35e7bc..567020f7 100644 --- a/externals/rdk/PlayerExternalsRdkInterface.h +++ b/externals/rdk/PlayerExternalsRdkInterface.h @@ -36,7 +36,7 @@ #include #include "PlayerExternalsInterfaceBase.h" - +#include /* IARM Deprecation Note: IARM is to be deprecated in favor of DeviceSettings and Firebolt Device API. @@ -63,6 +63,7 @@ class PlayerExternalsRdkInterface : public PlayerExternalsInterfaceBase , public device::Host::IVideoOutputPortEvents #endif { + std::mutex m_hdmiStatusMutex; enum InitState{ NOT_INITIALIZED, FIREBOLT,