From 67d84025e341faedf90016e43ea67f1594657af0 Mon Sep 17 00:00:00 2001 From: Arun Madhavan Date: Fri, 29 May 2026 09:35:45 -0400 Subject: [PATCH 1/3] RDKEMW-19283: Fix AUTO mode runtime state not updating when persist=false Move runtime AUTO state update outside persistence conditional block. Ensures immediate readback when setSoundMode(AUTO, persist=false). --- rpc/srv/dsAudio.c | 97 +++++++++++++++++++++++++++++++---------------- 1 file changed, 64 insertions(+), 33 deletions(-) diff --git a/rpc/srv/dsAudio.c b/rpc/srv/dsAudio.c index d35315b3..41e5267a 100755 --- a/rpc/srv/dsAudio.c +++ b/rpc/srv/dsAudio.c @@ -2838,42 +2838,47 @@ IARM_Result_t _dsGetStereoAuto(void *arg) IARM_Result_t _dsSetStereoAuto(void *arg) { _DEBUG_ENTER(); - IARM_BUS_Lock(lock); + if (!arg) { + return IARM_RESULT_INVALID_PARAM; + } - IARM_Result_t result = IARM_RESULT_INVALID_STATE; dsAudioSetStereoAutoParam_t *param = (dsAudioSetStereoAutoParam_t *)arg; + if ((NULL == param) || (NULL == param->handle)) { + return IARM_RESULT_INVALID_PARAM; + } - dsAudioPortType_t _APortType = _GetAudioPortType(param->handle); - - if (param->toPersist) { - switch(_APortType) { - case dsAUDIOPORT_TYPE_HDMI: - device::HostPersistence::getInstance().persistHostProperty("HDMI0.AudioMode.AUTO", param->autoMode ? "TRUE" : "FALSE"); - _srv_AudioHDMIAuto = param->autoMode; - break; - - case dsAUDIOPORT_TYPE_HDMI_ARC: - device::HostPersistence::getInstance().persistHostProperty("HDMI_ARC0.AudioMode.AUTO", param->autoMode ? "TRUE" : "FALSE"); - _srv_AudioHDMIARCAuto = param->autoMode; - break; - - case dsAUDIOPORT_TYPE_SPDIF: - device::HostPersistence::getInstance().persistHostProperty("SPDIF0.AudioMode.AUTO", param->autoMode ? "TRUE" : "FALSE"); - _srv_AudioSPDIFAuto = param->autoMode; - break; + IARM_BUS_Lock(lock); + IARM_Result_t result = IARM_RESULT_INVALID_STATE; + dsAudioPortType_t _APortType = _GetAudioPortType(param->handle); + int *runtimeAutoPtr = NULL; + int oldRuntimeAuto = 0; + + switch(_APortType) { + case dsAUDIOPORT_TYPE_HDMI: + runtimeAutoPtr = &_srv_AudioHDMIAuto; + break; + case dsAUDIOPORT_TYPE_HDMI_ARC: + runtimeAutoPtr = &_srv_AudioHDMIARCAuto; + break; + case dsAUDIOPORT_TYPE_SPDIF: + runtimeAutoPtr = &_srv_AudioSPDIFAuto; + break; case dsAUDIOPORT_TYPE_SPEAKER: - device::HostPersistence::getInstance().persistHostProperty("SPEAKER0.AudioMode.AUTO", param->autoMode ? "TRUE" : "FALSE"); - _srv_AudioSPEAKERAuto = param->autoMode; - break; - default: - break; - } + runtimeAutoPtr = &_srv_AudioSPEAKERAuto; + break; + default: + IARM_BUS_Unlock(lock); + return IARM_RESULT_INVALID_PARAM; } + oldRuntimeAuto = *runtimeAutoPtr; + if ((_APortType == dsAUDIOPORT_TYPE_HDMI_ARC) || (_APortType == dsAUDIOPORT_TYPE_SPDIF)) { typedef dsError_t (*dsSetStereoAuto_t)(intptr_t handle, int autoMode); static dsSetStereoAuto_t func = 0; + bool halUpdateSuccess = false; + if (func == 0) { void *dllib = dlopen(RDK_DSHAL_NAME, RTLD_LAZY); if (dllib) { @@ -2891,17 +2896,43 @@ IARM_Result_t _dsSetStereoAuto(void *arg) } } - if (func != 0) - { - if (func(param->handle, param->autoMode) == dsERR_NONE) - { - result = IARM_RESULT_SUCCESS; - } + if (func != 0) { + halUpdateSuccess = (func(param->handle, param->autoMode) == dsERR_NONE); + } + + if (!halUpdateSuccess) { + *runtimeAutoPtr = oldRuntimeAuto; + IARM_BUS_Unlock(lock); + return result; } } + /* Update runtime auto-state for immediate readback behavior. */ + *runtimeAutoPtr = param->autoMode ? 1 : 0; + + if (param->toPersist) { + switch(_APortType) { + case dsAUDIOPORT_TYPE_HDMI: + device::HostPersistence::getInstance().persistHostProperty("HDMI0.AudioMode.AUTO", param->autoMode ? "TRUE" : "FALSE"); + break; + case dsAUDIOPORT_TYPE_HDMI_ARC: + device::HostPersistence::getInstance().persistHostProperty("HDMI_ARC0.AudioMode.AUTO", param->autoMode ? "TRUE" : "FALSE"); + break; + case dsAUDIOPORT_TYPE_SPDIF: + device::HostPersistence::getInstance().persistHostProperty("SPDIF0.AudioMode.AUTO", param->autoMode ? "TRUE" : "FALSE"); + break; + case dsAUDIOPORT_TYPE_SPEAKER: + device::HostPersistence::getInstance().persistHostProperty("SPEAKER0.AudioMode.AUTO", param->autoMode ? "TRUE" : "FALSE"); + break; + default: + break; + } + } + + result = IARM_RESULT_SUCCESS; + IARM_BUS_Unlock(lock); - return IARM_RESULT_SUCCESS; + return result; } IARM_Result_t _dsSetAudioDucking(void *arg) From 1264768f31605136d1adbf5e8d6fdd1f3ba34d08 Mon Sep 17 00:00:00 2001 From: Arun Madhavan Date: Mon, 1 Jun 2026 15:38:10 -0400 Subject: [PATCH 2/3] Remove unused variable and fix param validation logic --- rpc/srv/dsAudio.c | 7 ------- 1 file changed, 7 deletions(-) diff --git a/rpc/srv/dsAudio.c b/rpc/srv/dsAudio.c index 41e5267a..b5e93ec8 100755 --- a/rpc/srv/dsAudio.c +++ b/rpc/srv/dsAudio.c @@ -2843,16 +2843,12 @@ IARM_Result_t _dsSetStereoAuto(void *arg) } dsAudioSetStereoAutoParam_t *param = (dsAudioSetStereoAutoParam_t *)arg; - if ((NULL == param) || (NULL == param->handle)) { - return IARM_RESULT_INVALID_PARAM; - } IARM_BUS_Lock(lock); IARM_Result_t result = IARM_RESULT_INVALID_STATE; dsAudioPortType_t _APortType = _GetAudioPortType(param->handle); int *runtimeAutoPtr = NULL; - int oldRuntimeAuto = 0; switch(_APortType) { case dsAUDIOPORT_TYPE_HDMI: @@ -2872,8 +2868,6 @@ IARM_Result_t _dsSetStereoAuto(void *arg) return IARM_RESULT_INVALID_PARAM; } - oldRuntimeAuto = *runtimeAutoPtr; - if ((_APortType == dsAUDIOPORT_TYPE_HDMI_ARC) || (_APortType == dsAUDIOPORT_TYPE_SPDIF)) { typedef dsError_t (*dsSetStereoAuto_t)(intptr_t handle, int autoMode); static dsSetStereoAuto_t func = 0; @@ -2901,7 +2895,6 @@ IARM_Result_t _dsSetStereoAuto(void *arg) } if (!halUpdateSuccess) { - *runtimeAutoPtr = oldRuntimeAuto; IARM_BUS_Unlock(lock); return result; } From e8e42f3cad0f1d71000370aa4019dab772398d50 Mon Sep 17 00:00:00 2001 From: Arun Madhavan Date: Wed, 3 Jun 2026 14:05:21 -0400 Subject: [PATCH 3/3] RDKEMW-19283: address coverity scope - remove unused var and unreachable code --- rpc/srv/dsAudio.c | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/rpc/srv/dsAudio.c b/rpc/srv/dsAudio.c index 9aa10c97..3201175c 100755 --- a/rpc/srv/dsAudio.c +++ b/rpc/srv/dsAudio.c @@ -2844,7 +2844,6 @@ IARM_Result_t _dsSetStereoAuto(void *arg) IARM_BUS_Lock(lock); - IARM_Result_t result = IARM_RESULT_INVALID_STATE; dsAudioPortType_t _APortType = _GetAudioPortType(param->handle); int *runtimeAutoPtr = NULL; @@ -2894,7 +2893,7 @@ IARM_Result_t _dsSetStereoAuto(void *arg) if (!halUpdateSuccess) { IARM_BUS_Unlock(lock); - return result; + return IARM_RESULT_INVALID_STATE; } } @@ -2915,15 +2914,11 @@ IARM_Result_t _dsSetStereoAuto(void *arg) case dsAUDIOPORT_TYPE_SPEAKER: device::HostPersistence::getInstance().persistHostProperty("SPEAKER0.AudioMode.AUTO", param->autoMode ? "TRUE" : "FALSE"); break; - default: - break; } } - result = IARM_RESULT_SUCCESS; - IARM_BUS_Unlock(lock); - return result; + return IARM_RESULT_SUCCESS; } IARM_Result_t _dsSetAudioDucking(void *arg)