annotate README @ 525:8c18bdaad04f c++11-mutex

Avoid simple static allocation of mutex, as it could lead to mutex being destroyed before last adapter that needs to use it (since adapters are usually also static)
author Chris Cannam
date Mon, 09 Sep 2019 10:24:13 +0100
parents df32b473b9b6
children db2cd87cef6f
rev   line source
cannam@14 1
cannam@14 2 Vamp
cannam@14 3 ====
cannam@14 4
cannam@14 5 An API for audio analysis and feature extraction plugins.
cannam@14 6
cannam@44 7 http://www.vamp-plugins.org/
cannam@44 8
cannam@14 9 Vamp is an API for C and C++ plugins that process sampled audio data
cannam@18 10 to produce descriptive output (measurements or semantic observations).
cannam@14 11
Chris@516 12 This is version 2.8 of the Vamp plugin Software Development Kit.
cannam@256 13
cannam@78 14 Plugins and hosts built with this SDK are binary compatible with those
Chris@423 15 built using any version 2.0 or newer of the SDK.
Chris@423 16
Chris@423 17 Plugins and hosts built with this SDK are binary compatible with those
cannam@256 18 built using version 1.0 of the SDK, with certain restrictions. See
cannam@256 19 the file README.compat for more details.
cannam@256 20
cannam@256 21 See the file CHANGELOG for a list of the changes in this release.
cannam@78 22
cannam@215 23 A documentation guide to writing plugins using the Vamp SDK can be
cannam@215 24 found at http://www.vamp-plugins.org/guide.pdf .
cannam@215 25
cannam@239 26
cannam@239 27 Compiling and Installing the SDK and Examples
cannam@239 28 =============================================
cannam@239 29
cannam@239 30 This SDK is intended for use on Windows, OS/X, Linux, and other POSIX
cannam@239 31 and GNU platforms.
cannam@239 32
cannam@239 33 Please see the platform-specific README file (README.msvc, README.osx,
cannam@239 34 README.linux) in the build/ directory for details about how to compile
cannam@239 35 and install the SDK, how to build plugin libraries using it, and how
cannam@239 36 to install the example plugins so you can use them in a host.
cannam@239 37
cannam@239 38
cannam@239 39 What's In This SDK
cannam@239 40 ==================
cannam@239 41
cannam@78 42 This SDK contains the following:
cannam@14 43
cannam@239 44
cannam@239 45 vamp/vamp.h
cannam@239 46 -----------
cannam@14 47
cannam@14 48 The formal C language plugin API for Vamp plugins.
cannam@14 49
cannam@14 50 A Vamp plugin is a dynamic library (.so, .dll or .dylib depending on
cannam@14 51 platform) exposing one C-linkage entry point (vampGetPluginDescriptor)
cannam@14 52 which returns data defined in the rest of this C header.
cannam@14 53
cannam@78 54 Although the C API is the official API for Vamp, we don't recommend
cannam@239 55 that you program directly to it. The C++ abstractions found in the
cannam@239 56 vamp-sdk and vamp-hostsdk directories (below) are preferable for most
cannam@239 57 purposes and are more thoroughly documented.
cannam@14 58
cannam@239 59
cannam@239 60 vamp-sdk
cannam@239 61 --------
cannam@14 62
cannam@237 63 C++ classes for implementing Vamp plugins.
cannam@18 64
cannam@78 65 Plugins should subclass Vamp::Plugin and then use Vamp::PluginAdapter
cannam@78 66 to expose the correct C API for the plugin. Plugin authors should
cannam@239 67 read vamp-sdk/PluginBase.h and Plugin.h for code documentation.
cannam@18 68
cannam@239 69 See "examples" below for details of the example plugins in the SDK,
cannam@239 70 from which you are welcome to take code and inspiration.
cannam@239 71
cannam@239 72 Plugins should link with -lvamp-sdk.
cannam@239 73
cannam@239 74
cannam@239 75 vamp-hostsdk
cannam@239 76 ------------
cannam@14 77
cannam@237 78 C++ classes for implementing Vamp hosts.
cannam@64 79
cannam@239 80 Hosts will normally use a Vamp::PluginHostAdapter to convert each
cannam@239 81 plugin's exposed C API back into a useful Vamp::Plugin C++ object.
cannam@237 82
cannam@237 83 The Vamp::HostExt namespace contains several additional C++ classes to
cannam@239 84 do this work for them, and make the host's life easier:
cannam@64 85
cannam@239 86 - Vamp::HostExt::PluginLoader provides a very easy interface for a
cannam@239 87 host to discover, load, and find out category information about the
cannam@239 88 available plugins. Most Vamp hosts will probably want to use this
cannam@239 89 class.
cannam@64 90
cannam@239 91 - Vamp::HostExt::PluginInputDomainAdapter provides a simple means for
cannam@239 92 hosts to handle plugins that want frequency-domain input, without
cannam@239 93 having to convert the input themselves.
cannam@64 94
cannam@239 95 - Vamp::HostExt::PluginChannelAdapter provides a simple means for
cannam@239 96 hosts to use plugins that do not necessarily support the same number
cannam@239 97 of audio channels as they have available, without having to apply a
cannam@239 98 channel management / mixdown policy themselves.
cannam@64 99
cannam@239 100 - Vamp::HostExt::PluginBufferingAdapter provides a means for hosts to
cannam@239 101 avoid having to negotiate the input step and block size, instead
cannam@239 102 permitting the host to use any block size they desire (and a step
cannam@239 103 size equal to it). This is particularly useful for "streaming" hosts
cannam@239 104 that cannot seek backwards in the input audio stream and so would
cannam@239 105 otherwise need to implement an additional buffer to support step
cannam@239 106 sizes smaller than the block size.
cannam@125 107
cannam@239 108 - Vamp::HostExt::PluginSummarisingAdapter provides summarisation
cannam@239 109 methods such as mean and median averages of output features, for use
cannam@239 110 in any context where an available plugin produces individual values
cannam@239 111 but the result that is actually needed is some sort of aggregate.
cannam@64 112
cannam@239 113 The PluginLoader class can also use the input domain, channel, and
cannam@239 114 buffering adapters automatically to make these conversions transparent
cannam@239 115 to the host if required.
cannam@14 116
cannam@239 117 Host authors should also refer to the example host code in the host
cannam@239 118 directory of the SDK.
cannam@14 119
cannam@239 120 Hosts should link with -lvamp-hostsdk.
cannam@239 121
cannam@239 122
Chris@397 123 vamp-hostsdk/host-c.h
Chris@397 124 ---------------------
Chris@397 125
Chris@397 126 A C-linkage header wrapping the part of the C++ SDK code that handles
Chris@397 127 plugin discovery and library loading. Host programs written in C or in
Chris@397 128 a language with a C-linkage foreign function interface may choose to
Chris@397 129 use this header to discover and load plugin libraries, together with
Chris@397 130 the vamp/vamp.h formal API to interact with plugins themselves. See
Chris@397 131 the header for more documentation.
Chris@397 132
Chris@397 133
cannam@239 134 examples
cannam@239 135 --------
cannam@239 136
cannam@239 137 Example plugins implemented using the C++ classes.
cannam@239 138
cannam@239 139 These plugins are intended to be useful examples you can draw code
cannam@239 140 from in order to provide the basic shape and structure of a Vamp
cannam@239 141 plugin. They are also intended to be correct and useful, if simple.
cannam@239 142
cannam@239 143 - ZeroCrossing calculates the positions and density of zero-crossing
cannam@239 144 points in an audio waveform.
cannam@239 145
cannam@239 146 - SpectralCentroid calculates the centre of gravity of the frequency
cannam@239 147 domain representation of each block of audio.
cannam@239 148
cannam@242 149 - PowerSpectrum calculates a power spectrum from the input audio.
cannam@244 150 Actually, it doesn't do any work except calculating power from a
cannam@244 151 cartesian complex FFT output. The work of calculating this frequency
cannam@244 152 domain output is done for it by the host or host SDK; the plugin just
cannam@244 153 needs to declare that it wants frequency domain input. This is the
cannam@244 154 simplest of the example plugins.
cannam@242 155
cannam@239 156 - AmplitudeFollower is a simple implementation of SuperCollider's
cannam@239 157 amplitude-follower algorithm.
cannam@239 158
cannam@239 159 - PercussionOnsetDetector estimates the locations of percussive
cannam@239 160 onsets using a simple method described in "Drum Source Separation
cannam@239 161 using Percussive Feature Detection and Spectral Modulation" by Dan
cannam@239 162 Barry, Derry Fitzgerald, Eugene Coyle and Bob Lawlor, ISSC 2005.
cannam@239 163
cannam@239 164 - FixedTempoEstimator calculates a single beats-per-minute value
cannam@239 165 which is an estimate of the tempo of a piece of music that is assumed
cannam@239 166 to be of fixed tempo, using autocorrelation of a frequency domain
cannam@239 167 energy rise metric. It has several outputs that return intermediate
cannam@239 168 results used in the calculation, and may be a useful example of a
cannam@239 169 plugin having several outputs with varying feature structures.
cannam@239 170
cannam@239 171
cannam@290 172 skeleton
cannam@290 173 --------
cannam@290 174
cannam@290 175 Skeleton code that could be used as a template for your new plugin
cannam@290 176 implementation.
cannam@290 177
cannam@290 178
cannam@239 179 host
cannam@239 180 ----
cannam@14 181
cannam@16 182 A simple command-line Vamp host, capable of loading a plugin and using
cannam@16 183 it to process a complete audio file, with its default parameters.
cannam@14 184
cannam@250 185 This host also contains a number of options for listing the installed
cannam@250 186 plugins and their properties in various formats. For that reason, it
cannam@250 187 isn't really as simple as one might hope. The core of the code is
cannam@250 188 still reasonably straightforward, however.
cannam@250 189
cannam@40 190
cannam@40 191 Plugin Lookup and Categorisation
cannam@40 192 ================================
cannam@40 193
cannam@40 194 The Vamp API does not officially specify how to load plugin libraries
cannam@40 195 or where to find them. However, the SDK does include a function
cannam@40 196 (Vamp::PluginHostAdapter::getPluginPath()) that returns a recommended
cannam@75 197 directory search path that hosts may use for plugin libraries, and a
cannam@75 198 class (Vamp::HostExt::PluginLoader) that implements a sensible
cannam@75 199 cross-platform lookup policy using this path. We recommend using this
cannam@75 200 class in your host unless you have a good reason not to want to. This
cannam@75 201 implementation also permits the user to set the environment variable
cannam@75 202 VAMP_PATH to override the default path if desired.
cannam@40 203
cannam@75 204 The policy used by Vamp::HostExt::PluginLoader -- and our
cannam@75 205 recommendation for any host -- is to search each directory in the path
cannam@75 206 returned by getPluginPath for .DLL (on Windows), .so (on Linux,
cannam@75 207 Solaris, BSD etc) or .dylib (on OS/X) files, then to load each one and
cannam@75 208 perform a dynamic name lookup on the vampGetPluginDescriptor function
cannam@75 209 to enumerate the plugins in the library. This operation will
cannam@75 210 necessarily be system-dependent.
cannam@40 211
cannam@40 212 Vamp also has an informal convention for sorting plugins into
cannam@40 213 functional categories. In addition to the library file itself, a
cannam@40 214 plugin library may install a category file with the same name as the
cannam@40 215 library but .cat extension. The existence and format of this file are
cannam@40 216 not specified by the Vamp API, but by convention the file may contain
cannam@40 217 lines of the format
cannam@40 218
cannam@40 219 vamp:pluginlibrary:pluginname::General Category > Specific Category
cannam@40 220
cannam@40 221 which a host may read and use to assign plugins a location within a
cannam@40 222 category tree for display to the user. The expectation is that
cannam@40 223 advanced users may also choose to set up their own preferred category
cannam@40 224 trees, which is why this information is not queried as part of the
cannam@75 225 Vamp plugin's API itself. The Vamp::HostExt::PluginLoader class also
cannam@75 226 provides support for plugin category lookup using this scheme.
cannam@32 227
cannam@14 228
cannam@14 229 Licensing
cannam@14 230 =========
cannam@14 231
cannam@18 232 This plugin SDK is freely redistributable under a "new-style BSD"
cannam@42 233 licence. See the file COPYING for more details. In short, you may
cannam@42 234 modify and redistribute the SDK and example plugins within any
cannam@42 235 commercial or non-commercial, proprietary or open-source plugin or
cannam@42 236 application under almost any conditions, with no obligation to provide
cannam@42 237 source code, provided you retain the original copyright note.
cannam@14 238
cannam@14 239
cannam@14 240 See Also
cannam@14 241 ========
cannam@14 242
cannam@14 243 Sonic Visualiser, an interactive open-source graphical audio
cannam@14 244 inspection, analysis and visualisation tool supporting Vamp plugins.
cannam@35 245 http://www.sonicvisualiser.org/
cannam@14 246
cannam@14 247
cannam@44 248 Authors
cannam@44 249 =======
cannam@44 250
cannam@44 251 Vamp and the Vamp SDK were designed and made at the Centre for Digital
cannam@64 252 Music at Queen Mary, University of London.
cannam@44 253
Chris@484 254 The SDK was written by Chris Cannam, copyright (c) 2005-2017
cannam@64 255 Chris Cannam and QMUL.
cannam@64 256
Chris@447 257 The SDK incorporates KissFFT code, copyright (c) 2003-2010 Mark
Chris@447 258 Borgerding.
Chris@447 259
cannam@64 260 Mark Sandler and Christian Landone provided ideas and direction, and
cannam@64 261 Mark Levy, Dan Stowell, Martin Gasser and Craig Sapp provided testing
cannam@64 262 and other input for the 1.0 API and SDK. The API also uses some ideas
cannam@64 263 from prior plugin systems, notably DSSI (http://dssi.sourceforge.net)
cannam@64 264 and FEAPI (http://feapi.sourceforge.net).
Chris@484 265