diff --git a/libs/ardour/ardour/audio_backend.h b/libs/ardour/ardour/audio_backend.h index d9561a62e5..4d57f0b43d 100644 --- a/libs/ardour/ardour/audio_backend.h +++ b/libs/ardour/ardour/audio_backend.h @@ -31,6 +31,14 @@ #include "ardour/types.h" #include "ardour/audioengine.h" #include "ardour/port_engine.h" +#include "ardour/visibility.h" + +#ifdef ARDOURBACKEND_DLL_EXPORTS // defined if we are building the ARDOUR Panners DLLs (instead of using them) + #define ARDOURBACKEND_API LIBARDOUR_HELPER_DLL_EXPORT +#else + #define ARDOURBACKEND_API LIBARDOUR_HELPER_DLL_IMPORT +#endif +#define ARDOURBACKEND_LOCAL LIBARDOUR_HELPER_DLL_LOCAL namespace ARDOUR { diff --git a/libs/ardour/ardour/visibility.h b/libs/ardour/ardour/visibility.h new file mode 100644 index 0000000000..09287b877d --- /dev/null +++ b/libs/ardour/ardour/visibility.h @@ -0,0 +1,44 @@ +/* + Copyright (C) 2013 Paul Davis + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program 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 General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +*/ + +#ifndef __libardour_visibility_h__ +#define __libardour_visibility_h__ + +/* _WIN32 is defined by most compilers targetting Windows, but within the + * ardour source tree, we also define COMPILER_MSVC or COMPILER_MINGW depending + * on how a Windows build is built. + */ + +#if defined _WIN32 || defined __CYGWIN__ || defined(COMPILER_MSVC) || defined(COMPILER_MINGW) + #define LIBARDOUR_HELPER_DLL_IMPORT __declspec(dllimport) + #define LIBARDOUR_HELPER_DLL_EXPORT __declspec(dllexport) + #define LIBARDOUR_HELPER_DLL_LOCAL +#else + #if __GNUC__ >= 4 + #define LIBARDOUR_HELPER_DLL_IMPORT __attribute__ ((visibility ("default"))) + #define LIBARDOUR_HELPER_DLL_EXPORT __attribute__ ((visibility ("default"))) + #define LIBARDOUR_HELPER_DLL_LOCAL __attribute__ ((visibility ("hidden"))) + #else + #define LIBARDOUR_HELPER_DLL_IMPORT + #define LIBARDOUR_HELPER_DLL_EXPORT + #define LIBARDOUR_HELPER_DLL_LOCAL + #endif +#endif + +#endif /* __libardour_visibility_h__ */ diff --git a/libs/ardour/audioengine.cc b/libs/ardour/audioengine.cc index 73dee76a92..567f3c7671 100644 --- a/libs/ardour/audioengine.cc +++ b/libs/ardour/audioengine.cc @@ -505,7 +505,8 @@ AudioEngine::backend_discover (const string& path) { Glib::Module module (path); AudioBackendInfo* info; - void* sym = 0; + AudioBackendInfo* (*dfunc)(void); + void* func = 0; if (!module) { error << string_compose(_("AudioEngine: cannot load module \"%1\" (%2)"), path, @@ -513,15 +514,16 @@ AudioEngine::backend_discover (const string& path) return 0; } - if (!module.get_symbol ("descriptor", sym)) { - error << string_compose(_("AudioEngine: backend at \"%1\" has no descriptor."), path) << endmsg; + if (!module.get_symbol ("descriptor", func)) { + error << string_compose(_("AudioEngine: backend at \"%1\" has no descriptor function."), path) << endmsg; error << Glib::Module::get_last_error() << endmsg; return 0; } module.make_resident (); - info = (AudioBackendInfo*) sym; + dfunc = (AudioBackendInfo* (*)(void))func; + info = dfunc(); return info; } diff --git a/libs/backends/jack/jack_api.cc b/libs/backends/jack/jack_api.cc index e02ccde2f1..836acfda11 100644 --- a/libs/backends/jack/jack_api.cc +++ b/libs/backends/jack/jack_api.cc @@ -66,19 +66,13 @@ already_configured () return JackConnection::server_running (); } -extern "C" { - - - /* functions looked up using dlopen-and-cousins, and so naming scope - * must be non-mangled. - */ +static ARDOUR::AudioBackendInfo _descriptor = { + "JACK", + instantiate, + deinstantiate, + backend_factory, + already_configured, +}; - ARDOUR::AudioBackendInfo descriptor = { - "JACK", - instantiate, - deinstantiate, - backend_factory, - already_configured, - }; -} +extern "C" ARDOURBACKEND_API ARDOUR::AudioBackendInfo* descriptor() { return &_descriptor; } diff --git a/libs/backends/jack/wscript b/libs/backends/jack/wscript index 3c47f3a652..98c39c7b16 100644 --- a/libs/backends/jack/wscript +++ b/libs/backends/jack/wscript @@ -38,8 +38,9 @@ def build(bld): obj.use = 'ardour libpbd' obj.vnum = JACKBACKEND_VERSION obj.install_path = os.path.join(bld.env['LIBDIR'], 'ardour3', 'backends') - obj.defines = ['PACKAGE="' + I18N_PACKAGE + '"'] - + obj.defines = ['PACKAGE="' + I18N_PACKAGE + '"', + 'ARDOURBACKEND_DLL_EXPORTS' + ] # # device discovery code in the jack backend needs ALSA