From 0e2a153bd34c2da6c426c819ef5272f4b8bdfbd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Danis?= Date: Wed, 17 Feb 2021 18:41:24 +0100 Subject: [PATCH] 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. --- spa/plugins/bluez5/backend-hsphfpd.c | 108 ++++++++++---------------- spa/plugins/bluez5/backend-native.c | 63 ++++++++++++++-- spa/plugins/bluez5/backend-ofono.c | 109 +++++++++------------------ spa/plugins/bluez5/bluez5-dbus.c | 68 ++++++++++++++++- spa/plugins/bluez5/defs.h | 13 +++- 5 files changed, 211 insertions(+), 150 deletions(-) diff --git a/spa/plugins/bluez5/backend-hsphfpd.c b/spa/plugins/bluez5/backend-hsphfpd.c index 64bab4ae8..754f44d49 100644 --- a/spa/plugins/bluez5/backend-hsphfpd.c +++ b/spa/plugins/bluez5/backend-hsphfpd.c @@ -100,7 +100,6 @@ struct hsphfpd_endpoint { #define DBUS_INTERFACE_OBJECTMANAGER "org.freedesktop.DBus.ObjectManager" -#define HSPHFPD_SERVICE "org.hsphfpd" #define HSPHFPD_APPLICATION_MANAGER_INTERFACE HSPHFPD_SERVICE ".ApplicationManager" #define HSPHFPD_ENDPOINT_INTERFACE HSPHFPD_SERVICE ".Endpoint" #define HSPHFPD_AUDIO_AGENT_INTERFACE HSPHFPD_SERVICE ".AudioAgent" @@ -564,7 +563,7 @@ static DBusHandlerResult hsphfpd_new_audio_connection(DBusConnection *conn, DBus uint16_t rx_volume_gain = -1; uint16_t tx_volume_gain = -1; uint16_t mtu = 0; - int codec; + unsigned int codec; struct hsphfpd_endpoint *endpoint; struct spa_bt_transport *transport; struct hsphfpd_transport_data *transport_data; @@ -1208,22 +1207,39 @@ finish: dbus_pending_call_unref(pending); } -static void hsphfpd_register_application_reply(DBusPendingCall *pending, void *user_data) +int backend_hsphfpd_register(struct spa_bt_backend *backend) { - struct spa_bt_backend *backend = user_data; - DBusMessage *r; - DBusMessage *m; + DBusMessage *m, *r; + const char *path = APPLICATION_OBJECT_MANAGER_PATH; DBusPendingCall *call; + DBusError err; - r = dbus_pending_call_steal_reply(pending); - if (r == NULL) - return; + spa_log_debug(backend->log, NAME": Registering to hsphfpd"); + + m = dbus_message_new_method_call(HSPHFPD_SERVICE, "/", + HSPHFPD_APPLICATION_MANAGER_INTERFACE, "RegisterApplication"); + if (m == NULL) + return -ENOMEM; + + dbus_message_append_args(m, DBUS_TYPE_OBJECT_PATH, &path, DBUS_TYPE_INVALID); + + dbus_error_init(&err); + + r = dbus_connection_send_with_reply_and_block(backend->conn, m, -1, &err); + dbus_message_unref(m); + + if (r == NULL) { + spa_log_error(backend->log, NAME": Registering application %s failed", path); + dbus_error_free(&err); + return -EIO; + } if (dbus_message_get_type(r) == DBUS_MESSAGE_TYPE_ERROR) { spa_log_error(backend->log, NAME": RegisterApplication() failed: %s", dbus_message_get_error_name(r)); goto finish; } + dbus_message_unref(r); backend->hsphfpd_service_id = strdup(dbus_message_get_sender(r)); @@ -1238,31 +1254,24 @@ static void hsphfpd_register_application_reply(DBusPendingCall *pending, void *u dbus_pending_call_set_notify(call, hsphfpd_get_endpoints_reply, backend, NULL); dbus_message_unref(m); + return 0; + finish: dbus_message_unref(r); - dbus_pending_call_unref(pending); + return -EIO; } -static int hsphfpd_register_application(struct spa_bt_backend *backend) +void backend_hsphfpd_unregistered(struct spa_bt_backend *backend) { - DBusMessage *m; - const char *path = APPLICATION_OBJECT_MANAGER_PATH; - DBusPendingCall *call; + struct hsphfpd_endpoint *endpoint; - spa_log_debug(backend->log, NAME": Registering to hsphfpd"); - - m = dbus_message_new_method_call(HSPHFPD_SERVICE, "/", - HSPHFPD_APPLICATION_MANAGER_INTERFACE, "RegisterApplication"); - if (m == NULL) - return -ENOMEM; - - dbus_message_append_args(m, DBUS_TYPE_OBJECT_PATH, &path, DBUS_TYPE_INVALID); - - dbus_connection_send_with_reply(backend->conn, m, &call, -1); - dbus_pending_call_set_notify(call, hsphfpd_register_application_reply, backend, NULL); - dbus_message_unref(m); - - return 0; + if (backend->hsphfpd_service_id) { + free(backend->hsphfpd_service_id); + backend->hsphfpd_service_id = NULL; + } + backend->endpoints_listed = false; + spa_list_consume(endpoint, &backend->endpoint_list, link) + endpoint_free(endpoint); } static DBusHandlerResult hsphfpd_filter_cb(DBusConnection *bus, DBusMessage *m, void *user_data) @@ -1275,42 +1284,7 @@ static DBusHandlerResult hsphfpd_filter_cb(DBusConnection *bus, DBusMessage *m, sender = dbus_message_get_sender(m); - if (strcmp(sender, DBUS_SERVICE_DBUS) == 0) { - if (dbus_message_is_signal(m, "org.freedesktop.DBus", "NameOwnerChanged")) { - const char *name, *old_owner, *new_owner; - - if (!dbus_message_get_args(m, &err, - DBUS_TYPE_STRING, &name, - DBUS_TYPE_STRING, &old_owner, - DBUS_TYPE_STRING, &new_owner, - DBUS_TYPE_INVALID)) { - spa_log_error(backend->log, NAME": Failed to parse org.freedesktop.DBus.NameOwnerChanged: %s", err.message); - goto finish; - } - - if (strcmp(name, HSPHFPD_SERVICE) == 0) { - if (old_owner && *old_owner) { - struct hsphfpd_endpoint *endpoint; - - spa_log_debug(backend->log, NAME": hsphfpd disappeared"); - if (backend->hsphfpd_service_id) { - free(backend->hsphfpd_service_id); - backend->hsphfpd_service_id = NULL; - } - backend->endpoints_listed = false; - spa_list_consume(endpoint, &backend->endpoint_list, link) - endpoint_free(endpoint); - } - - if (new_owner && *new_owner) { - spa_log_debug(backend->log, NAME": hsphfpd appeared"); - hsphfpd_register_application(backend); - } - } else { - spa_log_debug(backend->log, NAME": Name owner changed %s", dbus_message_get_path(m)); - } - } - } else if (backend->hsphfpd_service_id && strcmp(sender, backend->hsphfpd_service_id) == 0) { + if (backend->hsphfpd_service_id && strcmp(sender, backend->hsphfpd_service_id) == 0) { if (dbus_message_is_signal(m, DBUS_INTERFACE_OBJECTMANAGER, "InterfacesAdded")) { DBusMessageIter arg_i; @@ -1419,10 +1393,6 @@ void backend_hsphfpd_add_filters(struct spa_bt_backend *backend) goto fail; } - dbus_bus_add_match(backend->conn, - "type='signal',sender='org.freedesktop.DBus'," - "interface='org.freedesktop.DBus',member='NameOwnerChanged'," - "arg0='" HSPHFPD_SERVICE "'", &err); dbus_bus_add_match(backend->conn, "type='signal',sender='" HSPHFPD_SERVICE "'," "interface='" DBUS_INTERFACE_OBJECTMANAGER "',member='InterfacesAdded'", &err); @@ -1516,7 +1486,5 @@ struct spa_bt_backend *backend_hsphfpd_new(struct spa_bt_monitor *monitor, return NULL; } - hsphfpd_register_application(backend); - return backend; } diff --git a/spa/plugins/bluez5/backend-native.c b/spa/plugins/bluez5/backend-native.c index 2979a0f2e..db778874f 100644 --- a/spa/plugins/bluez5/backend-native.c +++ b/spa/plugins/bluez5/backend-native.c @@ -1307,6 +1307,40 @@ static int register_profile(struct spa_bt_backend *backend, const char *profile, return 0; } +void unregister_profile(struct spa_bt_backend *backend, const char *profile) +{ + DBusMessage *m, *r; + DBusError err; + + spa_log_debug(backend->log, NAME": Unregistering Profile %s", profile); + + m = dbus_message_new_method_call(BLUEZ_SERVICE, "/org/bluez", + BLUEZ_PROFILE_MANAGER_INTERFACE, "UnregisterProfile"); + if (m == NULL) + return; + + dbus_message_append_args(m, DBUS_TYPE_OBJECT_PATH, &profile, DBUS_TYPE_INVALID); + + dbus_error_init(&err); + + r = dbus_connection_send_with_reply_and_block(backend->conn, m, -1, &err); + dbus_message_unref(m); + m = NULL; + + if (r == NULL) { + spa_log_error(backend->log, NAME": Unregistering Profile %s failed", profile); + dbus_error_free(&err); + return; + } + + if (dbus_message_get_type(r) == DBUS_MESSAGE_TYPE_ERROR) { + spa_log_error(backend->log, NAME": UnregisterProfile() returned error: %s", dbus_message_get_error_name(r)); + return; + } + + dbus_message_unref(r); +} + void backend_native_register_profiles(struct spa_bt_backend *backend) { #ifdef HAVE_BLUEZ_5_BACKEND_HSP_NATIVE @@ -1318,12 +1352,13 @@ void backend_native_register_profiles(struct spa_bt_backend *backend) register_profile(backend, PROFILE_HFP_AG, SPA_BT_UUID_HFP_AG); register_profile(backend, PROFILE_HFP_HF, SPA_BT_UUID_HFP_HF); #endif + + if (backend->enabled_profiles & SPA_BT_PROFILE_HEADSET_HEAD_UNIT) + sco_listen(backend); } -void backend_native_free(struct spa_bt_backend *backend) +void backend_native_unregister_profiles(struct spa_bt_backend *backend) { - struct rfcomm *rfcomm; - if (backend->sco.fd >= 0) { if (backend->sco.loop) spa_loop_remove_source(backend->sco.loop, &backend->sco); @@ -1332,6 +1367,25 @@ void backend_native_free(struct spa_bt_backend *backend) backend->sco.fd = -1; } +#ifdef HAVE_BLUEZ_5_BACKEND_HSP_NATIVE + if (backend->enabled_profiles & SPA_BT_PROFILE_HSP_AG) + unregister_profile(backend, PROFILE_HSP_AG); + if (backend->enabled_profiles & SPA_BT_PROFILE_HSP_HS) + unregister_profile(backend, PROFILE_HSP_HS); +#endif + +#ifdef HAVE_BLUEZ_5_BACKEND_HFP_NATIVE + if (backend->enabled_profiles & SPA_BT_PROFILE_HFP_AG) + unregister_profile(backend, PROFILE_HFP_AG); + if (backend->enabled_profiles & SPA_BT_PROFILE_HFP_HF) + unregister_profile(backend, PROFILE_HFP_HF); +#endif +} + +void backend_native_free(struct spa_bt_backend *backend) +{ + struct rfcomm *rfcomm; + #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); @@ -1450,9 +1504,6 @@ struct spa_bt_backend *backend_native_new(struct spa_bt_monitor *monitor, } #endif - if (backend->enabled_profiles & SPA_BT_PROFILE_HEADSET_HEAD_UNIT) - sco_listen(backend); - return backend; #ifdef HAVE_BLUEZ_5_BACKEND_HFP_NATIVE diff --git a/spa/plugins/bluez5/backend-ofono.c b/spa/plugins/bluez5/backend-ofono.c index 2120195c4..dfa84876d 100644 --- a/spa/plugins/bluez5/backend-ofono.c +++ b/spa/plugins/bluez5/backend-ofono.c @@ -53,7 +53,6 @@ struct spa_bt_backend { unsigned int msbc_supported:1; }; -#define OFONO_SERVICE "org.ofono" #define OFONO_HF_AUDIO_MANAGER_INTERFACE OFONO_SERVICE ".HandsfreeAudioManager" #define OFONO_HF_AUDIO_CARD_INTERFACE OFONO_SERVICE ".HandsfreeAudioCard" #define OFONO_HF_AUDIO_AGENT_INTERFACE OFONO_SERVICE ".HandsfreeAudioAgent" @@ -499,16 +498,41 @@ finish: dbus_pending_call_unref(pending); } -static void ofono_register_reply(DBusPendingCall *pending, void *user_data) +int backend_ofono_register(struct spa_bt_backend *backend) { - struct spa_bt_backend *backend = user_data; - DBusMessage *r; - DBusMessage *m; + DBusMessage *m, *r; + const char *path = OFONO_AUDIO_CLIENT; + uint8_t codecs[2]; + const uint8_t *pcodecs = codecs; + int ncodecs = 0; DBusPendingCall *call; + DBusError err; - r = dbus_pending_call_steal_reply(pending); - if (r == NULL) - return; + spa_log_debug(backend->log, NAME": Registering"); + + m = dbus_message_new_method_call(OFONO_SERVICE, "/", + OFONO_HF_AUDIO_MANAGER_INTERFACE, "Register"); + if (m == NULL) + return -ENOMEM; + + codecs[ncodecs++] = HFP_AUDIO_CODEC_CVSD; + if (backend->msbc_supported) + codecs[ncodecs++] = HFP_AUDIO_CODEC_MSBC; + + dbus_message_append_args(m, DBUS_TYPE_OBJECT_PATH, &path, + DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &pcodecs, ncodecs, + DBUS_TYPE_INVALID); + + dbus_error_init(&err); + + r = dbus_connection_send_with_reply_and_block(backend->conn, m, -1, &err); + dbus_message_unref(m); + + if (r == NULL) { + spa_log_error(backend->log, NAME": Registering Profile %s failed", path); + dbus_error_free(&err); + return -EIO; + } if (dbus_message_is_error(r, OFONO_ERROR_INVALID_ARGUMENTS)) { spa_log_warn(backend->log, NAME": invalid arguments"); @@ -531,6 +555,7 @@ static void ofono_register_reply(DBusPendingCall *pending, void *user_data) dbus_message_get_error_name(r)); goto finish; } + dbus_message_unref(r); spa_log_debug(backend->log, NAME": registered"); @@ -543,40 +568,11 @@ static void ofono_register_reply(DBusPendingCall *pending, void *user_data) dbus_pending_call_set_notify(call, ofono_getcards_reply, backend, NULL); dbus_message_unref(m); + return 0; + finish: dbus_message_unref(r); - dbus_pending_call_unref(pending); -} - -static int ofono_register(struct spa_bt_backend *backend) -{ - DBusMessage *m; - const char *path = OFONO_AUDIO_CLIENT; - uint8_t codecs[2]; - const uint8_t *pcodecs = codecs; - int ncodecs = 0; - DBusPendingCall *call; - - spa_log_debug(backend->log, NAME": Registering"); - - m = dbus_message_new_method_call(OFONO_SERVICE, "/", - OFONO_HF_AUDIO_MANAGER_INTERFACE, "Register"); - if (m == NULL) - return -ENOMEM; - - codecs[ncodecs++] = HFP_AUDIO_CODEC_CVSD; - if (backend->msbc_supported) - codecs[ncodecs++] = HFP_AUDIO_CODEC_MSBC; - - dbus_message_append_args(m, DBUS_TYPE_OBJECT_PATH, &path, - DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &pcodecs, ncodecs, - DBUS_TYPE_INVALID); - - dbus_connection_send_with_reply(backend->conn, m, &call, -1); - dbus_pending_call_set_notify(call, ofono_register_reply, backend, NULL); - dbus_message_unref(m); - - return 0; + return -EIO; } static DBusHandlerResult ofono_filter_cb(DBusConnection *bus, DBusMessage *m, void *user_data) @@ -586,32 +582,7 @@ static DBusHandlerResult ofono_filter_cb(DBusConnection *bus, DBusMessage *m, vo dbus_error_init(&err); - if (dbus_message_is_signal(m, "org.freedesktop.DBus", "NameOwnerChanged")) { - const char *name, *old_owner, *new_owner; - - if (!dbus_message_get_args(m, &err, - DBUS_TYPE_STRING, &name, - DBUS_TYPE_STRING, &old_owner, - DBUS_TYPE_STRING, &new_owner, - DBUS_TYPE_INVALID)) { - spa_log_error(backend->log, NAME": Failed to parse org.freedesktop.DBus.NameOwnerChanged: %s", err.message); - goto fail; - } - - if (strcmp(name, OFONO_SERVICE) == 0) { - if (old_owner && *old_owner) { - spa_log_debug(backend->log, NAME": disappeared"); - //ofono_bus_id_destroy(backend); - } - - if (new_owner && *new_owner) { - spa_log_debug(backend->log, NAME": appeared"); - ofono_register(backend); - } - } else { - spa_log_debug(backend->log, "Name owner changed %s", dbus_message_get_path(m)); - } - } else if (dbus_message_is_signal(m, OFONO_HF_AUDIO_MANAGER_INTERFACE, "CardAdded")) { + if (dbus_message_is_signal(m, OFONO_HF_AUDIO_MANAGER_INTERFACE, "CardAdded")) { char *p; DBusMessageIter arg_i, props_i; @@ -657,10 +628,6 @@ void backend_ofono_add_filters(struct spa_bt_backend *backend) goto fail; } - dbus_bus_add_match(backend->conn, - "type='signal',sender='org.freedesktop.DBus'," - "interface='org.freedesktop.DBus',member='NameOwnerChanged'," - "arg0='" OFONO_SERVICE "'", &err); dbus_bus_add_match(backend->conn, "type='signal',sender='" OFONO_SERVICE "'," "interface='" OFONO_HF_AUDIO_MANAGER_INTERFACE "',member='CardAdded'", &err); @@ -716,7 +683,5 @@ struct spa_bt_backend *backend_ofono_new(struct spa_bt_monitor *monitor, return NULL; } - ofono_register(backend); - return backend; } diff --git a/spa/plugins/bluez5/bluez5-dbus.c b/spa/plugins/bluez5/bluez5-dbus.c index 4a8bd1d54..e03be3b48 100644 --- a/spa/plugins/bluez5/bluez5-dbus.c +++ b/spa/plugins/bluez5/bluez5-dbus.c @@ -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; } diff --git a/spa/plugins/bluez5/defs.h b/spa/plugins/bluez5/defs.h index 6802130e4..e8fff8576 100644 --- a/spa/plugins/bluez5/defs.h +++ b/spa/plugins/bluez5/defs.h @@ -29,8 +29,10 @@ extern "C" { #endif -#include +#include +#include #include +#include #include #include "config.h" @@ -532,6 +534,7 @@ struct spa_bt_backend *backend_native_new(struct spa_bt_monitor *monitor, uint32_t n_support); void backend_native_free(struct spa_bt_backend *backend); void backend_native_register_profiles(struct spa_bt_backend *backend); +void backend_native_unregister_profiles(struct spa_bt_backend *backend); #else static inline struct spa_bt_backend *backend_native_new(struct spa_bt_monitor *monitor, void *dbus_connection, @@ -544,6 +547,7 @@ static inline void backend_native_free(struct spa_bt_backend *backend) {} static inline void backend_native_register_profiles(struct spa_bt_backend *backend) {} #endif +#define OFONO_SERVICE "org.ofono" #ifdef HAVE_BLUEZ_5_BACKEND_OFONO struct spa_bt_backend *backend_ofono_new(struct spa_bt_monitor *monitor, void *dbus_connection, @@ -551,6 +555,7 @@ struct spa_bt_backend *backend_ofono_new(struct spa_bt_monitor *monitor, const struct spa_support *support, uint32_t n_support); void backend_ofono_free(struct spa_bt_backend *backend); +int backend_ofono_register(struct spa_bt_backend *backend); void backend_ofono_add_filters(struct spa_bt_backend *backend); #else static inline struct spa_bt_backend *backend_ofono_new(struct spa_bt_monitor *monitor, @@ -561,9 +566,11 @@ static inline struct spa_bt_backend *backend_ofono_new(struct spa_bt_monitor *mo return NULL; } static inline void backend_ofono_free(struct spa_bt_backend *backend) {} +static inline int backend_ofono_register(struct spa_bt_backend *backend) { return -ENOTSUP; } static inline void backend_ofono_add_filters(struct spa_bt_backend *backend) {} #endif +#define HSPHFPD_SERVICE "org.hsphfpd" #ifdef HAVE_BLUEZ_5_BACKEND_HSPHFPD struct spa_bt_backend *backend_hsphfpd_new(struct spa_bt_monitor *monitor, void *dbus_connection, @@ -571,6 +578,8 @@ struct spa_bt_backend *backend_hsphfpd_new(struct spa_bt_monitor *monitor, const struct spa_support *support, uint32_t n_support); void backend_hsphfpd_free(struct spa_bt_backend *backend); +int backend_hsphfpd_register(struct spa_bt_backend *backend); +void backend_hsphfpd_unregistered(struct spa_bt_backend *backend); void backend_hsphfpd_add_filters(struct spa_bt_backend *backend); #else static inline struct spa_bt_backend *backend_hsphfpd_new(struct spa_bt_monitor *monitor, @@ -581,6 +590,8 @@ static inline struct spa_bt_backend *backend_hsphfpd_new(struct spa_bt_monitor * return NULL; } static inline void backend_hsphfpd_free(struct spa_bt_backend *backend) {} +static inline int backend_hsphfpd_register(struct spa_bt_backend *backend) { return -ENOTSUP; } +static inline void backend_hsphfpd_unregistered(struct spa_bt_backend *backend) {} static inline void backend_hsphfpd_add_filters(struct spa_bt_backend *backend) {} #endif