From: jungsup lee Date: Wed, 8 Sep 2021 04:54:40 +0000 (+0900) Subject: device-manager-dbus: always place bt-sco device at first in device list X-Git-Tag: submit/tizen/20210910.035514^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=324cb705d7953ea4f7a23c5d0ac08d1bbdd961a1;p=platform%2Fcore%2Fmultimedia%2Fpulseaudio-modules-tizen.git device-manager-dbus: always place bt-sco device at first in device list [Version] 13.0.72 [Issue Type] Improvement Change-Id: I15efd7b12c48a3278ad64e9fdb7a2f409cf4183f --- diff --git a/packaging/pulseaudio-modules-tizen.spec b/packaging/pulseaudio-modules-tizen.spec index 741064d..b58e363 100644 --- a/packaging/pulseaudio-modules-tizen.spec +++ b/packaging/pulseaudio-modules-tizen.spec @@ -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+ diff --git a/src/device-manager-dbus.c b/src/device-manager-dbus.c index 359d4f4..8c067af 100644 --- a/src/device-manager-dbus.c +++ b/src/device-manager-dbus.c @@ -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));