From: Luiz Augusto von Dentz <luiz.von.dentz@xxxxxxxxx> Since there is no longer support for BlueZ 4 it makes no sense to keep BlueZ 5 modules separated. --- configure.ac | 68 ++++---- src/Makefile.am | 59 +++---- src/modules/bluetooth/backend-native.c | 2 +- src/modules/bluetooth/backend-ofono.c | 2 +- .../bluetooth/{bluez5-util.c => bluez-util.c} | 10 +- .../bluetooth/{bluez5-util.h => bluez-util.h} | 8 +- ...e-bluez5-device.c => module-bluetooth-device.c} | 6 +- src/modules/bluetooth/module-bluetooth-discover.c | 136 +++++++++++++--- src/modules/bluetooth/module-bluez5-discover.c | 174 --------------------- 9 files changed, 186 insertions(+), 279 deletions(-) rename src/modules/bluetooth/{bluez5-util.c => bluez-util.c} (99%) rename src/modules/bluetooth/{bluez5-util.h => bluez-util.h} (98%) rename src/modules/bluetooth/{module-bluez5-device.c => module-bluetooth-device.c} (99%) delete mode 100644 src/modules/bluetooth/module-bluez5-discover.c diff --git a/configure.ac b/configure.ac index 30e776a..e387b7d 100644 --- a/configure.ac +++ b/configure.ac @@ -1037,46 +1037,42 @@ AX_DEFINE_DIR(PA_MACHINE_ID_FALLBACK, PA_MACHINE_ID_FALLBACK, #### BlueZ support (optional, dependent on D-Bus and SBC) #### -AC_ARG_ENABLE([bluez5], - AS_HELP_STRING([--disable-bluez5],[Disable optional BlueZ 5 support])) +AC_ARG_ENABLE([bluez], + AS_HELP_STRING([--disable-bluez],[Disable optional BlueZ support])) ## SBC ## -AS_IF([test "x$enable_bluez5" != "xno"], +AS_IF([test "x$enable_bluez" != "xno"], [PKG_CHECK_MODULES(SBC, [ sbc >= 1.0 ], HAVE_SBC=1, HAVE_SBC=0)], HAVE_SBC=0) -## BlueZ 5 ## -AS_IF([test "x$enable_bluez5" != "xno" && test "x$HAVE_DBUS" = "x1" && test "x$HAVE_SBC" = "x1"], HAVE_BLUEZ_5=1, - HAVE_BLUEZ_5=0) -AS_IF([test "x$enable_bluez5" = "xyes" && test "x$HAVE_BLUEZ_5" != "x1"], - [AC_MSG_ERROR([*** BLUEZ 5 support not found (requires sbc and D-Bus)])]) -AC_SUBST(HAVE_BLUEZ_5) -AM_CONDITIONAL([HAVE_BLUEZ_5], [test "x$HAVE_BLUEZ_5" = x1]) - -AS_IF([test "x$HAVE_BLUEZ_5" = "x1"], HAVE_BLUEZ=1, HAVE_BLUEZ=0) +## BlueZ ## +AS_IF([test "x$enable_bluez" != "xno" && test "x$HAVE_DBUS" = "x1" && test "x$HAVE_SBC" = "x1"], HAVE_BLUEZ=1, + HAVE_BLUEZ=0) +AS_IF([test "x$enable_bluez" = "xyes" && test "x$HAVE_BLUEZ" != "x1"], + [AC_MSG_ERROR([*** BLUEZ support not found (requires sbc and D-Bus)])]) AC_SUBST(HAVE_BLUEZ) AM_CONDITIONAL([HAVE_BLUEZ], [test "x$HAVE_BLUEZ" = x1]) ## Bluetooth Headset profiles backend ## -AC_ARG_ENABLE([bluez5-ofono-headset], - AS_HELP_STRING([--disable-bluez5-ofono-headset],[Disable optional ofono headset backend support (Bluez 5)])) -AS_IF([test "x$HAVE_BLUEZ_5" = "x1" && test "x$enable_bluez5_ofono_headset" != "xno"], HAVE_BLUEZ_5_OFONO_HEADSET=1, - HAVE_BLUEZ_5_OFONO_HEADSET=0) -AC_SUBST(HAVE_BLUEZ_5_OFONO_HEADSET) -AM_CONDITIONAL([HAVE_BLUEZ_5_OFONO_HEADSET], [test "x$HAVE_BLUEZ_5_OFONO_HEADSET" = x1]) -AS_IF([test "x$HAVE_BLUEZ_5_OFONO_HEADSET" = "x1"], AC_DEFINE([HAVE_BLUEZ_5_OFONO_HEADSET], 1, [Bluez 5 ofono headset backend enabled])) - -AC_ARG_ENABLE([bluez5-native-headset], - 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"], - [PKG_CHECK_MODULES(BLUEZ, [ bluez >= 4.101 ], HAVE_BLUEZ_5_NATIVE_HEADSET=1, HAVE_BLUEZ_5_NATIVE_HEADSET=0)], - HAVE_BLUEZ_5_NATIVE_HEADSET=0) -AS_IF([test "x$enable_bluez5_native_headset" = "xyes" && test "x$HAVE_BLUEZ_5_NATIVE_HEADSET" = "x0"], - [AC_MSG_ERROR([*** BlueZ 5 native headset backend support not available (requires the libbluetooth headers)])]) -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])) +AC_ARG_ENABLE([bluez-ofono-headset], + AS_HELP_STRING([--disable-bluez-ofono-headset],[Disable optional ofono headset backend support (Bluez 5)])) +AS_IF([test "x$HAVE_BLUEZ" = "x1" && test "x$enable_bluez_ofono_headset" != "xno"], HAVE_BLUEZ_OFONO_HEADSET=1, + HAVE_BLUEZ_OFONO_HEADSET=0) +AC_SUBST(HAVE_BLUEZ_OFONO_HEADSET) +AM_CONDITIONAL([HAVE_BLUEZ_OFONO_HEADSET], [test "x$HAVE_BLUEZ_OFONO_HEADSET" = x1]) +AS_IF([test "x$HAVE_BLUEZ_OFONO_HEADSET" = "x1"], AC_DEFINE([HAVE_BLUEZ_OFONO_HEADSET], 1, [Bluez 5 ofono headset backend enabled])) + +AC_ARG_ENABLE([bluez-native-headset], + AS_HELP_STRING([--disable-bluez-native-headset],[Disable optional native headset backend support (Bluez 5)])) +AS_IF([test "x$HAVE_BLUEZ" = "x1" && test "x$enable_bluez_native_headset" != "xno"], + [PKG_CHECK_MODULES(BLUEZ, [ bluez >= 5.0 ], HAVE_BLUEZ_NATIVE_HEADSET=1, HAVE_BLUEZ_NATIVE_HEADSET=0)], + HAVE_BLUEZ_NATIVE_HEADSET=0) +AS_IF([test "x$enable_bluez_native_headset" = "xyes" && test "x$HAVE_BLUEZ_NATIVE_HEADSET" = "x0"], + [AC_MSG_ERROR([*** BlueZ native headset backend support not available (requires the libbluetooth headers)])]) +AC_SUBST(HAVE_BLUEZ_NATIVE_HEADSET) +AM_CONDITIONAL([HAVE_BLUEZ_NATIVE_HEADSET], [test "x$HAVE_BLUEZ_NATIVE_HEADSET" = x1]) +AS_IF([test "x$HAVE_BLUEZ_NATIVE_HEADSET" = "x1"], AC_DEFINE([HAVE_BLUEZ_NATIVE_HEADSET], 1, [Bluez 5 native headset backend enabled])) #### UDEV support (optional) #### @@ -1555,9 +1551,9 @@ AS_IF([test "x$HAVE_UDEV" = "x1"], ENABLE_UDEV=yes, ENABLE_UDEV=no) AS_IF([test "x$HAVE_SYSTEMD_DAEMON" = "x1"], ENABLE_SYSTEMD_DAEMON=yes, ENABLE_SYSTEMD_DAEMON=no) AS_IF([test "x$HAVE_SYSTEMD_LOGIN" = "x1"], ENABLE_SYSTEMD_LOGIN=yes, ENABLE_SYSTEMD_LOGIN=no) AS_IF([test "x$HAVE_SYSTEMD_JOURNAL" = "x1"], ENABLE_SYSTEMD_JOURNAL=yes, ENABLE_SYSTEMD_JOURNAL=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_BLUEZ" = "x1"], ENABLE_BLUEZ=yes, ENABLE_BLUEZ=no) +AS_IF([test "x$HAVE_BLUEZ_OFONO_HEADSET" = "x1"], ENABLE_BLUEZ_OFONO_HEADSET=yes, ENABLE_BLUEZ_OFONO_HEADSET=no) +AS_IF([test "x$HAVE_BLUEZ_NATIVE_HEADSET" = "x1"], ENABLE_BLUEZ_NATIVE_HEADSET=yes, ENABLE_BLUEZ_NATIVE_HEADSET=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_LIBSAMPLERATE" = "x1"], ENABLE_LIBSAMPLERATE="yes (DEPRECATED)", ENABLE_LIBSAMPLERATE=no) @@ -1612,9 +1608,9 @@ echo " Enable Async DNS: ${ENABLE_LIBASYNCNS} Enable LIRC: ${ENABLE_LIRC} Enable D-Bus: ${ENABLE_DBUS} - Enable BlueZ 5: ${ENABLE_BLUEZ_5} - Enable ofono headsets: ${ENABLE_BLUEZ_5_OFONO_HEADSET} - Enable native headsets: ${ENABLE_BLUEZ_5_NATIVE_HEADSET} + Enable BlueZ: ${ENABLE_BLUEZ} + Enable ofono headsets: ${ENABLE_BLUEZ_OFONO_HEADSET} + Enable native headsets: ${ENABLE_BLUEZ_NATIVE_HEADSET} Enable udev: ${ENABLE_UDEV} Enable HAL->udev compat: ${ENABLE_HAL_COMPAT} Enable systemd diff --git a/src/Makefile.am b/src/Makefile.am index 96caed2..eae1d2e 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1430,14 +1430,9 @@ endif if HAVE_BLUEZ modlibexec_LTLIBRARIES += \ module-bluetooth-discover.la \ - module-bluetooth-policy.la -endif - -if HAVE_BLUEZ_5 -modlibexec_LTLIBRARIES += \ - libbluez5-util.la \ - module-bluez5-discover.la \ - module-bluez5-device.la + module-bluetooth-policy.la \ + libbluez-util.la \ + module-bluetooth-device.la endif # RAOP depends on RTP, and we don't support RTP on Windows, see comment at @@ -1531,8 +1526,8 @@ SYMDEF_FILES = \ module-systemd-login-symdef.h \ module-bluetooth-policy-symdef.h \ module-bluetooth-discover-symdef.h \ - module-bluez5-discover-symdef.h \ - module-bluez5-device-symdef.h \ + module-bluetooth-discover-symdef.h \ + module-bluetooth-device-symdef.h \ module-raop-sink-symdef.h \ module-raop-discover-symdef.h \ module-gconf-symdef.h \ @@ -2131,39 +2126,33 @@ module_bluetooth_policy_la_LDFLAGS = $(MODULE_LDFLAGS) module_bluetooth_policy_la_LIBADD = $(MODULE_LIBADD) module_bluetooth_policy_la_CFLAGS = $(AM_CFLAGS) $(DBUS_CFLAGS) -# Bluetooth discover -module_bluetooth_discover_la_SOURCES = modules/bluetooth/module-bluetooth-discover.c -module_bluetooth_discover_la_LDFLAGS = $(MODULE_LDFLAGS) -module_bluetooth_discover_la_LIBADD = $(MODULE_LIBADD) -module_bluetooth_discover_la_CFLAGS = $(AM_CFLAGS) - -# Bluetooth BlueZ 5 sink / source -libbluez5_util_la_SOURCES = \ - modules/bluetooth/bluez5-util.c \ - modules/bluetooth/bluez5-util.h \ +# Bluetooth BlueZ sink / source +libbluez_util_la_SOURCES = \ + modules/bluetooth/bluez-util.c \ + modules/bluetooth/bluez-util.h \ modules/bluetooth/a2dp-codecs.h -if HAVE_BLUEZ_5_OFONO_HEADSET -libbluez5_util_la_SOURCES += \ +if HAVE_BLUEZ_OFONO_HEADSET +libbluez_util_la_SOURCES += \ modules/bluetooth/backend-ofono.c endif -if HAVE_BLUEZ_5_NATIVE_HEADSET -libbluez5_util_la_SOURCES += \ +if HAVE_BLUEZ_NATIVE_HEADSET +libbluez_util_la_SOURCES += \ modules/bluetooth/backend-native.c endif -libbluez5_util_la_LDFLAGS = -avoid-version -libbluez5_util_la_LIBADD = $(MODULE_LIBADD) $(DBUS_LIBS) -libbluez5_util_la_CFLAGS = $(AM_CFLAGS) $(DBUS_CFLAGS) +libbluez_util_la_LDFLAGS = -avoid-version +libbluez_util_la_LIBADD = $(MODULE_LIBADD) $(DBUS_LIBS) +libbluez_util_la_CFLAGS = $(AM_CFLAGS) $(DBUS_CFLAGS) -module_bluez5_discover_la_SOURCES = modules/bluetooth/module-bluez5-discover.c -module_bluez5_discover_la_LDFLAGS = $(MODULE_LDFLAGS) -module_bluez5_discover_la_LIBADD = $(MODULE_LIBADD) $(DBUS_LIBS) libbluez5-util.la -module_bluez5_discover_la_CFLAGS = $(AM_CFLAGS) $(DBUS_CFLAGS) +module_bluetooth_discover_la_SOURCES = modules/bluetooth/module-bluetooth-discover.c +module_bluetooth_discover_la_LDFLAGS = $(MODULE_LDFLAGS) +module_bluetooth_discover_la_LIBADD = $(MODULE_LIBADD) $(DBUS_LIBS) libbluez-util.la +module_bluetooth_discover_la_CFLAGS = $(AM_CFLAGS) $(DBUS_CFLAGS) -module_bluez5_device_la_SOURCES = modules/bluetooth/module-bluez5-device.c -module_bluez5_device_la_LDFLAGS = $(MODULE_LDFLAGS) -module_bluez5_device_la_LIBADD = $(MODULE_LIBADD) $(SBC_LIBS) libbluez5-util.la -module_bluez5_device_la_CFLAGS = $(AM_CFLAGS) $(SBC_CFLAGS) +module_bluetooth_device_la_SOURCES = modules/bluetooth/module-bluetooth-device.c +module_bluetooth_device_la_LDFLAGS = $(MODULE_LDFLAGS) +module_bluetooth_device_la_LIBADD = $(MODULE_LIBADD) $(SBC_LIBS) libbluez-util.la +module_bluetooth_device_la_CFLAGS = $(AM_CFLAGS) $(SBC_CFLAGS) # Apple Airtunes/RAOP module_raop_sink_la_SOURCES = modules/raop/module-raop-sink.c diff --git a/src/modules/bluetooth/backend-native.c b/src/modules/bluetooth/backend-native.c index 6eb4e16..ea46240 100644 --- a/src/modules/bluetooth/backend-native.c +++ b/src/modules/bluetooth/backend-native.c @@ -34,7 +34,7 @@ #include <bluetooth/bluetooth.h> #include <bluetooth/sco.h> -#include "bluez5-util.h" +#include "bluez-util.h" struct pa_bluetooth_backend { pa_core *core; diff --git a/src/modules/bluetooth/backend-ofono.c b/src/modules/bluetooth/backend-ofono.c index d098402..7dda39c 100644 --- a/src/modules/bluetooth/backend-ofono.c +++ b/src/modules/bluetooth/backend-ofono.c @@ -29,7 +29,7 @@ #include <pulsecore/shared.h> #include <pulsecore/core-error.h> -#include "bluez5-util.h" +#include "bluez-util.h" #define HFP_AUDIO_CODEC_CVSD 0x01 #define HFP_AUDIO_CODEC_MSBC 0x02 diff --git a/src/modules/bluetooth/bluez5-util.c b/src/modules/bluetooth/bluez-util.c similarity index 99% rename from src/modules/bluetooth/bluez5-util.c rename to src/modules/bluetooth/bluez-util.c index 8956fb1..cb9b778 100644 --- a/src/modules/bluetooth/bluez5-util.c +++ b/src/modules/bluetooth/bluez-util.c @@ -35,7 +35,7 @@ #include "a2dp-codecs.h" -#include "bluez5-util.h" +#include "bluez-util.h" #define WAIT_FOR_PROFILES_TIMEOUT_USEC (3 * PA_USEC_PER_SEC) @@ -347,7 +347,7 @@ void pa_bluetooth_transport_free(pa_bluetooth_transport *t) { pa_xfree(t); } -static int bluez5_transport_acquire_cb(pa_bluetooth_transport *t, bool optional, size_t *imtu, size_t *omtu) { +static int bluez_transport_acquire_cb(pa_bluetooth_transport *t, bool optional, size_t *imtu, size_t *omtu) { DBusMessage *m, *r; DBusError err; int ret; @@ -392,7 +392,7 @@ finish: return ret; } -static void bluez5_transport_release_cb(pa_bluetooth_transport *t) { +static void bluez_transport_release_cb(pa_bluetooth_transport *t) { DBusMessage *m; DBusError err; @@ -1457,8 +1457,8 @@ static DBusMessage *endpoint_set_configuration(DBusConnection *conn, DBusMessage dbus_message_unref(r); t = pa_bluetooth_transport_new(d, sender, path, p, config, size); - t->acquire = bluez5_transport_acquire_cb; - t->release = bluez5_transport_release_cb; + t->acquire = bluez_transport_acquire_cb; + t->release = bluez_transport_release_cb; pa_bluetooth_transport_put(t); pa_log_debug("Transport %s available for profile %s", t->path, pa_bluetooth_profile_to_string(t->profile)); diff --git a/src/modules/bluetooth/bluez5-util.h b/src/modules/bluetooth/bluez-util.h similarity index 98% rename from src/modules/bluetooth/bluez5-util.h rename to src/modules/bluetooth/bluez-util.h index a3e7bf3..42d084a 100644 --- a/src/modules/bluetooth/bluez5-util.h +++ b/src/modules/bluetooth/bluez-util.h @@ -1,5 +1,5 @@ -#ifndef foobluez5utilhfoo -#define foobluez5utilhfoo +#ifndef foobluezutilhfoo +#define foobluezutilhfoo /*** This file is part of PulseAudio. @@ -118,7 +118,7 @@ struct pa_bluetooth_adapter { bool valid; }; -#ifdef HAVE_BLUEZ_5_OFONO_HEADSET +#ifdef HAVE_BLUEZ_OFONO_HEADSET 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 @@ -128,7 +128,7 @@ static inline pa_bluetooth_backend *pa_bluetooth_ofono_backend_new(pa_core *c, p static inline void pa_bluetooth_ofono_backend_free(pa_bluetooth_backend *b) {} #endif -#ifdef HAVE_BLUEZ_5_NATIVE_HEADSET +#ifdef HAVE_BLUEZ_NATIVE_HEADSET pa_bluetooth_backend *pa_bluetooth_native_backend_new(pa_core *c, pa_bluetooth_discovery *y, bool enable_hs_role); void pa_bluetooth_native_backend_free(pa_bluetooth_backend *b); void pa_bluetooth_native_backend_enable_hs_role(pa_bluetooth_backend *b, bool enable_hs_role); diff --git a/src/modules/bluetooth/module-bluez5-device.c b/src/modules/bluetooth/module-bluetooth-device.c similarity index 99% rename from src/modules/bluetooth/module-bluez5-device.c rename to src/modules/bluetooth/module-bluetooth-device.c index 867def7..3168285 100644 --- a/src/modules/bluetooth/module-bluez5-device.c +++ b/src/modules/bluetooth/module-bluetooth-device.c @@ -46,10 +46,10 @@ #include <pulsecore/time-smoother.h> #include "a2dp-codecs.h" -#include "bluez5-util.h" +#include "bluez-util.h" #include "rtp.h" -#include "module-bluez5-device-symdef.h" +#include "module-bluez-device-symdef.h" PA_MODULE_AUTHOR("João Paulo Rechi Vita"); PA_MODULE_DESCRIPTION("BlueZ 5 Bluetooth audio sink and source"); @@ -2240,7 +2240,7 @@ int pa__init(pa_module* m) { if ((u->discovery = pa_shared_get(u->core, "bluetooth-discovery"))) pa_bluetooth_discovery_ref(u->discovery); else { - pa_log_error("module-bluez5-discover doesn't seem to be loaded, refusing to load module-bluez5-device"); + pa_log_error("module-bluetooth-discover doesn't seem to be loaded, refusing to load module-bluez-device"); goto fail_free_modargs; } diff --git a/src/modules/bluetooth/module-bluetooth-discover.c b/src/modules/bluetooth/module-bluetooth-discover.c index b88ab8b..39f5bf0 100644 --- a/src/modules/bluetooth/module-bluetooth-discover.c +++ b/src/modules/bluetooth/module-bluetooth-discover.c @@ -1,7 +1,7 @@ /*** This file is part of PulseAudio. - Copyright 2013 João Paulo Rechi Vita + Copyright 2008-2013 João Paulo Rechi Vita PulseAudio is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as @@ -21,49 +21,139 @@ #include <config.h> #endif +#include <pulsecore/core.h> #include <pulsecore/core-util.h> #include <pulsecore/macro.h> #include <pulsecore/module.h> +#include <pulsecore/modargs.h> +#include <pulsecore/shared.h> -#include "module-bluetooth-discover-symdef.h" +#include "bluez-util.h" + +#include "module-bluez-discover-symdef.h" PA_MODULE_AUTHOR("João Paulo Rechi Vita"); -PA_MODULE_DESCRIPTION("Detect available Bluetooth daemon and load the corresponding discovery module"); +PA_MODULE_DESCRIPTION("Detect available BlueZ 5 Bluetooth audio devices and load BlueZ 5 Bluetooth audio drivers"); PA_MODULE_VERSION(PACKAGE_VERSION); PA_MODULE_LOAD_ONCE(true); PA_MODULE_USAGE( - "headset=ofono|native|auto (bluez 5 only)" - "autodetect_mtu=<boolean> (bluez 5 only)" + "headset=ofono|native|auto" ); +static const char* const valid_modargs[] = { + "headset", + "autodetect_mtu", + NULL +}; + struct userdata { - uint32_t bluez5_module_idx; + pa_module *module; + pa_core *core; + pa_hashmap *loaded_device_paths; + pa_hook_slot *device_connection_changed_slot; + pa_bluetooth_discovery *discovery; + bool autodetect_mtu; }; -int pa__init(pa_module* m) { +static pa_hook_result_t device_connection_changed_cb(pa_bluetooth_discovery *y, const pa_bluetooth_device *d, struct userdata *u) { + bool module_loaded; + + pa_assert(d); + pa_assert(u); + + module_loaded = pa_hashmap_get(u->loaded_device_paths, d->path) ? true : false; + + if (module_loaded && !pa_bluetooth_device_any_transport_connected(d)) { + /* disconnection, the module unloads itself */ + pa_log_debug("Unregistering module for %s", d->path); + pa_hashmap_remove(u->loaded_device_paths, d->path); + return PA_HOOK_OK; + } + + if (!module_loaded && pa_bluetooth_device_any_transport_connected(d)) { + /* a new device has been connected */ + pa_module *m; + char *args = pa_sprintf_malloc("path=%s autodetect_mtu=%i", d->path, (int)u->autodetect_mtu); + + pa_log_debug("Loading module-bluetooth-device %s", args); + m = pa_module_load(u->module->core, "module-bluetooth-device", args); + pa_xfree(args); + + if (m) + /* No need to duplicate the path here since the device object will + * exist for the whole hashmap entry lifespan */ + pa_hashmap_put(u->loaded_device_paths, d->path, d->path); + else + pa_log_warn("Failed to load module for device %s", d->path); + + return PA_HOOK_OK; + } + + return PA_HOOK_OK; +} + +#ifdef HAVE_BLUEZ_NATIVE_HEADSET +const char *default_headset_backend = "auto"; +#else +const char *default_headset_backend = "ofono"; +#endif + +int pa__init(pa_module *m) { struct userdata *u; - pa_module *mm; + pa_modargs *ma; + const char *headset_str; + int headset_backend; + bool autodetect_mtu; pa_assert(m); - m->userdata = u = pa_xnew0(struct userdata, 1); - u->bluez5_module_idx = PA_INVALID_INDEX; + if (!(ma = pa_modargs_new(m->argument, valid_modargs))) { + pa_log("failed to parse module arguments."); + goto fail; + } - if (pa_module_exists("module-bluez5-discover")) { - mm = pa_module_load(m->core, "module-bluez5-discover", m->argument); - if (mm) - u->bluez5_module_idx = mm->index; + pa_assert_se(headset_str = pa_modargs_get_value(ma, "headset", default_headset_backend)); + if (pa_streq(headset_str, "ofono")) + headset_backend = HEADSET_BACKEND_OFONO; + else if (pa_streq(headset_str, "native")) + headset_backend = HEADSET_BACKEND_NATIVE; + else if (pa_streq(headset_str, "auto")) + headset_backend = HEADSET_BACKEND_AUTO; + else { + pa_log("headset parameter must be either ofono, native or auto (found %s)", headset_str); + goto fail; } - if (u->bluez5_module_idx == PA_INVALID_INDEX) { - pa_xfree(u); - return -1; + autodetect_mtu = true; + if (pa_modargs_get_value_boolean(ma, "autodetect_mtu", &autodetect_mtu) < 0) { + pa_log("Invalid boolean value for autodetect_mtu parameter"); + goto fail; } + m->userdata = u = pa_xnew0(struct userdata, 1); + u->module = m; + u->core = m->core; + u->autodetect_mtu = autodetect_mtu; + u->loaded_device_paths = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func); + + if (!(u->discovery = pa_bluetooth_discovery_get(u->core, headset_backend))) + goto fail; + + u->device_connection_changed_slot = + pa_hook_connect(pa_bluetooth_discovery_hook(u->discovery, PA_BLUETOOTH_HOOK_DEVICE_CONNECTION_CHANGED), + PA_HOOK_NORMAL, (pa_hook_cb_t) device_connection_changed_cb, u); + + pa_modargs_free(ma); return 0; + +fail: + if (ma) + pa_modargs_free(ma); + pa__done(m); + return -1; } -void pa__done(pa_module* m) { +void pa__done(pa_module *m) { struct userdata *u; pa_assert(m); @@ -71,8 +161,14 @@ void pa__done(pa_module* m) { if (!(u = m->userdata)) return; - if (u->bluez5_module_idx != PA_INVALID_INDEX) - pa_module_unload_by_index(m->core, u->bluez5_module_idx, true); + if (u->device_connection_changed_slot) + pa_hook_slot_free(u->device_connection_changed_slot); + + if (u->discovery) + pa_bluetooth_discovery_unref(u->discovery); + + if (u->loaded_device_paths) + pa_hashmap_free(u->loaded_device_paths); pa_xfree(u); } diff --git a/src/modules/bluetooth/module-bluez5-discover.c b/src/modules/bluetooth/module-bluez5-discover.c deleted file mode 100644 index 97ff943..0000000 --- a/src/modules/bluetooth/module-bluez5-discover.c +++ /dev/null @@ -1,174 +0,0 @@ -/*** - This file is part of PulseAudio. - - Copyright 2008-2013 João Paulo Rechi Vita - - PulseAudio is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as - published by the Free Software Foundation; either version 2.1 of the - License, or (at your option) any later version. - - PulseAudio is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with PulseAudio; if not, see <http://www.gnu.org/licenses/>. -***/ - -#ifdef HAVE_CONFIG_H -#include <config.h> -#endif - -#include <pulsecore/core.h> -#include <pulsecore/core-util.h> -#include <pulsecore/macro.h> -#include <pulsecore/module.h> -#include <pulsecore/modargs.h> -#include <pulsecore/shared.h> - -#include "bluez5-util.h" - -#include "module-bluez5-discover-symdef.h" - -PA_MODULE_AUTHOR("João Paulo Rechi Vita"); -PA_MODULE_DESCRIPTION("Detect available BlueZ 5 Bluetooth audio devices and load BlueZ 5 Bluetooth audio drivers"); -PA_MODULE_VERSION(PACKAGE_VERSION); -PA_MODULE_LOAD_ONCE(true); -PA_MODULE_USAGE( - "headset=ofono|native|auto" -); - -static const char* const valid_modargs[] = { - "headset", - "autodetect_mtu", - NULL -}; - -struct userdata { - pa_module *module; - pa_core *core; - pa_hashmap *loaded_device_paths; - pa_hook_slot *device_connection_changed_slot; - pa_bluetooth_discovery *discovery; - bool autodetect_mtu; -}; - -static pa_hook_result_t device_connection_changed_cb(pa_bluetooth_discovery *y, const pa_bluetooth_device *d, struct userdata *u) { - bool module_loaded; - - pa_assert(d); - pa_assert(u); - - module_loaded = pa_hashmap_get(u->loaded_device_paths, d->path) ? true : false; - - if (module_loaded && !pa_bluetooth_device_any_transport_connected(d)) { - /* disconnection, the module unloads itself */ - pa_log_debug("Unregistering module for %s", d->path); - pa_hashmap_remove(u->loaded_device_paths, d->path); - return PA_HOOK_OK; - } - - if (!module_loaded && pa_bluetooth_device_any_transport_connected(d)) { - /* a new device has been connected */ - pa_module *m; - char *args = pa_sprintf_malloc("path=%s autodetect_mtu=%i", d->path, (int)u->autodetect_mtu); - - pa_log_debug("Loading module-bluez5-device %s", args); - m = pa_module_load(u->module->core, "module-bluez5-device", args); - pa_xfree(args); - - if (m) - /* No need to duplicate the path here since the device object will - * exist for the whole hashmap entry lifespan */ - pa_hashmap_put(u->loaded_device_paths, d->path, d->path); - else - pa_log_warn("Failed to load module for device %s", d->path); - - return PA_HOOK_OK; - } - - return PA_HOOK_OK; -} - -#ifdef HAVE_BLUEZ_5_NATIVE_HEADSET -const char *default_headset_backend = "auto"; -#else -const char *default_headset_backend = "ofono"; -#endif - -int pa__init(pa_module *m) { - struct userdata *u; - pa_modargs *ma; - const char *headset_str; - int headset_backend; - bool autodetect_mtu; - - pa_assert(m); - - if (!(ma = pa_modargs_new(m->argument, valid_modargs))) { - pa_log("failed to parse module arguments."); - goto fail; - } - - pa_assert_se(headset_str = pa_modargs_get_value(ma, "headset", default_headset_backend)); - if (pa_streq(headset_str, "ofono")) - headset_backend = HEADSET_BACKEND_OFONO; - else if (pa_streq(headset_str, "native")) - headset_backend = HEADSET_BACKEND_NATIVE; - else if (pa_streq(headset_str, "auto")) - headset_backend = HEADSET_BACKEND_AUTO; - else { - pa_log("headset parameter must be either ofono, native or auto (found %s)", headset_str); - goto fail; - } - - autodetect_mtu = true; - if (pa_modargs_get_value_boolean(ma, "autodetect_mtu", &autodetect_mtu) < 0) { - pa_log("Invalid boolean value for autodetect_mtu parameter"); - goto fail; - } - - m->userdata = u = pa_xnew0(struct userdata, 1); - u->module = m; - u->core = m->core; - u->autodetect_mtu = autodetect_mtu; - u->loaded_device_paths = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func); - - if (!(u->discovery = pa_bluetooth_discovery_get(u->core, headset_backend))) - goto fail; - - u->device_connection_changed_slot = - pa_hook_connect(pa_bluetooth_discovery_hook(u->discovery, PA_BLUETOOTH_HOOK_DEVICE_CONNECTION_CHANGED), - PA_HOOK_NORMAL, (pa_hook_cb_t) device_connection_changed_cb, u); - - pa_modargs_free(ma); - return 0; - -fail: - if (ma) - pa_modargs_free(ma); - pa__done(m); - return -1; -} - -void pa__done(pa_module *m) { - struct userdata *u; - - pa_assert(m); - - if (!(u = m->userdata)) - return; - - if (u->device_connection_changed_slot) - pa_hook_slot_free(u->device_connection_changed_slot); - - if (u->discovery) - pa_bluetooth_discovery_unref(u->discovery); - - if (u->loaded_device_paths) - pa_hashmap_free(u->loaded_device_paths); - - pa_xfree(u); -} -- 2.9.4