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)
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);
}
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);
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);
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";
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;
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;
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,