annotate src/doc-overview @ 236:7739a9ee3fa4

* New trunk with clearer delineation between host and plugin libraries
author cannam
date Fri, 07 Nov 2008 16:50:08 +0000
parents 3451f7dfa2be
children cc467e52da4c
rev   line source
cannam@229 1
cannam@229 2 /** \mainpage Vamp Plugin SDK
cannam@229 3
cannam@229 4 \section about About Vamp
cannam@229 5
cannam@229 6 Vamp is an API for C and C++ plugins that process sampled audio data
cannam@229 7 to produce descriptive output (measurements or semantic observations).
cannam@229 8 Find more information at http://www.vamp-plugins.org/ .
cannam@229 9
cannam@229 10 Although the official API for Vamp plugins is defined in C for maximum
cannam@229 11 binary compatibility, we strongly recommend using the provided C++
cannam@229 12 classes in the SDK to implement your own plugins and hosts.
cannam@229 13
cannam@229 14 \section plugins For Plugins
cannam@229 15
cannam@229 16 Plugins should subclass Vamp::Plugin, and then use a
cannam@229 17 Vamp::PluginAdapter to expose the correct C API for the plugin. Read
cannam@229 18 the documentation for Vamp::PluginBase and Vamp::Plugin before
cannam@229 19 starting.
cannam@229 20
cannam@229 21 Plugins should be compiled and linked into dynamic libraries using the
cannam@229 22 usual convention for your platform, and should link (preferably
cannam@229 23 statically) with -lvamp-sdk. Any number of plugins can reside in a
cannam@229 24 single dynamic library. See plugins.cpp in the example plugins
cannam@229 25 directory for the sort of code that will need to accompany your plugin
cannam@229 26 class or classes, to make it possible for a host to look up your
cannam@229 27 plugins properly.
cannam@229 28
cannam@229 29 You will also need to ensure that the entry point
cannam@229 30 vampGetPluginDescriptor is properly exported (made public) from your
cannam@229 31 shared library. The method to do this depends on your linker; for
cannam@229 32 example, when using the Windows Visual Studio linker, use the linker
cannam@229 33 flag "/EXPORT:vampGetPluginDescriptor". Exported symbols are the
cannam@229 34 default with most other current platforms' linkers.
cannam@229 35
cannam@229 36 The following example plugins are provided. You may legally reuse any
cannam@229 37 amount of the code from these examples in any plugins you write,
cannam@229 38 whether proprietary or open-source.
cannam@229 39
cannam@229 40 - ZeroCrossing calculates the positions and density of zero-crossing
cannam@229 41 points in an audio waveform.
cannam@229 42
cannam@229 43 - SpectralCentroid calculates the centre of gravity of the frequency
cannam@229 44 domain representation of each block of audio.
cannam@229 45
cannam@229 46 - AmplitudeFollower is a simple implementation of SuperCollider's
cannam@229 47 amplitude-follower algorithm.
cannam@229 48
cannam@229 49 - PercussionOnsetDetector estimates the locations of percussive
cannam@229 50 onsets using a simple method described in "Drum Source Separation
cannam@229 51 using Percussive Feature Detection and Spectral Modulation" by Dan
cannam@229 52 Barry, Derry Fitzgerald, Eugene Coyle and Bob Lawlor, ISSC 2005.
cannam@229 53
cannam@229 54 - FixedTempoEstimator calculates a single bpm value which is an
cannam@229 55 estimate of the tempo of a piece of music that is assumed to be of
cannam@229 56 fixed tempo, using autocorrelation of a frequency domain energy rise
cannam@229 57 metric. It has several outputs that return intermediate results used
cannam@229 58 in the calculation, and may be a useful example of a plugin having
cannam@229 59 several outputs with varying feature structures.
cannam@229 60
cannam@229 61 \section hosts For Hosts
cannam@229 62
cannam@229 63 Hosts will normally use a Vamp::PluginHostAdapter to convert each
cannam@229 64 plugin's exposed C API back into a useful Vamp::Plugin C++ object.
cannam@229 65
cannam@229 66 Starting with version 1.1 of the Vamp SDK, there are several classes
cannam@229 67 in the Vamp::HostExt namespace that aim to make the host's life as
cannam@229 68 easy as possible:
cannam@229 69
cannam@229 70 - Vamp::HostExt::PluginLoader provides a very simple interface for a
cannam@229 71 host to discover, load, and find out category information about the
cannam@229 72 available plugins. Most "casual" Vamp hosts will probably want to
cannam@229 73 use this class.
cannam@229 74
cannam@229 75 - Vamp::HostExt::PluginInputDomainAdapter provides a simple means for
cannam@229 76 hosts to handle plugins that expect frequency-domain input, without
cannam@229 77 having to convert the input themselves.
cannam@229 78
cannam@229 79 - Vamp::HostExt::PluginChannelAdapter provides a simple means for
cannam@229 80 hosts to use plugins that do not necessarily support the same number
cannam@229 81 of audio channels as they have available, without having to apply a
cannam@229 82 channel management / mixdown policy themselves.
cannam@229 83
cannam@229 84 - Vamp::HostExt::PluginBufferingAdapter (new in version 1.2) provides
cannam@229 85 a means for hosts to avoid having to negotiate the input step and
cannam@229 86 block size, instead permitting the host to use any block size they
cannam@229 87 desire (and a step size equal to it). This is particularly useful
cannam@229 88 for "streaming" hosts that cannot seek backwards in the input audio
cannam@229 89 stream and so would otherwise need to implement an additional buffer
cannam@229 90 to support step sizes smaller than the block size.
cannam@229 91
cannam@229 92 - Vamp::HostExt::PluginSummarisingAdapter (new in version 2.0)
cannam@229 93 provides summarisation methods such as mean and median averages of
cannam@229 94 output features, for use in any context where an available plugin
cannam@229 95 produces individual values but the result that is actually needed
cannam@229 96 is some sort of aggregate.
cannam@229 97
cannam@229 98 The PluginLoader class can also use the input domain, channel, and
cannam@229 99 buffering adapters automatically to make these conversions transparent
cannam@229 100 to the host if required.
cannam@229 101
cannam@229 102 Hosts should link with -lvamp-hostsdk.
cannam@229 103
cannam@229 104 (The following notes in this section are mostly relevant for
cannam@229 105 developers that are not using the HostExt classes, or that wish to
cannam@229 106 know more about the policy they implement.)
cannam@229 107
cannam@229 108 The Vamp API does not officially specify how to load plugin libraries
cannam@229 109 or where to find them. However, the SDK does include a function
cannam@229 110 (Vamp::PluginHostAdapter::getPluginPath()) that returns a recommended
cannam@229 111 directory search path that hosts may use for plugin libraries.
cannam@229 112
cannam@229 113 Our suggestion for a host is to search each directory in this path for
cannam@229 114 .DLL (on Windows), .so (on Linux, Solaris, BSD etc) or .dylib (on
cannam@229 115 OS/X) files, then to load each one and perform a dynamic name lookup
cannam@229 116 on the vampGetPluginDescriptor function to enumerate the plugins in
cannam@229 117 the library. The example host has some code that may help, but this
cannam@229 118 operation will necessarily be system-dependent.
cannam@229 119
cannam@229 120 Vamp also has an informal convention for sorting plugins into
cannam@229 121 functional categories. In addition to the library file itself, a
cannam@229 122 plugin library may install a category file with the same name as the
cannam@229 123 library but .cat extension. The existence and format of this file are
cannam@229 124 not specified by the Vamp API, but by convention the file may contain
cannam@229 125 lines of the format
cannam@229 126
cannam@229 127 \code
cannam@229 128 vamp:pluginlibrary:pluginname::General Category > Specific Category
cannam@229 129 \endcode
cannam@229 130
cannam@229 131 which a host may read and use to assign plugins a location within a
cannam@229 132 category tree for display to the user. The expectation is that
cannam@229 133 advanced users may also choose to set up their own preferred category
cannam@229 134 trees, which is why this information is not queried as part of the
cannam@229 135 Vamp API itself.
cannam@229 136
cannam@229 137 There is an example host in the "host" directory from which code may
cannam@229 138 be drawn.
cannam@229 139
cannam@229 140 \section license License
cannam@229 141
cannam@229 142 This plugin SDK is freely redistributable under a "new-style BSD"
cannam@229 143 licence. See the file COPYING for more details. In short, you may
cannam@229 144 modify and redistribute the SDK and example plugins within any
cannam@229 145 commercial or non-commercial, proprietary or open-source plugin or
cannam@229 146 application under almost any conditions, with no obligation to provide
cannam@229 147 source code, provided you retain the original copyright note.
cannam@229 148
cannam@229 149
cannam@229 150 */