Get preferred device id from server 72/212972/3 accepted/tizen/unified/20190904.110721 submit/tizen/20190903.063631
authorSangchul Lee <sc11.lee@samsung.com>
Wed, 28 Aug 2019 09:09:37 +0000 (18:09 +0900)
committerSangchul Lee <sc11.lee@samsung.com>
Thu, 29 Aug 2019 08:08:14 +0000 (17:08 +0900)
[Version] 0.5.40
[Issue Type] Improvement

Change-Id: I40e0843d4ca07612b247e825cc373395336e5485
Signed-off-by: Sangchul Lee <sc11.lee@samsung.com>
include/sound_manager.h
packaging/capi-media-sound-manager.spec
src/sound_manager_private.c

index bc1a59b..2320488 100644 (file)
@@ -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()
index c200520..abfb3d7 100644 (file)
@@ -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
index 98aa326..30cce96 100644 (file)
@@ -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