[pulseaudio-discuss] [PATCH 2/3] bluetooth: use native and ofono backends in parallel with headset=auto
Georg Chini
georg at chini.tk
Thu Mar 2 16:04:10 UTC 2017
This patch changes the behavior of the headset=auto switch for module-bluez5-discover.
With headset=auto now both backends will be active at the same time for the AG role and
the switching between the backends is only done for the HS role.
headset=ofono and headset=native remain unchanged.
This allows to use old HSP only headsets while running ofono and to have headset support
via pulseaudio if ofono is started with the --noplugin=hfp_ag_bluez5 option.
---
src/modules/bluetooth/backend-native.c | 24 +++++++++++++++++++++---
src/modules/bluetooth/bluez5-util.c | 10 +++-------
src/modules/bluetooth/bluez5-util.h | 4 ++--
3 files changed, 26 insertions(+), 12 deletions(-)
diff --git a/src/modules/bluetooth/backend-native.c b/src/modules/bluetooth/backend-native.c
index 71f1773..7573b89 100644
--- a/src/modules/bluetooth/backend-native.c
+++ b/src/modules/bluetooth/backend-native.c
@@ -40,6 +40,7 @@ struct pa_bluetooth_backend {
pa_core *core;
pa_dbus_connection *connection;
pa_bluetooth_discovery *discovery;
+ bool enable_hs_role;
PA_LLIST_HEAD(pa_dbus_pending, pending);
};
@@ -653,10 +654,24 @@ static void profile_done(pa_bluetooth_backend *b, pa_bluetooth_profile_t profile
}
}
-pa_bluetooth_backend *pa_bluetooth_native_backend_new(pa_core *c, pa_bluetooth_discovery *y) {
+pa_bluetooth_backend *pa_bluetooth_native_backend_new(pa_core *c, pa_bluetooth_discovery *y, pa_bluetooth_backend *native_backend, bool enable_hs_role) {
pa_bluetooth_backend *backend;
DBusError err;
+ /* If the backend already exists just switch the HS role on or off */
+ if (native_backend) {
+ if (enable_hs_role == native_backend->enable_hs_role)
+ return native_backend;
+
+ if (enable_hs_role)
+ profile_init(native_backend, PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY);
+ else
+ profile_done(native_backend, PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY);
+
+ native_backend->enable_hs_role = enable_hs_role;
+ return native_backend;
+ }
+
pa_log_debug("Bluetooth Headset Backend API support using the native backend");
backend = pa_xnew0(pa_bluetooth_backend, 1);
@@ -671,8 +686,10 @@ pa_bluetooth_backend *pa_bluetooth_native_backend_new(pa_core *c, pa_bluetooth_d
}
backend->discovery = y;
+ backend->enable_hs_role = enable_hs_role;
- profile_init(backend, PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY);
+ if (enable_hs_role)
+ profile_init(backend, PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY);
profile_init(backend, PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT);
return backend;
@@ -683,7 +700,8 @@ void pa_bluetooth_native_backend_free(pa_bluetooth_backend *backend) {
pa_dbus_free_pending_list(&backend->pending);
- profile_done(backend, PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY);
+ if (backend->enable_hs_role)
+ profile_done(backend, PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY);
profile_done(backend, PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT);
pa_dbus_connection_unref(backend->connection);
diff --git a/src/modules/bluetooth/bluez5-util.c b/src/modules/bluetooth/bluez5-util.c
index 7d63f35..46ba22e 100644
--- a/src/modules/bluetooth/bluez5-util.c
+++ b/src/modules/bluetooth/bluez5-util.c
@@ -982,12 +982,8 @@ void pa_bluetooth_discovery_set_ofono_running(pa_bluetooth_discovery *y, bool is
if (y->headset_backend != HEADSET_BACKEND_AUTO)
return;
- if (is_running && y->native_backend) {
- pa_bluetooth_native_backend_free(y->native_backend);
- y->native_backend = NULL;
- }
- else if (!is_running && !y->native_backend)
- y->native_backend = pa_bluetooth_native_backend_new(y->core, y);
+ y->native_backend = pa_bluetooth_native_backend_new(y->core, y, y->native_backend, !is_running);
+
}
static void get_managed_objects_reply(DBusPendingCall *pending, void *userdata) {
@@ -1031,7 +1027,7 @@ static void get_managed_objects_reply(DBusPendingCall *pending, void *userdata)
if (!y->ofono_backend && y->headset_backend != HEADSET_BACKEND_NATIVE)
y->ofono_backend = pa_bluetooth_ofono_backend_new(y->core, y);
if (!y->ofono_backend && !y->native_backend && y->headset_backend != HEADSET_BACKEND_OFONO)
- y->native_backend = pa_bluetooth_native_backend_new(y->core, y);
+ y->native_backend = pa_bluetooth_native_backend_new(y->core, y, y->native_backend, true);
finish:
dbus_message_unref(r);
diff --git a/src/modules/bluetooth/bluez5-util.h b/src/modules/bluetooth/bluez5-util.h
index ef0c731..15376c0 100644
--- a/src/modules/bluetooth/bluez5-util.h
+++ b/src/modules/bluetooth/bluez5-util.h
@@ -129,10 +129,10 @@ static inline void pa_bluetooth_ofono_backend_free(pa_bluetooth_backend *b) {}
#endif
#ifdef HAVE_BLUEZ_5_NATIVE_HEADSET
-pa_bluetooth_backend *pa_bluetooth_native_backend_new(pa_core *c, pa_bluetooth_discovery *y);
+pa_bluetooth_backend *pa_bluetooth_native_backend_new(pa_core *c, pa_bluetooth_discovery *y, pa_bluetooth_backend *native_backend, bool enable_hs_role);
void pa_bluetooth_native_backend_free(pa_bluetooth_backend *b);
#else
-static inline pa_bluetooth_backend *pa_bluetooth_native_backend_new(pa_core *c, pa_bluetooth_discovery *y) {
+static inline pa_bluetooth_backend *pa_bluetooth_native_backend_new(pa_core *c, pa_bluetooth_discovery *y, pa_bluetooth_backend *native_backend, bool enable_hs_role) {
return NULL;
}
static inline void pa_bluetooth_native_backend_free(pa_bluetooth_backend *b) {}
--
2.10.1
More information about the pulseaudio-discuss
mailing list