bluez 5: Build both headset backends, if available

Enable both ofono and native backends to be built into the same
libbluez5-util. Never build the null backend.

Signed-off-by: David Henningsson <david.henningsson@canonical.com>
This commit is contained in:
David Henningsson 2014-11-03 11:01:00 +01:00
parent 807c98a37d
commit 1ffede3c85
6 changed files with 67 additions and 27 deletions

View file

@ -1035,18 +1035,22 @@ AM_CONDITIONAL([HAVE_BLUEZ], [test "x$HAVE_BLUEZ" = x1])
## Bluetooth Headset profiles backend ## ## Bluetooth Headset profiles backend ##
AC_ARG_WITH(bluetooth_headset_backend, AC_ARG_ENABLE([bluez5-ofono-headset],
AS_HELP_STRING([--with-bluetooth-headset-backend=<ofono|native|null>],[Backend for Bluetooth headset profiles (native)])) AS_HELP_STRING([--disable-bluez5-ofono-headset],[Disable optional ofono headset backend support (Bluez 5)]))
if test -z "$with_bluetooth_headset_backend" ; then AS_IF([test "x$HAVE_BLUEZ_5" = "x1" && test "x$enable_bluez5_ofono_headset" != "xno"], HAVE_BLUEZ_5_OFONO_HEADSET=1)
BLUETOOTH_HEADSET_BACKEND=native AC_SUBST(HAVE_BLUEZ_5_OFONO_HEADSET)
else AM_CONDITIONAL([HAVE_BLUEZ_5_OFONO_HEADSET], [test "x$HAVE_BLUEZ_5_OFONO_HEADSET" = x1])
BLUETOOTH_HEADSET_BACKEND=$with_bluetooth_headset_backend AS_IF([test "x$HAVE_BLUEZ_5_OFONO_HEADSET" = "x1"], AC_DEFINE([HAVE_BLUEZ_5_OFONO_HEADSET], 1, [Bluez 5 ofono headset backend enabled]))
fi
AS_IF([test "x$BLUETOOTH_HEADSET_BACKEND" != "xofono" && test "x$BLUETOOTH_HEADSET_BACKEND" != "xnull" && test "x$BLUETOOTH_HEADSET_BACKEND" != "xnative"], AC_ARG_ENABLE([bluez5-native-headset],
[AC_MSG_ERROR([*** Invalid Bluetooth Headset backend])]) AS_HELP_STRING([--disable-bluez5-native-headset],[Disable optional native headset backend support (Bluez 5)]))
AS_IF([test "x$HAVE_BLUEZ_5" = "x1" && test "x$enable_bluez5_native_headset" != "xno"], HAVE_BLUEZ_5_NATIVE_HEADSET=1)
AS_IF([test "x$HAVE_BLUEZ_5_NATIVE_HEADSET" = "x1"], [PKG_CHECK_MODULES(BLUEZ, [ bluez >= 4.101 ], [],
[AC_MSG_ERROR([*** Bluez library not found (required by native headset backend)])])])
AC_SUBST(BLUETOOTH_HEADSET_BACKEND) AC_SUBST(HAVE_BLUEZ_5_NATIVE_HEADSET)
AM_CONDITIONAL([HAVE_BLUEZ_5_NATIVE_HEADSET], [test "x$HAVE_BLUEZ_5_NATIVE_HEADSET" = x1])
AS_IF([test "x$HAVE_BLUEZ_5_NATIVE_HEADSET" = "x1"], AC_DEFINE([HAVE_BLUEZ_5_NATIVE_HEADSET], 1, [Bluez 5 native headset backend enabled]))
#### UDEV support (optional) #### #### UDEV support (optional) ####
@ -1509,6 +1513,8 @@ AS_IF([test "x$HAVE_SYSTEMD_LOGIN" = "x1"], ENABLE_SYSTEMD_LOGIN=yes, ENABLE_SYS
AS_IF([test "x$HAVE_SYSTEMD_JOURNAL" = "x1"], ENABLE_SYSTEMD_JOURNAL=yes, ENABLE_SYSTEMD_JOURNAL=no) AS_IF([test "x$HAVE_SYSTEMD_JOURNAL" = "x1"], ENABLE_SYSTEMD_JOURNAL=yes, ENABLE_SYSTEMD_JOURNAL=no)
AS_IF([test "x$HAVE_BLUEZ_4" = "x1"], ENABLE_BLUEZ_4=yes, ENABLE_BLUEZ_4=no) AS_IF([test "x$HAVE_BLUEZ_4" = "x1"], ENABLE_BLUEZ_4=yes, ENABLE_BLUEZ_4=no)
AS_IF([test "x$HAVE_BLUEZ_5" = "x1"], ENABLE_BLUEZ_5=yes, ENABLE_BLUEZ_5=no) AS_IF([test "x$HAVE_BLUEZ_5" = "x1"], ENABLE_BLUEZ_5=yes, ENABLE_BLUEZ_5=no)
AS_IF([test "x$HAVE_BLUEZ_5_OFONO_HEADSET" = "x1"], ENABLE_BLUEZ_5_OFONO_HEADSET=yes, ENABLE_BLUEZ_5_OFONO_HEADSET=no)
AS_IF([test "x$HAVE_BLUEZ_5_NATIVE_HEADSET" = "x1"], ENABLE_BLUEZ_5_NATIVE_HEADSET=yes, ENABLE_BLUEZ_5_NATIVE_HEADSET=no)
AS_IF([test "x$HAVE_HAL_COMPAT" = "x1"], ENABLE_HAL_COMPAT=yes, ENABLE_HAL_COMPAT=no) AS_IF([test "x$HAVE_HAL_COMPAT" = "x1"], ENABLE_HAL_COMPAT=yes, ENABLE_HAL_COMPAT=no)
AS_IF([test "x$HAVE_TCPWRAP" = "x1"], ENABLE_TCPWRAP=yes, ENABLE_TCPWRAP=no) AS_IF([test "x$HAVE_TCPWRAP" = "x1"], ENABLE_TCPWRAP=yes, ENABLE_TCPWRAP=no)
AS_IF([test "x$HAVE_LIBSAMPLERATE" = "x1"], ENABLE_LIBSAMPLERATE=yes, ENABLE_LIBSAMPLERATE=no) AS_IF([test "x$HAVE_LIBSAMPLERATE" = "x1"], ENABLE_LIBSAMPLERATE=yes, ENABLE_LIBSAMPLERATE=no)
@ -1563,7 +1569,8 @@ echo "
Enable D-Bus: ${ENABLE_DBUS} Enable D-Bus: ${ENABLE_DBUS}
Enable BlueZ 4: ${ENABLE_BLUEZ_4} Enable BlueZ 4: ${ENABLE_BLUEZ_4}
Enable BlueZ 5: ${ENABLE_BLUEZ_5} Enable BlueZ 5: ${ENABLE_BLUEZ_5}
headset backend: ${BLUETOOTH_HEADSET_BACKEND} Enable ofono headsets: ${ENABLE_BLUEZ_5_OFONO_HEADSET}
Enable native headsets: ${ENABLE_BLUEZ_5_NATIVE_HEADSET}
Enable udev: ${ENABLE_UDEV} Enable udev: ${ENABLE_UDEV}
Enable HAL->udev compat: ${ENABLE_HAL_COMPAT} Enable HAL->udev compat: ${ENABLE_HAL_COMPAT}
Enable systemd Enable systemd

View file

@ -2129,8 +2129,16 @@ module_bluez4_device_la_CFLAGS = $(AM_CFLAGS) $(DBUS_CFLAGS) $(SBC_CFLAGS)
libbluez5_util_la_SOURCES = \ libbluez5_util_la_SOURCES = \
modules/bluetooth/bluez5-util.c \ modules/bluetooth/bluez5-util.c \
modules/bluetooth/bluez5-util.h \ modules/bluetooth/bluez5-util.h \
modules/bluetooth/a2dp-codecs.h \ modules/bluetooth/a2dp-codecs.h
modules/bluetooth/backend-@BLUETOOTH_HEADSET_BACKEND@.c if HAVE_BLUEZ_5_OFONO_HEADSET
libbluez5_util_la_SOURCES += \
modules/bluetooth/backend-ofono.c
endif
if HAVE_BLUEZ_5_NATIVE_HEADSET
libbluez5_util_la_SOURCES += \
modules/bluetooth/backend-native.c
endif
libbluez5_util_la_LDFLAGS = -avoid-version libbluez5_util_la_LDFLAGS = -avoid-version
libbluez5_util_la_LIBADD = $(MODULE_LIBADD) $(DBUS_LIBS) libbluez5_util_la_LIBADD = $(MODULE_LIBADD) $(DBUS_LIBS)
libbluez5_util_la_CFLAGS = $(AM_CFLAGS) $(DBUS_CFLAGS) libbluez5_util_la_CFLAGS = $(AM_CFLAGS) $(DBUS_CFLAGS)

View file

@ -464,7 +464,7 @@ static void profile_done(pa_bluetooth_backend *b, pa_bluetooth_profile_t profile
} }
} }
pa_bluetooth_backend *pa_bluetooth_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 *backend; pa_bluetooth_backend *backend;
DBusError err; DBusError err;
@ -488,7 +488,7 @@ pa_bluetooth_backend *pa_bluetooth_backend_new(pa_core *c, pa_bluetooth_discover
return backend; return backend;
} }
void pa_bluetooth_backend_free(pa_bluetooth_backend *backend) { void pa_bluetooth_native_backend_free(pa_bluetooth_backend *backend) {
pa_assert(backend); pa_assert(backend);
pa_dbus_free_pending_list(&backend->pending); pa_dbus_free_pending_list(&backend->pending);

View file

@ -582,7 +582,7 @@ static DBusHandlerResult hf_audio_agent_handler(DBusConnection *c, DBusMessage *
return DBUS_HANDLER_RESULT_HANDLED; return DBUS_HANDLER_RESULT_HANDLED;
} }
pa_bluetooth_backend *pa_bluetooth_backend_new(pa_core *c, pa_bluetooth_discovery *y) { pa_bluetooth_backend *pa_bluetooth_ofono_backend_new(pa_core *c, pa_bluetooth_discovery *y) {
pa_bluetooth_backend *backend; pa_bluetooth_backend *backend;
DBusError err; DBusError err;
static const DBusObjectPathVTable vtable_hf_audio_agent = { static const DBusObjectPathVTable vtable_hf_audio_agent = {
@ -635,7 +635,7 @@ pa_bluetooth_backend *pa_bluetooth_backend_new(pa_core *c, pa_bluetooth_discover
return backend; return backend;
} }
void pa_bluetooth_backend_free(pa_bluetooth_backend *backend) { void pa_bluetooth_ofono_backend_free(pa_bluetooth_backend *backend) {
pa_assert(backend); pa_assert(backend);
pa_dbus_free_pending_list(&backend->pending); pa_dbus_free_pending_list(&backend->pending);

View file

@ -87,7 +87,7 @@ struct pa_bluetooth_discovery {
pa_hashmap *devices; pa_hashmap *devices;
pa_hashmap *transports; pa_hashmap *transports;
pa_bluetooth_backend *backend; pa_bluetooth_backend *ofono_backend, *native_backend;
PA_LLIST_HEAD(pa_dbus_pending, pending); PA_LLIST_HEAD(pa_dbus_pending, pending);
}; };
@ -899,8 +899,10 @@ static void get_managed_objects_reply(DBusPendingCall *pending, void *userdata)
y->objects_listed = true; y->objects_listed = true;
if (!y->backend) if (!y->ofono_backend)
y->backend = pa_bluetooth_backend_new(y->core, y); y->ofono_backend = pa_bluetooth_ofono_backend_new(y->core, y);
if (!y->ofono_backend && !y->native_backend)
y->native_backend = pa_bluetooth_native_backend_new(y->core, y);
finish: finish:
dbus_message_unref(r); dbus_message_unref(r);
@ -954,9 +956,13 @@ static DBusHandlerResult filter_cb(DBusConnection *bus, DBusMessage *m, void *us
pa_hashmap_remove_all(y->devices); pa_hashmap_remove_all(y->devices);
pa_hashmap_remove_all(y->adapters); pa_hashmap_remove_all(y->adapters);
y->objects_listed = false; y->objects_listed = false;
if (y->backend) { if (y->ofono_backend) {
pa_bluetooth_backend_free(y->backend); pa_bluetooth_ofono_backend_free(y->ofono_backend);
y->backend = NULL; y->ofono_backend = NULL;
}
if (y->native_backend) {
pa_bluetooth_native_backend_free(y->native_backend);
y->native_backend = NULL;
} }
} }
@ -1648,8 +1654,10 @@ void pa_bluetooth_discovery_unref(pa_bluetooth_discovery *y) {
pa_hashmap_free(y->transports); pa_hashmap_free(y->transports);
} }
if (y->backend) if (y->ofono_backend)
pa_bluetooth_backend_free(y->backend); pa_bluetooth_ofono_backend_free(y->ofono_backend);
if (y->native_backend)
pa_bluetooth_native_backend_free(y->native_backend);
if (y->connection) { if (y->connection) {

View file

@ -117,8 +117,25 @@ struct pa_bluetooth_adapter {
bool valid; bool valid;
}; };
pa_bluetooth_backend *pa_bluetooth_backend_new(pa_core *c, pa_bluetooth_discovery *y); #ifdef HAVE_BLUEZ_5_OFONO_HEADSET
void pa_bluetooth_backend_free(pa_bluetooth_backend *b); pa_bluetooth_backend *pa_bluetooth_ofono_backend_new(pa_core *c, pa_bluetooth_discovery *y);
void pa_bluetooth_ofono_backend_free(pa_bluetooth_backend *b);
#else
static inline pa_bluetooth_backend *pa_bluetooth_ofono_backend_new(pa_core *c, pa_bluetooth_discovery *y) {
return NULL;
}
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);
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) {
return NULL;
}
static inline void pa_bluetooth_native_backend_free(pa_bluetooth_backend *b) {}
#endif
pa_bluetooth_transport *pa_bluetooth_transport_new(pa_bluetooth_device *d, const char *owner, const char *path, pa_bluetooth_transport *pa_bluetooth_transport_new(pa_bluetooth_device *d, const char *owner, const char *path,
pa_bluetooth_profile_t p, const uint8_t *config, size_t size); pa_bluetooth_profile_t p, const uint8_t *config, size_t size);