From 9df132aa71678f7c3dac516f24fba42037e4930d Mon Sep 17 00:00:00 2001 From: Sangchul Lee Date: Wed, 28 Aug 2019 18:09:37 +0900 Subject: [PATCH] Get preferred device id from server [Version] 0.5.40 [Issue Type] Improvement Change-Id: I40e0843d4ca07612b247e825cc373395336e5485 Signed-off-by: Sangchul Lee --- include/sound_manager.h | 1 + packaging/capi-media-sound-manager.spec | 2 +- src/sound_manager_private.c | 67 +++++++++++++++++++++++++++++---- 3 files changed, 62 insertions(+), 8 deletions(-) diff --git a/include/sound_manager.h b/include/sound_manager.h index bc1a59b..2320488 100644 --- a/include/sound_manager.h +++ b/include/sound_manager.h @@ -843,6 +843,7 @@ int sound_manager_set_stream_preferred_device(sound_stream_info_h stream_info, s * otherwise a negative error value * @retval #SOUND_MANAGER_ERROR_NONE Success * @retval #SOUND_MANAGER_ERROR_INVALID_PARAMETER Invalid parameter + * @retval #SOUND_MANAGER_ERROR_INTERNAL Internal error inside the sound system * @see sound_manager_set_stream_preferred_device() * @see sound_manager_get_device_list() * @see sound_manager_get_next_device() diff --git a/packaging/capi-media-sound-manager.spec b/packaging/capi-media-sound-manager.spec index c200520..abfb3d7 100644 --- a/packaging/capi-media-sound-manager.spec +++ b/packaging/capi-media-sound-manager.spec @@ -1,6 +1,6 @@ Name: capi-media-sound-manager Summary: Sound Manager library -Version: 0.5.39 +Version: 0.5.40 Release: 0 Group: Multimedia/API License: Apache-2.0 diff --git a/src/sound_manager_private.c b/src/sound_manager_private.c index 98aa326..30cce96 100644 --- a/src/sound_manager_private.c +++ b/src/sound_manager_private.c @@ -27,6 +27,7 @@ #define PA_STREAM_MANAGER_METHOD_NAME_SET_STREAM_ROUTE_DEVICES "SetStreamRouteDevices" #define PA_STREAM_MANAGER_METHOD_NAME_SET_STREAM_ROUTE_OPTION "SetStreamRouteOption" #define PA_STREAM_MANAGER_METHOD_NAME_SET_STREAM_PREFERRED_DEVICE "SetStreamPreferredDevice" +#define PA_STREAM_MANAGER_METHOD_NAME_GET_STREAM_PREFERRED_DEVICE "GetStreamPreferredDevice" #define PA_STREAM_MANAGER_METHOD_NAME_GET_VOLUME_MAX_LEVEL "GetVolumeMaxLevel" #define PA_STREAM_MANAGER_METHOD_NAME_GET_VOLUME_LEVEL "GetVolumeLevel" #define PA_STREAM_MANAGER_METHOD_NAME_SET_VOLUME_LEVEL "SetVolumeLevel" @@ -3034,17 +3035,69 @@ device_free: int _get_preferred_device(sound_stream_info_s *stream_info, int *in_device_id, int *out_device_id) { + int ret = MM_ERROR_NONE; + GDBusConnection *conn = NULL; + GError *err = NULL; + GVariant *result = NULL; + const gchar *dbus_ret = NULL; + unsigned int _in_device_id; + unsigned int _out_device_id; + SM_INSTANCE_CHECK_FOR_PRIV(stream_info); - if (in_device_id) { - *in_device_id = stream_info->preferred_device_info.in; - LOGI("preferred device id[in:%d]", *in_device_id); + if ((ret = __get_dbus_connection(&conn))) + return ret; + + result = g_dbus_connection_call_sync(conn, + PA_BUS_NAME, + PA_STREAM_MANAGER_OBJECT_PATH, + PA_STREAM_MANAGER_INTERFACE, + PA_STREAM_MANAGER_METHOD_NAME_GET_STREAM_PREFERRED_DEVICE, + g_variant_new("(u)", stream_info->pa_info.index), + G_VARIANT_TYPE("(uus)"), + G_DBUS_CALL_FLAGS_NONE, + 1000, + NULL, + &err); + if (!result || err) { + LOGE("g_dbus_connection_call_sync() for GET_STREAM_PREFERRED_DEVICE error"); + ret = _convert_dbus_error(err ? err->message : NULL); + if (err) + g_error_free(err); + goto LEAVE; } - if (out_device_id) { - *out_device_id = stream_info->preferred_device_info.out; - LOGI("preferred device id[out:%d]", *out_device_id); + + g_variant_get(result, "(uu&s)", &_in_device_id, &_out_device_id, &dbus_ret); + + LOGI("dbus return value is (%s)", dbus_ret); + + if (!strncmp("STREAM_MANAGER_RETURN_OK", dbus_ret, strlen(dbus_ret))) { + if (in_device_id) { + if (stream_info->preferred_device_info.in != _in_device_id) { + LOGE("mismatching id [prev: %d, curr: %d]", stream_info->preferred_device_info.in, _in_device_id); + ret = MM_ERROR_SOUND_INTERNAL; + } else { + *in_device_id = _in_device_id; + LOGI("preferred device id[in:%d]", *in_device_id); + } + } + if (out_device_id) { + if (stream_info->preferred_device_info.out != _out_device_id) { + LOGE("mismatching id [prev: %d, curr: %d]", stream_info->preferred_device_info.out, _out_device_id); + ret = MM_ERROR_SOUND_INTERNAL; + } else { + *out_device_id = _out_device_id; + LOGI("preferred device id[out:%d]", *out_device_id); + } + } + } else { + ret = MM_ERROR_SOUND_INTERNAL; } - return MM_ERROR_NONE; +LEAVE: + g_variant_unref(result); + g_object_unref(conn); + + return ret; } //LCOV_EXCL_STOP \ No newline at end of file -- 2.7.4