From d6be84ddd0901e5cade1a6c59970643314a2b9fa Mon Sep 17 00:00:00 2001 From: Huang-Huang Bao Date: Sat, 13 Mar 2021 18:46:54 +0800 Subject: [PATCH] bluez5: close sco socket if bluetooth daemon disappeared Fixes pipewire/pipewire#853 --- spa/plugins/bluez5/backend-native.c | 9 ++++++++- spa/plugins/bluez5/bluez5-dbus.c | 5 +++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/spa/plugins/bluez5/backend-native.c b/spa/plugins/bluez5/backend-native.c index d326c312a..86f183dbc 100644 --- a/spa/plugins/bluez5/backend-native.c +++ b/spa/plugins/bluez5/backend-native.c @@ -1387,7 +1387,7 @@ void backend_native_register_profiles(struct spa_bt_backend *backend) sco_listen(backend); } -void backend_native_unregister_profiles(struct spa_bt_backend *backend) +void sco_close(struct spa_bt_backend *backend) { if (backend->sco.fd >= 0) { if (backend->sco.loop) @@ -1396,6 +1396,11 @@ void backend_native_unregister_profiles(struct spa_bt_backend *backend) close (backend->sco.fd); backend->sco.fd = -1; } +} + +void backend_native_unregister_profiles(struct spa_bt_backend *backend) +{ + sco_close(backend); #ifdef HAVE_BLUEZ_5_BACKEND_HSP_NATIVE if (backend->enabled_profiles & SPA_BT_PROFILE_HSP_AG) @@ -1416,6 +1421,8 @@ void backend_native_free(struct spa_bt_backend *backend) { struct rfcomm *rfcomm; + sco_close(backend); + #ifdef HAVE_BLUEZ_5_BACKEND_HSP_NATIVE dbus_connection_unregister_object_path(backend->conn, PROFILE_HSP_AG); dbus_connection_unregister_object_path(backend->conn, PROFILE_HSP_HS); diff --git a/spa/plugins/bluez5/bluez5-dbus.c b/spa/plugins/bluez5/bluez5-dbus.c index 3751bdb7b..1aef6ec4f 100644 --- a/spa/plugins/bluez5/bluez5-dbus.c +++ b/spa/plugins/bluez5/bluez5-dbus.c @@ -2917,6 +2917,11 @@ static DBusHandlerResult filter_cb(DBusConnection *bus, DBusMessage *m, void *us spa_log_debug(monitor->log, "Bluetooth daemon disappeared"); monitor->objects_listed = false; + if (monitor->backend_native_registered) { + backend_native_unregister_profiles(monitor->backend_native); + monitor->backend_native_registered = false; + } + spa_list_consume(t, &monitor->transport_list, link) spa_bt_transport_free(t); spa_list_consume(ep, &monitor->remote_endpoint_list, link)