<div dir="ltr"><p dir="ltr"><br>
On Jul 18, 2013 10:32 AM, "Tanu Kaskinen" <<a href="mailto:tanu.kaskinen@linux.intel.com" target="_blank">tanu.kaskinen@linux.intel.com</a>> wrote:<br>
><br>
> On Fri, 2013-07-12 at 15:06 -0300, <a href="mailto:jprvita@gmail.com" target="_blank">jprvita@gmail.com</a> wrote:<br>
> > From: João Paulo Rechi Vita <<a href="mailto:jprvita@openbossa.org" target="_blank">jprvita@openbossa.org</a>><br>
> ><br>
> > pa_bluetooth_discovery is the struct that holds information about known<br>
> > Bluetooth audio devices and other information about the Bluetooth stack.<br>
> ><br>
> > This commit also creates bluez5-util.[ch], which will hold a lot of<br>
> > utility functions to help with the BlueZ 5 support.<br>
><br>
> So there will be bluez4-util.so and bluez5-util.so, and those will<br>
> contain identical symbols. It's possible to load both bluez 4 and 5<br>
> modules at the same time, so the bluez*-util libraries will conflict in<br>
> a way that will cause crashing or weird behavior. Since we lost the<br>
> opportunity to have a shared Bluetooth core for all backends, I think it<br>
> would be OK to change the generic "pa_bluetooth" prefix (and "pa_bt", if<br>
> it's still used somewhere) to "pa_bluez5". That would resolve the symbol<br>
> conflict between the two libraries.<br>
></p>
<p dir="ltr">Good catch, I haven't thought about this problem before.</p>
<p dir="ltr">> Another, perhaps easier solution would be to use symbol versioning in<br>
> the libraries. I'm not 100% sure that this works, but I think it should<br>
> work.<br>
></p>
<p dir="ltr">How does it works? I have never done or seen it anywhere.</p>
<p dir="ltr">> To be clear, I don't think it's a valid use case to load both versions<br>
> at the same time, but we must not crash due to configuration errors.<br>
></p>
<p dir="ltr">Yes, I agree.</p>
<p dir="ltr">> > ---<br>
> >  src/Makefile.am                                | 10 +++-<br>
> >  src/modules/bluetooth/bluez5-util.c            | 74 ++++++++++++++++++++++++++<br>
> >  src/modules/bluetooth/bluez5-util.h            | 32 +++++++++++<br>
> >  src/modules/bluetooth/module-bluez5-discover.c | 33 ++++++++++++<br>
> >  4 files changed, 148 insertions(+), 1 deletion(-)<br>
> >  create mode 100644 src/modules/bluetooth/bluez5-util.c<br>
> >  create mode 100644 src/modules/bluetooth/bluez5-util.h<br>
> ><br>
> > diff --git a/src/Makefile.am b/src/Makefile.am<br>
> > index 733c338..52cd63f 100644<br>
> > --- a/src/Makefile.am<br>
> > +++ b/src/Makefile.am<br>
> > @@ -1333,6 +1333,7 @@ endif<br>
> >  if HAVE_BLUEZ_5<br>
> >  modlibexec_LTLIBRARIES += \<br>
> >               <a href="http://module-bluetooth-policy.la" target="_blank">module-bluetooth-policy.la</a> \<br>
> > +             <a href="http://libbluez5-util.la" target="_blank">libbluez5-util.la</a> \<br>
> >               <a href="http://module-bluez5-discover.la" target="_blank">module-bluez5-discover.la</a><br>
> >  endif<br>
> ><br>
> > @@ -2049,9 +2050,16 @@ module_bluez4_device_la_LIBADD = $(MODULE_LIBADD) $(DBUS_LIBS) $(SBC_LIBS) libbl<br>
> >  module_bluez4_device_la_CFLAGS = $(AM_CFLAGS) $(DBUS_CFLAGS) $(SBC_CFLAGS)<br>
> ><br>
> >  # Bluetooth BlueZ 5 sink / source<br>
> > +libbluez5_util_la_SOURCES = \<br>
> > +             modules/bluetooth/bluez5-util.c \<br>
> > +             modules/bluetooth/bluez5-util.h<br>
> > +libbluez5_util_la_LDFLAGS = -avoid-version<br>
> > +libbluez5_util_la_LIBADD = $(MODULE_LIBADD) $(DBUS_LIBS)<br>
> > +libbluez5_util_la_CFLAGS = $(AM_CFLAGS) $(DBUS_CFLAGS)<br>
> > +<br>
> >  module_bluez5_discover_la_SOURCES = modules/bluetooth/module-bluez5-discover.c<br>
> >  module_bluez5_discover_la_LDFLAGS = $(MODULE_LDFLAGS)<br>
> > -module_bluez5_discover_la_LIBADD = $(MODULE_LIBADD) $(DBUS_LIBS)<br>
> > +module_bluez5_discover_la_LIBADD = $(MODULE_LIBADD) $(DBUS_LIBS) <a href="http://libbluez5-util.la" target="_blank">libbluez5-util.la</a><br>
> >  module_bluez5_discover_la_CFLAGS = $(AM_CFLAGS) $(DBUS_CFLAGS)<br>
> ><br>
> >  # Apple Airtunes/RAOP<br>
> > diff --git a/src/modules/bluetooth/bluez5-util.c b/src/modules/bluetooth/bluez5-util.c<br>
> > new file mode 100644<br>
> > index 0000000..0f23bff<br>
> > --- /dev/null<br>
> > +++ b/src/modules/bluetooth/bluez5-util.c<br>
> > @@ -0,0 +1,74 @@<br>
> > +/***<br>
> > +  This file is part of PulseAudio.<br>
> > +<br>
> > +  Copyright 2008-2013 João Paulo Rechi Vita<br>
> > +<br>
> > +  PulseAudio is free software; you can redistribute it and/or modify<br>
> > +  it under the terms of the GNU Lesser General Public License as<br>
> > +  published by the Free Software Foundation; either version 2.1 of the<br>
> > +  License, or (at your option) any later version.<br>
> > +<br>
> > +  PulseAudio is distributed in the hope that it will be useful, but<br>
> > +  WITHOUT ANY WARRANTY; without even the implied warranty of<br>
> > +  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU<br>
> > +  General Public License for more details.<br>
> > +<br>
> > +  You should have received a copy of the GNU Lesser General Public<br>
> > +  License along with PulseAudio; if not, write to the Free Software<br>
> > +  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307<br>
> > +  USA.<br>
> > +***/<br>
> > +<br>
> > +#ifdef HAVE_CONFIG_H<br>
> > +#include <config.h><br>
> > +#endif<br>
> > +<br>
> > +#include <pulse/xmalloc.h><br>
> > +<br>
> > +#include <pulsecore/core.h><br>
> > +#include <pulsecore/macro.h><br>
> > +#include <pulsecore/refcnt.h><br>
> > +#include <pulsecore/shared.h><br>
> > +<br>
> > +#include "bluez5-util.h"<br>
> > +<br>
> > +struct pa_bluetooth_discovery {<br>
> > +    PA_REFCNT_DECLARE;<br>
> > +<br>
> > +    pa_core *core;<br>
> > +};<br>
> > +<br>
> > +pa_bluetooth_discovery* pa_bluetooth_discovery_get(pa_core *c) {<br>
> > +    pa_bluetooth_discovery *y;<br>
> > +<br>
> > +    if ((y = pa_shared_get(c, "bluetooth-discovery")))<br>
> > +        return pa_bluetooth_discovery_ref(y);<br>
><br>
> This is another source of crashy conflicts: bluez4-util uses the same<br>
> shared name, so you may end up returning bluez4 version of<br>
> pa_bluetooth_discovery to bluez5 code, or vice versa.<br>
></p>
<p dir="ltr">For this one we can simply use different names for BlueZ 4 and BlueZ 5. </p>
<p dir="ltr">> --<br>
> Tanu<br>
><br>
</p>
</div>