changeset 528:db2cd87cef6f c++11-mutex

This will be v2.9
author Chris Cannam
date Tue, 22 Oct 2019 12:10:41 +0100
parents bc5e76e90e95
children 57053d1ba746
files CHANGELOG Makefile.in README build/Doxyfile build/Makefile.osx.106 build/libvamp-hostsdk.la.in build/libvamp-sdk.la.in configure configure.ac pkgconfig/vamp-hostsdk.pc.in pkgconfig/vamp-sdk.pc.in pkgconfig/vamp.pc.in src/vamp-hostsdk/PluginHostAdapter.cpp src/vamp-hostsdk/acsymbols.c src/vamp-sdk/FFT.cpp src/vamp-sdk/PluginAdapter.cpp src/vamp-sdk/acsymbols.c vamp-hostsdk/hostguard.h vamp-sdk/plugguard.h
diffstat 19 files changed, 46 insertions(+), 428 deletions(-) [+]
line wrap: on
line diff
--- a/CHANGELOG	Wed Sep 11 14:55:16 2019 +0100
+++ b/CHANGELOG	Tue Oct 22 12:10:41 2019 +0100
@@ -1,3 +1,19 @@
+
+Version 2.9, 2019-10-23 (maintenance release)
+
+  * Fix non-thread-safe behaviour in PluginAdapter. Plugins built
+    using the adapter classes in version 2.8 or earlier cannot safely
+    be used simultaneously across threads with other instances of
+    themselves or of other plugins in the same library (i.e. shared
+    object). Hosts have been required to provide synchronisation for
+    such cases. Version 2.9 introduces synchronisation in the plugin,
+    making this usage safe. Unfortunately this does not make host code
+    safe when using older plugin builds, as the problem and its fix
+    are in the plugin side of the SDK. Caution is still required, but
+    this fix does allow updated plugin builds to avoid problems with
+    some existing hosts
+  * Change required C++ language standard from C++98 to C++11. This
+    is because of the use of std::mutex in the above fix
 
 Version 2.8, 2019-02-07 (maintenance and minor feature release)
 
--- a/Makefile.in	Wed Sep 11 14:55:16 2019 +0100
+++ b/Makefile.in	Tue Oct 22 12:10:41 2019 +0100
@@ -78,13 +78,13 @@
 INSTALL_PLUGINS		  = $(INSTALL_PREFIX)/lib/vamp
 INSTALL_BINARIES	  = $(INSTALL_PREFIX)/bin 
 
-INSTALL_SDK_LIBNAME	  = libvamp-sdk.so.2.8.0
+INSTALL_SDK_LIBNAME	  = libvamp-sdk.so.2.9.0
 INSTALL_SDK_LINK_ABI	  = libvamp-sdk.so.2
 INSTALL_SDK_LINK_DEV	  = libvamp-sdk.so
 INSTALL_SDK_STATIC        = libvamp-sdk.a
 INSTALL_SDK_LA            = libvamp-sdk.la
 
-INSTALL_HOSTSDK_LIBNAME   = libvamp-hostsdk.so.3.8.0
+INSTALL_HOSTSDK_LIBNAME   = libvamp-hostsdk.so.3.9.0
 INSTALL_HOSTSDK_LINK_ABI  = libvamp-hostsdk.so.3
 INSTALL_HOSTSDK_LINK_DEV  = libvamp-hostsdk.so
 INSTALL_HOSTSDK_STATIC    = libvamp-hostsdk.a
@@ -113,7 +113,7 @@
 	HOSTSDK_DYNAMIC_LDFLAGS	  = $(DYNAMIC_LDFLAGS)
 	PLUGIN_LDFLAGS		  = $(DYNAMIC_LDFLAGS) -exported_symbols_list build/vamp-plugin.list
 
-	INSTALL_HOSTSDK_LIBNAME   = libvamp-hostsdk.3.8.0.dylib
+	INSTALL_HOSTSDK_LIBNAME   = libvamp-hostsdk.3.9.0.dylib
 	INSTALL_HOSTSDK_LINK_ABI  = libvamp-hostsdk.3.dylib
 
 # The OS X linker doesn't allow you to request static linkage when
@@ -122,7 +122,7 @@
 # dynamic, the static library will never be used. That's OK for the
 # host SDK, but we do want plugins to get static linkage of the plugin
 # SDK. So install the dynamic version under a different name.
-	INSTALL_SDK_LIBNAME	  = libvamp-sdk-dynamic.2.8.0.dylib
+	INSTALL_SDK_LIBNAME	  = libvamp-sdk-dynamic.2.9.0.dylib
 	INSTALL_SDK_LINK_ABI	  = libvamp-sdk-dynamic.2.dylib
 
 endif
--- a/README	Wed Sep 11 14:55:16 2019 +0100
+++ b/README	Tue Oct 22 12:10:41 2019 +0100
@@ -9,7 +9,7 @@
 Vamp is an API for C and C++ plugins that process sampled audio data
 to produce descriptive output (measurements or semantic observations).
 
-This is version 2.8 of the Vamp plugin Software Development Kit.
+This is version 2.9 of the Vamp plugin Software Development Kit.
 
 Plugins and hosts built with this SDK are binary compatible with those
 built using any version 2.0 or newer of the SDK.
--- a/build/Doxyfile	Wed Sep 11 14:55:16 2019 +0100
+++ b/build/Doxyfile	Tue Oct 22 12:10:41 2019 +0100
@@ -31,7 +31,7 @@
 # This could be handy for archiving the generated documentation or 
 # if some version control system is used.
 
-PROJECT_NUMBER         = 2.8
+PROJECT_NUMBER         = 2.9
 
 # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) 
 # base path where the generated documentation will be put. 
--- a/build/Makefile.osx.106	Wed Sep 11 14:55:16 2019 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,400 +0,0 @@
-
-# Makefile for the Vamp plugin SDK.  This builds the SDK objects,
-# libraries, example plugins, and the test host.  Please adjust to
-# suit your operating system requirements.
-#
-# This version of the Makefile is approximately correct for OS/X.
-# Note that it has no "install" target; the following are the
-# library and related files that may be of interest resulting from
-# the build:
-# 
-#   libvamp-sdk.dylib                 [SDK dynamic library for plugins]
-#   libvamp-hostsdk.dylib             [SDK dynamic library for hosts]
-#
-#   libvamp-sdk.a                     [SDK static library for plugins]
-#   libvamp-hostsdk.a                 [SDK static library for hosts]
-#
-#   examples/vamp-example-plugins.cat     [copy this to your Vamp plugin dir]
-#   examples/vamp-example-plugins.dylib   [copy this to your Vamp plugin dir]
-#
-#   host/vamp-simple-host                 [requires libsndfile to build]
-#
-#   rdf/generator/vamp-rdf-template-generator
-
-# Makefile for the Vamp plugin SDK.  This builds the SDK objects,
-# libraries, example plugins, and the test host.  Please adjust to
-# suit your operating system requirements.
-
-APIDIR		= vamp
-
-SDKDIR		= vamp-sdk
-HOSTSDKDIR	= vamp-hostsdk
-
-SRCDIR		= src
-SDKSRCDIR	= src/vamp-sdk
-HOSTSDKSRCDIR	= src/vamp-hostsdk
-
-EXAMPLEDIR	= examples
-HOSTDIR		= host
-PCDIR		= pkgconfig
-LADIR		= build
-RDFGENDIR	= rdf/generator
-
-###
-### Start of user-serviceable parts
-###
-
-# Default build target (or use "make <target>" to select one).
-# Targets are:
-#   all       -- build everything
-#   sdk       -- build all the Vamp SDK libraries for plugins and hosts
-#   sdkstatic -- build only the static versions of the SDK libraries
-#   plugins   -- build the example plugins (and the SDK if required)
-#   host      -- build the simple Vamp plugin host (and the SDK if required)
-#   rdfgen    -- build the RDF template generator (and the SDK if required)
-#   test      -- build the host and example plugins, and run a quick test
-#   clean     -- remove binary targets
-#   distclean -- remove all targets
-#
-default:	all
-
-# Architecture and developer SDK selection flags.  Change these only
-# if you want to select a different OS/X compatibility level from the
-# default.
-#
-# By default, we try to find the oldest available SDK that is newer
-# than 10.4.
-# 
-# If you want to override this to select a particular SDK, change
-# PREFERRED_SDK to the SDK name (e.g. "10.4u") and PREFERRED_MINVERSION
-# to the minimum OS revision (e.g. "10.4").  An example follows this code.
-# 
-SDKPREFIX	:= /Developer/SDKs/MacOSX
-SDKS		:= $(wildcard $(SDKPREFIX)*.sdk)
-SDKVERSIONS	:= $(patsubst $(SDKPREFIX)%.sdk,%,$(SDKS))
-GOOD_SDKS	:= $(filter-out 10.1%,$(filter-out 10.2%,$(filter-out 10.3%,$(filter-out 10.4%,$(SDKVERSIONS)))))
-#
-PREFERRED_SDK	:= $(word 1, $(sort $(GOOD_SDKS)))
-PREFERRED_MINVERSION  := $(patsubst %u,%,$(PREFERRED_SDK))
-#
-# Example: to set your own values, uncomment and adjust:
-# PREFERRED_SDK	:= 10.4u
-# PREFERRED_MINVERSION  := 10.4
-
-SDKFLAGS	= -isysroot /Developer/SDKs/MacOSX$(PREFERRED_SDK).sdk -mmacosx-version-min=$(PREFERRED_MINVERSION)
-
-# Our default is to try to build for all available architectures in a
-# universal binary.
-#
-ARCHFLAGS = $(SDKFLAGS) -arch i386 -arch x86_64 -arch ppc
-
-# Compile flags
-#
-CFLAGS		= $(ARCHFLAGS) -fPIC
-CXXFLAGS	= $(ARCHFLAGS) -O2 -Wall -I. -fPIC
-
-# Link flags common to all link targets
-#
-LDFLAGS		= $(ARCHFLAGS) 
-
-# ar, ranlib
-#
-AR		= ar
-RANLIB		= ranlib
-RM_F		= rm -f
-
-# Libraries required for the plugins.
-#
-PLUGIN_LIBS	= ./libvamp-sdk.a
-
-# File extension for a dynamically loadable object
-#
-PLUGIN_EXT	= .dylib
-
-# Libraries required for the host.
-#
-HOST_LIBS	= ./libvamp-hostsdk.a -lsndfile -ldl
-
-# Libraries required for the RDF template generator.
-#
-RDFGEN_LIBS	= ./libvamp-hostsdk.a -ldl
-
-# Flags required to tell the compiler to create a dynamically loadable object
-#
-DYNAMIC_LDFLAGS		= $(ARCHFLAGS) -dynamiclib 
-
-# Flags for building specific plugin and library targets.  We need to
-# tell the linker the formal name for the library, and for plugins we
-# also want to tell the linker to make all symbols in the library
-# hidden except for the public entry point (making for a tidier library).
-#
-PLUGIN_LDFLAGS		= $(DYNAMIC_LDFLAGS) \
-			  -install_name vamp-example-plugins.dylib \
-			  -exported_symbols_list build/vamp-plugin.list
-SDK_DYNAMIC_LDFLAGS	= $(DYNAMIC_LDFLAGS) -install_name libvamp-sdk.dylib
-HOSTSDK_DYNAMIC_LDFLAGS	= $(DYNAMIC_LDFLAGS) -install_name libvamp-hostsdk.dylib
-
-
-### End of user-serviceable parts
-
-
-API_HEADERS	= \
-		$(APIDIR)/vamp.h
-
-SDK_HEADERS	= \
-		$(SDKDIR)/Plugin.h \
-		$(SDKDIR)/PluginAdapter.h \
-		$(SDKDIR)/PluginBase.h \
-		$(SDKDIR)/RealTime.h \
-		$(SDKDIR)/FFT.h \
-		$(SDKDIR)/plugguard.h \
-		$(SDKDIR)/vamp-sdk.h
-
-HOSTSDK_HEADERS	= \
-		$(HOSTSDKDIR)/Plugin.h \
-		$(HOSTSDKDIR)/PluginBase.h \
-		$(HOSTSDKDIR)/PluginHostAdapter.h \
-		$(HOSTSDKDIR)/RealTime.h \
-		$(HOSTSDKDIR)/PluginBufferingAdapter.h \
-		$(HOSTSDKDIR)/PluginChannelAdapter.h \
-		$(HOSTSDKDIR)/PluginInputDomainAdapter.h \
-		$(HOSTSDKDIR)/PluginLoader.h \
-		$(HOSTSDKDIR)/PluginSummarisingAdapter.h \
-		$(HOSTSDKDIR)/PluginWrapper.h \
-		$(HOSTSDKDIR)/hostguard.h \
-		$(HOSTSDKDIR)/host-c.h \
-		$(HOSTSDKDIR)/vamp-hostsdk.h
-
-SDK_OBJECTS	= \
-		$(SDKSRCDIR)/PluginAdapter.o \
-		$(SDKSRCDIR)/RealTime.o \
-		$(SDKSRCDIR)/FFT.o \
-		$(SDKSRCDIR)/acsymbols.o
-
-HOSTSDK_OBJECTS	= \
-		$(HOSTSDKSRCDIR)/Files.o \
-		$(HOSTSDKSRCDIR)/PluginHostAdapter.o \
-		$(HOSTSDKSRCDIR)/RealTime.o \
-		$(HOSTSDKSRCDIR)/PluginBufferingAdapter.o \
-		$(HOSTSDKSRCDIR)/PluginChannelAdapter.o \
-		$(HOSTSDKSRCDIR)/PluginInputDomainAdapter.o \
-		$(HOSTSDKSRCDIR)/PluginLoader.o \
-		$(HOSTSDKSRCDIR)/PluginSummarisingAdapter.o \
-		$(HOSTSDKSRCDIR)/PluginWrapper.o \
-		$(HOSTSDKSRCDIR)/host-c.o \
-		$(HOSTSDKSRCDIR)/acsymbols.o
-
-SDK_STATIC	= \
-		./libvamp-sdk.a
-
-HOSTSDK_STATIC	= \
-		./libvamp-hostsdk.a
-
-SDK_DYNAMIC	= \
-		./libvamp-sdk$(PLUGIN_EXT)
-
-HOSTSDK_DYNAMIC	= \
-		./libvamp-hostsdk$(PLUGIN_EXT)
-
-SDK_LA		= \
-		$(LADIR)/libvamp-sdk.la
-
-HOSTSDK_LA	= \
-		$(LADIR)/libvamp-hostsdk.la
-
-PLUGIN_HEADERS	= \
-		$(EXAMPLEDIR)/SpectralCentroid.h \
-		$(EXAMPLEDIR)/PowerSpectrum.h \
-		$(EXAMPLEDIR)/PercussionOnsetDetector.h \
-		$(EXAMPLEDIR)/FixedTempoEstimator.h \
-		$(EXAMPLEDIR)/AmplitudeFollower.h \
-		$(EXAMPLEDIR)/ZeroCrossing.h
-
-PLUGIN_OBJECTS	= \
-		$(EXAMPLEDIR)/SpectralCentroid.o \
-		$(EXAMPLEDIR)/PowerSpectrum.o \
-		$(EXAMPLEDIR)/PercussionOnsetDetector.o \
-		$(EXAMPLEDIR)/FixedTempoEstimator.o \
-		$(EXAMPLEDIR)/AmplitudeFollower.o \
-		$(EXAMPLEDIR)/ZeroCrossing.o \
-		$(EXAMPLEDIR)/plugins.o
-
-PLUGIN_TARGET	= \
-		$(EXAMPLEDIR)/vamp-example-plugins$(PLUGIN_EXT)
-
-HOST_HEADERS	= \
-		$(HOSTDIR)/system.h
-
-HOST_OBJECTS	= \
-		$(HOSTDIR)/vamp-simple-host.o
-
-HOST_TARGET	= \
-		$(HOSTDIR)/vamp-simple-host
-
-RDFGEN_OBJECTS	= \
-		$(RDFGENDIR)/vamp-rdf-template-generator.o
-
-RDFGEN_TARGET	= \
-		$(RDFGENDIR)/vamp-rdf-template-generator
-
-show:
-		@echo " *** Found available SDK versions: $(SDKVERSIONS)"
-		@test -n "$(PREFERRED_SDK)" || ( echo "Error: Failed to establish preferred SDK version, please ensure at least one Developer SDK is installed" ; exit 1 )
-		@test -n "$(PREFERRED_MINVERSION)" || ( echo "Error: Failed to establish preferred minimum OS version" ; exit 1 )
-		@echo " *** Default SDK is $(PREFERRED_SDK) for minimum OS/X version $(PREFERRED_MINVERSION)"
-
-sdk:		show sdkstatic $(SDK_DYNAMIC) $(HOSTSDK_DYNAMIC)
-
-sdkstatic:	$(SDK_STATIC) $(HOSTSDK_STATIC)
-		$(RANLIB) $(SDK_STATIC)
-		$(RANLIB) $(HOSTSDK_STATIC)
-
-plugins:	$(PLUGIN_TARGET)
-
-host:		$(HOST_TARGET)
-
-rdfgen:		$(RDFGEN_TARGET)
-
-all:		sdk plugins host rdfgen test
-
-$(SDK_STATIC):	$(SDK_OBJECTS) $(API_HEADERS) $(SDK_HEADERS)
-		$(RM_F) $@
-		$(AR) r $@ $(SDK_OBJECTS)
-
-$(HOSTSDK_STATIC):	$(HOSTSDK_OBJECTS) $(API_HEADERS) $(HOSTSDK_HEADERS)
-		$(RM_F) $@
-		$(AR) r $@ $(HOSTSDK_OBJECTS)
-
-$(SDK_DYNAMIC):	$(SDK_OBJECTS) $(API_HEADERS) $(SDK_HEADERS)
-		$(CXX) $(LDFLAGS) $(SDK_DYNAMIC_LDFLAGS) -o $@ $(SDK_OBJECTS)
-
-$(HOSTSDK_DYNAMIC):	$(HOSTSDK_OBJECTS) $(API_HEADERS) $(HOSTSDK_HEADERS)
-		$(CXX) $(LDFLAGS) $(HOSTSDK_DYNAMIC_LDFLAGS) -o $@ $(HOSTSDK_OBJECTS)
-
-$(PLUGIN_TARGET):	$(PLUGIN_OBJECTS) $(SDK_STATIC) $(PLUGIN_HEADERS)
-		$(CXX) $(LDFLAGS) $(PLUGIN_LDFLAGS) -o $@ $(PLUGIN_OBJECTS) $(PLUGIN_LIBS)
-
-$(HOST_TARGET):	$(HOST_OBJECTS) $(HOSTSDK_STATIC) $(HOST_HEADERS)
-		$(CXX) $(LDFLAGS) $(HOST_LDFLAGS) -o $@ $(HOST_OBJECTS) $(HOST_LIBS)
-
-$(RDFGEN_TARGET):	$(RDFGEN_OBJECTS) $(HOSTSDK_STATIC) 
-		$(CXX) $(LDFLAGS) $(RDFGEN_LDFLAGS) -o $@ $(RDFGEN_OBJECTS) $(RDFGEN_LIBS)
-
-test:		plugins host
-		VAMP_PATH=$(EXAMPLEDIR) $(HOST_TARGET) -l
-
-clean:		
-		rm -f $(SDK_OBJECTS) $(HOSTSDK_OBJECTS) $(PLUGIN_OBJECTS) $(HOST_OBJECTS) $(RDFGEN_OBJECTS)
-
-distclean:	clean
-		rm -f $(SDK_STATIC) $(SDK_DYNAMIC) $(HOSTSDK_STATIC) $(HOSTSDK_DYNAMIC) $(PLUGIN_TARGET) $(HOST_TARGET) $(RDFGEN_TARGET) *~ */*~
-
-# DO NOT DELETE
-
-examples/AmplitudeFollower.o: examples/AmplitudeFollower.h vamp-sdk/Plugin.h
-examples/AmplitudeFollower.o: vamp-sdk/PluginBase.h vamp-sdk/plugguard.h
-examples/AmplitudeFollower.o: vamp-sdk/RealTime.h
-examples/FixedTempoEstimator.o: examples/FixedTempoEstimator.h
-examples/FixedTempoEstimator.o: vamp-sdk/Plugin.h vamp-sdk/PluginBase.h
-examples/FixedTempoEstimator.o: vamp-sdk/plugguard.h vamp-sdk/RealTime.h
-examples/PercussionOnsetDetector.o: examples/PercussionOnsetDetector.h
-examples/PercussionOnsetDetector.o: vamp-sdk/Plugin.h vamp-sdk/PluginBase.h
-examples/PercussionOnsetDetector.o: vamp-sdk/plugguard.h vamp-sdk/RealTime.h
-examples/SpectralCentroid.o: examples/SpectralCentroid.h vamp-sdk/Plugin.h
-examples/SpectralCentroid.o: vamp-sdk/PluginBase.h vamp-sdk/plugguard.h
-examples/SpectralCentroid.o: vamp-sdk/RealTime.h
-examples/PowerSpectrum.o: examples/PowerSpectrum.h vamp-sdk/Plugin.h
-examples/PowerSpectrum.o: vamp-sdk/PluginBase.h vamp-sdk/plugguard.h
-examples/PowerSpectrum.o: vamp-sdk/RealTime.h
-examples/ZeroCrossing.o: examples/ZeroCrossing.h vamp-sdk/Plugin.h
-examples/ZeroCrossing.o: vamp-sdk/PluginBase.h vamp-sdk/plugguard.h
-examples/ZeroCrossing.o: vamp-sdk/RealTime.h
-examples/plugins.o: vamp/vamp.h vamp-sdk/PluginAdapter.h vamp-sdk/Plugin.h
-examples/plugins.o: vamp-sdk/PluginBase.h vamp-sdk/plugguard.h
-examples/plugins.o: vamp-sdk/RealTime.h examples/ZeroCrossing.h
-examples/plugins.o: vamp-sdk/Plugin.h examples/SpectralCentroid.h
-examples/plugins.o: examples/PercussionOnsetDetector.h examples/PowerSpectrum.h
-examples/plugins.o: examples/FixedTempoEstimator.h
-examples/plugins.o: examples/AmplitudeFollower.h
-host/vamp-simple-host.o: ./vamp-hostsdk/PluginHostAdapter.h vamp/vamp.h
-host/vamp-simple-host.o: vamp-sdk/Plugin.h vamp-sdk/PluginBase.h
-host/vamp-simple-host.o: vamp-sdk/plugguard.h vamp-sdk/RealTime.h
-host/vamp-simple-host.o: ./vamp-hostsdk/PluginInputDomainAdapter.h
-host/vamp-simple-host.o: ./vamp-hostsdk/PluginWrapper.h
-host/vamp-simple-host.o: ./vamp-hostsdk/Plugin.h ./vamp-hostsdk/hostguard.h
-host/vamp-simple-host.o: vamp-sdk/Plugin.h
-host/vamp-simple-host.o: ./vamp-hostsdk/PluginLoader.h host/system.h
-rdf/generator/vamp-rdf-template-generator.o: ./vamp-hostsdk/PluginHostAdapter.h
-rdf/generator/vamp-rdf-template-generator.o: vamp/vamp.h vamp-sdk/Plugin.h
-rdf/generator/vamp-rdf-template-generator.o: vamp-sdk/PluginBase.h
-rdf/generator/vamp-rdf-template-generator.o: vamp-sdk/plugguard.h vamp-sdk/RealTime.h
-rdf/generator/vamp-rdf-template-generator.o: ./vamp-hostsdk/PluginChannelAdapter.h
-rdf/generator/vamp-rdf-template-generator.o: ./vamp-hostsdk/PluginWrapper.h
-rdf/generator/vamp-rdf-template-generator.o: ./vamp-hostsdk/Plugin.h
-rdf/generator/vamp-rdf-template-generator.o: ./vamp-hostsdk/hostguard.h
-rdf/generator/vamp-rdf-template-generator.o: vamp-sdk/Plugin.h
-rdf/generator/vamp-rdf-template-generator.o: ./vamp-hostsdk/PluginInputDomainAdapter.h
-rdf/generator/vamp-rdf-template-generator.o: ./vamp-hostsdk/PluginLoader.h
-src/vamp-hostsdk/PluginHostAdapter.o: ./vamp-hostsdk/PluginHostAdapter.h
-src/vamp-hostsdk/PluginHostAdapter.o: vamp/vamp.h vamp-sdk/Plugin.h
-src/vamp-hostsdk/PluginHostAdapter.o: vamp-sdk/PluginBase.h
-src/vamp-hostsdk/PluginHostAdapter.o: vamp-sdk/plugguard.h
-src/vamp-hostsdk/PluginHostAdapter.o: vamp-sdk/RealTime.h
-src/vamp-hostsdk/RealTime.o: src/vamp-sdk/RealTime.cpp ./vamp-sdk/RealTime.h
-src/vamp-hostsdk/RealTime.o: vamp-sdk/plugguard.h
-src/vamp-sdk/PluginAdapter.o: vamp-sdk/PluginAdapter.h vamp/vamp.h
-src/vamp-sdk/PluginAdapter.o: vamp-sdk/Plugin.h vamp-sdk/PluginBase.h
-src/vamp-sdk/PluginAdapter.o: vamp-sdk/plugguard.h vamp-sdk/RealTime.h
-src/vamp-sdk/RealTime.o: ./vamp-sdk/RealTime.h vamp-sdk/plugguard.h
-src/vamp-hostsdk/PluginBufferingAdapter.o: ./vamp-hostsdk/PluginBufferingAdapter.h
-src/vamp-hostsdk/PluginBufferingAdapter.o: ./vamp-hostsdk/PluginWrapper.h
-src/vamp-hostsdk/PluginBufferingAdapter.o: ./vamp-hostsdk/Plugin.h
-src/vamp-hostsdk/PluginBufferingAdapter.o: ./vamp-hostsdk/hostguard.h
-src/vamp-hostsdk/PluginBufferingAdapter.o: vamp-sdk/Plugin.h
-src/vamp-hostsdk/PluginBufferingAdapter.o: vamp-sdk/PluginBase.h
-src/vamp-hostsdk/PluginBufferingAdapter.o: vamp-sdk/plugguard.h
-src/vamp-hostsdk/PluginBufferingAdapter.o: vamp-sdk/RealTime.h
-src/vamp-hostsdk/PluginChannelAdapter.o: ./vamp-hostsdk/PluginChannelAdapter.h
-src/vamp-hostsdk/PluginChannelAdapter.o: ./vamp-hostsdk/PluginWrapper.h
-src/vamp-hostsdk/PluginChannelAdapter.o: ./vamp-hostsdk/Plugin.h
-src/vamp-hostsdk/PluginChannelAdapter.o: ./vamp-hostsdk/hostguard.h
-src/vamp-hostsdk/PluginChannelAdapter.o: vamp-sdk/Plugin.h
-src/vamp-hostsdk/PluginChannelAdapter.o: vamp-sdk/PluginBase.h
-src/vamp-hostsdk/PluginChannelAdapter.o: vamp-sdk/plugguard.h
-src/vamp-hostsdk/PluginChannelAdapter.o: vamp-sdk/RealTime.h
-src/vamp-hostsdk/PluginInputDomainAdapter.o: ./vamp-hostsdk/PluginInputDomainAdapter.h
-src/vamp-hostsdk/PluginInputDomainAdapter.o: ./vamp-hostsdk/PluginWrapper.h
-src/vamp-hostsdk/PluginInputDomainAdapter.o: ./vamp-hostsdk/Plugin.h
-src/vamp-hostsdk/PluginInputDomainAdapter.o: ./vamp-hostsdk/hostguard.h
-src/vamp-hostsdk/PluginInputDomainAdapter.o: vamp-sdk/Plugin.h
-src/vamp-hostsdk/PluginInputDomainAdapter.o: vamp-sdk/PluginBase.h
-src/vamp-hostsdk/PluginInputDomainAdapter.o: vamp-sdk/plugguard.h
-src/vamp-hostsdk/PluginInputDomainAdapter.o: vamp-sdk/RealTime.h
-src/vamp-hostsdk/PluginLoader.o: ./vamp-hostsdk/PluginHostAdapter.h
-src/vamp-hostsdk/PluginLoader.o: vamp/vamp.h vamp-sdk/Plugin.h
-src/vamp-hostsdk/PluginLoader.o: vamp-sdk/PluginBase.h
-src/vamp-hostsdk/PluginLoader.o: vamp-sdk/plugguard.h
-src/vamp-hostsdk/PluginLoader.o: vamp-sdk/RealTime.h
-src/vamp-hostsdk/PluginLoader.o: ./vamp-hostsdk/PluginLoader.h
-src/vamp-hostsdk/PluginLoader.o: ./vamp-hostsdk/PluginWrapper.h
-src/vamp-hostsdk/PluginLoader.o: ./vamp-hostsdk/Plugin.h
-src/vamp-hostsdk/PluginLoader.o: ./vamp-hostsdk/hostguard.h
-src/vamp-hostsdk/PluginLoader.o: vamp-sdk/Plugin.h
-src/vamp-hostsdk/PluginLoader.o: ./vamp-hostsdk/PluginInputDomainAdapter.h
-src/vamp-hostsdk/PluginLoader.o: ./vamp-hostsdk/PluginChannelAdapter.h
-src/vamp-hostsdk/PluginLoader.o: ./vamp-hostsdk/PluginBufferingAdapter.h
-src/vamp-hostsdk/PluginSummarisingAdapter.o: ./vamp-hostsdk/PluginSummarisingAdapter.h
-src/vamp-hostsdk/PluginSummarisingAdapter.o: ./vamp-hostsdk/PluginWrapper.h
-src/vamp-hostsdk/PluginSummarisingAdapter.o: ./vamp-hostsdk/Plugin.h
-src/vamp-hostsdk/PluginSummarisingAdapter.o: ./vamp-hostsdk/hostguard.h
-src/vamp-hostsdk/PluginSummarisingAdapter.o: vamp-sdk/Plugin.h
-src/vamp-hostsdk/PluginSummarisingAdapter.o: vamp-sdk/PluginBase.h
-src/vamp-hostsdk/PluginSummarisingAdapter.o: vamp-sdk/plugguard.h
-src/vamp-hostsdk/PluginSummarisingAdapter.o: vamp-sdk/RealTime.h
-src/vamp-hostsdk/PluginWrapper.o: ./vamp-hostsdk/PluginWrapper.h
-src/vamp-hostsdk/PluginWrapper.o: ./vamp-hostsdk/Plugin.h
-src/vamp-hostsdk/PluginWrapper.o: ./vamp-hostsdk/hostguard.h
-src/vamp-hostsdk/PluginWrapper.o: vamp-sdk/Plugin.h
-src/vamp-hostsdk/PluginWrapper.o: vamp-sdk/PluginBase.h
-src/vamp-hostsdk/PluginWrapper.o: vamp-sdk/plugguard.h
-src/vamp-hostsdk/PluginWrapper.o: vamp-sdk/RealTime.h
--- a/build/libvamp-hostsdk.la.in	Wed Sep 11 14:55:16 2019 +0100
+++ b/build/libvamp-hostsdk.la.in	Tue Oct 22 12:10:41 2019 +0100
@@ -8,7 +8,7 @@
 old_library='%STATIC%'
 dependency_libs=''
 current=3
-age=8
+age=9
 revision=0
 installed=yes
 libdir='%LIBS%'
--- a/build/libvamp-sdk.la.in	Wed Sep 11 14:55:16 2019 +0100
+++ b/build/libvamp-sdk.la.in	Tue Oct 22 12:10:41 2019 +0100
@@ -8,7 +8,7 @@
 old_library='%STATIC%'
 dependency_libs=''
 current=2
-age=8
+age=9
 revision=0
 installed=yes
 libdir='%LIBS%'
--- a/configure	Wed Sep 11 14:55:16 2019 +0100
+++ b/configure	Tue Oct 22 12:10:41 2019 +0100
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for vamp-plugin-sdk 2.8.
+# Generated by GNU Autoconf 2.69 for vamp-plugin-sdk 2.9.
 #
 # Report bugs to <cannam@all-day-breakfast.com>.
 #
@@ -580,8 +580,8 @@
 # Identity of this package.
 PACKAGE_NAME='vamp-plugin-sdk'
 PACKAGE_TARNAME='vamp-plugin-sdk'
-PACKAGE_VERSION='2.8'
-PACKAGE_STRING='vamp-plugin-sdk 2.8'
+PACKAGE_VERSION='2.9'
+PACKAGE_STRING='vamp-plugin-sdk 2.9'
 PACKAGE_BUGREPORT='cannam@all-day-breakfast.com'
 PACKAGE_URL=''
 
@@ -1244,7 +1244,7 @@
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures vamp-plugin-sdk 2.8 to adapt to many kinds of systems.
+\`configure' configures vamp-plugin-sdk 2.9 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1305,7 +1305,7 @@
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of vamp-plugin-sdk 2.8:";;
+     short | recursive ) echo "Configuration of vamp-plugin-sdk 2.9:";;
    esac
   cat <<\_ACEOF
 
@@ -1403,7 +1403,7 @@
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-vamp-plugin-sdk configure 2.8
+vamp-plugin-sdk configure 2.9
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -1652,7 +1652,7 @@
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by vamp-plugin-sdk $as_me 2.8, which was
+It was created by vamp-plugin-sdk $as_me 2.9, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -4648,7 +4648,7 @@
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by vamp-plugin-sdk $as_me 2.8, which was
+This file was extended by vamp-plugin-sdk $as_me 2.9, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -4701,7 +4701,7 @@
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-vamp-plugin-sdk config.status 2.8
+vamp-plugin-sdk config.status 2.9
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
--- a/configure.ac	Wed Sep 11 14:55:16 2019 +0100
+++ b/configure.ac	Tue Oct 22 12:10:41 2019 +0100
@@ -1,5 +1,5 @@
 
-AC_INIT(vamp-plugin-sdk, 2.8, cannam@all-day-breakfast.com)
+AC_INIT(vamp-plugin-sdk, 2.9, cannam@all-day-breakfast.com)
 
 AC_CONFIG_SRCDIR(vamp/vamp.h)
 AC_PROG_CXX
--- a/pkgconfig/vamp-hostsdk.pc.in	Wed Sep 11 14:55:16 2019 +0100
+++ b/pkgconfig/vamp-hostsdk.pc.in	Tue Oct 22 12:10:41 2019 +0100
@@ -4,7 +4,7 @@
 includedir=${prefix}/include
 
 Name: vamp-hostsdk
-Version: 2.8
+Version: 2.9
 Description: Development library for Vamp audio analysis plugin hosts
 Libs: -L${libdir} -lvamp-hostsdk -ldl
 Cflags: -I${includedir} 
--- a/pkgconfig/vamp-sdk.pc.in	Wed Sep 11 14:55:16 2019 +0100
+++ b/pkgconfig/vamp-sdk.pc.in	Tue Oct 22 12:10:41 2019 +0100
@@ -4,7 +4,7 @@
 includedir=${prefix}/include
 
 Name: vamp-sdk
-Version: 2.8
+Version: 2.9
 Description: Development library for Vamp audio analysis plugins
 Libs: -L${libdir} -lvamp-sdk
 Cflags: -I${includedir} 
--- a/pkgconfig/vamp.pc.in	Wed Sep 11 14:55:16 2019 +0100
+++ b/pkgconfig/vamp.pc.in	Tue Oct 22 12:10:41 2019 +0100
@@ -4,7 +4,7 @@
 includedir=${prefix}/include
 
 Name: vamp
-Version: 2.8
+Version: 2.9
 Description: An API for audio analysis and feature extraction plugins
 Libs: 
 Cflags: -I${includedir} 
--- a/src/vamp-hostsdk/PluginHostAdapter.cpp	Wed Sep 11 14:55:16 2019 +0100
+++ b/src/vamp-hostsdk/PluginHostAdapter.cpp	Tue Oct 22 12:10:41 2019 +0100
@@ -39,7 +39,7 @@
 
 #include "Files.h"
 
-#if ( VAMP_SDK_MAJOR_VERSION != 2 || VAMP_SDK_MINOR_VERSION != 8 )
+#if ( VAMP_SDK_MAJOR_VERSION != 2 || VAMP_SDK_MINOR_VERSION != 9 )
 #error Unexpected version of Vamp SDK header included
 #endif
 
--- a/src/vamp-hostsdk/acsymbols.c	Wed Sep 11 14:55:16 2019 +0100
+++ b/src/vamp-hostsdk/acsymbols.c	Tue Oct 22 12:10:41 2019 +0100
@@ -1,6 +1,7 @@
 /* These stubs are provided so that autoconf can check library
  * versions using C symbols only */
 
+extern void libvamphostsdk_v_2_9_present(void) { }
 extern void libvamphostsdk_v_2_8_present(void) { }
 extern void libvamphostsdk_v_2_7_1_present(void) { }
 extern void libvamphostsdk_v_2_7_present(void) { }
--- a/src/vamp-sdk/FFT.cpp	Wed Sep 11 14:55:16 2019 +0100
+++ b/src/vamp-sdk/FFT.cpp	Tue Oct 22 12:10:41 2019 +0100
@@ -41,7 +41,7 @@
 #include <math.h>
 #include <string.h>
 
-#if ( VAMP_SDK_MAJOR_VERSION != 2 || VAMP_SDK_MINOR_VERSION != 8 )
+#if ( VAMP_SDK_MAJOR_VERSION != 2 || VAMP_SDK_MINOR_VERSION != 9 )
 #error Unexpected version of Vamp SDK header included
 #endif
 
--- a/src/vamp-sdk/PluginAdapter.cpp	Wed Sep 11 14:55:16 2019 +0100
+++ b/src/vamp-sdk/PluginAdapter.cpp	Tue Oct 22 12:10:41 2019 +0100
@@ -41,7 +41,7 @@
 
 #include <mutex>
 
-#if ( VAMP_SDK_MAJOR_VERSION != 2 || VAMP_SDK_MINOR_VERSION != 8 )
+#if ( VAMP_SDK_MAJOR_VERSION != 2 || VAMP_SDK_MINOR_VERSION != 9 )
 #error Unexpected version of Vamp SDK header included
 #endif
 
--- a/src/vamp-sdk/acsymbols.c	Wed Sep 11 14:55:16 2019 +0100
+++ b/src/vamp-sdk/acsymbols.c	Tue Oct 22 12:10:41 2019 +0100
@@ -1,6 +1,7 @@
 /* These stubs are provided so that autoconf can check library
  * versions using C symbols only */
 
+extern void libvampsdk_v_2_9_present(void) { }
 extern void libvampsdk_v_2_8_present(void) { }
 extern void libvampsdk_v_2_7_1_present(void) { }
 extern void libvampsdk_v_2_7_present(void) { }
--- a/vamp-hostsdk/hostguard.h	Wed Sep 11 14:55:16 2019 +0100
+++ b/vamp-hostsdk/hostguard.h	Tue Oct 22 12:10:41 2019 +0100
@@ -43,9 +43,9 @@
 
 #define _VAMP_IN_HOSTSDK 1
 
-#define VAMP_SDK_VERSION "2.8"
+#define VAMP_SDK_VERSION "2.9"
 #define VAMP_SDK_MAJOR_VERSION 2
-#define VAMP_SDK_MINOR_VERSION 8
+#define VAMP_SDK_MINOR_VERSION 9
 
 #ifdef _VAMP_NO_HOST_NAMESPACE
 #define _VAMP_SDK_HOSTSPACE_BEGIN(h)
--- a/vamp-sdk/plugguard.h	Wed Sep 11 14:55:16 2019 +0100
+++ b/vamp-sdk/plugguard.h	Tue Oct 22 12:10:41 2019 +0100
@@ -71,9 +71,9 @@
 
 #define _VAMP_IN_PLUGINSDK 1
 
-#define VAMP_SDK_VERSION "2.8"
+#define VAMP_SDK_VERSION "2.9"
 #define VAMP_SDK_MAJOR_VERSION 2
-#define VAMP_SDK_MINOR_VERSION 8
+#define VAMP_SDK_MINOR_VERSION 9
 
 #ifdef _VAMP_NO_PLUGIN_NAMESPACE
 #define _VAMP_SDK_PLUGSPACE_BEGIN(h)