bluez5: fix HFP backend behavior when BlueZ goes away

Ensure unavailable backends get unregistered.

Don't log error-level messages on HFP unregistration failures.
This commit is contained in:
Pauli Virtanen 2021-10-09 15:23:04 +03:00 committed by Wim Taymans
parent 5f7c4dec34
commit d28b36bb93
2 changed files with 17 additions and 12 deletions

View file

@ -2020,7 +2020,7 @@ static void unregister_profile(struct impl *backend, const char *profile)
m = NULL; m = NULL;
if (r == 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); dbus_error_free(&err);
return; return;
} }

View file

@ -3360,7 +3360,7 @@ static int switch_backend(struct spa_bt_monitor *monitor, struct spa_bt_backend
return 0; 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; struct spa_bt_backend *backend;
size_t i; size_t i;
@ -3383,8 +3383,12 @@ static void reselect_backend(struct spa_bt_monitor *monitor)
return; return;
} }
spa_log_error(monitor->log, "Failed to start HFP/HSP backend %s", spa_bt_backend_unregister_profiles(monitor->backend);
backend ? backend->name : "none"); 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, 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)) { else if (spa_streq(interface_name, BLUEZ_PROFILE_MANAGER_INTERFACE)) {
if (monitor->backends[BACKEND_NATIVE]) if (monitor->backends[BACKEND_NATIVE])
monitor->backends[BACKEND_NATIVE]->available = true; monitor->backends[BACKEND_NATIVE]->available = true;
reselect_backend(monitor); reselect_backend(monitor, false);
} }
else if (spa_streq(interface_name, BLUEZ_DEVICE_INTERFACE)) { else if (spa_streq(interface_name, BLUEZ_DEVICE_INTERFACE)) {
struct spa_bt_device *d; 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]); dbus_message_iter_next(&it[1]);
} }
reselect_backend(monitor); reselect_backend(monitor, false);
monitor->objects_listed = true; monitor->objects_listed = true;
@ -3612,6 +3616,11 @@ static DBusHandlerResult filter_cb(DBusConnection *bus, DBusMessage *m, void *us
if (has_old_owner) { if (has_old_owner) {
spa_log_debug(monitor->log, "Bluetooth daemon disappeared"); 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) { if (has_old_owner || has_new_owner) {
@ -3630,10 +3639,6 @@ static DBusHandlerResult filter_cb(DBusConnection *bus, DBusMessage *m, void *us
device_free(d); device_free(d);
spa_list_consume(a, &monitor->adapter_list, link) spa_list_consume(a, &monitor->adapter_list, link)
adapter_free(a); adapter_free(a);
if (monitor->backends[BACKEND_NATIVE])
monitor->backends[BACKEND_NATIVE]->available = false;
reselect_backend(monitor);
} }
if (has_new_owner) { 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)) { } else if (spa_streq(name, OFONO_SERVICE)) {
if (monitor->backends[BACKEND_OFONO]) if (monitor->backends[BACKEND_OFONO])
monitor->backends[BACKEND_OFONO]->available = (new_owner && *new_owner); monitor->backends[BACKEND_OFONO]->available = (new_owner && *new_owner);
reselect_backend(monitor); reselect_backend(monitor, false);
} else if (spa_streq(name, HSPHFPD_SERVICE)) { } else if (spa_streq(name, HSPHFPD_SERVICE)) {
if (monitor->backends[BACKEND_HSPHFPD]) if (monitor->backends[BACKEND_HSPHFPD])
monitor->backends[BACKEND_HSPHFPD]->available = (new_owner && *new_owner); 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")) { } else if (dbus_message_is_signal(m, "org.freedesktop.DBus.ObjectManager", "InterfacesAdded")) {
DBusMessageIter it; DBusMessageIter it;