diff --git a/rpc/srv/dsAudio.c b/rpc/srv/dsAudio.c index 6ee65f82..3201175c 100755 --- a/rpc/srv/dsAudio.c +++ b/rpc/srv/dsAudio.c @@ -2836,42 +2836,40 @@ 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; - 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); + dsAudioPortType_t _APortType = _GetAudioPortType(param->handle); + int *runtimeAutoPtr = NULL; + + 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; } 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) { @@ -2889,12 +2887,33 @@ 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) { + IARM_BUS_Unlock(lock); + return IARM_RESULT_INVALID_STATE; + } + } + + /* 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; } }