device-manager-dbus: always place bt-sco device at first in device list 79/263679/3 submit/tizen/20210910.035514
authorjungsup lee <jungsup4.lee@samsung.com>
Wed, 8 Sep 2021 04:54:40 +0000 (13:54 +0900)
committerSeungbae Shin <seungbae.shin@samsung.com>
Thu, 9 Sep 2021 08:05:14 +0000 (17:05 +0900)
[Version] 13.0.72
[Issue Type] Improvement

Change-Id: I15efd7b12c48a3278ad64e9fdb7a2f409cf4183f

packaging/pulseaudio-modules-tizen.spec
src/device-manager-dbus.c

index 741064d..b58e363 100644 (file)
@@ -1,6 +1,6 @@
 Name:             pulseaudio-modules-tizen
 Summary:          Pulseaudio modules for Tizen
-Version:          13.0.71
+Version:          13.0.72
 Release:          0
 Group:            Multimedia/Audio
 License:          LGPL-2.1+
index 359d4f4..8c067af 100644 (file)
@@ -689,35 +689,22 @@ static int method_call_bt_get_name(DBusConnection *conn, const char *device_path
 }
 #endif /* __TIZEN_INTERNAL_BT_SCO__ */
 
-static void handle_get_connected_device_list(DBusConnection *conn, DBusMessage *msg, void *userdata) {
-    pa_device_manager *dm = (pa_device_manager *)userdata;
-    DBusMessage *reply = NULL;
-    DBusMessageIter msg_iter, array_iter, device_iter;
-    pa_tz_device *device;
-    dm_device_state_t state;
+static void array_iter_append(DBusMessageIter *array_iter, pa_idxset *device_list, int mask) {
     uint32_t device_idx;
+    dm_device_state_t state;
     dbus_int32_t device_id, direction;
-    int mask;
     char *type, *name;
     dbus_int32_t vendor_id, product_id;
     dbus_bool_t is_running;
+    pa_tz_device *device;
+    DBusMessageIter device_iter;
 
-    pa_assert(conn);
-    pa_assert(msg);
-    pa_assert(dm);
-
-    pa_assert_se((reply = dbus_message_new_method_return(msg)));
-
-    pa_assert_se(dbus_message_get_args(msg, NULL,
-                                       DBUS_TYPE_INT32, &mask,
-                                       DBUS_TYPE_INVALID));
-
-    pa_log_info("Get connected device list (mask : %d)", mask);
+    pa_assert(array_iter);
 
-    dbus_message_iter_init_append(reply, &msg_iter);
-    pa_assert_se(dbus_message_iter_open_container(&msg_iter, DBUS_TYPE_ARRAY, "(isiisiib)", &array_iter));
+    if (!device_list)
+        return;
 
-    PA_IDXSET_FOREACH(device, dm->device_list, device_idx) {
+    PA_IDXSET_FOREACH(device, device_list, device_idx) {
         device_id = (dbus_int32_t)pa_tz_device_get_id(device);
         state = pa_tz_device_get_state(device);
         direction = pa_tz_device_get_direction(device);
@@ -727,9 +714,9 @@ static void handle_get_connected_device_list(DBusConnection *conn, DBusMessage *
         product_id = (dbus_int32_t) pa_tz_device_get_product_id(device);
         product_id = (dbus_int32_t) pa_tz_device_get_product_id(device);
         is_running = (dbus_bool_t) pa_tz_device_is_running(device);
-        if (device_is_match_with_mask(device,  mask)) {
+        if (device_is_match_with_mask(device, mask)) {
             simple_device_dump(PA_LOG_INFO, "[MATCH]", device_id, type, name, direction, state);
-            pa_assert_se(dbus_message_iter_open_container(&array_iter, DBUS_TYPE_STRUCT, NULL, &device_iter));
+            pa_assert_se(dbus_message_iter_open_container(array_iter, DBUS_TYPE_STRUCT, NULL, &device_iter));
             dbus_message_iter_append_basic(&device_iter, DBUS_TYPE_INT32, &device_id);
             dbus_message_iter_append_basic(&device_iter, DBUS_TYPE_STRING, &type);
             dbus_message_iter_append_basic(&device_iter, DBUS_TYPE_INT32, &direction);
@@ -738,11 +725,70 @@ static void handle_get_connected_device_list(DBusConnection *conn, DBusMessage *
             dbus_message_iter_append_basic(&device_iter, DBUS_TYPE_INT32, &vendor_id);
             dbus_message_iter_append_basic(&device_iter, DBUS_TYPE_INT32, &product_id);
             dbus_message_iter_append_basic(&device_iter, DBUS_TYPE_BOOLEAN, &is_running);
-            pa_assert_se(dbus_message_iter_close_container(&array_iter, &device_iter));
+            pa_assert_se(dbus_message_iter_close_container(array_iter, &device_iter));
         } else {
             simple_device_dump(PA_LOG_INFO, "[UNMATCH]", device_id, type, name, direction, state);
         }
     }
+}
+
+#ifndef __TIZEN_INTERNAL_BT_SCO__
+static int include_device_filter_func(const void *d, const void *include_device_type) {
+    pa_tz_device *device = (pa_tz_device *)d;
+
+    pa_assert(device);
+    pa_assert(include_device_type);
+
+    return (int)pa_safe_streq(pa_tz_device_get_type(device), (const char *)include_device_type);
+}
+
+static int exclude_device_filter_func(const void *d, const void *exclude_device_type) {
+    pa_tz_device *device = (pa_tz_device *)d;
+
+    pa_assert(device);
+    pa_assert(exclude_device_type);
+
+    return (int)!pa_safe_streq(pa_tz_device_get_type(device), (const char *)exclude_device_type);
+}
+#endif /* __TIZEN_INTERNAL_BT_SCO__ */
+
+static void handle_get_connected_device_list(DBusConnection *conn, DBusMessage *msg, void *userdata) {
+    pa_device_manager *dm = (pa_device_manager *)userdata;
+    DBusMessage *reply = NULL;
+    DBusMessageIter msg_iter, array_iter;
+    int mask;
+#ifndef __TIZEN_INTERNAL_BT_SCO__
+    pa_idxset *idxset1, *idxset2;
+#endif
+
+    pa_assert(conn);
+    pa_assert(msg);
+    pa_assert(dm);
+
+    pa_assert_se((reply = dbus_message_new_method_return(msg)));
+
+    pa_assert_se(dbus_message_get_args(msg, NULL,
+                                       DBUS_TYPE_INT32, &mask,
+                                       DBUS_TYPE_INVALID));
+
+    pa_log_info("Get connected device list (mask : %d)", mask);
+
+    dbus_message_iter_init_append(reply, &msg_iter);
+    pa_assert_se(dbus_message_iter_open_container(&msg_iter, DBUS_TYPE_ARRAY, "(isiisiib)", &array_iter));
+
+#ifdef __TIZEN_INTERNAL_BT_SCO__
+    array_iter_append(&array_iter, dm->device_list, mask);
+#else
+    /* divide into two groups and merge them because dbus message doesn't support sorting or prepend */
+    idxset1 = pa_idxset_filtered_copy(dm->device_list, NULL, include_device_filter_func, DEVICE_TYPE_BT_SCO);
+    idxset2 = pa_idxset_filtered_copy(dm->device_list, NULL, exclude_device_filter_func, DEVICE_TYPE_BT_SCO);
+
+    array_iter_append(&array_iter, idxset1, mask);
+    array_iter_append(&array_iter, idxset2, mask);
+
+    pa_idxset_free(idxset1, NULL);
+    pa_idxset_free(idxset2, NULL);
+#endif /* __TIZEN_INTERNAL_BT_SCO__ */
 
     pa_assert_se(dbus_message_iter_close_container(&msg_iter, &array_iter));