mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-12-16 08:56:45 -05:00
bluez5: Start only one backend at a time for HSP/HFP
This will prevent to run the different backends concurrently. The native backend will only register to BlueZ if neither oFono nor hsphfpd are running. If one of them starts, the native backend will be unregistered and the corresponding backend will register to its daemon.
This commit is contained in:
parent
1dfa36d77b
commit
0e2a153bd3
5 changed files with 211 additions and 150 deletions
|
|
@ -88,6 +88,9 @@ struct spa_bt_monitor {
|
|||
struct spa_dict enabled_codecs;
|
||||
|
||||
unsigned int enable_sbc_xq:1;
|
||||
unsigned int backend_native_registered:1;
|
||||
unsigned int backend_ofono_registered:1;
|
||||
unsigned int backend_hsphfpd_registered:1;
|
||||
};
|
||||
|
||||
/* Stream endpoints owned by BlueZ for each device */
|
||||
|
|
@ -2508,7 +2511,10 @@ static void interface_added(struct spa_bt_monitor *monitor,
|
|||
adapter_register_application(a);
|
||||
}
|
||||
else if (strcmp(interface_name, BLUEZ_PROFILE_MANAGER_INTERFACE) == 0) {
|
||||
backend_native_register_profiles(monitor->backend_native);
|
||||
if (!monitor->backend_ofono_registered && !monitor->backend_hsphfpd_registered) {
|
||||
backend_native_register_profiles(monitor->backend_native);
|
||||
monitor->backend_native_registered = true;
|
||||
}
|
||||
}
|
||||
else if (strcmp(interface_name, BLUEZ_DEVICE_INTERFACE) == 0) {
|
||||
struct spa_bt_device *d;
|
||||
|
|
@ -2707,6 +2713,49 @@ static DBusHandlerResult filter_cb(DBusConnection *bus, DBusMessage *m, void *us
|
|||
spa_log_debug(monitor->log, "Bluetooth daemon appeared");
|
||||
get_managed_objects(monitor);
|
||||
}
|
||||
} else if (strcmp(name, OFONO_SERVICE) == 0 && monitor->backend_ofono) {
|
||||
if (old_owner && *old_owner) {
|
||||
spa_log_debug(monitor->log, "oFono daemon disappeared");
|
||||
monitor->backend_ofono_registered = false;
|
||||
backend_native_register_profiles(monitor->backend_native);
|
||||
monitor->backend_native_registered = true;
|
||||
}
|
||||
|
||||
if (new_owner && *new_owner) {
|
||||
spa_log_debug(monitor->log, "oFono daemon appeared");
|
||||
if (monitor->backend_native_registered) {
|
||||
backend_native_unregister_profiles(monitor->backend_native);
|
||||
monitor->backend_native_registered = false;
|
||||
}
|
||||
if (backend_ofono_register(monitor->backend_ofono) == 0)
|
||||
monitor->backend_ofono_registered = true;
|
||||
else {
|
||||
backend_native_register_profiles(monitor->backend_native);
|
||||
monitor->backend_native_registered = true;
|
||||
}
|
||||
}
|
||||
} else if (strcmp(name, HSPHFPD_SERVICE) == 0 && monitor->backend_hsphfpd) {
|
||||
if (old_owner && *old_owner) {
|
||||
spa_log_debug(monitor->log, "hsphfpd daemon disappeared");
|
||||
backend_hsphfpd_unregistered(monitor->backend_hsphfpd);
|
||||
monitor->backend_hsphfpd_registered = false;
|
||||
backend_native_register_profiles(monitor->backend_native);
|
||||
monitor->backend_native_registered = true;
|
||||
}
|
||||
|
||||
if (new_owner && *new_owner) {
|
||||
spa_log_debug(monitor->log, "hsphfpd daemon appeared");
|
||||
if (monitor->backend_native_registered) {
|
||||
backend_native_unregister_profiles(monitor->backend_native);
|
||||
monitor->backend_native_registered = false;
|
||||
}
|
||||
if (backend_hsphfpd_register(monitor->backend_hsphfpd) == 0)
|
||||
monitor->backend_hsphfpd_registered = true;
|
||||
else {
|
||||
backend_native_register_profiles(monitor->backend_native);
|
||||
monitor->backend_native_registered = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (dbus_message_is_signal(m, "org.freedesktop.DBus.ObjectManager", "InterfacesAdded")) {
|
||||
DBusMessageIter it;
|
||||
|
|
@ -2833,6 +2882,18 @@ static void add_filters(struct spa_bt_monitor *this)
|
|||
"type='signal',sender='org.freedesktop.DBus',"
|
||||
"interface='org.freedesktop.DBus',member='NameOwnerChanged',"
|
||||
"arg0='" BLUEZ_SERVICE "'", &err);
|
||||
#ifdef HAVE_BLUEZ_5_BACKEND_OFONO
|
||||
dbus_bus_add_match(this->conn,
|
||||
"type='signal',sender='org.freedesktop.DBus',"
|
||||
"interface='org.freedesktop.DBus',member='NameOwnerChanged',"
|
||||
"arg0='" OFONO_SERVICE "'", &err);
|
||||
#endif
|
||||
#ifdef HAVE_BLUEZ_5_BACKEND_HSPHFPD
|
||||
dbus_bus_add_match(this->conn,
|
||||
"type='signal',sender='org.freedesktop.DBus',"
|
||||
"interface='org.freedesktop.DBus',member='NameOwnerChanged',"
|
||||
"arg0='" HSPHFPD_SERVICE "'", &err);
|
||||
#endif
|
||||
dbus_bus_add_match(this->conn,
|
||||
"type='signal',sender='" BLUEZ_SERVICE "',"
|
||||
"interface='org.freedesktop.DBus.ObjectManager',member='InterfacesAdded'", &err);
|
||||
|
|
@ -3101,6 +3162,11 @@ impl_init(const struct spa_handle_factory *factory,
|
|||
this->backend_ofono = backend_ofono_new(this, this->conn, info, support, n_support);
|
||||
this->backend_hsphfpd = backend_hsphfpd_new(this, this->conn, info, support, n_support);
|
||||
|
||||
if (this->backend_ofono && backend_ofono_register(this->backend_ofono) == 0)
|
||||
this->backend_ofono_registered = true;
|
||||
else if (this->backend_hsphfpd && backend_hsphfpd_register(this->backend_hsphfpd) == 0)
|
||||
this->backend_hsphfpd_registered = true;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue