Revision 532:569fc23fa37a

View differences:

CHANGELOG
1

  
2
Version 2.9, 2019-10-23 (maintenance release)
3

  
4
  * Fix non-thread-safe behaviour in PluginAdapter. Plugins built
5
    using the adapter classes in version 2.8 or earlier cannot safely
6
    be used simultaneously across threads with other instances of
7
    themselves or of other plugins in the same library (i.e. shared
8
    object). Hosts have been required to provide synchronisation for
9
    such cases. Version 2.9 introduces synchronisation in the plugin,
10
    making this usage safe. Unfortunately this does not make host code
11
    safe when using older plugin builds, as the problem and its fix
12
    are in the plugin side of the SDK. Caution is still required, but
13
    this fix does allow updated plugin builds to avoid problems with
14
    some existing hosts
15
  * Change required C++ language standard from C++98 to C++11. This
16
    is because of the use of std::mutex in the above fix
1 17

  
2 18
Version 2.8, 2019-02-07 (maintenance and minor feature release)
3 19

  
Makefile.in
41 41
CC		= @CC@
42 42
CXX		= @CXX@
43 43
CFLAGS		= @CFLAGS@
44
CXXFLAGS	= -I. @CXXFLAGS@ @SNDFILE_CFLAGS@ 
44
CXXFLAGS	= -std=c++11 -I. @CXXFLAGS@ @SNDFILE_CFLAGS@ 
45 45

  
46 46
# ar, ranlib
47 47
#
......
78 78
INSTALL_PLUGINS		  = $(INSTALL_PREFIX)/lib/vamp
79 79
INSTALL_BINARIES	  = $(INSTALL_PREFIX)/bin 
80 80

  
81
INSTALL_SDK_LIBNAME	  = libvamp-sdk.so.2.8.0
81
INSTALL_SDK_LIBNAME	  = libvamp-sdk.so.2.9.0
82 82
INSTALL_SDK_LINK_ABI	  = libvamp-sdk.so.2
83 83
INSTALL_SDK_LINK_DEV	  = libvamp-sdk.so
84 84
INSTALL_SDK_STATIC        = libvamp-sdk.a
85 85
INSTALL_SDK_LA            = libvamp-sdk.la
86 86

  
87
INSTALL_HOSTSDK_LIBNAME   = libvamp-hostsdk.so.3.8.0
87
INSTALL_HOSTSDK_LIBNAME   = libvamp-hostsdk.so.3.9.0
88 88
INSTALL_HOSTSDK_LINK_ABI  = libvamp-hostsdk.so.3
89 89
INSTALL_HOSTSDK_LINK_DEV  = libvamp-hostsdk.so
90 90
INSTALL_HOSTSDK_STATIC    = libvamp-hostsdk.a
......
113 113
	HOSTSDK_DYNAMIC_LDFLAGS	  = $(DYNAMIC_LDFLAGS)
114 114
	PLUGIN_LDFLAGS		  = $(DYNAMIC_LDFLAGS) -exported_symbols_list build/vamp-plugin.list
115 115

  
116
	INSTALL_HOSTSDK_LIBNAME   = libvamp-hostsdk.3.8.0.dylib
116
	INSTALL_HOSTSDK_LIBNAME   = libvamp-hostsdk.3.9.0.dylib
117 117
	INSTALL_HOSTSDK_LINK_ABI  = libvamp-hostsdk.3.dylib
118 118

  
119 119
# The OS X linker doesn't allow you to request static linkage when
......
122 122
# dynamic, the static library will never be used. That's OK for the
123 123
# host SDK, but we do want plugins to get static linkage of the plugin
124 124
# SDK. So install the dynamic version under a different name.
125
	INSTALL_SDK_LIBNAME	  = libvamp-sdk-dynamic.2.8.0.dylib
125
	INSTALL_SDK_LIBNAME	  = libvamp-sdk-dynamic.2.9.0.dylib
126 126
	INSTALL_SDK_LINK_ABI	  = libvamp-sdk-dynamic.2.dylib
127 127

  
128 128
endif
README
9 9
Vamp is an API for C and C++ plugins that process sampled audio data
10 10
to produce descriptive output (measurements or semantic observations).
11 11

  
12
This is version 2.8 of the Vamp plugin Software Development Kit.
12
This is version 2.9 of the Vamp plugin Software Development Kit.
13 13

  
14 14
Plugins and hosts built with this SDK are binary compatible with those
15 15
built using any version 2.0 or newer of the SDK.
acinclude.m4
1

  
2
# From autoconf archive:
3

  
4
# ============================================================================
5
#  http://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx_11.html
6
# ============================================================================
7
#
8
# SYNOPSIS
9
#
10
#   AX_CXX_COMPILE_STDCXX_11([ext|noext],[mandatory|optional])
11
#
12
# DESCRIPTION
13
#
14
#   Check for baseline language coverage in the compiler for the C++11
15
#   standard; if necessary, add switches to CXXFLAGS to enable support.
16
#
17
#   The first argument, if specified, indicates whether you insist on an
18
#   extended mode (e.g. -std=gnu++11) or a strict conformance mode (e.g.
19
#   -std=c++11).  If neither is specified, you get whatever works, with
20
#   preference for an extended mode.
21
#
22
#   The second argument, if specified 'mandatory' or if left unspecified,
23
#   indicates that baseline C++11 support is required and that the macro
24
#   should error out if no mode with that support is found.  If specified
25
#   'optional', then configuration proceeds regardless, after defining
26
#   HAVE_CXX11 if and only if a supporting mode is found.
27
#
28
# LICENSE
29
#
30
#   Copyright (c) 2008 Benjamin Kosnik <bkoz@redhat.com>
31
#   Copyright (c) 2012 Zack Weinberg <zackw@panix.com>
32
#   Copyright (c) 2013 Roy Stogner <roystgnr@ices.utexas.edu>
33
#   Copyright (c) 2014 Alexey Sokolov <sokolov@google.com>
34
#
35
#   Copying and distribution of this file, with or without modification, are
36
#   permitted in any medium without royalty provided the copyright notice
37
#   and this notice are preserved. This file is offered as-is, without any
38
#   warranty.
39

  
40
m4_define([_AX_CXX_COMPILE_STDCXX_11_testbody], [[
41
  template <typename T>
42
    struct check
43
    {
44
      static_assert(sizeof(int) <= sizeof(T), "not big enough");
45
    };
46

  
47
    struct Base {
48
    virtual void f() {}
49
    };
50
    struct Child : public Base {
51
    virtual void f() override {}
52
    };
53

  
54
    typedef check<check<bool>> right_angle_brackets;
55

  
56
    int a;
57
    decltype(a) b;
58

  
59
    typedef check<int> check_type;
60
    check_type c;
61
    check_type&& cr = static_cast<check_type&&>(c);
62

  
63
    auto d = a;
64
    auto l = [](){};
65
]])
66

  
67
AC_DEFUN([AX_CXX_COMPILE_STDCXX_11], [dnl
68
  m4_if([$1], [], [],
69
        [$1], [ext], [],
70
        [$1], [noext], [],
71
        [m4_fatal([invalid argument `$1' to AX_CXX_COMPILE_STDCXX_11])])dnl
72
  m4_if([$2], [], [ax_cxx_compile_cxx11_required=true],
73
        [$2], [mandatory], [ax_cxx_compile_cxx11_required=true],
74
        [$2], [optional], [ax_cxx_compile_cxx11_required=false],
75
        [m4_fatal([invalid second argument `$2' to AX_CXX_COMPILE_STDCXX_11])])
76
  AC_LANG_PUSH([C++])dnl
77
  ac_success=no
78
  AC_CACHE_CHECK(whether $CXX supports C++11 features by default,
79
  ax_cv_cxx_compile_cxx11,
80
  [AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])],
81
    [ax_cv_cxx_compile_cxx11=yes],
82
    [ax_cv_cxx_compile_cxx11=no])])
83
  if test x$ax_cv_cxx_compile_cxx11 = xyes; then
84
    ac_success=yes
85
  fi
86

  
87
  m4_if([$1], [noext], [], [dnl
88
  if test x$ac_success = xno; then
89
    for switch in -std=gnu++11 -std=gnu++0x; do
90
      cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx11_$switch])
91
      AC_CACHE_CHECK(whether $CXX supports C++11 features with $switch,
92
                     $cachevar,
93
        [ac_save_CXXFLAGS="$CXXFLAGS"
94
         CXXFLAGS="$CXXFLAGS $switch"
95
         AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])],
96
          [eval $cachevar=yes],
97
          [eval $cachevar=no])
98
         CXXFLAGS="$ac_save_CXXFLAGS"])
99
      if eval test x\$$cachevar = xyes; then
100
        CXXFLAGS="$CXXFLAGS $switch"
101
        ac_success=yes
102
        break
103
      fi
104
    done
105
  fi])
106

  
107
  m4_if([$1], [ext], [], [dnl
108
  if test x$ac_success = xno; then
109
    for switch in -std=c++11 -std=c++0x; do
110
      cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx11_$switch])
111
      AC_CACHE_CHECK(whether $CXX supports C++11 features with $switch,
112
                     $cachevar,
113
        [ac_save_CXXFLAGS="$CXXFLAGS"
114
         CXXFLAGS="$CXXFLAGS $switch"
115
         AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_11_testbody])],
116
          [eval $cachevar=yes],
117
          [eval $cachevar=no])
118
         CXXFLAGS="$ac_save_CXXFLAGS"])
119
      if eval test x\$$cachevar = xyes; then
120
        CXXFLAGS="$CXXFLAGS $switch"
121
        ac_success=yes
122
        break
123
      fi
124
    done
125
  fi])
126
  AC_LANG_POP([C++])
127
  if test x$ax_cxx_compile_cxx11_required = xtrue; then
128
    if test x$ac_success = xno; then
129
      AC_MSG_ERROR([*** A compiler with support for C++11 language features is required.])
130
    fi
131
  else
132
    if test x$ac_success = xno; then
133
      HAVE_CXX11=0
134
      AC_MSG_NOTICE([No compiler with C++11 support was found])
135
    else
136
      HAVE_CXX11=1
137
      AC_DEFINE(HAVE_CXX11,1,
138
                [define if the compiler supports basic C++11 syntax])
139
    fi
140

  
141
    AC_SUBST(HAVE_CXX11)
142
  fi
143
])
build/Doxyfile
31 31
# This could be handy for archiving the generated documentation or 
32 32
# if some version control system is used.
33 33

  
34
PROJECT_NUMBER         = 2.8
34
PROJECT_NUMBER         = 2.9
35 35

  
36 36
# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) 
37 37
# base path where the generated documentation will be put. 
build/Makefile.osx
70 70
# Compile flags
71 71
#
72 72
CFLAGS		+= $(ARCHFLAGS) -fPIC
73
CXXFLAGS	+= $(ARCHFLAGS) -O2 -Wall -I. -I/usr/local/include -fPIC
73
CXXFLAGS	+= $(ARCHFLAGS) -std=c++11 -O2 -Wall -I. -I/usr/local/include -fPIC
74 74

  
75 75
# Link flags common to all link targets
76 76
#
build/Makefile.osx.106
1

  
2
# Makefile for the Vamp plugin SDK.  This builds the SDK objects,
3
# libraries, example plugins, and the test host.  Please adjust to
4
# suit your operating system requirements.
5
#
6
# This version of the Makefile is approximately correct for OS/X.
7
# Note that it has no "install" target; the following are the
8
# library and related files that may be of interest resulting from
9
# the build:
10
# 
11
#   libvamp-sdk.dylib                 [SDK dynamic library for plugins]
12
#   libvamp-hostsdk.dylib             [SDK dynamic library for hosts]
13
#
14
#   libvamp-sdk.a                     [SDK static library for plugins]
15
#   libvamp-hostsdk.a                 [SDK static library for hosts]
16
#
17
#   examples/vamp-example-plugins.cat     [copy this to your Vamp plugin dir]
18
#   examples/vamp-example-plugins.dylib   [copy this to your Vamp plugin dir]
19
#
20
#   host/vamp-simple-host                 [requires libsndfile to build]
21
#
22
#   rdf/generator/vamp-rdf-template-generator
23

  
24
# Makefile for the Vamp plugin SDK.  This builds the SDK objects,
25
# libraries, example plugins, and the test host.  Please adjust to
26
# suit your operating system requirements.
27

  
28
APIDIR		= vamp
29

  
30
SDKDIR		= vamp-sdk
31
HOSTSDKDIR	= vamp-hostsdk
32

  
33
SRCDIR		= src
34
SDKSRCDIR	= src/vamp-sdk
35
HOSTSDKSRCDIR	= src/vamp-hostsdk
36

  
37
EXAMPLEDIR	= examples
38
HOSTDIR		= host
39
PCDIR		= pkgconfig
40
LADIR		= build
41
RDFGENDIR	= rdf/generator
42

  
43
###
44
### Start of user-serviceable parts
45
###
46

  
47
# Default build target (or use "make <target>" to select one).
48
# Targets are:
49
#   all       -- build everything
50
#   sdk       -- build all the Vamp SDK libraries for plugins and hosts
51
#   sdkstatic -- build only the static versions of the SDK libraries
52
#   plugins   -- build the example plugins (and the SDK if required)
53
#   host      -- build the simple Vamp plugin host (and the SDK if required)
54
#   rdfgen    -- build the RDF template generator (and the SDK if required)
55
#   test      -- build the host and example plugins, and run a quick test
56
#   clean     -- remove binary targets
57
#   distclean -- remove all targets
58
#
59
default:	all
60

  
61
# Architecture and developer SDK selection flags.  Change these only
62
# if you want to select a different OS/X compatibility level from the
63
# default.
64
#
65
# By default, we try to find the oldest available SDK that is newer
66
# than 10.4.
67
# 
68
# If you want to override this to select a particular SDK, change
69
# PREFERRED_SDK to the SDK name (e.g. "10.4u") and PREFERRED_MINVERSION
70
# to the minimum OS revision (e.g. "10.4").  An example follows this code.
71
# 
72
SDKPREFIX	:= /Developer/SDKs/MacOSX
73
SDKS		:= $(wildcard $(SDKPREFIX)*.sdk)
74
SDKVERSIONS	:= $(patsubst $(SDKPREFIX)%.sdk,%,$(SDKS))
75
GOOD_SDKS	:= $(filter-out 10.1%,$(filter-out 10.2%,$(filter-out 10.3%,$(filter-out 10.4%,$(SDKVERSIONS)))))
76
#
77
PREFERRED_SDK	:= $(word 1, $(sort $(GOOD_SDKS)))
78
PREFERRED_MINVERSION  := $(patsubst %u,%,$(PREFERRED_SDK))
79
#
80
# Example: to set your own values, uncomment and adjust:
81
# PREFERRED_SDK	:= 10.4u
82
# PREFERRED_MINVERSION  := 10.4
83

  
84
SDKFLAGS	= -isysroot /Developer/SDKs/MacOSX$(PREFERRED_SDK).sdk -mmacosx-version-min=$(PREFERRED_MINVERSION)
85

  
86
# Our default is to try to build for all available architectures in a
87
# universal binary.
88
#
89
ARCHFLAGS = $(SDKFLAGS) -arch i386 -arch x86_64 -arch ppc
90

  
91
# Compile flags
92
#
93
CFLAGS		= $(ARCHFLAGS) -fPIC
94
CXXFLAGS	= $(ARCHFLAGS) -O2 -Wall -I. -fPIC
95

  
96
# Link flags common to all link targets
97
#
98
LDFLAGS		= $(ARCHFLAGS) 
99

  
100
# ar, ranlib
101
#
102
AR		= ar
103
RANLIB		= ranlib
104
RM_F		= rm -f
105

  
106
# Libraries required for the plugins.
107
#
108
PLUGIN_LIBS	= ./libvamp-sdk.a
109

  
110
# File extension for a dynamically loadable object
111
#
112
PLUGIN_EXT	= .dylib
113

  
114
# Libraries required for the host.
115
#
116
HOST_LIBS	= ./libvamp-hostsdk.a -lsndfile -ldl
117

  
118
# Libraries required for the RDF template generator.
119
#
120
RDFGEN_LIBS	= ./libvamp-hostsdk.a -ldl
121

  
122
# Flags required to tell the compiler to create a dynamically loadable object
123
#
124
DYNAMIC_LDFLAGS		= $(ARCHFLAGS) -dynamiclib 
125

  
126
# Flags for building specific plugin and library targets.  We need to
127
# tell the linker the formal name for the library, and for plugins we
128
# also want to tell the linker to make all symbols in the library
129
# hidden except for the public entry point (making for a tidier library).
130
#
131
PLUGIN_LDFLAGS		= $(DYNAMIC_LDFLAGS) \
132
			  -install_name vamp-example-plugins.dylib \
133
			  -exported_symbols_list build/vamp-plugin.list
134
SDK_DYNAMIC_LDFLAGS	= $(DYNAMIC_LDFLAGS) -install_name libvamp-sdk.dylib
135
HOSTSDK_DYNAMIC_LDFLAGS	= $(DYNAMIC_LDFLAGS) -install_name libvamp-hostsdk.dylib
136

  
137

  
138
### End of user-serviceable parts
139

  
140

  
141
API_HEADERS	= \
142
		$(APIDIR)/vamp.h
143

  
144
SDK_HEADERS	= \
145
		$(SDKDIR)/Plugin.h \
146
		$(SDKDIR)/PluginAdapter.h \
147
		$(SDKDIR)/PluginBase.h \
148
		$(SDKDIR)/RealTime.h \
149
		$(SDKDIR)/FFT.h \
150
		$(SDKDIR)/plugguard.h \
151
		$(SDKDIR)/vamp-sdk.h
152

  
153
HOSTSDK_HEADERS	= \
154
		$(HOSTSDKDIR)/Plugin.h \
155
		$(HOSTSDKDIR)/PluginBase.h \
156
		$(HOSTSDKDIR)/PluginHostAdapter.h \
157
		$(HOSTSDKDIR)/RealTime.h \
158
		$(HOSTSDKDIR)/PluginBufferingAdapter.h \
159
		$(HOSTSDKDIR)/PluginChannelAdapter.h \
160
		$(HOSTSDKDIR)/PluginInputDomainAdapter.h \
161
		$(HOSTSDKDIR)/PluginLoader.h \
162
		$(HOSTSDKDIR)/PluginSummarisingAdapter.h \
163
		$(HOSTSDKDIR)/PluginWrapper.h \
164
		$(HOSTSDKDIR)/hostguard.h \
165
		$(HOSTSDKDIR)/host-c.h \
166
		$(HOSTSDKDIR)/vamp-hostsdk.h
167

  
168
SDK_OBJECTS	= \
169
		$(SDKSRCDIR)/PluginAdapter.o \
170
		$(SDKSRCDIR)/RealTime.o \
171
		$(SDKSRCDIR)/FFT.o \
172
		$(SDKSRCDIR)/acsymbols.o
173

  
174
HOSTSDK_OBJECTS	= \
175
		$(HOSTSDKSRCDIR)/Files.o \
176
		$(HOSTSDKSRCDIR)/PluginHostAdapter.o \
177
		$(HOSTSDKSRCDIR)/RealTime.o \
178
		$(HOSTSDKSRCDIR)/PluginBufferingAdapter.o \
179
		$(HOSTSDKSRCDIR)/PluginChannelAdapter.o \
180
		$(HOSTSDKSRCDIR)/PluginInputDomainAdapter.o \
181
		$(HOSTSDKSRCDIR)/PluginLoader.o \
182
		$(HOSTSDKSRCDIR)/PluginSummarisingAdapter.o \
183
		$(HOSTSDKSRCDIR)/PluginWrapper.o \
184
		$(HOSTSDKSRCDIR)/host-c.o \
185
		$(HOSTSDKSRCDIR)/acsymbols.o
186

  
187
SDK_STATIC	= \
188
		./libvamp-sdk.a
189

  
190
HOSTSDK_STATIC	= \
191
		./libvamp-hostsdk.a
192

  
193
SDK_DYNAMIC	= \
194
		./libvamp-sdk$(PLUGIN_EXT)
195

  
196
HOSTSDK_DYNAMIC	= \
197
		./libvamp-hostsdk$(PLUGIN_EXT)
198

  
199
SDK_LA		= \
200
		$(LADIR)/libvamp-sdk.la
201

  
202
HOSTSDK_LA	= \
203
		$(LADIR)/libvamp-hostsdk.la
204

  
205
PLUGIN_HEADERS	= \
206
		$(EXAMPLEDIR)/SpectralCentroid.h \
207
		$(EXAMPLEDIR)/PowerSpectrum.h \
208
		$(EXAMPLEDIR)/PercussionOnsetDetector.h \
209
		$(EXAMPLEDIR)/FixedTempoEstimator.h \
210
		$(EXAMPLEDIR)/AmplitudeFollower.h \
211
		$(EXAMPLEDIR)/ZeroCrossing.h
212

  
213
PLUGIN_OBJECTS	= \
214
		$(EXAMPLEDIR)/SpectralCentroid.o \
215
		$(EXAMPLEDIR)/PowerSpectrum.o \
216
		$(EXAMPLEDIR)/PercussionOnsetDetector.o \
217
		$(EXAMPLEDIR)/FixedTempoEstimator.o \
218
		$(EXAMPLEDIR)/AmplitudeFollower.o \
219
		$(EXAMPLEDIR)/ZeroCrossing.o \
220
		$(EXAMPLEDIR)/plugins.o
221

  
222
PLUGIN_TARGET	= \
223
		$(EXAMPLEDIR)/vamp-example-plugins$(PLUGIN_EXT)
224

  
225
HOST_HEADERS	= \
226
		$(HOSTDIR)/system.h
227

  
228
HOST_OBJECTS	= \
229
		$(HOSTDIR)/vamp-simple-host.o
230

  
231
HOST_TARGET	= \
232
		$(HOSTDIR)/vamp-simple-host
233

  
234
RDFGEN_OBJECTS	= \
235
		$(RDFGENDIR)/vamp-rdf-template-generator.o
236

  
237
RDFGEN_TARGET	= \
238
		$(RDFGENDIR)/vamp-rdf-template-generator
239

  
240
show:
241
		@echo " *** Found available SDK versions: $(SDKVERSIONS)"
242
		@test -n "$(PREFERRED_SDK)" || ( echo "Error: Failed to establish preferred SDK version, please ensure at least one Developer SDK is installed" ; exit 1 )
243
		@test -n "$(PREFERRED_MINVERSION)" || ( echo "Error: Failed to establish preferred minimum OS version" ; exit 1 )
244
		@echo " *** Default SDK is $(PREFERRED_SDK) for minimum OS/X version $(PREFERRED_MINVERSION)"
245

  
246
sdk:		show sdkstatic $(SDK_DYNAMIC) $(HOSTSDK_DYNAMIC)
247

  
248
sdkstatic:	$(SDK_STATIC) $(HOSTSDK_STATIC)
249
		$(RANLIB) $(SDK_STATIC)
250
		$(RANLIB) $(HOSTSDK_STATIC)
251

  
252
plugins:	$(PLUGIN_TARGET)
253

  
254
host:		$(HOST_TARGET)
255

  
256
rdfgen:		$(RDFGEN_TARGET)
257

  
258
all:		sdk plugins host rdfgen test
259

  
260
$(SDK_STATIC):	$(SDK_OBJECTS) $(API_HEADERS) $(SDK_HEADERS)
261
		$(RM_F) $@
262
		$(AR) r $@ $(SDK_OBJECTS)
263

  
264
$(HOSTSDK_STATIC):	$(HOSTSDK_OBJECTS) $(API_HEADERS) $(HOSTSDK_HEADERS)
265
		$(RM_F) $@
266
		$(AR) r $@ $(HOSTSDK_OBJECTS)
267

  
268
$(SDK_DYNAMIC):	$(SDK_OBJECTS) $(API_HEADERS) $(SDK_HEADERS)
269
		$(CXX) $(LDFLAGS) $(SDK_DYNAMIC_LDFLAGS) -o $@ $(SDK_OBJECTS)
270

  
271
$(HOSTSDK_DYNAMIC):	$(HOSTSDK_OBJECTS) $(API_HEADERS) $(HOSTSDK_HEADERS)
272
		$(CXX) $(LDFLAGS) $(HOSTSDK_DYNAMIC_LDFLAGS) -o $@ $(HOSTSDK_OBJECTS)
273

  
274
$(PLUGIN_TARGET):	$(PLUGIN_OBJECTS) $(SDK_STATIC) $(PLUGIN_HEADERS)
275
		$(CXX) $(LDFLAGS) $(PLUGIN_LDFLAGS) -o $@ $(PLUGIN_OBJECTS) $(PLUGIN_LIBS)
276

  
277
$(HOST_TARGET):	$(HOST_OBJECTS) $(HOSTSDK_STATIC) $(HOST_HEADERS)
278
		$(CXX) $(LDFLAGS) $(HOST_LDFLAGS) -o $@ $(HOST_OBJECTS) $(HOST_LIBS)
279

  
280
$(RDFGEN_TARGET):	$(RDFGEN_OBJECTS) $(HOSTSDK_STATIC) 
281
		$(CXX) $(LDFLAGS) $(RDFGEN_LDFLAGS) -o $@ $(RDFGEN_OBJECTS) $(RDFGEN_LIBS)
282

  
283
test:		plugins host
284
		VAMP_PATH=$(EXAMPLEDIR) $(HOST_TARGET) -l
285

  
286
clean:		
287
		rm -f $(SDK_OBJECTS) $(HOSTSDK_OBJECTS) $(PLUGIN_OBJECTS) $(HOST_OBJECTS) $(RDFGEN_OBJECTS)
288

  
289
distclean:	clean
290
		rm -f $(SDK_STATIC) $(SDK_DYNAMIC) $(HOSTSDK_STATIC) $(HOSTSDK_DYNAMIC) $(PLUGIN_TARGET) $(HOST_TARGET) $(RDFGEN_TARGET) *~ */*~
291

  
292
# DO NOT DELETE
293

  
294
examples/AmplitudeFollower.o: examples/AmplitudeFollower.h vamp-sdk/Plugin.h
295
examples/AmplitudeFollower.o: vamp-sdk/PluginBase.h vamp-sdk/plugguard.h
296
examples/AmplitudeFollower.o: vamp-sdk/RealTime.h
297
examples/FixedTempoEstimator.o: examples/FixedTempoEstimator.h
298
examples/FixedTempoEstimator.o: vamp-sdk/Plugin.h vamp-sdk/PluginBase.h
299
examples/FixedTempoEstimator.o: vamp-sdk/plugguard.h vamp-sdk/RealTime.h
300
examples/PercussionOnsetDetector.o: examples/PercussionOnsetDetector.h
301
examples/PercussionOnsetDetector.o: vamp-sdk/Plugin.h vamp-sdk/PluginBase.h
302
examples/PercussionOnsetDetector.o: vamp-sdk/plugguard.h vamp-sdk/RealTime.h
303
examples/SpectralCentroid.o: examples/SpectralCentroid.h vamp-sdk/Plugin.h
304
examples/SpectralCentroid.o: vamp-sdk/PluginBase.h vamp-sdk/plugguard.h
305
examples/SpectralCentroid.o: vamp-sdk/RealTime.h
306
examples/PowerSpectrum.o: examples/PowerSpectrum.h vamp-sdk/Plugin.h
307
examples/PowerSpectrum.o: vamp-sdk/PluginBase.h vamp-sdk/plugguard.h
308
examples/PowerSpectrum.o: vamp-sdk/RealTime.h
309
examples/ZeroCrossing.o: examples/ZeroCrossing.h vamp-sdk/Plugin.h
310
examples/ZeroCrossing.o: vamp-sdk/PluginBase.h vamp-sdk/plugguard.h
311
examples/ZeroCrossing.o: vamp-sdk/RealTime.h
312
examples/plugins.o: vamp/vamp.h vamp-sdk/PluginAdapter.h vamp-sdk/Plugin.h
313
examples/plugins.o: vamp-sdk/PluginBase.h vamp-sdk/plugguard.h
314
examples/plugins.o: vamp-sdk/RealTime.h examples/ZeroCrossing.h
315
examples/plugins.o: vamp-sdk/Plugin.h examples/SpectralCentroid.h
316
examples/plugins.o: examples/PercussionOnsetDetector.h examples/PowerSpectrum.h
317
examples/plugins.o: examples/FixedTempoEstimator.h
318
examples/plugins.o: examples/AmplitudeFollower.h
319
host/vamp-simple-host.o: ./vamp-hostsdk/PluginHostAdapter.h vamp/vamp.h
320
host/vamp-simple-host.o: vamp-sdk/Plugin.h vamp-sdk/PluginBase.h
321
host/vamp-simple-host.o: vamp-sdk/plugguard.h vamp-sdk/RealTime.h
322
host/vamp-simple-host.o: ./vamp-hostsdk/PluginInputDomainAdapter.h
323
host/vamp-simple-host.o: ./vamp-hostsdk/PluginWrapper.h
324
host/vamp-simple-host.o: ./vamp-hostsdk/Plugin.h ./vamp-hostsdk/hostguard.h
325
host/vamp-simple-host.o: vamp-sdk/Plugin.h
326
host/vamp-simple-host.o: ./vamp-hostsdk/PluginLoader.h host/system.h
327
rdf/generator/vamp-rdf-template-generator.o: ./vamp-hostsdk/PluginHostAdapter.h
328
rdf/generator/vamp-rdf-template-generator.o: vamp/vamp.h vamp-sdk/Plugin.h
329
rdf/generator/vamp-rdf-template-generator.o: vamp-sdk/PluginBase.h
330
rdf/generator/vamp-rdf-template-generator.o: vamp-sdk/plugguard.h vamp-sdk/RealTime.h
331
rdf/generator/vamp-rdf-template-generator.o: ./vamp-hostsdk/PluginChannelAdapter.h
332
rdf/generator/vamp-rdf-template-generator.o: ./vamp-hostsdk/PluginWrapper.h
333
rdf/generator/vamp-rdf-template-generator.o: ./vamp-hostsdk/Plugin.h
334
rdf/generator/vamp-rdf-template-generator.o: ./vamp-hostsdk/hostguard.h
335
rdf/generator/vamp-rdf-template-generator.o: vamp-sdk/Plugin.h
336
rdf/generator/vamp-rdf-template-generator.o: ./vamp-hostsdk/PluginInputDomainAdapter.h
337
rdf/generator/vamp-rdf-template-generator.o: ./vamp-hostsdk/PluginLoader.h
338
src/vamp-hostsdk/PluginHostAdapter.o: ./vamp-hostsdk/PluginHostAdapter.h
339
src/vamp-hostsdk/PluginHostAdapter.o: vamp/vamp.h vamp-sdk/Plugin.h
340
src/vamp-hostsdk/PluginHostAdapter.o: vamp-sdk/PluginBase.h
341
src/vamp-hostsdk/PluginHostAdapter.o: vamp-sdk/plugguard.h
342
src/vamp-hostsdk/PluginHostAdapter.o: vamp-sdk/RealTime.h
343
src/vamp-hostsdk/RealTime.o: src/vamp-sdk/RealTime.cpp ./vamp-sdk/RealTime.h
344
src/vamp-hostsdk/RealTime.o: vamp-sdk/plugguard.h
345
src/vamp-sdk/PluginAdapter.o: vamp-sdk/PluginAdapter.h vamp/vamp.h
346
src/vamp-sdk/PluginAdapter.o: vamp-sdk/Plugin.h vamp-sdk/PluginBase.h
347
src/vamp-sdk/PluginAdapter.o: vamp-sdk/plugguard.h vamp-sdk/RealTime.h
348
src/vamp-sdk/RealTime.o: ./vamp-sdk/RealTime.h vamp-sdk/plugguard.h
349
src/vamp-hostsdk/PluginBufferingAdapter.o: ./vamp-hostsdk/PluginBufferingAdapter.h
350
src/vamp-hostsdk/PluginBufferingAdapter.o: ./vamp-hostsdk/PluginWrapper.h
351
src/vamp-hostsdk/PluginBufferingAdapter.o: ./vamp-hostsdk/Plugin.h
352
src/vamp-hostsdk/PluginBufferingAdapter.o: ./vamp-hostsdk/hostguard.h
353
src/vamp-hostsdk/PluginBufferingAdapter.o: vamp-sdk/Plugin.h
354
src/vamp-hostsdk/PluginBufferingAdapter.o: vamp-sdk/PluginBase.h
355
src/vamp-hostsdk/PluginBufferingAdapter.o: vamp-sdk/plugguard.h
356
src/vamp-hostsdk/PluginBufferingAdapter.o: vamp-sdk/RealTime.h
357
src/vamp-hostsdk/PluginChannelAdapter.o: ./vamp-hostsdk/PluginChannelAdapter.h
358
src/vamp-hostsdk/PluginChannelAdapter.o: ./vamp-hostsdk/PluginWrapper.h
359
src/vamp-hostsdk/PluginChannelAdapter.o: ./vamp-hostsdk/Plugin.h
360
src/vamp-hostsdk/PluginChannelAdapter.o: ./vamp-hostsdk/hostguard.h
361
src/vamp-hostsdk/PluginChannelAdapter.o: vamp-sdk/Plugin.h
362
src/vamp-hostsdk/PluginChannelAdapter.o: vamp-sdk/PluginBase.h
363
src/vamp-hostsdk/PluginChannelAdapter.o: vamp-sdk/plugguard.h
364
src/vamp-hostsdk/PluginChannelAdapter.o: vamp-sdk/RealTime.h
365
src/vamp-hostsdk/PluginInputDomainAdapter.o: ./vamp-hostsdk/PluginInputDomainAdapter.h
366
src/vamp-hostsdk/PluginInputDomainAdapter.o: ./vamp-hostsdk/PluginWrapper.h
367
src/vamp-hostsdk/PluginInputDomainAdapter.o: ./vamp-hostsdk/Plugin.h
368
src/vamp-hostsdk/PluginInputDomainAdapter.o: ./vamp-hostsdk/hostguard.h
369
src/vamp-hostsdk/PluginInputDomainAdapter.o: vamp-sdk/Plugin.h
370
src/vamp-hostsdk/PluginInputDomainAdapter.o: vamp-sdk/PluginBase.h
371
src/vamp-hostsdk/PluginInputDomainAdapter.o: vamp-sdk/plugguard.h
372
src/vamp-hostsdk/PluginInputDomainAdapter.o: vamp-sdk/RealTime.h
373
src/vamp-hostsdk/PluginLoader.o: ./vamp-hostsdk/PluginHostAdapter.h
374
src/vamp-hostsdk/PluginLoader.o: vamp/vamp.h vamp-sdk/Plugin.h
375
src/vamp-hostsdk/PluginLoader.o: vamp-sdk/PluginBase.h
376
src/vamp-hostsdk/PluginLoader.o: vamp-sdk/plugguard.h
377
src/vamp-hostsdk/PluginLoader.o: vamp-sdk/RealTime.h
378
src/vamp-hostsdk/PluginLoader.o: ./vamp-hostsdk/PluginLoader.h
379
src/vamp-hostsdk/PluginLoader.o: ./vamp-hostsdk/PluginWrapper.h
380
src/vamp-hostsdk/PluginLoader.o: ./vamp-hostsdk/Plugin.h
381
src/vamp-hostsdk/PluginLoader.o: ./vamp-hostsdk/hostguard.h
382
src/vamp-hostsdk/PluginLoader.o: vamp-sdk/Plugin.h
383
src/vamp-hostsdk/PluginLoader.o: ./vamp-hostsdk/PluginInputDomainAdapter.h
384
src/vamp-hostsdk/PluginLoader.o: ./vamp-hostsdk/PluginChannelAdapter.h
385
src/vamp-hostsdk/PluginLoader.o: ./vamp-hostsdk/PluginBufferingAdapter.h
386
src/vamp-hostsdk/PluginSummarisingAdapter.o: ./vamp-hostsdk/PluginSummarisingAdapter.h
387
src/vamp-hostsdk/PluginSummarisingAdapter.o: ./vamp-hostsdk/PluginWrapper.h
388
src/vamp-hostsdk/PluginSummarisingAdapter.o: ./vamp-hostsdk/Plugin.h
389
src/vamp-hostsdk/PluginSummarisingAdapter.o: ./vamp-hostsdk/hostguard.h
390
src/vamp-hostsdk/PluginSummarisingAdapter.o: vamp-sdk/Plugin.h
391
src/vamp-hostsdk/PluginSummarisingAdapter.o: vamp-sdk/PluginBase.h
392
src/vamp-hostsdk/PluginSummarisingAdapter.o: vamp-sdk/plugguard.h
393
src/vamp-hostsdk/PluginSummarisingAdapter.o: vamp-sdk/RealTime.h
394
src/vamp-hostsdk/PluginWrapper.o: ./vamp-hostsdk/PluginWrapper.h
395
src/vamp-hostsdk/PluginWrapper.o: ./vamp-hostsdk/Plugin.h
396
src/vamp-hostsdk/PluginWrapper.o: ./vamp-hostsdk/hostguard.h
397
src/vamp-hostsdk/PluginWrapper.o: vamp-sdk/Plugin.h
398
src/vamp-hostsdk/PluginWrapper.o: vamp-sdk/PluginBase.h
399
src/vamp-hostsdk/PluginWrapper.o: vamp-sdk/plugguard.h
400
src/vamp-hostsdk/PluginWrapper.o: vamp-sdk/RealTime.h
build/docker/Dockerfile_v2.9_ubuntu1604
1
FROM ubuntu:16.04
2
MAINTAINER Chris Cannam <cannam@all-day-breakfast.com>
3
RUN apt-get update && \
4
    apt-get install -y \
5
    locales \
6
    build-essential \
7
    libsndfile-dev \
8
    git \
9
    mercurial
10
RUN gcc --version
11
RUN apt-get clean && rm -rf /var/lib/apt/lists/*
12
RUN locale-gen en_US.UTF-8
13
ENV LANG en_US.UTF-8  
14
ENV LANGUAGE en_US:en  
15
ENV LC_ALL en_US.UTF-8
16
RUN hg clone -rvamp-plugin-sdk-v2.9 https://code.soundsoftware.ac.uk/hg/vamp-plugin-sdk
17
RUN hg clone https://code.soundsoftware.ac.uk/hg/vamp-test-plugin
18
WORKDIR vamp-plugin-sdk
19
RUN ./configure && make
20
WORKDIR ../vamp-test-plugin
21
RUN make -f Makefile.linux
22
WORKDIR ../vamp-plugin-sdk
23
RUN test/run-test-plugin-regression.sh
24
RUN mkdir vamp-plugin-sdk-2.9.0-binaries-amd64-linux
25
RUN cp libvamp-sdk.a libvamp-hostsdk.a examples/vamp-example-plugins.so host/vamp-simple-host rdf/generator/vamp-rdf-template-generator vamp-plugin-sdk-2.9.0-binaries-amd64-linux
26
RUN tar cvzf vamp-plugin-sdk-2.9.0-binaries-amd64-linux.tar.gz vamp-plugin-sdk-2.9.0-binaries-amd64-linux
27
RUN tar cvf output.tar *.tar.gz && cp output.tar ..
build/libvamp-hostsdk.la.in
8 8
old_library='%STATIC%'
9 9
dependency_libs=''
10 10
current=3
11
age=8
11
age=9
12 12
revision=0
13 13
installed=yes
14 14
libdir='%LIBS%'
build/libvamp-sdk.la.in
8 8
old_library='%STATIC%'
9 9
dependency_libs=''
10 10
current=2
11
age=8
11
age=9
12 12
revision=0
13 13
installed=yes
14 14
libdir='%LIBS%'
configure
1 1
#! /bin/sh
2 2
# Guess values for system-dependent variables and create Makefiles.
3
# Generated by GNU Autoconf 2.69 for vamp-plugin-sdk 2.8.
3
# Generated by GNU Autoconf 2.69 for vamp-plugin-sdk 2.9.
4 4
#
5 5
# Report bugs to <cannam@all-day-breakfast.com>.
6 6
#
......
580 580
# Identity of this package.
581 581
PACKAGE_NAME='vamp-plugin-sdk'
582 582
PACKAGE_TARNAME='vamp-plugin-sdk'
583
PACKAGE_VERSION='2.8'
584
PACKAGE_STRING='vamp-plugin-sdk 2.8'
583
PACKAGE_VERSION='2.9'
584
PACKAGE_STRING='vamp-plugin-sdk 2.9'
585 585
PACKAGE_BUGREPORT='cannam@all-day-breakfast.com'
586 586
PACKAGE_URL=''
587 587

  
......
630 630
PKG_CONFIG_LIBDIR
631 631
PKG_CONFIG_PATH
632 632
PKG_CONFIG
633
HAVE_CXX11
633 634
EGREP
634 635
GREP
635 636
CPP
......
1243 1244
  # Omit some internal or obsolete options to make the list less imposing.
1244 1245
  # This message is too long to be a string in the A/UX 3.1 sh.
1245 1246
  cat <<_ACEOF
1246
\`configure' configures vamp-plugin-sdk 2.8 to adapt to many kinds of systems.
1247
\`configure' configures vamp-plugin-sdk 2.9 to adapt to many kinds of systems.
1247 1248

  
1248 1249
Usage: $0 [OPTION]... [VAR=VALUE]...
1249 1250

  
......
1304 1305

  
1305 1306
if test -n "$ac_init_help"; then
1306 1307
  case $ac_init_help in
1307
     short | recursive ) echo "Configuration of vamp-plugin-sdk 2.8:";;
1308
     short | recursive ) echo "Configuration of vamp-plugin-sdk 2.9:";;
1308 1309
   esac
1309 1310
  cat <<\_ACEOF
1310 1311

  
......
1402 1403
test -n "$ac_init_help" && exit $ac_status
1403 1404
if $ac_init_version; then
1404 1405
  cat <<\_ACEOF
1405
vamp-plugin-sdk configure 2.8
1406
vamp-plugin-sdk configure 2.9
1406 1407
generated by GNU Autoconf 2.69
1407 1408

  
1408 1409
Copyright (C) 2012 Free Software Foundation, Inc.
......
1651 1652
This file contains any messages produced by compilers while
1652 1653
running configure, to aid debugging if configure makes a mistake.
1653 1654

  
1654
It was created by vamp-plugin-sdk $as_me 2.8, which was
1655
It was created by vamp-plugin-sdk $as_me 2.9, which was
1655 1656
generated by GNU Autoconf 2.69.  Invocation command line was
1656 1657

  
1657 1658
  $ $0 $@
......
3670 3671
 esac
3671 3672

  
3672 3673

  
3674
# We now require C++11
3675

  
3676
    ax_cxx_compile_cxx11_required=true
3677
  ac_ext=cpp
3678
ac_cpp='$CXXCPP $CPPFLAGS'
3679
ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
3680
ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
3681
ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
3682
  ac_success=no
3683
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX supports C++11 features by default" >&5
3684
$as_echo_n "checking whether $CXX supports C++11 features by default... " >&6; }
3685
if ${ax_cv_cxx_compile_cxx11+:} false; then :
3686
  $as_echo_n "(cached) " >&6
3687
else
3688
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
3689
/* end confdefs.h.  */
3690

  
3691
  template <typename T>
3692
    struct check
3693
    {
3694
      static_assert(sizeof(int) <= sizeof(T), "not big enough");
3695
    };
3696

  
3697
    struct Base {
3698
    virtual void f() {}
3699
    };
3700
    struct Child : public Base {
3701
    virtual void f() override {}
3702
    };
3703

  
3704
    typedef check<check<bool>> right_angle_brackets;
3705

  
3706
    int a;
3707
    decltype(a) b;
3708

  
3709
    typedef check<int> check_type;
3710
    check_type c;
3711
    check_type&& cr = static_cast<check_type&&>(c);
3712

  
3713
    auto d = a;
3714
    auto l = [](){};
3715

  
3716
_ACEOF
3717
if ac_fn_cxx_try_compile "$LINENO"; then :
3718
  ax_cv_cxx_compile_cxx11=yes
3719
else
3720
  ax_cv_cxx_compile_cxx11=no
3721
fi
3722
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
3723
fi
3724
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_cxx_compile_cxx11" >&5
3725
$as_echo "$ax_cv_cxx_compile_cxx11" >&6; }
3726
  if test x$ax_cv_cxx_compile_cxx11 = xyes; then
3727
    ac_success=yes
3728
  fi
3729

  
3730

  
3731

  
3732
    if test x$ac_success = xno; then
3733
    for switch in -std=c++11 -std=c++0x; do
3734
      cachevar=`$as_echo "ax_cv_cxx_compile_cxx11_$switch" | $as_tr_sh`
3735
      { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX supports C++11 features with $switch" >&5
3736
$as_echo_n "checking whether $CXX supports C++11 features with $switch... " >&6; }
3737
if eval \${$cachevar+:} false; then :
3738
  $as_echo_n "(cached) " >&6
3739
else
3740
  ac_save_CXXFLAGS="$CXXFLAGS"
3741
         CXXFLAGS="$CXXFLAGS $switch"
3742
         cat confdefs.h - <<_ACEOF >conftest.$ac_ext
3743
/* end confdefs.h.  */
3744

  
3745
  template <typename T>
3746
    struct check
3747
    {
3748
      static_assert(sizeof(int) <= sizeof(T), "not big enough");
3749
    };
3750

  
3751
    struct Base {
3752
    virtual void f() {}
3753
    };
3754
    struct Child : public Base {
3755
    virtual void f() override {}
3756
    };
3757

  
3758
    typedef check<check<bool>> right_angle_brackets;
3759

  
3760
    int a;
3761
    decltype(a) b;
3762

  
3763
    typedef check<int> check_type;
3764
    check_type c;
3765
    check_type&& cr = static_cast<check_type&&>(c);
3766

  
3767
    auto d = a;
3768
    auto l = [](){};
3769

  
3770
_ACEOF
3771
if ac_fn_cxx_try_compile "$LINENO"; then :
3772
  eval $cachevar=yes
3773
else
3774
  eval $cachevar=no
3775
fi
3776
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
3777
         CXXFLAGS="$ac_save_CXXFLAGS"
3778
fi
3779
eval ac_res=\$$cachevar
3780
	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
3781
$as_echo "$ac_res" >&6; }
3782
      if eval test x\$$cachevar = xyes; then
3783
        CXXFLAGS="$CXXFLAGS $switch"
3784
        ac_success=yes
3785
        break
3786
      fi
3787
    done
3788
  fi
3789
  ac_ext=c
3790
ac_cpp='$CPP $CPPFLAGS'
3791
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
3792
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
3793
ac_compiler_gnu=$ac_cv_c_compiler_gnu
3794

  
3795
  if test x$ax_cxx_compile_cxx11_required = xtrue; then
3796
    if test x$ac_success = xno; then
3797
      as_fn_error $? "*** A compiler with support for C++11 language features is required." "$LINENO" 5
3798
    fi
3799
  else
3800
    if test x$ac_success = xno; then
3801
      HAVE_CXX11=0
3802
      { $as_echo "$as_me:${as_lineno-$LINENO}: No compiler with C++11 support was found" >&5
3803
$as_echo "$as_me: No compiler with C++11 support was found" >&6;}
3804
    else
3805
      HAVE_CXX11=1
3806

  
3807
$as_echo "#define HAVE_CXX11 1" >>confdefs.h
3808

  
3809
    fi
3810

  
3811

  
3812
  fi
3813

  
3814

  
3673 3815
if pkg-config --modversion vamp-sdk >/dev/null 2>&1; then
3674 3816
  echo "WARNING: A version of the Vamp plugin SDK is already installed."
3675 3817
  echo "         Expect worries and sorrows if you install a new version"
......
3956 4098
    *[\ \	]-fPIC\ -Wall[\ \	]*) ;;
3957 4099
    *) CFLAGS="$CFLAGS -fPIC -Wall -Wextra" ;;
3958 4100
  esac
3959
  CXXFLAGS="$CXXFLAGS -std=c++98"
4101
  CXXFLAGS="$CXXFLAGS -std=c++11"
3960 4102
fi
3961 4103

  
3962 4104

  
......
4506 4648
# report actual input values of CONFIG_FILES etc. instead of their
4507 4649
# values after options handling.
4508 4650
ac_log="
4509
This file was extended by vamp-plugin-sdk $as_me 2.8, which was
4651
This file was extended by vamp-plugin-sdk $as_me 2.9, which was
4510 4652
generated by GNU Autoconf 2.69.  Invocation command line was
4511 4653

  
4512 4654
  CONFIG_FILES    = $CONFIG_FILES
......
4559 4701
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
4560 4702
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
4561 4703
ac_cs_version="\\
4562
vamp-plugin-sdk config.status 2.8
4704
vamp-plugin-sdk config.status 2.9
4563 4705
configured by $0, generated by GNU Autoconf 2.69,
4564 4706
  with options \\"\$ac_cs_config\\"
4565 4707

  
configure.ac
1 1

  
2
AC_INIT(vamp-plugin-sdk, 2.8, cannam@all-day-breakfast.com)
2
AC_INIT(vamp-plugin-sdk, 2.9, cannam@all-day-breakfast.com)
3 3

  
4 4
AC_CONFIG_SRCDIR(vamp/vamp.h)
5 5
AC_PROG_CXX
6 6
AC_HEADER_STDC
7 7
AC_C_BIGENDIAN
8 8

  
9
# We now require C++11
10
AX_CXX_COMPILE_STDCXX_11(noext)
11

  
9 12
if pkg-config --modversion vamp-sdk >/dev/null 2>&1; then
10 13
  echo "WARNING: A version of the Vamp plugin SDK is already installed."
11 14
  echo "         Expect worries and sorrows if you install a new version"
......
50 53
    *[\ \	]-fPIC\ -Wall[\ \	]*) ;;
51 54
    *) CFLAGS="$CFLAGS -fPIC -Wall -Wextra" ;;
52 55
  esac
53
  CXXFLAGS="$CXXFLAGS -std=c++98"
56
  CXXFLAGS="$CXXFLAGS -std=c++11"
54 57
fi
55 58
changequote([,])dnl
56 59

  
pkgconfig/vamp-hostsdk.pc.in
4 4
includedir=${prefix}/include
5 5

  
6 6
Name: vamp-hostsdk
7
Version: 2.8
7
Version: 2.9
8 8
Description: Development library for Vamp audio analysis plugin hosts
9 9
Libs: -L${libdir} -lvamp-hostsdk -ldl
10 10
Cflags: -I${includedir} 
pkgconfig/vamp-sdk.pc.in
4 4
includedir=${prefix}/include
5 5

  
6 6
Name: vamp-sdk
7
Version: 2.8
7
Version: 2.9
8 8
Description: Development library for Vamp audio analysis plugins
9 9
Libs: -L${libdir} -lvamp-sdk
10 10
Cflags: -I${includedir} 
pkgconfig/vamp.pc.in
4 4
includedir=${prefix}/include
5 5

  
6 6
Name: vamp
7
Version: 2.8
7
Version: 2.9
8 8
Description: An API for audio analysis and feature extraction plugins
9 9
Libs: 
10 10
Cflags: -I${includedir} 
src/vamp-hostsdk/PluginHostAdapter.cpp
39 39

  
40 40
#include "Files.h"
41 41

  
42
#if ( VAMP_SDK_MAJOR_VERSION != 2 || VAMP_SDK_MINOR_VERSION != 8 )
42
#if ( VAMP_SDK_MAJOR_VERSION != 2 || VAMP_SDK_MINOR_VERSION != 9 )
43 43
#error Unexpected version of Vamp SDK header included
44 44
#endif
45 45

  
src/vamp-hostsdk/PluginLoader.cpp
567 567
PluginLoader::Impl::pluginDeleted(PluginDeletionNotifyAdapter *adapter)
568 568
{
569 569
    void *handle = m_pluginLibraryHandleMap[adapter];
570
    if (handle) Files::unloadLibrary(handle);
570
    if (!handle) return;
571

  
571 572
    m_pluginLibraryHandleMap.erase(adapter);
573

  
574
    for (auto h: m_pluginLibraryHandleMap) {
575
        if (h.second == handle) {
576
            // still in use
577
            return;
578
        }
579
    }
580
    
581
    Files::unloadLibrary(handle);
572 582
}
573 583

  
574 584
PluginLoader::Impl::PluginDeletionNotifyAdapter::PluginDeletionNotifyAdapter(Plugin *plugin,
src/vamp-hostsdk/acsymbols.c
1 1
/* These stubs are provided so that autoconf can check library
2 2
 * versions using C symbols only */
3 3

  
4
extern void libvamphostsdk_v_2_9_present(void) { }
4 5
extern void libvamphostsdk_v_2_8_present(void) { }
5 6
extern void libvamphostsdk_v_2_7_1_present(void) { }
6 7
extern void libvamphostsdk_v_2_7_present(void) { }
src/vamp-sdk/FFT.cpp
41 41
#include <math.h>
42 42
#include <string.h>
43 43

  
44
#if ( VAMP_SDK_MAJOR_VERSION != 2 || VAMP_SDK_MINOR_VERSION != 8 )
44
#if ( VAMP_SDK_MAJOR_VERSION != 2 || VAMP_SDK_MINOR_VERSION != 9 )
45 45
#error Unexpected version of Vamp SDK header included
46 46
#endif
47 47

  
src/vamp-sdk/PluginAdapter.cpp
39 39
#include <cstring>
40 40
#include <cstdlib>
41 41

  
42
#if ( VAMP_SDK_MAJOR_VERSION != 2 || VAMP_SDK_MINOR_VERSION != 8 )
42
#include <mutex>
43

  
44
#if ( VAMP_SDK_MAJOR_VERSION != 2 || VAMP_SDK_MINOR_VERSION != 9 )
43 45
#error Unexpected version of Vamp SDK header included
44 46
#endif
45 47

  
48
using std::map;
49
using std::vector;
50
using std::string;
51
using std::cerr;
52
using std::endl;
53
using std::mutex;
54
using std::lock_guard;
46 55

  
47 56
//#define DEBUG_PLUGIN_ADAPTER 1
48 57

  
......
103 112

  
104 113
    void cleanup(Plugin *plugin);
105 114
    unsigned int getOutputCount(Plugin *plugin);
106
    VampOutputDescriptor *getOutputDescriptor(Plugin *plugin,
107
                                             unsigned int i);
115
    VampOutputDescriptor *getOutputDescriptor(Plugin *plugin, unsigned int i);
108 116
    VampFeatureList *process(Plugin *plugin,
109 117
                             const float *const *inputBuffers,
110 118
                             int sec, int nsec);
......
113 121
                                     const Plugin::FeatureSet &features);
114 122
    
115 123
    // maps both plugins and descriptors to adapters
116
    typedef std::map<const void *, Impl *> AdapterMap;
124
    typedef map<const void *, Impl *> AdapterMap;
125

  
117 126
    static AdapterMap *m_adapterMap;
127

  
128
    static mutex &adapterMapMutex() {
129
        // If this mutex was a global static, then it might be
130
        // destroyed before the last adapter, and we would end up
131
        // trying to lock an invalid mutex when removing an adapter
132
        // from the adapter map. To ensure it outlasts the adapters,
133
        // we need to ensure it is constructed before the construction
134
        // of any of them is complete, since destruction order is
135
        // reverse of construction. So we have to make sure this is
136
        // called from the PluginAdapterBase::Impl constructor below.
137
        static mutex m;
138
        return m;
139
    }
140
        
118 141
    static Impl *lookupAdapter(VampPluginHandle);
119 142

  
143
    mutex m_mutex; // guards all of the below
144
    
120 145
    bool m_populated;
121 146
    VampPluginDescriptor m_descriptor;
122 147
    Plugin::ParameterList m_parameters;
123 148
    Plugin::ProgramList m_programs;
124 149
    
125
    typedef std::map<Plugin *, Plugin::OutputList *> OutputMap;
150
    typedef map<Plugin *, Plugin::OutputList *> OutputMap;
126 151
    OutputMap m_pluginOutputs;
127 152

  
128
    std::map<Plugin *, VampFeatureList *> m_fs;
129
    std::map<Plugin *, std::vector<size_t> > m_fsizes;
130
    std::map<Plugin *, std::vector<std::vector<size_t> > > m_fvsizes;
153
    map<Plugin *, VampFeatureList *> m_fs;
154
    map<Plugin *, vector<size_t> > m_fsizes;
155
    map<Plugin *, vector<vector<size_t> > > m_fvsizes;
131 156
    void resizeFS(Plugin *plugin, int n);
132 157
    void resizeFL(Plugin *plugin, int n, size_t sz);
133 158
    void resizeFV(Plugin *plugin, int n, int j, size_t sz);
......
154 179
    m_populated(false)
155 180
{
156 181
#ifdef DEBUG_PLUGIN_ADAPTER
157
    std::cerr << "PluginAdapterBase::Impl[" << this << "]::Impl" << std::endl;
182
    cerr << "PluginAdapterBase::Impl[" << this << "]::Impl" << endl;
158 183
#endif
184

  
185
    (void)adapterMapMutex(); // see comment in adapterMapMutex function above
159 186
}
160 187

  
161 188
const VampPluginDescriptor *
162 189
PluginAdapterBase::Impl::getDescriptor()
163 190
{
164 191
#ifdef DEBUG_PLUGIN_ADAPTER
165
    std::cerr << "PluginAdapterBase::Impl[" << this << "]::getDescriptor" << std::endl;
192
    cerr << "PluginAdapterBase::Impl[" << this << "]::getDescriptor" << endl;
166 193
#endif
167 194

  
195
    lock_guard<mutex> guard(m_mutex);
196
    
168 197
    if (m_populated) return &m_descriptor;
169 198
    
170 199
    Plugin *plugin = m_base->createPlugin(48000);
171 200
  
172 201
    if (!plugin) {
173
        std::cerr << "PluginAdapterBase::Impl::getDescriptor: Failed to create plugin" << std::endl;
202
        cerr << "PluginAdapterBase::Impl::getDescriptor: Failed to create plugin" << endl;
174 203
        return 0;
175 204
    }
176 205

  
177 206
    if (plugin->getVampApiVersion() != VAMP_API_VERSION) {
178
        std::cerr << "Vamp::PluginAdapterBase::Impl::getDescriptor: ERROR: "
179
                  << "API version " << plugin->getVampApiVersion()
180
                  << " for\nplugin \"" << plugin->getIdentifier() << "\" "
181
                  << "differs from version "
182
                  << VAMP_API_VERSION << " for adapter.\n"
183
                  << "This plugin is probably linked against a different version of the Vamp SDK\n"
184
                  << "from the version it was compiled with.  It will need to be re-linked correctly\n"
185
                  << "before it can be used." << std::endl;
207
        cerr << "Vamp::PluginAdapterBase::Impl::getDescriptor: ERROR: "
208
             << "API version " << plugin->getVampApiVersion()
209
             << " for\nplugin \"" << plugin->getIdentifier() << "\" "
210
             << "differs from version "
211
             << VAMP_API_VERSION << " for adapter.\n"
212
             << "This plugin is probably linked against a different version of the Vamp SDK\n"
213
             << "from the version it was compiled with.  It will need to be re-linked correctly\n"
214
             << "before it can be used." << endl;
186 215
        delete plugin;
187 216
        return 0;
188 217
    }
......
260 289
    m_descriptor.process = vampProcess;
261 290
    m_descriptor.getRemainingFeatures = vampGetRemainingFeatures;
262 291
    m_descriptor.releaseFeatureSet = vampReleaseFeatureSet;
292

  
293
    lock_guard<mutex> adapterMapGuard(adapterMapMutex());
263 294
    
264 295
    if (!m_adapterMap) {
265 296
        m_adapterMap = new AdapterMap;
......
275 306
PluginAdapterBase::Impl::~Impl()
276 307
{
277 308
#ifdef DEBUG_PLUGIN_ADAPTER
278
    std::cerr << "PluginAdapterBase::Impl[" << this << "]::~Impl" << std::endl;
309
    cerr << "PluginAdapterBase::Impl[" << this << "]::~Impl" << endl;
279 310
#endif
280 311

  
312
    lock_guard<mutex> guard(m_mutex);
313

  
281 314
    if (!m_populated) return;
282 315

  
283 316
    free((void *)m_descriptor.identifier);
......
307 340
    }
308 341
    free((void *)m_descriptor.programs);
309 342

  
343
    lock_guard<mutex> adapterMapGuard(adapterMapMutex());
344
    
310 345
    if (m_adapterMap) {
311 346
        
312 347
        m_adapterMap->erase(&m_descriptor);
313

  
348
        
314 349
        if (m_adapterMap->empty()) {
315 350
            delete m_adapterMap;
316 351
            m_adapterMap = 0;
......
322 357
PluginAdapterBase::Impl::lookupAdapter(VampPluginHandle handle)
323 358
{
324 359
#ifdef DEBUG_PLUGIN_ADAPTER
325
    std::cerr << "PluginAdapterBase::Impl::lookupAdapter(" << handle << ")" << std::endl;
360
    cerr << "PluginAdapterBase::Impl::lookupAdapter(" << handle << ")" << endl;
326 361
#endif
327 362

  
363
    lock_guard<mutex> adapterMapGuard(adapterMapMutex());
364
    
328 365
    if (!m_adapterMap) return 0;
329 366
    AdapterMap::const_iterator i = m_adapterMap->find(handle);
330 367
    if (i == m_adapterMap->end()) return 0;
......
336 373
                                         float inputSampleRate)
337 374
{
338 375
#ifdef DEBUG_PLUGIN_ADAPTER
339
    std::cerr << "PluginAdapterBase::Impl::vampInstantiate(" << desc << ")" << std::endl;
376
    cerr << "PluginAdapterBase::Impl::vampInstantiate(" << desc << ")" << endl;
340 377
#endif
341 378

  
379
    lock_guard<mutex> adapterMapGuard(adapterMapMutex());
380
    
342 381
    if (!m_adapterMap) {
343 382
        m_adapterMap = new AdapterMap();
344 383
    }
345 384

  
346 385
    if (m_adapterMap->find(desc) == m_adapterMap->end()) {
347
        std::cerr << "WARNING: PluginAdapterBase::Impl::vampInstantiate: Descriptor " << desc << " not in adapter map" << std::endl;
386
        cerr << "WARNING: PluginAdapterBase::Impl::vampInstantiate: Descriptor " << desc << " not in adapter map" << endl;
348 387
        return 0;
349 388
    }
350 389

  
......
357 396
    }
358 397

  
359 398
#ifdef DEBUG_PLUGIN_ADAPTER
360
    std::cerr << "PluginAdapterBase::Impl::vampInstantiate(" << desc << "): returning handle " << plugin << std::endl;
399
    cerr << "PluginAdapterBase::Impl::vampInstantiate(" << desc << "): returning handle " << plugin << endl;
361 400
#endif
362 401

  
363 402
    return plugin;
......
367 406
PluginAdapterBase::Impl::vampCleanup(VampPluginHandle handle)
368 407
{
369 408
#ifdef DEBUG_PLUGIN_ADAPTER
370
    std::cerr << "PluginAdapterBase::Impl::vampCleanup(" << handle << ")" << std::endl;
409
    cerr << "PluginAdapterBase::Impl::vampCleanup(" << handle << ")" << endl;
371 410
#endif
372 411

  
373 412
    Impl *adapter = lookupAdapter(handle);
......
385 424
                                        unsigned int blockSize)
386 425
{
387 426
#ifdef DEBUG_PLUGIN_ADAPTER
388
    std::cerr << "PluginAdapterBase::Impl::vampInitialise(" << handle << ", " << channels << ", " << stepSize << ", " << blockSize << ")" << std::endl;
427
    cerr << "PluginAdapterBase::Impl::vampInitialise(" << handle << ", " << channels << ", " << stepSize << ", " << blockSize << ")" << endl;
389 428
#endif
390 429

  
391 430
    Impl *adapter = lookupAdapter(handle);
......
399 438
PluginAdapterBase::Impl::vampReset(VampPluginHandle handle) 
400 439
{
401 440
#ifdef DEBUG_PLUGIN_ADAPTER
402
    std::cerr << "PluginAdapterBase::Impl::vampReset(" << handle << ")" << std::endl;
441
    cerr << "PluginAdapterBase::Impl::vampReset(" << handle << ")" << endl;
403 442
#endif
404 443

  
405 444
    ((Plugin *)handle)->reset();
......
410 449
                                    int param) 
411 450
{
412 451
#ifdef DEBUG_PLUGIN_ADAPTER
413
    std::cerr << "PluginAdapterBase::Impl::vampGetParameter(" << handle << ", " << param << ")" << std::endl;
452
    cerr << "PluginAdapterBase::Impl::vampGetParameter(" << handle << ", " << param << ")" << endl;
414 453
#endif
415 454

  
416 455
    Impl *adapter = lookupAdapter(handle);
......
424 463
                                    int param, float value)
425 464
{
426 465
#ifdef DEBUG_PLUGIN_ADAPTER
427
    std::cerr << "PluginAdapterBase::Impl::vampSetParameter(" << handle << ", " << param << ", " << value << ")" << std::endl;
466
    cerr << "PluginAdapterBase::Impl::vampSetParameter(" << handle << ", " << param << ", " << value << ")" << endl;
428 467
#endif
429 468

  
430 469
    Impl *adapter = lookupAdapter(handle);
......
438 477
PluginAdapterBase::Impl::vampGetCurrentProgram(VampPluginHandle handle)
439 478
{
440 479
#ifdef DEBUG_PLUGIN_ADAPTER
441
    std::cerr << "PluginAdapterBase::Impl::vampGetCurrentProgram(" << handle << ")" << std::endl;
480
    cerr << "PluginAdapterBase::Impl::vampGetCurrentProgram(" << handle << ")" << endl;
442 481
#endif
443 482

  
444 483
    Impl *adapter = lookupAdapter(handle);
445 484
    if (!adapter) return 0;
446 485
    Plugin::ProgramList &list = adapter->m_programs;
447
    std::string program = ((Plugin *)handle)->getCurrentProgram();
486
    string program = ((Plugin *)handle)->getCurrentProgram();
448 487
    for (unsigned int i = 0; i < list.size(); ++i) {
449 488
        if (list[i] == program) return i;
450 489
    }
......
456 495
                                           unsigned int program)
457 496
{
458 497
#ifdef DEBUG_PLUGIN_ADAPTER
459
    std::cerr << "PluginAdapterBase::Impl::vampSelectProgram(" << handle << ", " << program << ")" << std::endl;
498
    cerr << "PluginAdapterBase::Impl::vampSelectProgram(" << handle << ", " << program << ")" << endl;
460 499
#endif
461 500

  
462 501
    Impl *adapter = lookupAdapter(handle);
......
472 511
PluginAdapterBase::Impl::vampGetPreferredStepSize(VampPluginHandle handle)
473 512
{
474 513
#ifdef DEBUG_PLUGIN_ADAPTER
475
    std::cerr << "PluginAdapterBase::Impl::vampGetPreferredStepSize(" << handle << ")" << std::endl;
514
    cerr << "PluginAdapterBase::Impl::vampGetPreferredStepSize(" << handle << ")" << endl;
476 515
#endif
477 516

  
478 517
    return ((Plugin *)handle)->getPreferredStepSize();
......
482 521
PluginAdapterBase::Impl::vampGetPreferredBlockSize(VampPluginHandle handle) 
483 522
{
484 523
#ifdef DEBUG_PLUGIN_ADAPTER
485
    std::cerr << "PluginAdapterBase::Impl::vampGetPreferredBlockSize(" << handle << ")" << std::endl;
524
    cerr << "PluginAdapterBase::Impl::vampGetPreferredBlockSize(" << handle << ")" << endl;
486 525
#endif
487 526

  
488 527
    return ((Plugin *)handle)->getPreferredBlockSize();
......
492 531
PluginAdapterBase::Impl::vampGetMinChannelCount(VampPluginHandle handle)
493 532
{
494 533
#ifdef DEBUG_PLUGIN_ADAPTER
495
    std::cerr << "PluginAdapterBase::Impl::vampGetMinChannelCount(" << handle << ")" << std::endl;
534
    cerr << "PluginAdapterBase::Impl::vampGetMinChannelCount(" << handle << ")" << endl;
496 535
#endif
497 536

  
498 537
    return ((Plugin *)handle)->getMinChannelCount();
......
502 541
PluginAdapterBase::Impl::vampGetMaxChannelCount(VampPluginHandle handle)
503 542
{
504 543
#ifdef DEBUG_PLUGIN_ADAPTER
505
    std::cerr << "PluginAdapterBase::Impl::vampGetMaxChannelCount(" << handle << ")" << std::endl;
544
    cerr << "PluginAdapterBase::Impl::vampGetMaxChannelCount(" << handle << ")" << endl;
506 545
#endif
507 546

  
508 547
    return ((Plugin *)handle)->getMaxChannelCount();
......
512 551
PluginAdapterBase::Impl::vampGetOutputCount(VampPluginHandle handle)
513 552
{
514 553
#ifdef DEBUG_PLUGIN_ADAPTER
515
    std::cerr << "PluginAdapterBase::Impl::vampGetOutputCount(" << handle << ")" << std::endl;
554
    cerr << "PluginAdapterBase::Impl::vampGetOutputCount(" << handle << ")" << endl;
516 555
#endif
517 556

  
518 557
    Impl *adapter = lookupAdapter(handle);
519 558

  
520
//    std::cerr << "vampGetOutputCount: handle " << handle << " -> adapter "<< adapter << std::endl;
559
//    cerr << "vampGetOutputCount: handle " << handle << " -> adapter "<< adapter << endl;
521 560

  
522 561
    if (!adapter) return 0;
523 562
    return adapter->getOutputCount((Plugin *)handle);
......
528 567
                                                 unsigned int i)
529 568
{
530 569
#ifdef DEBUG_PLUGIN_ADAPTER
531
    std::cerr << "PluginAdapterBase::Impl::vampGetOutputDescriptor(" << handle << ", " << i << ")" << std::endl;
570
    cerr << "PluginAdapterBase::Impl::vampGetOutputDescriptor(" << handle << ", " << i << ")" << endl;
532 571
#endif
533 572

  
534 573
    Impl *adapter = lookupAdapter(handle);
535 574

  
536
//    std::cerr << "vampGetOutputDescriptor: handle " << handle << " -> adapter "<< adapter << std::endl;
575
//    cerr << "vampGetOutputDescriptor: handle " << handle << " -> adapter "<< adapter << endl;
537 576

  
538 577
    if (!adapter) return 0;
539 578
    return adapter->getOutputDescriptor((Plugin *)handle, i);
......
543 582
PluginAdapterBase::Impl::vampReleaseOutputDescriptor(VampOutputDescriptor *desc)
544 583
{
545 584
#ifdef DEBUG_PLUGIN_ADAPTER
546
    std::cerr << "PluginAdapterBase::Impl::vampReleaseOutputDescriptor(" << desc << ")" << std::endl;
585
    cerr << "PluginAdapterBase::Impl::vampReleaseOutputDescriptor(" << desc << ")" << endl;
547 586
#endif
548 587

  
549 588
    if (desc->identifier) free((void *)desc->identifier);
......
568 607
                                     int nsec)
569 608
{
570 609
#ifdef DEBUG_PLUGIN_ADAPTER
571
    std::cerr << "PluginAdapterBase::Impl::vampProcess(" << handle << ", " << sec << ", " << nsec << ")" << std::endl;
610
    cerr << "PluginAdapterBase::Impl::vampProcess(" << handle << ", " << sec << ", " << nsec << ")" << endl;
572 611
#endif
573 612

  
574 613
    Impl *adapter = lookupAdapter(handle);
......
580 619
PluginAdapterBase::Impl::vampGetRemainingFeatures(VampPluginHandle handle)
581 620
{
582 621
#ifdef DEBUG_PLUGIN_ADAPTER
583
    std::cerr << "PluginAdapterBase::Impl::vampGetRemainingFeatures(" << handle << ")" << std::endl;
622
    cerr << "PluginAdapterBase::Impl::vampGetRemainingFeatures(" << handle << ")" << endl;
584 623
#endif
585 624

  
586 625
    Impl *adapter = lookupAdapter(handle);
......
592 631
PluginAdapterBase::Impl::vampReleaseFeatureSet(VampFeatureList *)
593 632
{
594 633
#ifdef DEBUG_PLUGIN_ADAPTER
595
    std::cerr << "PluginAdapterBase::Impl::vampReleaseFeatureSet" << std::endl;
634
    cerr << "PluginAdapterBase::Impl::vampReleaseFeatureSet" << endl;
596 635
#endif
597 636
}
598 637

  
599 638
void 
600 639
PluginAdapterBase::Impl::cleanup(Plugin *plugin)
601 640
{
641
    // at this point no mutex is held
642
    
643
    lock_guard<mutex> adapterMapGuard(adapterMapMutex());
644
    lock_guard<mutex> guard(m_mutex);
645
    
602 646
    if (m_fs.find(plugin) != m_fs.end()) {
603 647
        size_t outputCount = 0;
604 648
        if (m_pluginOutputs[plugin]) {
605 649
            outputCount = m_pluginOutputs[plugin]->size();
606 650
        }
607 651
#ifdef DEBUG_PLUGIN_ADAPTER
608
        std::cerr << "PluginAdapterBase::Impl::cleanup: " << outputCount << " output(s)" << std::endl;
652
        cerr << "PluginAdapterBase::Impl::cleanup: " << outputCount << " output(s)" << endl;
609 653
#endif
610 654
        VampFeatureList *list = m_fs[plugin];
611 655
        for (unsigned int i = 0; i < outputCount; ++i) {
......
645 689
void 
646 690
PluginAdapterBase::Impl::checkOutputMap(Plugin *plugin)
647 691
{
692
    // must be called with m_mutex held
693
    
648 694
    OutputMap::iterator i = m_pluginOutputs.find(plugin);
649 695

  
650 696
    if (i == m_pluginOutputs.end() || !i->second) {
......
652 698
        m_pluginOutputs[plugin] = new Plugin::OutputList
653 699
            (plugin->getOutputDescriptors());
654 700

  
655
//        std::cerr << "PluginAdapterBase::Impl::checkOutputMap: Have " << m_pluginOutputs[plugin]->size() << " outputs for plugin " << plugin->getIdentifier() << std::endl;
701
//        cerr << "PluginAdapterBase::Impl::checkOutputMap: Have " << m_pluginOutputs[plugin]->size() << " outputs for plugin " << plugin->getIdentifier() << endl;
656 702
    }
657 703
}
658 704

  
659 705
void
660 706
PluginAdapterBase::Impl::markOutputsChanged(Plugin *plugin)
661 707
{
708
    lock_guard<mutex> guard(m_mutex);
709

  
662 710
    OutputMap::iterator i = m_pluginOutputs.find(plugin);
663 711

  
664
//    std::cerr << "PluginAdapterBase::Impl::markOutputsChanged" << std::endl;
712
//    cerr << "PluginAdapterBase::Impl::markOutputsChanged" << endl;
665 713

  
666 714
    if (i != m_pluginOutputs.end()) {
... This diff was truncated because it exceeds the maximum size that can be displayed.

Also available in: Unified diff