PulseAudio Marge Bot pushed to branch master at PulseAudio / pulseaudio
Commits: d7f95170 by João Paulo Rechi Vita at 2021-10-06T15:07:00+00:00 bluetooth: Consider adapter UUIDs when evaluating profile support The remote device list of UUIDs reflects which profiles are supported by the remote device alone. We currently rely solely on this list to decide if a certain card profile is supported, and thus should be created and get connected. This used to be accurate when the Bluetooth modules were first written, but now BlueZ is more dynamic and local profile support can be added or removed during runtime. The adapter's list of UUIDs is an accurate representation of the profiles supported by the local host at a certain moment. This commit combines the list of UUIDs supported by remote device and the list of UUIDs supported by the local host to determined whether a Bluetooth profile is actually supported or not, and whether it should be expected to get connected during device connection. Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/638> - - - - - ab47d939 by João Paulo Rechi Vita at 2021-10-06T15:07:00+00:00 bluetooth: Add debug logging to pa_bluetooth_device_supports_profile Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/638> - - - - - f7acc2ad by João Paulo Rechi Vita at 2021-10-06T15:07:00+00:00 bluetooth: Do not create a card profile for unsupported profiles Check whether a Bluetooth profile is supported both by the remote device and the local host before creating a card profile for it. This is useful when some of the media profiles have not been registered with bluetoothd because ex., oFono is not running and the headset backend is not available. Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/638> - - - - - 48c78f08 by João Paulo Rechi Vita at 2021-10-06T15:07:00+00:00 bluetooth: Add debug logging to profile creation Part-of: <https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/merge_requests/638> - - - - - 3 changed files: - src/modules/bluetooth/bluez5-util.c - src/modules/bluetooth/bluez5-util.h - src/modules/bluetooth/module-bluez5-device.c Changes: ===================================== src/modules/bluetooth/bluez5-util.c ===================================== @@ -254,8 +254,8 @@ static const char *transport_state_to_string(pa_bluetooth_transport_state_t stat return "invalid"; } -static bool device_supports_profile(pa_bluetooth_device *device, pa_bluetooth_profile_t profile) { - bool show_hfp, show_hsp; +bool pa_bluetooth_device_supports_profile(const pa_bluetooth_device *device, pa_bluetooth_profile_t profile) { + bool show_hfp, show_hsp, r; if (device->enable_hfp_hf) { show_hfp = pa_hashmap_get(device->uuids, PA_BLUETOOTH_UUID_HFP_HF); @@ -267,24 +267,41 @@ static bool device_supports_profile(pa_bluetooth_device *device, pa_bluetooth_pr switch (profile) { case PA_BLUETOOTH_PROFILE_A2DP_SINK: - return !!pa_hashmap_get(device->uuids, PA_BLUETOOTH_UUID_A2DP_SINK); + r = !!(pa_hashmap_get(device->uuids, PA_BLUETOOTH_UUID_A2DP_SINK) && + pa_hashmap_get(device->adapter->uuids, PA_BLUETOOTH_UUID_A2DP_SOURCE)); + break; case PA_BLUETOOTH_PROFILE_A2DP_SOURCE: - return !!pa_hashmap_get(device->uuids, PA_BLUETOOTH_UUID_A2DP_SOURCE); + r = !!(pa_hashmap_get(device->uuids, PA_BLUETOOTH_UUID_A2DP_SOURCE) && + pa_hashmap_get(device->adapter->uuids, PA_BLUETOOTH_UUID_A2DP_SINK)); case PA_BLUETOOTH_PROFILE_HSP_HS: - return show_hsp - && ( !!pa_hashmap_get(device->uuids, PA_BLUETOOTH_UUID_HSP_HS) - || !!pa_hashmap_get(device->uuids, PA_BLUETOOTH_UUID_HSP_HS_ALT)); + r = show_hsp + && ( !!(pa_hashmap_get(device->uuids, PA_BLUETOOTH_UUID_HSP_HS) && + pa_hashmap_get(device->adapter->uuids, PA_BLUETOOTH_UUID_HSP_AG)) || + !!(pa_hashmap_get(device->uuids, PA_BLUETOOTH_UUID_HSP_HS_ALT) && + pa_hashmap_get(device->adapter->uuids, PA_BLUETOOTH_UUID_HSP_AG)) ); case PA_BLUETOOTH_PROFILE_HSP_AG: - return !!pa_hashmap_get(device->uuids, PA_BLUETOOTH_UUID_HSP_AG); + r = !!(pa_hashmap_get(device->uuids, PA_BLUETOOTH_UUID_HSP_AG) && + pa_hashmap_get(device->adapter->uuids, PA_BLUETOOTH_UUID_HSP_HS)) || + !!(pa_hashmap_get(device->uuids, PA_BLUETOOTH_UUID_HSP_AG) && + pa_hashmap_get(device->adapter->uuids, PA_BLUETOOTH_UUID_HSP_HS_ALT)); case PA_BLUETOOTH_PROFILE_HFP_HF: - return show_hfp && !!pa_hashmap_get(device->uuids, PA_BLUETOOTH_UUID_HFP_HF); + r = show_hfp + && !!(pa_hashmap_get(device->uuids, PA_BLUETOOTH_UUID_HFP_HF) && + pa_hashmap_get(device->adapter->uuids, PA_BLUETOOTH_UUID_HFP_AG)); case PA_BLUETOOTH_PROFILE_HFP_AG: - return !!pa_hashmap_get(device->uuids, PA_BLUETOOTH_UUID_HFP_AG); + r = !!(pa_hashmap_get(device->uuids, PA_BLUETOOTH_UUID_HFP_AG) && + pa_hashmap_get(device->adapter->uuids, PA_BLUETOOTH_UUID_HFP_HF)); + break; case PA_BLUETOOTH_PROFILE_OFF: + default: pa_assert_not_reached(); + break; } - pa_assert_not_reached(); + pa_log_debug("Checking if device %s (%s) supports profile %s: %s", + device->alias, device->address, pa_bluetooth_profile_to_string(profile), r ? "true" : "false"); + + return r; } static bool device_is_profile_connected(pa_bluetooth_device *device, pa_bluetooth_profile_t profile) { @@ -299,7 +316,7 @@ static unsigned device_count_disconnected_profiles(pa_bluetooth_device *device) unsigned count = 0; for (profile = 0; profile < PA_BLUETOOTH_PROFILE_COUNT; profile++) { - if (!device_supports_profile(device, profile)) + if (!pa_bluetooth_device_supports_profile(device, profile)) continue; if (!device_is_profile_connected(device, profile)) @@ -332,7 +349,7 @@ static void wait_for_profiles_cb(pa_mainloop_api *api, pa_time_event* event, con if (device_is_profile_connected(device, profile)) continue; - if (!device_supports_profile(device, profile)) + if (!pa_bluetooth_device_supports_profile(device, profile)) continue; if (first) @@ -2081,7 +2098,7 @@ void pa_bluetooth_discovery_set_ofono_running(pa_bluetooth_discovery *y, bool is pa_bluetooth_device *d; PA_HASHMAP_FOREACH(d, y->devices, state) { - if (device_supports_profile(d, PA_BLUETOOTH_PROFILE_HFP_AG) || device_supports_profile(d, PA_BLUETOOTH_PROFILE_HFP_HF)) { + if (pa_bluetooth_device_supports_profile(d, PA_BLUETOOTH_PROFILE_HFP_AG) || pa_bluetooth_device_supports_profile(d, PA_BLUETOOTH_PROFILE_HFP_HF)) { DBusMessage *m; pa_assert_se(m = dbus_message_new_method_call(BLUEZ_SERVICE, d->path, BLUEZ_DEVICE_INTERFACE, "Disconnect")); ===================================== src/modules/bluetooth/bluez5-util.h ===================================== @@ -215,6 +215,7 @@ void pa_bluetooth_transport_unlink(pa_bluetooth_transport *t); void pa_bluetooth_transport_free(pa_bluetooth_transport *t); void pa_bluetooth_transport_load_a2dp_sink_volume(pa_bluetooth_transport *t); +bool pa_bluetooth_device_supports_profile(const pa_bluetooth_device *device, pa_bluetooth_profile_t profile); bool pa_bluetooth_device_any_transport_connected(const pa_bluetooth_device *d); bool pa_bluetooth_device_switch_codec(pa_bluetooth_device *device, pa_bluetooth_profile_t profile, pa_hashmap *capabilities_hashmap, const pa_a2dp_endpoint_conf *endpoint_conf, void (*codec_switch_cb)(bool, pa_bluetooth_profile_t profile, void *), void *userdata); void pa_bluetooth_device_report_battery_level(pa_bluetooth_device *d, uint8_t level, const char *reporting_source); ===================================== src/modules/bluetooth/module-bluez5-device.c ===================================== @@ -2195,8 +2195,18 @@ static int add_card(struct userdata *u) { if (uuid_to_profile(uuid, &profile) < 0) continue; - if (pa_hashmap_get(data.profiles, pa_bluetooth_profile_to_string(profile))) + pa_log_debug("Trying to create profile %s (%s) for device %s (%s)", + pa_bluetooth_profile_to_string(profile), uuid, d->alias, d->address); + + if (pa_hashmap_get(data.profiles, pa_bluetooth_profile_to_string(profile))) { + pa_log_debug("%s already exists", pa_bluetooth_profile_to_string(profile)); continue; + } + + if (!pa_bluetooth_device_supports_profile(d, profile)) { + pa_log_debug("%s is not supported by the device or adapter", pa_bluetooth_profile_to_string(profile)); + continue; + } cp = create_card_profile(u, profile, data.ports); pa_hashmap_put(data.profiles, cp->name, cp); View it on GitLab: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/compare/b81b995809160e1df7b1997313446fec95194954...48c78f0835aaa14cdded296323036ea384cb181d -- View it on GitLab: https://gitlab.freedesktop.org/pulseaudio/pulseaudio/-/compare/b81b995809160e1df7b1997313446fec95194954...48c78f0835aaa14cdded296323036ea384cb181d You're receiving this email because of your account on gitlab.freedesktop.org.
