From d28b36bb937e913b1af030a85bbbd7722100e391 Mon Sep 17 00:00:00 2001 From: Pauli Virtanen Date: Sat, 9 Oct 2021 15:23:04 +0300 Subject: [PATCH] bluez5: fix HFP backend behavior when BlueZ goes away Ensure unavailable backends get unregistered. Don't log error-level messages on HFP unregistration failures. --- spa/plugins/bluez5/backend-native.c | 2 +- spa/plugins/bluez5/bluez5-dbus.c | 27 ++++++++++++++++----------- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/spa/plugins/bluez5/backend-native.c b/spa/plugins/bluez5/backend-native.c index 824c6929f..7883a2a96 100644 --- a/spa/plugins/bluez5/backend-native.c +++ b/spa/plugins/bluez5/backend-native.c @@ -2020,7 +2020,7 @@ static void unregister_profile(struct impl *backend, const char *profile) m = NULL; if (r == NULL) { - spa_log_error(backend->log, "Unregistering Profile %s failed", profile); + spa_log_info(backend->log, "Unregistering Profile %s failed", profile); dbus_error_free(&err); return; } diff --git a/spa/plugins/bluez5/bluez5-dbus.c b/spa/plugins/bluez5/bluez5-dbus.c index 3624c2284..eb78365f5 100644 --- a/spa/plugins/bluez5/bluez5-dbus.c +++ b/spa/plugins/bluez5/bluez5-dbus.c @@ -3360,7 +3360,7 @@ static int switch_backend(struct spa_bt_monitor *monitor, struct spa_bt_backend return 0; } -static void reselect_backend(struct spa_bt_monitor *monitor) +static void reselect_backend(struct spa_bt_monitor *monitor, bool silent) { struct spa_bt_backend *backend; size_t i; @@ -3383,8 +3383,12 @@ static void reselect_backend(struct spa_bt_monitor *monitor) return; } - spa_log_error(monitor->log, "Failed to start HFP/HSP backend %s", - backend ? backend->name : "none"); + spa_bt_backend_unregister_profiles(monitor->backend); + monitor->backend = NULL; + + if (!silent) + spa_log_error(monitor->log, "Failed to start HFP/HSP backend %s", + backend ? backend->name : "none"); } static void interface_added(struct spa_bt_monitor *monitor, @@ -3412,7 +3416,7 @@ static void interface_added(struct spa_bt_monitor *monitor, else if (spa_streq(interface_name, BLUEZ_PROFILE_MANAGER_INTERFACE)) { if (monitor->backends[BACKEND_NATIVE]) monitor->backends[BACKEND_NATIVE]->available = true; - reselect_backend(monitor); + reselect_backend(monitor, false); } else if (spa_streq(interface_name, BLUEZ_DEVICE_INTERFACE)) { struct spa_bt_device *d; @@ -3560,7 +3564,7 @@ static void get_managed_objects_reply(DBusPendingCall *pending, void *user_data) dbus_message_iter_next(&it[1]); } - reselect_backend(monitor); + reselect_backend(monitor, false); monitor->objects_listed = true; @@ -3612,6 +3616,11 @@ static DBusHandlerResult filter_cb(DBusConnection *bus, DBusMessage *m, void *us if (has_old_owner) { spa_log_debug(monitor->log, "Bluetooth daemon disappeared"); + + if (monitor->backends[BACKEND_NATIVE]) + monitor->backends[BACKEND_NATIVE]->available = false; + + reselect_backend(monitor, true); } if (has_old_owner || has_new_owner) { @@ -3630,10 +3639,6 @@ static DBusHandlerResult filter_cb(DBusConnection *bus, DBusMessage *m, void *us device_free(d); spa_list_consume(a, &monitor->adapter_list, link) adapter_free(a); - - if (monitor->backends[BACKEND_NATIVE]) - monitor->backends[BACKEND_NATIVE]->available = false; - reselect_backend(monitor); } if (has_new_owner) { @@ -3643,11 +3648,11 @@ static DBusHandlerResult filter_cb(DBusConnection *bus, DBusMessage *m, void *us } else if (spa_streq(name, OFONO_SERVICE)) { if (monitor->backends[BACKEND_OFONO]) monitor->backends[BACKEND_OFONO]->available = (new_owner && *new_owner); - reselect_backend(monitor); + reselect_backend(monitor, false); } else if (spa_streq(name, HSPHFPD_SERVICE)) { if (monitor->backends[BACKEND_HSPHFPD]) monitor->backends[BACKEND_HSPHFPD]->available = (new_owner && *new_owner); - reselect_backend(monitor); + reselect_backend(monitor, false); } } else if (dbus_message_is_signal(m, "org.freedesktop.DBus.ObjectManager", "InterfacesAdded")) { DBusMessageIter it;