[pulseaudio-discuss] [PATCH v4 4/4] bluetooth: Rename *bluez5 modules to bluetooth

Tanu Kaskinen tanuk at iki.fi
Tue Mar 27 06:59:11 UTC 2018


On Mon, 2018-03-26 at 17:15 +0300, Luiz Augusto von Dentz wrote:
> From: Luiz Augusto von Dentz <luiz.von.dentz at intel.com>
> 
> Since there is no longer support for BlueZ 4 it makes no sense to keep
> BlueZ 5 modules separated.
> ---
>  configure.ac                                       |  68 +++++----
>  po/POTFILES.in                                     |   2 +-
>  po/be.po                                           |  42 +++---
>  po/de.po                                           |  42 +++---
>  po/el.po                                           |  38 ++---
>  po/fr.po                                           |  42 +++---
>  po/hr.po                                           |  42 +++---
>  po/hu.po                                           |  43 +++---
>  po/id.po                                           |  42 +++---
>  po/it.po                                           |  42 +++---
>  po/lt.po                                           |  42 +++---
>  po/nn.po                                           |  42 +++---
>  po/oc.po                                           |  42 +++---
>  po/pl.po                                           |  42 +++---
>  po/pt_BR.po                                        |  42 +++---
>  po/ru.po                                           |  38 ++---
>  po/sk.po                                           |  42 +++---
>  po/sv.po                                           |  42 +++---
>  po/tr.po                                           |  42 +++---
>  po/uk.po                                           |  42 +++---
>  po/zh_CN.po                                        |  42 +++---
>  po/zh_TW.po                                        |  42 +++---
>  src/Makefile.am                                    |  58 ++++----
>  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} |   8 +-
>  src/modules/bluetooth/module-bluetooth-discover.c  | 134 ++++++++++++++---
>  src/modules/bluetooth/module-bluez5-discover.c     | 158 ++++-----------------
>  30 files changed, 634 insertions(+), 649 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%)
> 
> diff --git a/configure.ac b/configure.ac
> index c2e883731..3dd6129c3 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -1043,46 +1043,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)]))

The "(Bluez 5)" part can be dropped.

> +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]))

"5" can be dropped.

> +
> +AC_ARG_ENABLE([bluez-native-headset],
> +    AS_HELP_STRING([--disable-bluez-native-headset],[Disable optional native headset backend support (Bluez 5)]))

"(Bluez 5)" can be dropped.

> +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]))

"5" can be dropped.

> -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) -DPA_MODULE_NAME=module_bluez5_device
> +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)

-DPA_MODULE_NAME=module_bluetooth_device is missing from CFLAGS.

> --- a/src/modules/bluetooth/module-bluez5-device.c
> +++ b/src/modules/bluetooth/module-bluetooth-device.c
> @@ -46,11 +46,13 @@
>  #include <pulsecore/time-smoother.h>
>  
>  #include "a2dp-codecs.h"
> -#include "bluez5-util.h"
> +#include "bluez-util.h"
>  #include "rtp.h"
>  
> +#include "module-bluetooth-device-symdef.h"

That file doesn't exist (this line isn't needed any more). You're
expected to do build testing before you submit patches, by the way...

> +
>  PA_MODULE_AUTHOR("João Paulo Rechi Vita");
> -PA_MODULE_DESCRIPTION("BlueZ 5 Bluetooth audio sink and source");
> +PA_MODULE_DESCRIPTION("Bluetooth audio sink and source");
>  PA_MODULE_VERSION(PACKAGE_VERSION);
>  PA_MODULE_LOAD_ONCE(false);
>  PA_MODULE_USAGE("path=<device object path>"
> @@ -2283,7 +2285,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 63195d3e1..0641467bc 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,47 +21,137 @@
>  #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 "bluez-util.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 Bluetooth audio devices and 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"

autodetect_mtu shouldn't be dropped from the usage string.

>  );
>  
> +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);
> +        pa_module_load(&m, 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")) {
> -        pa_module_load(&mm, 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;

This was set to false previously.

> +    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);
> @@ -69,8 +159,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
> index 44578214c..bc553a897 100644
> --- a/src/modules/bluetooth/module-bluez5-discover.c
> +++ b/src/modules/bluetooth/module-bluez5-discover.c
> @@ -4,169 +4,63 @@
>    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.
> +  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/>.
> +  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 <pulse/xmalloc.h>
>  
> -#include "bluez5-util.h"
> +#include <pulsecore/module.h>
> +#include <pulsecore/log.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_DESCRIPTION("Compatibility module (module-bluez5-discover rename)");
>  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
> -};
> +PA_MODULE_LOAD_ONCE(false);

This should be set to true.

> +PA_MODULE_DEPRECATED("Please use module-bluetooth-discover instead of module-bluez5-discover!");
>  
>  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;
> +    uint32_t module_index;
>  };
>  
> -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);
> -        pa_module_load(&m, 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) {
> +int pa__init(pa_module*m) {
>      struct userdata *u;
> -    pa_modargs *ma;
> -    const char *headset_str;
> -    int headset_backend;
> -    bool autodetect_mtu;
> +    pa_module *module;
>  
>      pa_assert(m);
> +    pa_assert_se(m->userdata = u = pa_xnew0(struct userdata, 1));
> +
> +    pa_log_warn("We will now load module-bluetooth-discover. Please make sure to remove module-bluez5-discover from your configuration.");
> +
> +    pa_module_load(&module, m->core, "module-bluetooth-discover", m->argument);
> +    u->module_index = module ? module->index : PA_INVALID_INDEX;
>  
> -    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 = false;
> -    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;
> +    return module ? 0 : -1;

If we return -1, then pa__done() won't be called, and u->userdata will
not get freed, so we have to free the userdata before returning -1.

>  }
>  
> -void pa__done(pa_module *m) {
> +void pa__done(pa_module*m) {
>      struct userdata *u;
>  
>      pa_assert(m);
> +    pa_assert(m->userdata);
>  
> -    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);
> +    u = m->userdata;
>  
> -    if (u->loaded_device_paths)
> -        pa_hashmap_free(u->loaded_device_paths);
> +    if (u && PA_INVALID_INDEX != u->module_index)
> +        pa_module_unload_by_index(m->core, u->module_index, true);

This if check is unnecessary. u is never null and the module index is
never invalid.

-- 
Tanu

https://liberapay.com/tanuk
https://www.patreon.com/tanuk


More information about the pulseaudio-discuss mailing list