Change first parameter of _get_ducking_state() to check server connection in it 63/217263/1 accepted/tizen/unified/20191111.105602 submit/tizen/20191111.045007
authorJeongmo Yang <jm80.yang@samsung.com>
Fri, 8 Nov 2019 04:58:09 +0000 (13:58 +0900)
committerJeongmo Yang <jm80.yang@samsung.com>
Fri, 8 Nov 2019 05:00:18 +0000 (14:00 +0900)
[Version] 0.5.45
[Profile] Common
[Issue Type] Update

Change-Id: Iaf0136107be17626242fec828253763b1819de75
Signed-off-by: Jeongmo Yang <jm80.yang@samsung.com>
include/sound_manager_private.h
packaging/capi-media-sound-manager.spec
src/sound_manager.c
src/sound_manager_private.c

index 7f32c30..3019971 100644 (file)
@@ -371,7 +371,7 @@ int _set_acm_master_mode(bool on);
 
 int _activate_ducking(uint32_t stream_index, bool enable, const char *target_stream, uint32_t duration, double ratio);
 
-int _get_ducking_state(uint32_t stream_index, bool *is_ducked);
+int _get_ducking_state(sound_pa_info_s *pa_info, bool *is_ducked);
 
 int _set_preferred_device(sound_stream_info_s *stream_info, sound_device_io_direction_e direction, sound_device_h device);
 
index ecdda42..1110d5b 100644 (file)
@@ -1,6 +1,6 @@
 Name:       capi-media-sound-manager
 Summary:    Sound Manager library
-Version:    0.5.44
+Version:    0.5.45
 Release:    0
 Group:      Multimedia/API
 License:    Apache-2.0
index acadaa0..b461291 100644 (file)
@@ -1249,44 +1249,38 @@ int sound_manager_destroy_stream_ducking(sound_stream_ducking_h stream_ducking)
 
        SM_INSTANCE_CHECK(ducking);
 
-       if (ducking->pa_info.is_disconnected == false) {
-               ret = _get_ducking_state(ducking->pa_info.index, &is_ducked);
-               if (ret != MM_ERROR_NONE)
-                       return _convert_sound_manager_error_code(__func__, ret);
-       } else {
-               LOGW("disconnected handle. destroy it.");
-       }
-
-       SM_ENTER_CRITICAL_SECTION_WITH_RETURN(&ducking_mutex, SOUND_MANAGER_ERROR_INTERNAL);
+       ret = _get_ducking_state(&ducking->pa_info, &is_ducked);
+       if (ret != MM_ERROR_NONE && ret != MM_ERROR_SOUND_SERVER_DISCONNECTED)
+               return _convert_sound_manager_error_code(__func__, ret);
 
-       if (!is_ducked) {
-               _destroy_pa_connection(&ducking->pa_info);
-       } else {
+       if (is_ducked) {
                LOGE("ducked now, it should be deactivated first.");
-               ret = MM_ERROR_SOUND_INVALID_STATE;
+               return SOUND_MANAGER_ERROR_INVALID_STATE;
        }
 
-       if (ret == MM_ERROR_NONE) {
-               LOGI("destroy stream ducking(%p)", ducking);
+       LOGI("destroy stream ducking(%p)", ducking);
 
-               for (i = 0 ; i < SOUND_DUCKING_ARR_MAX ; i++)
-                       if (ducking_arr[i] == ducking)
-                               ducking_arr[i] = NULL;
+       SM_ENTER_CRITICAL_SECTION_WITH_RETURN(&ducking_mutex, SOUND_MANAGER_ERROR_INTERNAL);
 
-               if (--ducking_arr_count == 0) {
-                       /* unsubscribe ducking finished signal */
-                       if (mm_sound_remove_ducking_state_changed_callback(ducking_cb_subs_id) != MM_ERROR_NONE)
-                               LOGW("mm_sound_remove_ducking_state_changed_callback(id:%u) failed", ducking_cb_subs_id);
+       _destroy_pa_connection(&ducking->pa_info);
 
-                       ducking_cb_subs_id = 0;
-               }
+       for (i = 0 ; i < SOUND_DUCKING_ARR_MAX ; i++)
+               if (ducking_arr[i] == ducking)
+                       ducking_arr[i] = NULL;
+
+       if (--ducking_arr_count == 0) {
+               /* unsubscribe ducking finished signal */
+               if (mm_sound_remove_ducking_state_changed_callback(ducking_cb_subs_id) != MM_ERROR_NONE)
+                       LOGW("mm_sound_remove_ducking_state_changed_callback(id:%u) failed", ducking_cb_subs_id);
 
-               free(ducking);
+               ducking_cb_subs_id = 0;
        }
 
+       free(ducking);
+
        SM_LEAVE_CRITICAL_SECTION(&ducking_mutex);
 
-       return _convert_sound_manager_error_code(__func__, ret);
+       return _convert_sound_manager_error_code(__func__, MM_ERROR_NONE);
 }
 
 int sound_manager_is_ducked(sound_stream_ducking_h stream_ducking, bool *is_ducked)
@@ -1299,7 +1293,7 @@ int sound_manager_is_ducked(sound_stream_ducking_h stream_ducking, bool *is_duck
        SM_INSTANCE_CHECK(ducking);
        SM_NULL_ARG_CHECK(is_ducked);
 
-       ret = _get_ducking_state(ducking->pa_info.index, is_ducked);
+       ret = _get_ducking_state(&ducking->pa_info, is_ducked);
 
        return _convert_sound_manager_error_code(__func__, ret);
 }
@@ -1319,22 +1313,22 @@ int sound_manager_activate_ducking(sound_stream_ducking_h stream_ducking, unsign
 
        SM_INSTANCE_CHECK(ducking);
 
-       ret = _get_ducking_state(ducking->pa_info.index, &is_ducked);
+       ret = _get_ducking_state(&ducking->pa_info, &is_ducked);
        if (ret != MM_ERROR_NONE)
                return _convert_sound_manager_error_code(__func__, ret);
 
+       if (is_ducked) {
+               LOGE("already ducked");
+               return SOUND_MANAGER_ERROR_INVALID_STATE;
+       }
+
        SM_ENTER_CRITICAL_SECTION_WITH_RETURN(&ducking_mutex, SOUND_MANAGER_ERROR_INTERNAL);
 
-       if (!is_ducked) {
-               ducking->duration = duration;
-               ducking->ratio = ratio;
+       ducking->duration = duration;
+       ducking->ratio = ratio;
 
-               ret = _activate_ducking(ducking->pa_info.index,
-                       true, ducking->target_stream, ducking->duration, ducking->ratio);
-       } else {
-               LOGE("already ducked");
-               ret = MM_ERROR_SOUND_INVALID_STATE;
-       }
+       ret = _activate_ducking(ducking->pa_info.index,
+               true, ducking->target_stream, ducking->duration, ducking->ratio);
 
        SM_LEAVE_CRITICAL_SECTION(&ducking_mutex);
 
@@ -1351,20 +1345,20 @@ int sound_manager_deactivate_ducking(sound_stream_ducking_h stream_ducking)
 
        SM_INSTANCE_CHECK(ducking);
 
-       ret = _get_ducking_state(ducking->pa_info.index, &is_ducked);
+       ret = _get_ducking_state(&ducking->pa_info, &is_ducked);
        if (ret != MM_ERROR_NONE)
                return _convert_sound_manager_error_code(__func__, ret);
 
-       SM_ENTER_CRITICAL_SECTION_WITH_RETURN(&ducking_mutex, SOUND_MANAGER_ERROR_INTERNAL);
-
-       if (is_ducked) {
-               ret = _activate_ducking(ducking->pa_info.index,
-                       false, ducking->target_stream, ducking->duration, ducking->ratio);
-       } else {
+       if (!is_ducked) {
                LOGE("not ducked");
-               ret = MM_ERROR_SOUND_INVALID_STATE;
+               return SOUND_MANAGER_ERROR_INVALID_STATE;
        }
 
+       SM_ENTER_CRITICAL_SECTION_WITH_RETURN(&ducking_mutex, SOUND_MANAGER_ERROR_INTERNAL);
+
+       ret = _activate_ducking(ducking->pa_info.index,
+               false, ducking->target_stream, ducking->duration, ducking->ratio);
+
        SM_LEAVE_CRITICAL_SECTION(&ducking_mutex);
 
        return _convert_sound_manager_error_code(__func__, ret);
index 3d29f7a..eccd35e 100644 (file)
@@ -116,6 +116,7 @@ int _convert_sound_manager_error_code(const char *func, int code)
        case MM_ERROR_SOUND_INTERNAL:
        case MM_ERROR_SOUND_VOLUME_CAPTURE_ONLY:
        case MM_ERROR_OUT_OF_MEMORY:
+       case MM_ERROR_SOUND_SERVER_DISCONNECTED:
                //LCOV_EXCL_START
                ret = SOUND_MANAGER_ERROR_INTERNAL;
                errorstr = "INTERNAL";
@@ -2839,7 +2840,7 @@ LEAVE:
        return ret;
 }
 
-int _get_ducking_state(uint32_t stream_index, bool *is_ducked)
+int _get_ducking_state(sound_pa_info_s *pa_info, bool *is_ducked)
 {
        int ret = MM_ERROR_NONE;
        gboolean _is_ducked = FALSE;
@@ -2848,8 +2849,14 @@ int _get_ducking_state(uint32_t stream_index, bool *is_ducked)
        GVariant *result = NULL;
        const gchar *dbus_ret = NULL;
 
+       SM_NULL_ARG_CHECK_FOR_PRIV(pa_info);
        SM_NULL_ARG_CHECK_FOR_PRIV(is_ducked);
 
+       if (pa_info->is_disconnected) {
+               LOGE("server disconnected");
+               return MM_ERROR_SOUND_SERVER_DISCONNECTED;
+       }
+
        if ((ret = __get_dbus_connection(&conn)))
                return ret;
 
@@ -2858,7 +2865,7 @@ int _get_ducking_state(uint32_t stream_index, bool *is_ducked)
                PA_STREAM_MANAGER_OBJECT_PATH,
                PA_STREAM_MANAGER_INTERFACE,
                PA_STREAM_MANAGER_METHOD_NAME_GET_DUCKING_STATE,
-               g_variant_new("(u)", stream_index),
+               g_variant_new("(u)", pa_info->index),
                G_VARIANT_TYPE("(bs)"),
                G_DBUS_CALL_FLAGS_NONE,
                1000,