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