diff options
author | Doug McLain <doug@nostar.net> | 2008-06-02 05:02:28 +0000 |
---|---|---|
committer | Doug McLain <doug@nostar.net> | 2008-06-02 05:02:28 +0000 |
commit | 9c0d7d72d70082a54f823cd44c0ccda5da64bb6f (patch) | |
tree | 96ec400b83b8c1c06852b1936f684b5fbcd47a79 /libs/vamp-sdk | |
parent | 2f3f697bb8e185eb43c2c50b4eefc2bcb937f269 (diff) |
remove empty sigc++2 directory
git-svn-id: svn://localhost/ardour2/branches/3.0@3432 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/vamp-sdk')
25 files changed, 0 insertions, 6071 deletions
diff --git a/libs/vamp-sdk/COPYING b/libs/vamp-sdk/COPYING deleted file mode 100644 index 19fa472218..0000000000 --- a/libs/vamp-sdk/COPYING +++ /dev/null @@ -1,26 +0,0 @@ - - Permission is hereby granted, free of charge, to any person - obtaining a copy of this software and associated documentation - files (the "Software"), to deal in the Software without - restriction, including without limitation the rights to use, copy, - modify, merge, publish, distribute, sublicense, and/or sell copies - of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR - ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF - CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - Except as contained in this notice, the names of the Centre for - Digital Music; Queen Mary, University of London; and Chris Cannam - shall not be used in advertising or otherwise to promote the sale, - use or other dealings in this Software without prior written - authorization. - diff --git a/libs/vamp-sdk/README b/libs/vamp-sdk/README deleted file mode 100644 index 9454038260..0000000000 --- a/libs/vamp-sdk/README +++ /dev/null @@ -1,240 +0,0 @@ - -Vamp -==== - -An API for audio analysis and feature extraction plugins. - - http://www.vamp-plugins.org/ - -Vamp is an API for C and C++ plugins that process sampled audio data -to produce descriptive output (measurements or semantic observations). - -The principal differences between Vamp and a real-time audio -processing plugin system such as VST are: - - * Vamp plugins may output complex multidimensional data with labels. - As a consequence, they are likely to work best when the output - data has a much lower sampling rate than the input. (This also - means it is usually desirable to implement them in C++ using the - high-level base class provided rather than use the raw C API.) - - * While Vamp plugins receive data block-by-block, they are not - required to return output immediately on receiving the input. - A Vamp plugin may be non-causal, preferring to store up data - based on its input until the end of a processing run and then - return all results at once. - - * Vamp plugins have more control over their inputs than a typical - real-time processing plugin. For example, they can indicate to - the host their preferred processing block and step sizes, and these - may differ. - - * Vamp plugins may ask to receive data in the frequency domain - instead of the time domain. The host takes the responsibility - for converting the input data using an FFT of windowed frames. - This simplifies plugins that do straightforward frequency-domain - processing and permits the host to cache frequency-domain data - when possible. - - * A Vamp plugin is configured once before each processing run, and - receives no further parameter changes during use -- unlike real- - time plugin APIs in which the input parameters may change at any - time. This also means that fundamental properties such as the - number of values per output or the preferred processing block - size may depend on the input parameters. - - * Vamp plugins do not have to be able to run in real time. - - -About this SDK -============== - -This is version 1.1b of the Vamp plugin Software Development Kit. -Plugins and hosts built with this SDK are binary compatible with those -built using version 1.0 of the SDK. - -This SDK contains the following: - - * vamp/vamp.h - -The formal C language plugin API for Vamp plugins. - -A Vamp plugin is a dynamic library (.so, .dll or .dylib depending on -platform) exposing one C-linkage entry point (vampGetPluginDescriptor) -which returns data defined in the rest of this C header. - -Although the C API is the official API for Vamp, we don't recommend -that you program directly to it. The C++ abstraction found in the -vamp-sdk directory (below) is preferable for most purposes and is -more thoroughly documented. - - * vamp-sdk - -C++ classes for straightforwardly implementing Vamp plugins and hosts. - -Plugins should subclass Vamp::Plugin and then use Vamp::PluginAdapter -to expose the correct C API for the plugin. Plugin authors should -read vamp-sdk/PluginBase.h and Plugin.h for code documentation, and -refer to the example plugin code in the examples directory. Plugins -should link with -lvampsdk. [*NOTE: this has changed from vamp-sdk in -previous versions, to avoid conflict with the use of hyphens for -library versioning schemes on some platforms.] - -Hosts may use the Vamp::PluginHostAdapter to convert the loaded -plugin's C API back into a Vamp::Plugin object. Host authors should -refer to the example host code in the host directory. Hosts should -link with -lvamphostsdk. [*NOTE: this has changed from vamp-hostsdk -in previous versions, to avoid conflict with the use of hyphens for -library versioning schemes on some platforms.] - - * vamp-sdk/hostext - -Additional C++ classes to make a host's life easier (introduced in -version 1.1 of the Vamp SDK). - -Vamp::HostExt::PluginLoader provides a very easy interface for a host -to discover, load, and find out category information about the -available plugins. Most "casual" Vamp hosts will probably want to use -this class. - -Vamp::HostExt::PluginInputDomainAdapter provides a means for hosts to -handle plugins that expect frequency-domain input, without having to -convert the input themselves. - -Vamp::HostExt::PluginChannelAdapter provides a means for hosts to use -plugins that do not necessarily support the same number of audio -channels as they have available, without having to worry about -applying a channel management / mixdown policy themselves. - -The PluginLoader class can also use the input domain and channel -adapters automatically to make the entire conversion process -transparent to the host if required. - - * examples - -Example plugins implemented using the C++ classes. ZeroCrossing -calculates the positions and density of zero-crossing points in an -audio waveform. SpectralCentroid calculates the centre of gravity of -the frequency domain representation of each block of audio. -AmplitudeFollower tracks the amplitude of a signal based on a method -from the SuperCollider real-time audio system. -PercussionOnsetDetector estimates the locations of percussive onsets -using a simple method described in "Drum Source Separation using -Percussive Feature Detection and Spectral Modulation" by Dan Barry, -Derry Fitzgerald, Eugene Coyle and Bob Lawlor, ISSC 2005. - - * host - -A simple command-line Vamp host, capable of loading a plugin and using -it to process a complete audio file, with its default parameters. -Requires libsndfile (http://www.mega-nerd.com/libsndfile/). - -If you don't have libsndfile, you may want to edit the Makefile to -change the default build target from "all" to "sdk", so as to compile -only the SDK and not the host. - - -Plugin Lookup and Categorisation -================================ - -The Vamp API does not officially specify how to load plugin libraries -or where to find them. However, the SDK does include a function -(Vamp::PluginHostAdapter::getPluginPath()) that returns a recommended -directory search path that hosts may use for plugin libraries, and a -class (Vamp::HostExt::PluginLoader) that implements a sensible -cross-platform lookup policy using this path. We recommend using this -class in your host unless you have a good reason not to want to. This -implementation also permits the user to set the environment variable -VAMP_PATH to override the default path if desired. - -The policy used by Vamp::HostExt::PluginLoader -- and our -recommendation for any host -- is to search each directory in the path -returned by getPluginPath for .DLL (on Windows), .so (on Linux, -Solaris, BSD etc) or .dylib (on OS/X) files, then to load each one and -perform a dynamic name lookup on the vampGetPluginDescriptor function -to enumerate the plugins in the library. This operation will -necessarily be system-dependent. - -Vamp also has an informal convention for sorting plugins into -functional categories. In addition to the library file itself, a -plugin library may install a category file with the same name as the -library but .cat extension. The existence and format of this file are -not specified by the Vamp API, but by convention the file may contain -lines of the format - -vamp:pluginlibrary:pluginname::General Category > Specific Category - -which a host may read and use to assign plugins a location within a -category tree for display to the user. The expectation is that -advanced users may also choose to set up their own preferred category -trees, which is why this information is not queried as part of the -Vamp plugin's API itself. The Vamp::HostExt::PluginLoader class also -provides support for plugin category lookup using this scheme. - - -Building and Installing the SDK and Examples -============================================ - -To build the SDK, the simple host, and the example plugins, edit the -Makefile to suit your platform according to the comments in it, then -run "make". - -To use an IDE to build a plugin or host using the Vamp SDK, simply add -the .cpp files in the vamp-sdk directory to your project. - -Installing the example plugins so that they can be found by other Vamp -hosts depends on your platform: - - * Windows: copy the files - examples/vamp-example-plugins.dll - examples/vamp-example-plugins.cat - to - C:\Program Files\Vamp Plugins - - * Linux: copy the files - examples/vamp-example-plugins.so - examples/vamp-example-plugins.cat - to - /usr/local/lib/vamp/ - - * OS/X: copy the files - examples/vamp-example-plugins.dylib - examples/vamp-example-plugins.cat - to - /Library/Audio/Plug-Ins/Vamp - - -Licensing -========= - -This plugin SDK is freely redistributable under a "new-style BSD" -licence. See the file COPYING for more details. In short, you may -modify and redistribute the SDK and example plugins within any -commercial or non-commercial, proprietary or open-source plugin or -application under almost any conditions, with no obligation to provide -source code, provided you retain the original copyright note. - - -See Also -======== - -Sonic Visualiser, an interactive open-source graphical audio -inspection, analysis and visualisation tool supporting Vamp plugins. -http://www.sonicvisualiser.org/ - - -Authors -======= - -Vamp and the Vamp SDK were designed and made at the Centre for Digital -Music at Queen Mary, University of London. - -The SDK was written by Chris Cannam, copyright (c) 2005-2007 -Chris Cannam and QMUL. - -Mark Sandler and Christian Landone provided ideas and direction, and -Mark Levy, Dan Stowell, Martin Gasser and Craig Sapp provided testing -and other input for the 1.0 API and SDK. The API also uses some ideas -from prior plugin systems, notably DSSI (http://dssi.sourceforge.net) -and FEAPI (http://feapi.sourceforge.net). - diff --git a/libs/vamp-sdk/SConscript b/libs/vamp-sdk/SConscript deleted file mode 100644 index 79046e2fc0..0000000000 --- a/libs/vamp-sdk/SConscript +++ /dev/null @@ -1,46 +0,0 @@ -# -*- python -*- - -import os -import os.path -import glob - -vampsdk_files = Split (""" -vamp-sdk/PluginAdapter.cpp -vamp-sdk/RealTime.cpp -""") - -vamphostsdk_files = Split (""" -vamp-sdk/PluginHostAdapter.cpp -vamp-sdk/hostext/PluginBufferingAdapter.cpp -vamp-sdk/hostext/PluginChannelAdapter.cpp -vamp-sdk/hostext/PluginInputDomainAdapter.cpp -vamp-sdk/hostext/PluginLoader.cpp -vamp-sdk/hostext/PluginWrapper.cpp -vamp-sdk/RealTime.cpp -""") - -Import('env install_prefix libraries') -vampsdk = env.Copy() - -vampsdk.Merge ([libraries['fftw3'], libraries['fftw3f']]) - -# HAVE_FFTW3 is used to help improve some performance aspects of VAMP's InputDomainAdapter - -vampsdk.Append (CPPATH='#libs/vamp-sdk/vamp', CXXFLAGS="-Ilibs/vamp-sdk -DHAVE_FFTW3") - -libvampsdk = vampsdk.SharedLibrary('vampsdk', vampsdk_files) -libvamphostsdk = vampsdk.SharedLibrary('vamphostsdk', vamphostsdk_files) - -Default(libvampsdk) -Default(libvamphostsdk) - -env.Alias('install', env.Install(os.path.join(install_prefix, env['LIBDIR'], 'ardour3'), libvampsdk)) -env.Alias('install', env.Install(os.path.join(install_prefix, env['LIBDIR'], 'ardour3'), libvamphostsdk)) - -env.Alias('tarball', env.Distribute (env['DISTTREE'], - [ 'SConscript', 'COPYING', 'README' ] + - vampsdk_files + - vamphostsdk_files + - glob.glob('vamp/*.h') + - glob.glob('vamp-sdk/*.h') + - glob.glob('vamp-sdk/hostext/*.h'))) diff --git a/libs/vamp-sdk/vamp-sdk/Plugin.h b/libs/vamp-sdk/vamp-sdk/Plugin.h deleted file mode 100644 index 159bf4fac6..0000000000 --- a/libs/vamp-sdk/vamp-sdk/Plugin.h +++ /dev/null @@ -1,405 +0,0 @@ -/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ - -/* - Vamp - - An API for audio analysis and feature extraction plugins. - - Centre for Digital Music, Queen Mary, University of London. - Copyright 2006 Chris Cannam. - - Permission is hereby granted, free of charge, to any person - obtaining a copy of this software and associated documentation - files (the "Software"), to deal in the Software without - restriction, including without limitation the rights to use, copy, - modify, merge, publish, distribute, sublicense, and/or sell copies - of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR - ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF - CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - Except as contained in this notice, the names of the Centre for - Digital Music; Queen Mary, University of London; and Chris Cannam - shall not be used in advertising or otherwise to promote the sale, - use or other dealings in this Software without prior written - authorization. -*/ - -#ifndef _VAMP_PLUGIN_H_ -#define _VAMP_PLUGIN_H_ - -#include "PluginBase.h" -#include "RealTime.h" - -#include <string> -#include <vector> -#include <map> - -namespace Vamp { - -/** - * \class Plugin Plugin.h <vamp-sdk/Plugin.h> - * - * Vamp::Plugin is a base class for plugin instance classes - * that provide feature extraction from audio or related data. - * - * In most cases, the input will be audio and the output will be a - * stream of derived data at a lower sampling resolution than the - * input. - * - * Note that this class inherits several abstract methods from - * PluginBase. These must be implemented by the subclass. - * - * - * PLUGIN LIFECYCLE - * - * Feature extraction plugins are managed differently from real-time - * plugins (such as VST effects). The main difference is that the - * parameters for a feature extraction plugin are configured before - * the plugin is used, and do not change during use. - * - * 1. Host constructs the plugin, passing it the input sample rate. - * The plugin may do basic initialisation, but should not do anything - * computationally expensive at this point. You must make sure your - * plugin is cheap to construct, otherwise you'll seriously affect the - * startup performance of almost all hosts. If you have serious - * initialisation to do, the proper place is in initialise() (step 5). - * - * 2. Host may query the plugin's available outputs. - * - * 3. Host queries programs and parameter descriptors, and may set - * some or all of them. Parameters that are not explicitly set should - * take their default values as specified in the parameter descriptor. - * When a program is set, the parameter values may change and the host - * will re-query them to check. - * - * 4. Host queries the preferred step size, block size and number of - * channels. These may all vary depending on the parameter values. - * (Note however that you cannot make the number of distinct outputs - * dependent on parameter values.) - * - * 5. Plugin is properly initialised with a call to initialise. This - * fixes the step size, block size, and number of channels, as well as - * all of the parameter and program settings. If the values passed in - * to initialise do not match the plugin's advertised preferred values - * from step 4, the plugin may refuse to initialise and return false - * (although if possible it should accept the new values). Any - * computationally expensive setup code should take place here. - * - * 6. Host finally checks the number of values, resolution, extents - * etc per output (which may vary depending on the number of channels, - * step size and block size as well as the parameter values). - * - * 7. Host will repeatedly call the process method to pass in blocks - * of input data. This method may return features extracted from that - * data (if the plugin is causal). - * - * 8. Host will call getRemainingFeatures exactly once, after all the - * input data has been processed. This may return any non-causal or - * leftover features. - * - * 9. At any point after initialise was called, the host may - * optionally call the reset method and restart processing. (This - * does not mean it can change the parameters, which are fixed from - * initialise until destruction.) - * - * A plugin does not need to handle the case where setParameter or - * selectProgram is called after initialise has been called. It's the - * host's responsibility not to do that. Similarly, the plugin may - * safely assume that initialise is called no more than once. - */ - -class Plugin : public PluginBase -{ -public: - virtual ~Plugin() { } - - /** - * Initialise a plugin to prepare it for use with the given number - * of input channels, step size (window increment, in sample - * frames) and block size (window size, in sample frames). - * - * The input sample rate should have been already specified at - * construction time. - * - * Return true for successful initialisation, false if the number - * of input channels, step size and/or block size cannot be - * supported. - */ - virtual bool initialise(size_t inputChannels, - size_t stepSize, - size_t blockSize) = 0; - - /** - * Reset the plugin after use, to prepare it for another clean - * run. Not called for the first initialisation (i.e. initialise - * must also do a reset). - */ - virtual void reset() = 0; - - enum InputDomain { TimeDomain, FrequencyDomain }; - - /** - * Get the plugin's required input domain. If this is TimeDomain, - * the samples provided to the process() function (below) will be - * in the time domain, as for a traditional audio processing - * plugin. If this is FrequencyDomain, the host will carry out a - * windowed FFT of size equal to the negotiated block size on the - * data before passing the frequency bin data in to process(). - * The plugin does not get to choose the window type -- the host - * will either let the user do so, or will use a Hanning window. - */ - virtual InputDomain getInputDomain() const = 0; - - /** - * Get the preferred block size (window size -- the number of - * sample frames passed in each block to the process() function). - * This should be called before initialise(). - * - * A plugin that can handle any block size may return 0. The - * final block size will be set in the initialise() call. - */ - virtual size_t getPreferredBlockSize() const { return 0; } - - /** - * Get the preferred step size (window increment -- the distance - * in sample frames between the start frames of consecutive blocks - * passed to the process() function) for the plugin. This should - * be called before initialise(). - * - * A plugin may return 0 if it has no particular interest in the - * step size. In this case, the host should make the step size - * equal to the block size if the plugin is accepting input in the - * time domain. If the plugin is accepting input in the frequency - * domain, the host may use any step size. The final step size - * will be set in the initialise() call. - */ - virtual size_t getPreferredStepSize() const { return 0; } - - /** - * Get the minimum supported number of input channels. - */ - virtual size_t getMinChannelCount() const { return 1; } - - /** - * Get the maximum supported number of input channels. - */ - virtual size_t getMaxChannelCount() const { return 1; } - - struct OutputDescriptor - { - /** - * The name of the output, in computer-usable form. Should be - * reasonably short and without whitespace or punctuation, using - * the characters [a-zA-Z0-9_] only. - * Example: "zero_crossing_count" - */ - std::string identifier; - - /** - * The human-readable name of the output. - * Example: "Zero Crossing Counts" - */ - std::string name; - - /** - * A human-readable short text describing the output. May be - * empty if the name has said it all already. - * Example: "The number of zero crossing points per processing block" - */ - std::string description; - - /** - * The unit of the output, in human-readable form. - */ - std::string unit; - - /** - * True if the output has the same number of values per sample - * for every output sample. Outputs for which this is false - * are unlikely to be very useful in a general-purpose host. - */ - bool hasFixedBinCount; - - /** - * The number of values per result of the output. Undefined - * if hasFixedBinCount is false. If this is zero, the output - * is point data (i.e. only the time of each output is of - * interest, the value list will be empty). - */ - size_t binCount; - - /** - * The (human-readable) names of each of the bins, if - * appropriate. This is always optional. - */ - std::vector<std::string> binNames; - - /** - * True if the results in each output bin fall within a fixed - * numeric range (minimum and maximum values). Undefined if - * binCount is zero. - */ - bool hasKnownExtents; - - /** - * Minimum value of the results in the output. Undefined if - * hasKnownExtents is false or binCount is zero. - */ - float minValue; - - /** - * Maximum value of the results in the output. Undefined if - * hasKnownExtents is false or binCount is zero. - */ - float maxValue; - - /** - * True if the output values are quantized to a particular - * resolution. Undefined if binCount is zero. - */ - bool isQuantized; - - /** - * Quantization resolution of the output values (e.g. 1.0 if - * they are all integers). Undefined if isQuantized is false - * or binCount is zero. - */ - float quantizeStep; - - enum SampleType { - - /// Results from each process() align with that call's block start - OneSamplePerStep, - - /// Results are evenly spaced in time (sampleRate specified below) - FixedSampleRate, - - /// Results are unevenly spaced and have individual timestamps - VariableSampleRate - }; - - /** - * Positioning in time of the output results. - */ - SampleType sampleType; - - /** - * Sample rate of the output results, as samples per second. - * Undefined if sampleType is OneSamplePerStep. - * - * If sampleType is VariableSampleRate and this value is - * non-zero, then it may be used to calculate a resolution for - * the output (i.e. the "duration" of each sample, in time, - * will be 1/sampleRate seconds). It's recommended to set - * this to zero if that behaviour is not desired. - */ - float sampleRate; - }; - - typedef std::vector<OutputDescriptor> OutputList; - - /** - * Get the outputs of this plugin. An output's index in this list - * is used as its numeric index when looking it up in the - * FeatureSet returned from the process() call. - */ - virtual OutputList getOutputDescriptors() const = 0; - - struct Feature - { - /** - * True if an output feature has its own timestamp. This is - * mandatory if the output has VariableSampleRate, and is - * likely to be disregarded otherwise. - */ - bool hasTimestamp; - - /** - * Timestamp of the output feature. This is mandatory if the - * output has VariableSampleRate, and is likely to be - * disregarded otherwise. Undefined if hasTimestamp is false. - */ - RealTime timestamp; - - /** - * Results for a single sample of this feature. If the output - * hasFixedBinCount, there must be the same number of values - * as the output's binCount count. - */ - std::vector<float> values; - - /** - * Label for the sample of this feature. - */ - std::string label; - }; - - typedef std::vector<Feature> FeatureList; - typedef std::map<int, FeatureList> FeatureSet; // key is output no - - /** - * Process a single block of input data. - * - * If the plugin's inputDomain is TimeDomain, inputBuffers will - * point to one array of floats per input channel, and each of - * these arrays will contain blockSize consecutive audio samples - * (the host will zero-pad as necessary). The timestamp will be - * the real time in seconds of the start of the supplied block of - * samples. - * - * If the plugin's inputDomain is FrequencyDomain, inputBuffers - * will point to one array of floats per input channel, and each - * of these arrays will contain blockSize/2+1 consecutive pairs of - * real and imaginary component floats corresponding to bins - * 0..(blockSize/2) of the FFT output. That is, bin 0 (the first - * pair of floats) contains the DC output, up to bin blockSize/2 - * which contains the Nyquist-frequency output. There will - * therefore be blockSize+2 floats per channel in total. The - * timestamp will be the real time in seconds of the centre of the - * FFT input window (i.e. the very first block passed to process - * might contain the FFT of half a block of zero samples and the - * first half-block of the actual data, with a timestamp of zero). - * - * Return any features that have become available after this - * process call. (These do not necessarily have to fall within - * the process block, except for OneSamplePerStep outputs.) - */ - virtual FeatureSet process(const float *const *inputBuffers, - RealTime timestamp) = 0; - - /** - * After all blocks have been processed, calculate and return any - * remaining features derived from the complete input. - */ - virtual FeatureSet getRemainingFeatures() = 0; - - /** - * Used to distinguish between Vamp::Plugin and other potential - * sibling subclasses of PluginBase. Do not reimplement this - * function in your subclass. - */ - virtual std::string getType() const { return "Feature Extraction Plugin"; } - -protected: - Plugin(float inputSampleRate) : - m_inputSampleRate(inputSampleRate) { } - - float m_inputSampleRate; -}; - -} - -#endif - - - diff --git a/libs/vamp-sdk/vamp-sdk/PluginAdapter.cpp b/libs/vamp-sdk/vamp-sdk/PluginAdapter.cpp deleted file mode 100644 index 63cbfecfd1..0000000000 --- a/libs/vamp-sdk/vamp-sdk/PluginAdapter.cpp +++ /dev/null @@ -1,853 +0,0 @@ -/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ - -/* - Vamp - - An API for audio analysis and feature extraction plugins. - - Centre for Digital Music, Queen Mary, University of London. - Copyright 2006 Chris Cannam. - - Permission is hereby granted, free of charge, to any person - obtaining a copy of this software and associated documentation - files (the "Software"), to deal in the Software without - restriction, including without limitation the rights to use, copy, - modify, merge, publish, distribute, sublicense, and/or sell copies - of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR - ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF - CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - Except as contained in this notice, the names of the Centre for - Digital Music; Queen Mary, University of London; and Chris Cannam - shall not be used in advertising or otherwise to promote the sale, - use or other dealings in this Software without prior written - authorization. -*/ - -#include <cstring> -#include <cstdlib> -#include "PluginAdapter.h" - -//#define DEBUG_PLUGIN_ADAPTER 1 - - -namespace Vamp { - -class PluginAdapterBase::Impl -{ -public: - Impl(PluginAdapterBase *); - ~Impl(); - - const VampPluginDescriptor *getDescriptor(); - -protected: - PluginAdapterBase *m_base; - - static VampPluginHandle vampInstantiate(const VampPluginDescriptor *desc, - float inputSampleRate); - - static void vampCleanup(VampPluginHandle handle); - - static int vampInitialise(VampPluginHandle handle, unsigned int channels, - unsigned int stepSize, unsigned int blockSize); - - static void vampReset(VampPluginHandle handle); - - static float vampGetParameter(VampPluginHandle handle, int param); - static void vampSetParameter(VampPluginHandle handle, int param, float value); - - static unsigned int vampGetCurrentProgram(VampPluginHandle handle); - static void vampSelectProgram(VampPluginHandle handle, unsigned int program); - - static unsigned int vampGetPreferredStepSize(VampPluginHandle handle); - static unsigned int vampGetPreferredBlockSize(VampPluginHandle handle); - static unsigned int vampGetMinChannelCount(VampPluginHandle handle); - static unsigned int vampGetMaxChannelCount(VampPluginHandle handle); - - static unsigned int vampGetOutputCount(VampPluginHandle handle); - - static VampOutputDescriptor *vampGetOutputDescriptor(VampPluginHandle handle, - unsigned int i); - - static void vampReleaseOutputDescriptor(VampOutputDescriptor *desc); - - static VampFeatureList *vampProcess(VampPluginHandle handle, - const float *const *inputBuffers, - int sec, - int nsec); - - static VampFeatureList *vampGetRemainingFeatures(VampPluginHandle handle); - - static void vampReleaseFeatureSet(VampFeatureList *fs); - - void cleanup(Plugin *plugin); - void checkOutputMap(Plugin *plugin); - unsigned int getOutputCount(Plugin *plugin); - VampOutputDescriptor *getOutputDescriptor(Plugin *plugin, - unsigned int i); - VampFeatureList *process(Plugin *plugin, - const float *const *inputBuffers, - int sec, int nsec); - VampFeatureList *getRemainingFeatures(Plugin *plugin); - VampFeatureList *convertFeatures(Plugin *plugin, - const Plugin::FeatureSet &features); - - // maps both plugins and descriptors to adapters - typedef std::map<const void *, Impl *> AdapterMap; - static AdapterMap *m_adapterMap; - static Impl *lookupAdapter(VampPluginHandle); - - bool m_populated; - VampPluginDescriptor m_descriptor; - Plugin::ParameterList m_parameters; - Plugin::ProgramList m_programs; - - typedef std::map<Plugin *, Plugin::OutputList *> OutputMap; - OutputMap m_pluginOutputs; - - std::map<Plugin *, VampFeatureList *> m_fs; - std::map<Plugin *, std::vector<size_t> > m_fsizes; - std::map<Plugin *, std::vector<std::vector<size_t> > > m_fvsizes; - void resizeFS(Plugin *plugin, int n); - void resizeFL(Plugin *plugin, int n, size_t sz); - void resizeFV(Plugin *plugin, int n, int j, size_t sz); -}; - -PluginAdapterBase::PluginAdapterBase() -{ - m_impl = new Impl(this); -} - -PluginAdapterBase::~PluginAdapterBase() -{ - delete m_impl; -} - -const VampPluginDescriptor * -PluginAdapterBase::getDescriptor() -{ - return m_impl->getDescriptor(); -} - -PluginAdapterBase::Impl::Impl(PluginAdapterBase *base) : - m_base(base), - m_populated(false) -{ -#ifdef DEBUG_PLUGIN_ADAPTER - std::cerr << "PluginAdapterBase::Impl[" << this << "]::Impl" << std::endl; -#endif -} - -const VampPluginDescriptor * -PluginAdapterBase::Impl::getDescriptor() -{ -#ifdef DEBUG_PLUGIN_ADAPTER - std::cerr << "PluginAdapterBase::Impl[" << this << "]::getDescriptor" << std::endl; -#endif - - if (m_populated) return &m_descriptor; - - Plugin *plugin = m_base->createPlugin(48000); - - if (plugin->getVampApiVersion() != VAMP_API_VERSION) { - std::cerr << "Vamp::PluginAdapterBase::Impl::getDescriptor: ERROR: " - << "Plugin object API version " - << plugin->getVampApiVersion() - << " does not match actual API version " - << VAMP_API_VERSION << std::endl; - delete plugin; - return 0; - } - - m_parameters = plugin->getParameterDescriptors(); - m_programs = plugin->getPrograms(); - - m_descriptor.vampApiVersion = plugin->getVampApiVersion(); - m_descriptor.identifier = strdup(plugin->getIdentifier().c_str()); - m_descriptor.name = strdup(plugin->getName().c_str()); - m_descriptor.description = strdup(plugin->getDescription().c_str()); - m_descriptor.maker = strdup(plugin->getMaker().c_str()); - m_descriptor.pluginVersion = plugin->getPluginVersion(); - m_descriptor.copyright = strdup(plugin->getCopyright().c_str()); - - m_descriptor.parameterCount = m_parameters.size(); - m_descriptor.parameters = (const VampParameterDescriptor **) - malloc(m_parameters.size() * sizeof(VampParameterDescriptor)); - - unsigned int i; - - for (i = 0; i < m_parameters.size(); ++i) { - VampParameterDescriptor *desc = (VampParameterDescriptor *) - malloc(sizeof(VampParameterDescriptor)); - desc->identifier = strdup(m_parameters[i].identifier.c_str()); - desc->name = strdup(m_parameters[i].name.c_str()); - desc->description = strdup(m_parameters[i].description.c_str()); - desc->unit = strdup(m_parameters[i].unit.c_str()); - desc->minValue = m_parameters[i].minValue; - desc->maxValue = m_parameters[i].maxValue; - desc->defaultValue = m_parameters[i].defaultValue; - desc->isQuantized = m_parameters[i].isQuantized; - desc->quantizeStep = m_parameters[i].quantizeStep; - desc->valueNames = 0; - if (desc->isQuantized && !m_parameters[i].valueNames.empty()) { - desc->valueNames = (const char **) - malloc((m_parameters[i].valueNames.size()+1) * sizeof(char *)); - for (unsigned int j = 0; j < m_parameters[i].valueNames.size(); ++j) { - desc->valueNames[j] = strdup(m_parameters[i].valueNames[j].c_str()); - } - desc->valueNames[m_parameters[i].valueNames.size()] = 0; - } - m_descriptor.parameters[i] = desc; - } - - m_descriptor.programCount = m_programs.size(); - m_descriptor.programs = (const char **) - malloc(m_programs.size() * sizeof(const char *)); - - for (i = 0; i < m_programs.size(); ++i) { - m_descriptor.programs[i] = strdup(m_programs[i].c_str()); - } - - if (plugin->getInputDomain() == Plugin::FrequencyDomain) { - m_descriptor.inputDomain = vampFrequencyDomain; - } else { - m_descriptor.inputDomain = vampTimeDomain; - } - - m_descriptor.instantiate = vampInstantiate; - m_descriptor.cleanup = vampCleanup; - m_descriptor.initialise = vampInitialise; - m_descriptor.reset = vampReset; - m_descriptor.getParameter = vampGetParameter; - m_descriptor.setParameter = vampSetParameter; - m_descriptor.getCurrentProgram = vampGetCurrentProgram; - m_descriptor.selectProgram = vampSelectProgram; - m_descriptor.getPreferredStepSize = vampGetPreferredStepSize; - m_descriptor.getPreferredBlockSize = vampGetPreferredBlockSize; - m_descriptor.getMinChannelCount = vampGetMinChannelCount; - m_descriptor.getMaxChannelCount = vampGetMaxChannelCount; - m_descriptor.getOutputCount = vampGetOutputCount; - m_descriptor.getOutputDescriptor = vampGetOutputDescriptor; - m_descriptor.releaseOutputDescriptor = vampReleaseOutputDescriptor; - m_descriptor.process = vampProcess; - m_descriptor.getRemainingFeatures = vampGetRemainingFeatures; - m_descriptor.releaseFeatureSet = vampReleaseFeatureSet; - - if (!m_adapterMap) { - m_adapterMap = new AdapterMap; - } - (*m_adapterMap)[&m_descriptor] = this; - - delete plugin; - - m_populated = true; - return &m_descriptor; -} - -PluginAdapterBase::Impl::~Impl() -{ -#ifdef DEBUG_PLUGIN_ADAPTER - std::cerr << "PluginAdapterBase::Impl[" << this << "]::~Impl" << std::endl; -#endif - - if (!m_populated) return; - - free((void *)m_descriptor.identifier); - free((void *)m_descriptor.name); - free((void *)m_descriptor.description); - free((void *)m_descriptor.maker); - free((void *)m_descriptor.copyright); - - for (unsigned int i = 0; i < m_descriptor.parameterCount; ++i) { - const VampParameterDescriptor *desc = m_descriptor.parameters[i]; - free((void *)desc->identifier); - free((void *)desc->name); - free((void *)desc->description); - free((void *)desc->unit); - if (desc->valueNames) { - for (unsigned int j = 0; desc->valueNames[j]; ++j) { - free((void *)desc->valueNames[j]); - } - free((void *)desc->valueNames); - } - } - free((void *)m_descriptor.parameters); - - for (unsigned int i = 0; i < m_descriptor.programCount; ++i) { - free((void *)m_descriptor.programs[i]); - } - free((void *)m_descriptor.programs); - - if (m_adapterMap) { - - m_adapterMap->erase(&m_descriptor); - - if (m_adapterMap->empty()) { - delete m_adapterMap; - m_adapterMap = 0; - } - } -} - -PluginAdapterBase::Impl * -PluginAdapterBase::Impl::lookupAdapter(VampPluginHandle handle) -{ -#ifdef DEBUG_PLUGIN_ADAPTER - std::cerr << "PluginAdapterBase::Impl::lookupAdapter(" << handle << ")" << std::endl; -#endif - - if (!m_adapterMap) return 0; - AdapterMap::const_iterator i = m_adapterMap->find(handle); - if (i == m_adapterMap->end()) return 0; - return i->second; -} - -VampPluginHandle -PluginAdapterBase::Impl::vampInstantiate(const VampPluginDescriptor *desc, - float inputSampleRate) -{ -#ifdef DEBUG_PLUGIN_ADAPTER - std::cerr << "PluginAdapterBase::Impl::vampInstantiate(" << desc << ")" << std::endl; -#endif - - if (!m_adapterMap) { - m_adapterMap = new AdapterMap(); - } - - if (m_adapterMap->find(desc) == m_adapterMap->end()) { - std::cerr << "WARNING: PluginAdapterBase::Impl::vampInstantiate: Descriptor " << desc << " not in adapter map" << std::endl; - return 0; - } - - Impl *adapter = (*m_adapterMap)[desc]; - if (desc != &adapter->m_descriptor) return 0; - - Plugin *plugin = adapter->m_base->createPlugin(inputSampleRate); - if (plugin) { - (*m_adapterMap)[plugin] = adapter; - } - -#ifdef DEBUG_PLUGIN_ADAPTER - std::cerr << "PluginAdapterBase::Impl::vampInstantiate(" << desc << "): returning handle " << plugin << std::endl; -#endif - - return plugin; -} - -void -PluginAdapterBase::Impl::vampCleanup(VampPluginHandle handle) -{ -#ifdef DEBUG_PLUGIN_ADAPTER - std::cerr << "PluginAdapterBase::Impl::vampCleanup(" << handle << ")" << std::endl; -#endif - - Impl *adapter = lookupAdapter(handle); - if (!adapter) { - delete ((Plugin *)handle); - return; - } - adapter->cleanup(((Plugin *)handle)); -} - -int -PluginAdapterBase::Impl::vampInitialise(VampPluginHandle handle, - unsigned int channels, - unsigned int stepSize, - unsigned int blockSize) -{ -#ifdef DEBUG_PLUGIN_ADAPTER - std::cerr << "PluginAdapterBase::Impl::vampInitialise(" << handle << ", " << channels << ", " << stepSize << ", " << blockSize << ")" << std::endl; -#endif - - bool result = ((Plugin *)handle)->initialise - (channels, stepSize, blockSize); - return result ? 1 : 0; -} - -void -PluginAdapterBase::Impl::vampReset(VampPluginHandle handle) -{ -#ifdef DEBUG_PLUGIN_ADAPTER - std::cerr << "PluginAdapterBase::Impl::vampReset(" << handle << ")" << std::endl; -#endif - - ((Plugin *)handle)->reset(); -} - -float -PluginAdapterBase::Impl::vampGetParameter(VampPluginHandle handle, - int param) -{ -#ifdef DEBUG_PLUGIN_ADAPTER - std::cerr << "PluginAdapterBase::Impl::vampGetParameter(" << handle << ", " << param << ")" << std::endl; -#endif - - Impl *adapter = lookupAdapter(handle); - if (!adapter) return 0.0; - Plugin::ParameterList &list = adapter->m_parameters; - return ((Plugin *)handle)->getParameter(list[param].identifier); -} - -void -PluginAdapterBase::Impl::vampSetParameter(VampPluginHandle handle, - int param, float value) -{ -#ifdef DEBUG_PLUGIN_ADAPTER - std::cerr << "PluginAdapterBase::Impl::vampSetParameter(" << handle << ", " << param << ", " << value << ")" << std::endl; -#endif - - Impl *adapter = lookupAdapter(handle); - if (!adapter) return; - Plugin::ParameterList &list = adapter->m_parameters; - ((Plugin *)handle)->setParameter(list[param].identifier, value); -} - -unsigned int -PluginAdapterBase::Impl::vampGetCurrentProgram(VampPluginHandle handle) -{ -#ifdef DEBUG_PLUGIN_ADAPTER - std::cerr << "PluginAdapterBase::Impl::vampGetCurrentProgram(" << handle << ")" << std::endl; -#endif - - Impl *adapter = lookupAdapter(handle); - if (!adapter) return 0; - Plugin::ProgramList &list = adapter->m_programs; - std::string program = ((Plugin *)handle)->getCurrentProgram(); - for (unsigned int i = 0; i < list.size(); ++i) { - if (list[i] == program) return i; - } - return 0; -} - -void -PluginAdapterBase::Impl::vampSelectProgram(VampPluginHandle handle, - unsigned int program) -{ -#ifdef DEBUG_PLUGIN_ADAPTER - std::cerr << "PluginAdapterBase::Impl::vampSelectProgram(" << handle << ", " << program << ")" << std::endl; -#endif - - Impl *adapter = lookupAdapter(handle); - if (!adapter) return; - Plugin::ProgramList &list = adapter->m_programs; - ((Plugin *)handle)->selectProgram(list[program]); -} - -unsigned int -PluginAdapterBase::Impl::vampGetPreferredStepSize(VampPluginHandle handle) -{ -#ifdef DEBUG_PLUGIN_ADAPTER - std::cerr << "PluginAdapterBase::Impl::vampGetPreferredStepSize(" << handle << ")" << std::endl; -#endif - - return ((Plugin *)handle)->getPreferredStepSize(); -} - -unsigned int -PluginAdapterBase::Impl::vampGetPreferredBlockSize(VampPluginHandle handle) -{ -#ifdef DEBUG_PLUGIN_ADAPTER - std::cerr << "PluginAdapterBase::Impl::vampGetPreferredBlockSize(" << handle << ")" << std::endl; -#endif - - return ((Plugin *)handle)->getPreferredBlockSize(); -} - -unsigned int -PluginAdapterBase::Impl::vampGetMinChannelCount(VampPluginHandle handle) -{ -#ifdef DEBUG_PLUGIN_ADAPTER - std::cerr << "PluginAdapterBase::Impl::vampGetMinChannelCount(" << handle << ")" << std::endl; -#endif - - return ((Plugin *)handle)->getMinChannelCount(); -} - -unsigned int -PluginAdapterBase::Impl::vampGetMaxChannelCount(VampPluginHandle handle) -{ -#ifdef DEBUG_PLUGIN_ADAPTER - std::cerr << "PluginAdapterBase::Impl::vampGetMaxChannelCount(" << handle << ")" << std::endl; -#endif - - return ((Plugin *)handle)->getMaxChannelCount(); -} - -unsigned int -PluginAdapterBase::Impl::vampGetOutputCount(VampPluginHandle handle) -{ -#ifdef DEBUG_PLUGIN_ADAPTER - std::cerr << "PluginAdapterBase::Impl::vampGetOutputCount(" << handle << ")" << std::endl; -#endif - - Impl *adapter = lookupAdapter(handle); - -// std::cerr << "vampGetOutputCount: handle " << handle << " -> adapter "<< adapter << std::endl; - - if (!adapter) return 0; - return adapter->getOutputCount((Plugin *)handle); -} - -VampOutputDescriptor * -PluginAdapterBase::Impl::vampGetOutputDescriptor(VampPluginHandle handle, - unsigned int i) -{ -#ifdef DEBUG_PLUGIN_ADAPTER - std::cerr << "PluginAdapterBase::Impl::vampGetOutputDescriptor(" << handle << ", " << i << ")" << std::endl; -#endif - - Impl *adapter = lookupAdapter(handle); - -// std::cerr << "vampGetOutputDescriptor: handle " << handle << " -> adapter "<< adapter << std::endl; - - if (!adapter) return 0; - return adapter->getOutputDescriptor((Plugin *)handle, i); -} - -void -PluginAdapterBase::Impl::vampReleaseOutputDescriptor(VampOutputDescriptor *desc) -{ -#ifdef DEBUG_PLUGIN_ADAPTER - std::cerr << "PluginAdapterBase::Impl::vampReleaseOutputDescriptor(" << desc << ")" << std::endl; -#endif - - if (desc->identifier) free((void *)desc->identifier); - if (desc->name) free((void *)desc->name); - if (desc->description) free((void *)desc->description); - if (desc->unit) free((void *)desc->unit); - if (desc->hasFixedBinCount && desc->binNames) { - for (unsigned int i = 0; i < desc->binCount; ++i) { - if (desc->binNames[i]) { - free((void *)desc->binNames[i]); - } - } - } - if (desc->binNames) free((void *)desc->binNames); - free((void *)desc); -} - -VampFeatureList * -PluginAdapterBase::Impl::vampProcess(VampPluginHandle handle, - const float *const *inputBuffers, - int sec, - int nsec) -{ -#ifdef DEBUG_PLUGIN_ADAPTER - std::cerr << "PluginAdapterBase::Impl::vampProcess(" << handle << ", " << sec << ", " << nsec << ")" << std::endl; -#endif - - Impl *adapter = lookupAdapter(handle); - if (!adapter) return 0; - return adapter->process((Plugin *)handle, - inputBuffers, sec, nsec); -} - -VampFeatureList * -PluginAdapterBase::Impl::vampGetRemainingFeatures(VampPluginHandle handle) -{ -#ifdef DEBUG_PLUGIN_ADAPTER - std::cerr << "PluginAdapterBase::Impl::vampGetRemainingFeatures(" << handle << ")" << std::endl; -#endif - - Impl *adapter = lookupAdapter(handle); - if (!adapter) return 0; - return adapter->getRemainingFeatures((Plugin *)handle); -} - -void -PluginAdapterBase::Impl::vampReleaseFeatureSet(VampFeatureList *fs) -{ -#ifdef DEBUG_PLUGIN_ADAPTER - std::cerr << "PluginAdapterBase::Impl::vampReleaseFeatureSet" << std::endl; -#endif -} - -void -PluginAdapterBase::Impl::cleanup(Plugin *plugin) -{ - if (m_fs.find(plugin) != m_fs.end()) { - size_t outputCount = 0; - if (m_pluginOutputs[plugin]) { - outputCount = m_pluginOutputs[plugin]->size(); - } - VampFeatureList *list = m_fs[plugin]; - for (unsigned int i = 0; i < outputCount; ++i) { - for (unsigned int j = 0; j < m_fsizes[plugin][i]; ++j) { - if (list[i].features[j].label) { - free(list[i].features[j].label); - } - if (list[i].features[j].values) { - free(list[i].features[j].values); - } - } - if (list[i].features) free(list[i].features); - } - m_fs.erase(plugin); - m_fsizes.erase(plugin); - m_fvsizes.erase(plugin); - } - - if (m_pluginOutputs.find(plugin) != m_pluginOutputs.end()) { - delete m_pluginOutputs[plugin]; - m_pluginOutputs.erase(plugin); - } - - if (m_adapterMap) { - m_adapterMap->erase(plugin); - - if (m_adapterMap->empty()) { - delete m_adapterMap; - m_adapterMap = 0; - } - } - - delete ((Plugin *)plugin); -} - -void -PluginAdapterBase::Impl::checkOutputMap(Plugin *plugin) -{ - if (m_pluginOutputs.find(plugin) == m_pluginOutputs.end() || - !m_pluginOutputs[plugin]) { - m_pluginOutputs[plugin] = new Plugin::OutputList - (plugin->getOutputDescriptors()); -// std::cerr << "PluginAdapterBase::Impl::checkOutputMap: Have " << m_pluginOutputs[plugin]->size() << " outputs for plugin " << plugin->getIdentifier() << std::endl; - } -} - -unsigned int -PluginAdapterBase::Impl::getOutputCount(Plugin *plugin) -{ - checkOutputMap(plugin); - return m_pluginOutputs[plugin]->size(); -} - -VampOutputDescriptor * -PluginAdapterBase::Impl::getOutputDescriptor(Plugin *plugin, - unsigned int i) -{ - checkOutputMap(plugin); - Plugin::OutputDescriptor &od = - (*m_pluginOutputs[plugin])[i]; - - VampOutputDescriptor *desc = (VampOutputDescriptor *) - malloc(sizeof(VampOutputDescriptor)); - - desc->identifier = strdup(od.identifier.c_str()); - desc->name = strdup(od.name.c_str()); - desc->description = strdup(od.description.c_str()); - desc->unit = strdup(od.unit.c_str()); - desc->hasFixedBinCount = od.hasFixedBinCount; - desc->binCount = od.binCount; - - if (od.hasFixedBinCount && od.binCount > 0) { - desc->binNames = (const char **) - malloc(od.binCount * sizeof(const char *)); - - for (unsigned int i = 0; i < od.binCount; ++i) { - if (i < od.binNames.size()) { - desc->binNames[i] = strdup(od.binNames[i].c_str()); - } else { - desc->binNames[i] = 0; - } - } - } else { - desc->binNames = 0; - } - - desc->hasKnownExtents = od.hasKnownExtents; - desc->minValue = od.minValue; - desc->maxValue = od.maxValue; - desc->isQuantized = od.isQuantized; - desc->quantizeStep = od.quantizeStep; - - switch (od.sampleType) { - case Plugin::OutputDescriptor::OneSamplePerStep: - desc->sampleType = vampOneSamplePerStep; break; - case Plugin::OutputDescriptor::FixedSampleRate: - desc->sampleType = vampFixedSampleRate; break; - case Plugin::OutputDescriptor::VariableSampleRate: - desc->sampleType = vampVariableSampleRate; break; - } - - desc->sampleRate = od.sampleRate; - - return desc; -} - -VampFeatureList * -PluginAdapterBase::Impl::process(Plugin *plugin, - const float *const *inputBuffers, - int sec, int nsec) -{ -// std::cerr << "PluginAdapterBase::Impl::process" << std::endl; - RealTime rt(sec, nsec); - checkOutputMap(plugin); - return convertFeatures(plugin, plugin->process(inputBuffers, rt)); -} - -VampFeatureList * -PluginAdapterBase::Impl::getRemainingFeatures(Plugin *plugin) -{ -// std::cerr << "PluginAdapterBase::Impl::getRemainingFeatures" << std::endl; - checkOutputMap(plugin); - return convertFeatures(plugin, plugin->getRemainingFeatures()); -} - -VampFeatureList * -PluginAdapterBase::Impl::convertFeatures(Plugin *plugin, - const Plugin::FeatureSet &features) -{ - int lastN = -1; - - int outputCount = 0; - if (m_pluginOutputs[plugin]) outputCount = m_pluginOutputs[plugin]->size(); - - resizeFS(plugin, outputCount); - VampFeatureList *fs = m_fs[plugin]; - - for (Plugin::FeatureSet::const_iterator fi = features.begin(); - fi != features.end(); ++fi) { - - int n = fi->first; - -// std::cerr << "PluginAdapterBase::Impl::convertFeatures: n = " << n << std::endl; - - if (n >= int(outputCount)) { - std::cerr << "WARNING: PluginAdapterBase::Impl::convertFeatures: Too many outputs from plugin (" << n+1 << ", only should be " << outputCount << ")" << std::endl; - continue; - } - - if (n > lastN + 1) { - for (int i = lastN + 1; i < n; ++i) { - fs[i].featureCount = 0; - } - } - - const Plugin::FeatureList &fl = fi->second; - - size_t sz = fl.size(); - if (sz > m_fsizes[plugin][n]) resizeFL(plugin, n, sz); - fs[n].featureCount = sz; - - for (size_t j = 0; j < sz; ++j) { - -// std::cerr << "PluginAdapterBase::Impl::convertFeatures: j = " << j << std::endl; - - VampFeature *feature = &fs[n].features[j]; - - feature->hasTimestamp = fl[j].hasTimestamp; - feature->sec = fl[j].timestamp.sec; - feature->nsec = fl[j].timestamp.nsec; - feature->valueCount = fl[j].values.size(); - - if (feature->label) free(feature->label); - - if (fl[j].label.empty()) { - feature->label = 0; - } else { - feature->label = strdup(fl[j].label.c_str()); - } - - if (feature->valueCount > m_fvsizes[plugin][n][j]) { - resizeFV(plugin, n, j, feature->valueCount); - } - - for (unsigned int k = 0; k < feature->valueCount; ++k) { -// std::cerr << "PluginAdapterBase::Impl::convertFeatures: k = " << k << std::endl; - feature->values[k] = fl[j].values[k]; - } - } - - lastN = n; - } - - if (lastN == -1) return 0; - - if (int(outputCount) > lastN + 1) { - for (int i = lastN + 1; i < int(outputCount); ++i) { - fs[i].featureCount = 0; - } - } - - return fs; -} - -void -PluginAdapterBase::Impl::resizeFS(Plugin *plugin, int n) -{ -// std::cerr << "PluginAdapterBase::Impl::resizeFS(" << plugin << ", " << n << ")" << std::endl; - - int i = m_fsizes[plugin].size(); - if (i >= n) return; - -// std::cerr << "resizing from " << i << std::endl; - - m_fs[plugin] = (VampFeatureList *)realloc - (m_fs[plugin], n * sizeof(VampFeatureList)); - - while (i < n) { - m_fs[plugin][i].featureCount = 0; - m_fs[plugin][i].features = 0; - m_fsizes[plugin].push_back(0); - m_fvsizes[plugin].push_back(std::vector<size_t>()); - i++; - } -} - -void -PluginAdapterBase::Impl::resizeFL(Plugin *plugin, int n, size_t sz) -{ -// std::cerr << "PluginAdapterBase::Impl::resizeFL(" << plugin << ", " << n << ", " -// << sz << ")" << std::endl; - - size_t i = m_fsizes[plugin][n]; - if (i >= sz) return; - -// std::cerr << "resizing from " << i << std::endl; - - m_fs[plugin][n].features = (VampFeature *)realloc - (m_fs[plugin][n].features, sz * sizeof(VampFeature)); - - while (m_fsizes[plugin][n] < sz) { - m_fs[plugin][n].features[m_fsizes[plugin][n]].valueCount = 0; - m_fs[plugin][n].features[m_fsizes[plugin][n]].values = 0; - m_fs[plugin][n].features[m_fsizes[plugin][n]].label = 0; - m_fvsizes[plugin][n].push_back(0); - m_fsizes[plugin][n]++; - } -} - -void -PluginAdapterBase::Impl::resizeFV(Plugin *plugin, int n, int j, size_t sz) -{ -// std::cerr << "PluginAdapterBase::Impl::resizeFV(" << plugin << ", " << n << ", " -// << j << ", " << sz << ")" << std::endl; - - size_t i = m_fvsizes[plugin][n][j]; - if (i >= sz) return; - -// std::cerr << "resizing from " << i << std::endl; - - m_fs[plugin][n].features[j].values = (float *)realloc - (m_fs[plugin][n].features[j].values, sz * sizeof(float)); - - m_fvsizes[plugin][n][j] = sz; -} - -PluginAdapterBase::Impl::AdapterMap * -PluginAdapterBase::Impl::m_adapterMap = 0; - -} - diff --git a/libs/vamp-sdk/vamp-sdk/PluginAdapter.h b/libs/vamp-sdk/vamp-sdk/PluginAdapter.h deleted file mode 100644 index bfc97508eb..0000000000 --- a/libs/vamp-sdk/vamp-sdk/PluginAdapter.h +++ /dev/null @@ -1,117 +0,0 @@ -/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ - -/* - Vamp - - An API for audio analysis and feature extraction plugins. - - Centre for Digital Music, Queen Mary, University of London. - Copyright 2006 Chris Cannam. - - Permission is hereby granted, free of charge, to any person - obtaining a copy of this software and associated documentation - files (the "Software"), to deal in the Software without - restriction, including without limitation the rights to use, copy, - modify, merge, publish, distribute, sublicense, and/or sell copies - of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR - ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF - CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - Except as contained in this notice, the names of the Centre for - Digital Music; Queen Mary, University of London; and Chris Cannam - shall not be used in advertising or otherwise to promote the sale, - use or other dealings in this Software without prior written - authorization. -*/ - -#ifndef _VAMP_PLUGIN_ADAPTER_H_ -#define _VAMP_PLUGIN_ADAPTER_H_ - -#include <vamp/vamp.h> - -#include "Plugin.h" - -#include <map> - -namespace Vamp { - -/** - * \class PluginAdapterBase PluginAdapter.h <vamp-sdk/PluginAdapter.h> - * - * PluginAdapter and PluginAdapterBase provide a wrapper class that a - * plugin library can use to make its C++ Vamp::Plugin objects - * available through the Vamp C API. - * - * Almost all Vamp plugin libraries will want to make use of this. To - * do so, all they need to do is declare a PluginAdapter<T> for each - * plugin class T in their library. It's very simple, and you need to - * know absolutely nothing about how it works in order to use it. - * Just cut and paste from an existing plugin's discovery function. - * \see vampGetPluginDescriptor - */ - -class PluginAdapterBase -{ -public: - virtual ~PluginAdapterBase(); - - /** - * Return a VampPluginDescriptor describing the plugin that is - * wrapped by this adapter. - */ - const VampPluginDescriptor *getDescriptor(); - -protected: - PluginAdapterBase(); - - virtual Plugin *createPlugin(float inputSampleRate) = 0; - - class Impl; - Impl *m_impl; -}; - -/** - * \class PluginAdapter PluginAdapter.h <vamp-sdk/PluginAdapter.h> - * - * PluginAdapter turns a PluginAdapterBase into a specific wrapper for - * a particular plugin implementation. - * - * See PluginAdapterBase. - */ - -template <typename P> -class PluginAdapter : public PluginAdapterBase -{ -public: - PluginAdapter() : PluginAdapterBase() { } - virtual ~PluginAdapter() { } - -protected: - Plugin *createPlugin(float inputSampleRate) { - P *p = new P(inputSampleRate); - Plugin *plugin = dynamic_cast<Plugin *>(p); - if (!plugin) { - std::cerr << "ERROR: PluginAdapter::createPlugin: " - << "Template type is not a plugin!" - << std::endl; - delete p; - return 0; - } - return plugin; - } -}; - -} - -#endif - diff --git a/libs/vamp-sdk/vamp-sdk/PluginBase.h b/libs/vamp-sdk/vamp-sdk/PluginBase.h deleted file mode 100644 index 38d2b49904..0000000000 --- a/libs/vamp-sdk/vamp-sdk/PluginBase.h +++ /dev/null @@ -1,252 +0,0 @@ -/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ - -/* - Vamp - - An API for audio analysis and feature extraction plugins. - - Centre for Digital Music, Queen Mary, University of London. - Copyright 2006 Chris Cannam. - - Permission is hereby granted, free of charge, to any person - obtaining a copy of this software and associated documentation - files (the "Software"), to deal in the Software without - restriction, including without limitation the rights to use, copy, - modify, merge, publish, distribute, sublicense, and/or sell copies - of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR - ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF - CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - Except as contained in this notice, the names of the Centre for - Digital Music; Queen Mary, University of London; and Chris Cannam - shall not be used in advertising or otherwise to promote the sale, - use or other dealings in this Software without prior written - authorization. -*/ - -#ifndef _VAMP_PLUGIN_BASE_H_ -#define _VAMP_PLUGIN_BASE_H_ - -#include <string> -#include <vector> - -#define VAMP_SDK_VERSION "1.1" - -namespace Vamp { - -/** - * A base class for plugins with optional configurable parameters, - * programs, etc. The Vamp::Plugin is derived from this, and - * individual Vamp plugins should derive from that. - * - * This class does not provide the necessary interfaces to instantiate - * or run a plugin. It only specifies an interface for retrieving - * those controls that the host may wish to show to the user for - * editing. It could meaningfully be subclassed by real-time plugins - * or other sorts of plugin as well as Vamp plugins. - */ - -class PluginBase -{ -public: - virtual ~PluginBase() { } - - /** - * Get the Vamp API compatibility level of the plugin. - */ - virtual unsigned int getVampApiVersion() const { return 1; } - - /** - * Get the computer-usable name of the plugin. This should be - * reasonably short and contain no whitespace or punctuation - * characters. It may only contain the characters [a-zA-Z0-9_]. - * This is the authoritative way for a program to identify a - * plugin within a given library. - * - * This text may be visible to the user, but it should not be the - * main text used to identify a plugin to the user (that will be - * the name, below). - * - * Example: "zero_crossings" - */ - virtual std::string getIdentifier() const = 0; - - /** - * Get a human-readable name or title of the plugin. This - * should be brief and self-contained, as it may be used to - * identify the plugin to the user in isolation (i.e. without also - * showing the plugin's "identifier"). - * - * Example: "Zero Crossings" - */ - virtual std::string getName() const = 0; - - /** - * Get a human-readable description for the plugin, typically - * a line of text that may optionally be displayed in addition - * to the plugin's "name". May be empty if the name has said - * it all already. - * - * Example: "Detect and count zero crossing points" - */ - virtual std::string getDescription() const = 0; - - /** - * Get the name of the author or vendor of the plugin in - * human-readable form. This should be a short identifying text, - * as it may be used to label plugins from the same source in a - * menu or similar. - */ - virtual std::string getMaker() const = 0; - - /** - * Get the copyright statement or licensing summary for the - * plugin. This can be an informative text, without the same - * presentation constraints as mentioned for getMaker above. - */ - virtual std::string getCopyright() const = 0; - - /** - * Get the version number of the plugin. - */ - virtual int getPluginVersion() const = 0; - - - struct ParameterDescriptor - { - /** - * The name of the parameter, in computer-usable form. Should - * be reasonably short, and may only contain the characters - * [a-zA-Z0-9_]. - */ - std::string identifier; - - /** - * The human-readable name of the parameter. - */ - std::string name; - - /** - * A human-readable short text describing the parameter. May be - * empty if the name has said it all already. - */ - std::string description; - - /** - * The unit of the parameter, in human-readable form. - */ - std::string unit; - - /** - * The minimum value of the parameter. - */ - float minValue; - - /** - * The maximum value of the parameter. - */ - float maxValue; - - /** - * The default value of the parameter. The plugin should - * ensure that parameters have this value on initialisation - * (i.e. the host is not required to explicitly set parameters - * if it wants to use their default values). - */ - float defaultValue; - - /** - * True if the parameter values are quantized to a particular - * resolution. - */ - bool isQuantized; - - /** - * Quantization resolution of the parameter values (e.g. 1.0 - * if they are all integers). Undefined if isQuantized is - * false. - */ - float quantizeStep; - - /** - * Names for the quantized values. If isQuantized is true, - * this may either be empty or contain one string for each of - * the quantize steps from minValue up to maxValue inclusive. - * Undefined if isQuantized is false. - * - * If these names are provided, they should be shown to the - * user in preference to the values themselves. The user may - * never see the actual numeric values unless they are also - * encoded in the names. - */ - std::vector<std::string> valueNames; - }; - - typedef std::vector<ParameterDescriptor> ParameterList; - - /** - * Get the controllable parameters of this plugin. - */ - virtual ParameterList getParameterDescriptors() const { - return ParameterList(); - } - - /** - * Get the value of a named parameter. The argument is the identifier - * field from that parameter's descriptor. - */ - virtual float getParameter(std::string) const { return 0.0; } - - /** - * Set a named parameter. The first argument is the identifier field - * from that parameter's descriptor. - */ - virtual void setParameter(std::string, float) { } - - - typedef std::vector<std::string> ProgramList; - - /** - * Get the program settings available in this plugin. A program - * is a named shorthand for a set of parameter values; changing - * the program may cause the plugin to alter the values of its - * published parameters (and/or non-public internal processing - * parameters). The host should re-read the plugin's parameter - * values after setting a new program. - * - * The programs must have unique names. - */ - virtual ProgramList getPrograms() const { return ProgramList(); } - - /** - * Get the current program. - */ - virtual std::string getCurrentProgram() const { return ""; } - - /** - * Select a program. (If the given program name is not one of the - * available programs, do nothing.) - */ - virtual void selectProgram(std::string) { } - - /** - * Get the type of plugin. This is to be implemented by the - * immediate subclass, not by actual plugins. Do not attempt to - * implement this in plugin code. - */ - virtual std::string getType() const = 0; -}; - -} - -#endif diff --git a/libs/vamp-sdk/vamp-sdk/PluginHostAdapter.cpp b/libs/vamp-sdk/vamp-sdk/PluginHostAdapter.cpp deleted file mode 100644 index 24f91e5f50..0000000000 --- a/libs/vamp-sdk/vamp-sdk/PluginHostAdapter.cpp +++ /dev/null @@ -1,419 +0,0 @@ -/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ - -/* - Vamp - - An API for audio analysis and feature extraction plugins. - - Centre for Digital Music, Queen Mary, University of London. - Copyright 2006 Chris Cannam. - - Permission is hereby granted, free of charge, to any person - obtaining a copy of this software and associated documentation - files (the "Software"), to deal in the Software without - restriction, including without limitation the rights to use, copy, - modify, merge, publish, distribute, sublicense, and/or sell copies - of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR - ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF - CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - Except as contained in this notice, the names of the Centre for - Digital Music; Queen Mary, University of London; and Chris Cannam - shall not be used in advertising or otherwise to promote the sale, - use or other dealings in this Software without prior written - authorization. -*/ - -#include <stdlib.h> -#include "PluginHostAdapter.h" - -namespace Vamp -{ - -PluginHostAdapter::PluginHostAdapter(const VampPluginDescriptor *descriptor, - float inputSampleRate) : - Plugin(inputSampleRate), - m_descriptor(descriptor) -{ -// std::cerr << "PluginHostAdapter::PluginHostAdapter (plugin = " << descriptor->name << ")" << std::endl; - m_handle = m_descriptor->instantiate(m_descriptor, inputSampleRate); - if (!m_handle) { -// std::cerr << "WARNING: PluginHostAdapter: Plugin instantiation failed for plugin " << m_descriptor->name << std::endl; - } -} - -PluginHostAdapter::~PluginHostAdapter() -{ -// std::cerr << "PluginHostAdapter::~PluginHostAdapter (plugin = " << m_descriptor->name << ")" << std::endl; - if (m_handle) m_descriptor->cleanup(m_handle); -} - -std::vector<std::string> -PluginHostAdapter::getPluginPath() -{ - std::vector<std::string> path; - std::string envPath; - - char *cpath = getenv("VAMP_PATH"); - if (cpath) envPath = cpath; - -#ifdef _WIN32 -#define PATH_SEPARATOR ';' -#define DEFAULT_VAMP_PATH "%ProgramFiles%\\Vamp Plugins" -#else -#define PATH_SEPARATOR ':' -#ifdef __APPLE__ -#define DEFAULT_VAMP_PATH "$HOME/Library/Audio/Plug-Ins/Vamp:/Library/Audio/Plug-Ins/Vamp" -#else -#define DEFAULT_VAMP_PATH "$HOME/vamp:$HOME/.vamp:/usr/local/lib/vamp:/usr/lib/vamp" -#endif -#endif - - if (envPath == "") { - envPath = DEFAULT_VAMP_PATH; - char *chome = getenv("HOME"); - if (chome) { - std::string home(chome); - std::string::size_type f; - while ((f = envPath.find("$HOME")) != std::string::npos && - f < envPath.length()) { - envPath.replace(f, 5, home); - } - } -#ifdef _WIN32 - char *cpfiles = getenv("ProgramFiles"); - if (!cpfiles) cpfiles = "C:\\Program Files"; - std::string pfiles(cpfiles); - std::string::size_type f; - while ((f = envPath.find("%ProgramFiles%")) != std::string::npos && - f < envPath.length()) { - envPath.replace(f, 14, pfiles); - } -#endif - } - - std::string::size_type index = 0, newindex = 0; - - while ((newindex = envPath.find(PATH_SEPARATOR, index)) < envPath.size()) { - path.push_back(envPath.substr(index, newindex - index)); - index = newindex + 1; - } - - path.push_back(envPath.substr(index)); - - return path; -} - -bool -PluginHostAdapter::initialise(size_t channels, - size_t stepSize, - size_t blockSize) -{ - if (!m_handle) return false; - return m_descriptor->initialise(m_handle, channels, stepSize, blockSize) ? - true : false; -} - -void -PluginHostAdapter::reset() -{ - if (!m_handle) return; - m_descriptor->reset(m_handle); -} - -PluginHostAdapter::InputDomain -PluginHostAdapter::getInputDomain() const -{ - if (m_descriptor->inputDomain == vampFrequencyDomain) { - return FrequencyDomain; - } else { - return TimeDomain; - } -} - -unsigned int -PluginHostAdapter::getVampApiVersion() const -{ - return m_descriptor->vampApiVersion; -} - -std::string -PluginHostAdapter::getIdentifier() const -{ - return m_descriptor->identifier; -} - -std::string -PluginHostAdapter::getName() const -{ - return m_descriptor->name; -} - -std::string -PluginHostAdapter::getDescription() const -{ - return m_descriptor->description; -} - -std::string -PluginHostAdapter::getMaker() const -{ - return m_descriptor->maker; -} - -int -PluginHostAdapter::getPluginVersion() const -{ - return m_descriptor->pluginVersion; -} - -std::string -PluginHostAdapter::getCopyright() const -{ - return m_descriptor->copyright; -} - -PluginHostAdapter::ParameterList -PluginHostAdapter::getParameterDescriptors() const -{ - ParameterList list; - for (unsigned int i = 0; i < m_descriptor->parameterCount; ++i) { - const VampParameterDescriptor *spd = m_descriptor->parameters[i]; - ParameterDescriptor pd; - pd.identifier = spd->identifier; - pd.name = spd->name; - pd.description = spd->description; - pd.unit = spd->unit; - pd.minValue = spd->minValue; - pd.maxValue = spd->maxValue; - pd.defaultValue = spd->defaultValue; - pd.isQuantized = spd->isQuantized; - pd.quantizeStep = spd->quantizeStep; - if (pd.isQuantized && spd->valueNames) { - for (unsigned int j = 0; spd->valueNames[j]; ++j) { - pd.valueNames.push_back(spd->valueNames[j]); - } - } - list.push_back(pd); - } - return list; -} - -float -PluginHostAdapter::getParameter(std::string param) const -{ - if (!m_handle) return 0.0; - - for (unsigned int i = 0; i < m_descriptor->parameterCount; ++i) { - if (param == m_descriptor->parameters[i]->identifier) { - return m_descriptor->getParameter(m_handle, i); - } - } - - return 0.0; -} - -void -PluginHostAdapter::setParameter(std::string param, - float value) -{ - if (!m_handle) return; - - for (unsigned int i = 0; i < m_descriptor->parameterCount; ++i) { - if (param == m_descriptor->parameters[i]->identifier) { - m_descriptor->setParameter(m_handle, i, value); - return; - } - } -} - -PluginHostAdapter::ProgramList -PluginHostAdapter::getPrograms() const -{ - ProgramList list; - - for (unsigned int i = 0; i < m_descriptor->programCount; ++i) { - list.push_back(m_descriptor->programs[i]); - } - - return list; -} - -std::string -PluginHostAdapter::getCurrentProgram() const -{ - if (!m_handle) return ""; - - int pn = m_descriptor->getCurrentProgram(m_handle); - return m_descriptor->programs[pn]; -} - -void -PluginHostAdapter::selectProgram(std::string program) -{ - if (!m_handle) return; - - for (unsigned int i = 0; i < m_descriptor->programCount; ++i) { - if (program == m_descriptor->programs[i]) { - m_descriptor->selectProgram(m_handle, i); - return; - } - } -} - -size_t -PluginHostAdapter::getPreferredStepSize() const -{ - if (!m_handle) return 0; - return m_descriptor->getPreferredStepSize(m_handle); -} - -size_t -PluginHostAdapter::getPreferredBlockSize() const -{ - if (!m_handle) return 0; - return m_descriptor->getPreferredBlockSize(m_handle); -} - -size_t -PluginHostAdapter::getMinChannelCount() const -{ - if (!m_handle) return 0; - return m_descriptor->getMinChannelCount(m_handle); -} - -size_t -PluginHostAdapter::getMaxChannelCount() const -{ - if (!m_handle) return 0; - return m_descriptor->getMaxChannelCount(m_handle); -} - -PluginHostAdapter::OutputList -PluginHostAdapter::getOutputDescriptors() const -{ - OutputList list; - if (!m_handle) { -// std::cerr << "PluginHostAdapter::getOutputDescriptors: no handle " << std::endl; - return list; - } - - unsigned int count = m_descriptor->getOutputCount(m_handle); - - for (unsigned int i = 0; i < count; ++i) { - VampOutputDescriptor *sd = m_descriptor->getOutputDescriptor(m_handle, i); - OutputDescriptor d; - d.identifier = sd->identifier; - d.name = sd->name; - d.description = sd->description; - d.unit = sd->unit; - d.hasFixedBinCount = sd->hasFixedBinCount; - d.binCount = sd->binCount; - if (d.hasFixedBinCount) { - for (unsigned int j = 0; j < sd->binCount; ++j) { - d.binNames.push_back(sd->binNames[j] ? sd->binNames[j] : ""); - } - } - d.hasKnownExtents = sd->hasKnownExtents; - d.minValue = sd->minValue; - d.maxValue = sd->maxValue; - d.isQuantized = sd->isQuantized; - d.quantizeStep = sd->quantizeStep; - - switch (sd->sampleType) { - case vampOneSamplePerStep: - d.sampleType = OutputDescriptor::OneSamplePerStep; break; - case vampFixedSampleRate: - d.sampleType = OutputDescriptor::FixedSampleRate; break; - case vampVariableSampleRate: - d.sampleType = OutputDescriptor::VariableSampleRate; break; - } - - d.sampleRate = sd->sampleRate; - - list.push_back(d); - - m_descriptor->releaseOutputDescriptor(sd); - } - - return list; -} - -PluginHostAdapter::FeatureSet -PluginHostAdapter::process(const float *const *inputBuffers, - RealTime timestamp) -{ - FeatureSet fs; - if (!m_handle) return fs; - - int sec = timestamp.sec; - int nsec = timestamp.nsec; - - VampFeatureList *features = m_descriptor->process(m_handle, - inputBuffers, - sec, nsec); - - convertFeatures(features, fs); - m_descriptor->releaseFeatureSet(features); - return fs; -} - -PluginHostAdapter::FeatureSet -PluginHostAdapter::getRemainingFeatures() -{ - FeatureSet fs; - if (!m_handle) return fs; - - VampFeatureList *features = m_descriptor->getRemainingFeatures(m_handle); - - convertFeatures(features, fs); - m_descriptor->releaseFeatureSet(features); - return fs; -} - -void -PluginHostAdapter::convertFeatures(VampFeatureList *features, - FeatureSet &fs) -{ - if (!features) return; - - unsigned int outputs = m_descriptor->getOutputCount(m_handle); - - for (unsigned int i = 0; i < outputs; ++i) { - - VampFeatureList &list = features[i]; - - if (list.featureCount > 0) { - - for (unsigned int j = 0; j < list.featureCount; ++j) { - - Feature feature; - feature.hasTimestamp = list.features[j].hasTimestamp; - feature.timestamp = RealTime(list.features[j].sec, - list.features[j].nsec); - - for (unsigned int k = 0; k < list.features[j].valueCount; ++k) { - feature.values.push_back(list.features[j].values[k]); - } - - if (list.features[j].label) { - feature.label = list.features[j].label; - } - - fs[i].push_back(feature); - } - } - } -} - -} diff --git a/libs/vamp-sdk/vamp-sdk/PluginHostAdapter.h b/libs/vamp-sdk/vamp-sdk/PluginHostAdapter.h deleted file mode 100644 index 80ae6208a4..0000000000 --- a/libs/vamp-sdk/vamp-sdk/PluginHostAdapter.h +++ /dev/null @@ -1,117 +0,0 @@ -/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ - -/* - Vamp - - An API for audio analysis and feature extraction plugins. - - Centre for Digital Music, Queen Mary, University of London. - Copyright 2006 Chris Cannam. - - Permission is hereby granted, free of charge, to any person - obtaining a copy of this software and associated documentation - files (the "Software"), to deal in the Software without - restriction, including without limitation the rights to use, copy, - modify, merge, publish, distribute, sublicense, and/or sell copies - of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR - ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF - CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - Except as contained in this notice, the names of the Centre for - Digital Music; Queen Mary, University of London; and Chris Cannam - shall not be used in advertising or otherwise to promote the sale, - use or other dealings in this Software without prior written - authorization. -*/ - -#ifndef _VAMP_PLUGIN_HOST_ADAPTER_H_ -#define _VAMP_PLUGIN_HOST_ADAPTER_H_ - -#include <vamp/vamp.h> -#include <vamp-sdk/Plugin.h> - -#include <vector> - -namespace Vamp { - -/** - * \class PluginHostAdapter PluginHostAdapter.h <vamp-sdk/PluginHostAdapter.h> - * - * PluginHostAdapter is a wrapper class that a Vamp host can use to - * make the C-language VampPluginDescriptor object appear as a C++ - * Vamp::Plugin object. - * - * The Vamp API is defined in vamp/vamp.h as a C API. The C++ objects - * used for convenience by plugins and hosts actually communicate - * using the C low-level API, but the details of this communication - * are handled seamlessly by the Vamp SDK implementation provided the - * plugin and host use the proper C++ wrapper objects. - * - * See also PluginAdapter, the plugin-side wrapper that makes a C++ - * plugin object available using the C query API. - */ - -class PluginHostAdapter : public Plugin -{ -public: - PluginHostAdapter(const VampPluginDescriptor *descriptor, - float inputSampleRate); - virtual ~PluginHostAdapter(); - - static std::vector<std::string> getPluginPath(); - - bool initialise(size_t channels, size_t stepSize, size_t blockSize); - void reset(); - - InputDomain getInputDomain() const; - - unsigned int getVampApiVersion() const; - std::string getIdentifier() const; - std::string getName() const; - std::string getDescription() const; - std::string getMaker() const; - int getPluginVersion() const; - std::string getCopyright() const; - - ParameterList getParameterDescriptors() const; - float getParameter(std::string) const; - void setParameter(std::string, float); - - ProgramList getPrograms() const; - std::string getCurrentProgram() const; - void selectProgram(std::string); - - size_t getPreferredStepSize() const; - size_t getPreferredBlockSize() const; - - size_t getMinChannelCount() const; - size_t getMaxChannelCount() const; - - OutputList getOutputDescriptors() const; - - FeatureSet process(const float *const *inputBuffers, RealTime timestamp); - - FeatureSet getRemainingFeatures(); - -protected: - void convertFeatures(VampFeatureList *, FeatureSet &); - - const VampPluginDescriptor *m_descriptor; - VampPluginHandle m_handle; -}; - -} - -#endif - - diff --git a/libs/vamp-sdk/vamp-sdk/RealTime.cpp b/libs/vamp-sdk/vamp-sdk/RealTime.cpp deleted file mode 100644 index 0b541cc33e..0000000000 --- a/libs/vamp-sdk/vamp-sdk/RealTime.cpp +++ /dev/null @@ -1,254 +0,0 @@ -/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ - -/* - Vamp - - An API for audio analysis and feature extraction plugins. - - Centre for Digital Music, Queen Mary, University of London. - Copyright 2006 Chris Cannam. - - Permission is hereby granted, free of charge, to any person - obtaining a copy of this software and associated documentation - files (the "Software"), to deal in the Software without - restriction, including without limitation the rights to use, copy, - modify, merge, publish, distribute, sublicense, and/or sell copies - of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR - ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF - CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - Except as contained in this notice, the names of the Centre for - Digital Music; Queen Mary, University of London; and Chris Cannam - shall not be used in advertising or otherwise to promote the sale, - use or other dealings in this Software without prior written - authorization. -*/ - -/* - This is a modified version of a source file from the - Rosegarden MIDI and audio sequencer and notation editor. - This file copyright 2000-2006 Chris Cannam. - Relicensed by the author as detailed above. -*/ - -#include <iostream> - -#if (__GNUC__ < 3) -#include <strstream> -#define stringstream strstream -#else -#include <sstream> -#endif - -using std::cerr; -using std::endl; - -#include "RealTime.h" - -#ifndef _WIN32 -#include <sys/time.h> -#endif - -namespace Vamp { - -// A RealTime consists of two ints that must be at least 32 bits each. -// A signed 32-bit int can store values exceeding +/- 2 billion. This -// means we can safely use our lower int for nanoseconds, as there are -// 1 billion nanoseconds in a second and we need to handle double that -// because of the implementations of addition etc that we use. -// -// The maximum valid RealTime on a 32-bit system is somewhere around -// 68 years: 999999999 nanoseconds longer than the classic Unix epoch. - -#define ONE_BILLION 1000000000 - -RealTime::RealTime(int s, int n) : - sec(s), nsec(n) -{ - if (sec == 0) { - while (nsec <= -ONE_BILLION) { nsec += ONE_BILLION; --sec; } - while (nsec >= ONE_BILLION) { nsec -= ONE_BILLION; ++sec; } - } else if (sec < 0) { - while (nsec <= -ONE_BILLION) { nsec += ONE_BILLION; --sec; } - while (nsec > 0) { nsec -= ONE_BILLION; ++sec; } - } else { - while (nsec >= ONE_BILLION) { nsec -= ONE_BILLION; ++sec; } - while (nsec < 0) { nsec += ONE_BILLION; --sec; } - } -} - -RealTime -RealTime::fromSeconds(double sec) -{ - return RealTime(int(sec), int((sec - int(sec)) * ONE_BILLION + 0.5)); -} - -RealTime -RealTime::fromMilliseconds(int msec) -{ - return RealTime(msec / 1000, (msec % 1000) * 1000000); -} - -#ifndef _WIN32 -RealTime -RealTime::fromTimeval(const struct timeval &tv) -{ - return RealTime(tv.tv_sec, tv.tv_usec * 1000); -} -#endif - -std::ostream &operator<<(std::ostream &out, const RealTime &rt) -{ - if (rt < RealTime::zeroTime) { - out << "-"; - } else { - out << " "; - } - - int s = (rt.sec < 0 ? -rt.sec : rt.sec); - int n = (rt.nsec < 0 ? -rt.nsec : rt.nsec); - - out << s << "."; - - int nn(n); - if (nn == 0) out << "00000000"; - else while (nn < (ONE_BILLION / 10)) { - out << "0"; - nn *= 10; - } - - out << n << "R"; - return out; -} - -std::string -RealTime::toString() const -{ - std::stringstream out; - out << *this; - -#if (__GNUC__ < 3) - out << std::ends; -#endif - - std::string s = out.str(); - - // remove trailing R - return s.substr(0, s.length() - 1); -} - -std::string -RealTime::toText(bool fixedDp) const -{ - if (*this < RealTime::zeroTime) return "-" + (-*this).toText(); - - std::stringstream out; - - if (sec >= 3600) { - out << (sec / 3600) << ":"; - } - - if (sec >= 60) { - out << (sec % 3600) / 60 << ":"; - } - - if (sec >= 10) { - out << ((sec % 60) / 10); - } - - out << (sec % 10); - - int ms = msec(); - - if (ms != 0) { - out << "."; - out << (ms / 100); - ms = ms % 100; - if (ms != 0) { - out << (ms / 10); - ms = ms % 10; - } else if (fixedDp) { - out << "0"; - } - if (ms != 0) { - out << ms; - } else if (fixedDp) { - out << "0"; - } - } else if (fixedDp) { - out << ".000"; - } - -#if (__GNUC__ < 3) - out << std::ends; -#endif - - std::string s = out.str(); - - return s; -} - - -RealTime -RealTime::operator/(int d) const -{ - int secdiv = sec / d; - int secrem = sec % d; - - double nsecdiv = (double(nsec) + ONE_BILLION * double(secrem)) / d; - - return RealTime(secdiv, int(nsecdiv + 0.5)); -} - -double -RealTime::operator/(const RealTime &r) const -{ - double lTotal = double(sec) * ONE_BILLION + double(nsec); - double rTotal = double(r.sec) * ONE_BILLION + double(r.nsec); - - if (rTotal == 0) return 0.0; - else return lTotal/rTotal; -} - -long -RealTime::realTime2Frame(const RealTime &time, unsigned int sampleRate) -{ - if (time < zeroTime) return -realTime2Frame(-time, sampleRate); - - // We like integers. The last term is always zero unless the - // sample rate is greater than 1MHz, but hell, you never know... - - long frame = - time.sec * sampleRate + - (time.msec() * sampleRate) / 1000 + - ((time.usec() - 1000 * time.msec()) * sampleRate) / 1000000 + - ((time.nsec - 1000 * time.usec()) * sampleRate) / 1000000000; - - return frame; -} - -RealTime -RealTime::frame2RealTime(long frame, unsigned int sampleRate) -{ - if (frame < 0) return -frame2RealTime(-frame, sampleRate); - - RealTime rt; - rt.sec = frame / long(sampleRate); - frame -= rt.sec * long(sampleRate); - rt.nsec = (int)(((float(frame) * 1000000) / long(sampleRate)) * 1000); - return rt; -} - -const RealTime RealTime::zeroTime(0,0); - -} diff --git a/libs/vamp-sdk/vamp-sdk/RealTime.h b/libs/vamp-sdk/vamp-sdk/RealTime.h deleted file mode 100644 index 6b88ed53f0..0000000000 --- a/libs/vamp-sdk/vamp-sdk/RealTime.h +++ /dev/null @@ -1,162 +0,0 @@ -/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ - -/* - Vamp - - An API for audio analysis and feature extraction plugins. - - Centre for Digital Music, Queen Mary, University of London. - Copyright 2006 Chris Cannam. - - Permission is hereby granted, free of charge, to any person - obtaining a copy of this software and associated documentation - files (the "Software"), to deal in the Software without - restriction, including without limitation the rights to use, copy, - modify, merge, publish, distribute, sublicense, and/or sell copies - of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR - ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF - CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - Except as contained in this notice, the names of the Centre for - Digital Music; Queen Mary, University of London; and Chris Cannam - shall not be used in advertising or otherwise to promote the sale, - use or other dealings in this Software without prior written - authorization. -*/ - -/* - This is a modified version of a source file from the - Rosegarden MIDI and audio sequencer and notation editor. - This file copyright 2000-2006 Chris Cannam. - Relicensed by the author as detailed above. -*/ - -#ifndef _VAMP_REAL_TIME_H_ -#define _VAMP_REAL_TIME_H_ - -#include <iostream> -#include <string> - -#ifndef _WIN32 -struct timeval; -#endif - -namespace Vamp { - -/** - * \class RealTime RealTime.h <vamp-sdk/RealTime.h> - * - * RealTime represents time values to nanosecond precision - * with accurate arithmetic and frame-rate conversion functions. - */ - -struct RealTime -{ - int sec; - int nsec; - - int usec() const { return nsec / 1000; } - int msec() const { return nsec / 1000000; } - - RealTime(): sec(0), nsec(0) {} - RealTime(int s, int n); - - RealTime(const RealTime &r) : - sec(r.sec), nsec(r.nsec) { } - - static RealTime fromSeconds(double sec); - static RealTime fromMilliseconds(int msec); - -#ifndef _WIN32 - static RealTime fromTimeval(const struct timeval &); -#endif - - RealTime &operator=(const RealTime &r) { - sec = r.sec; nsec = r.nsec; return *this; - } - - RealTime operator+(const RealTime &r) const { - return RealTime(sec + r.sec, nsec + r.nsec); - } - RealTime operator-(const RealTime &r) const { - return RealTime(sec - r.sec, nsec - r.nsec); - } - RealTime operator-() const { - return RealTime(-sec, -nsec); - } - - bool operator <(const RealTime &r) const { - if (sec == r.sec) return nsec < r.nsec; - else return sec < r.sec; - } - - bool operator >(const RealTime &r) const { - if (sec == r.sec) return nsec > r.nsec; - else return sec > r.sec; - } - - bool operator==(const RealTime &r) const { - return (sec == r.sec && nsec == r.nsec); - } - - bool operator!=(const RealTime &r) const { - return !(r == *this); - } - - bool operator>=(const RealTime &r) const { - if (sec == r.sec) return nsec >= r.nsec; - else return sec >= r.sec; - } - - bool operator<=(const RealTime &r) const { - if (sec == r.sec) return nsec <= r.nsec; - else return sec <= r.sec; - } - - RealTime operator/(int d) const; - - /** - * Return the ratio of two times. - */ - double operator/(const RealTime &r) const; - - /** - * Return a human-readable debug-type string to full precision - * (probably not a format to show to a user directly) - */ - std::string toString() const; - - /** - * Return a user-readable string to the nearest millisecond - * in a form like HH:MM:SS.mmm - */ - std::string toText(bool fixedDp = false) const; - - /** - * Convert a RealTime into a sample frame at the given sample rate. - */ - static long realTime2Frame(const RealTime &r, unsigned int sampleRate); - - /** - * Convert a sample frame at the given sample rate into a RealTime. - */ - static RealTime frame2RealTime(long frame, unsigned int sampleRate); - - static const RealTime zeroTime; -}; - -std::ostream &operator<<(std::ostream &out, const RealTime &rt); - -} - -#endif diff --git a/libs/vamp-sdk/vamp-sdk/hostext/PluginBufferingAdapter.cpp b/libs/vamp-sdk/vamp-sdk/hostext/PluginBufferingAdapter.cpp deleted file mode 100644 index cbe179fb6b..0000000000 --- a/libs/vamp-sdk/vamp-sdk/hostext/PluginBufferingAdapter.cpp +++ /dev/null @@ -1,516 +0,0 @@ -/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ - -/* - Vamp - - An API for audio analysis and feature extraction plugins. - - Centre for Digital Music, Queen Mary, University of London. - Copyright 2006-2007 Chris Cannam and QMUL. - This file by Mark Levy and Chris Cannam. - - Permission is hereby granted, free of charge, to any person - obtaining a copy of this software and associated documentation - files (the "Software"), to deal in the Software without - restriction, including without limitation the rights to use, copy, - modify, merge, publish, distribute, sublicense, and/or sell copies - of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR - ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF - CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - Except as contained in this notice, the names of the Centre for - Digital Music; Queen Mary, University of London; and Chris Cannam - shall not be used in advertising or otherwise to promote the sale, - use or other dealings in this Software without prior written - authorization. -*/ - -#include <vector> -#include <map> - -#include "PluginBufferingAdapter.h" - -using std::vector; -using std::map; - -namespace Vamp { - -namespace HostExt { - -class PluginBufferingAdapter::Impl -{ -public: - Impl(Plugin *plugin, float inputSampleRate); - ~Impl(); - - bool initialise(size_t channels, size_t stepSize, size_t blockSize); - - OutputList getOutputDescriptors() const; - - void reset(); - - FeatureSet process(const float *const *inputBuffers, RealTime timestamp); - - FeatureSet getRemainingFeatures(); - -protected: - class RingBuffer - { - public: - RingBuffer(int n) : - m_buffer(new float[n+1]), m_writer(0), m_reader(0), m_size(n+1) { } - virtual ~RingBuffer() { delete[] m_buffer; } - - int getSize() const { return m_size-1; } - void reset() { m_writer = 0; m_reader = 0; } - - int getReadSpace() const { - int writer = m_writer, reader = m_reader, space; - if (writer > reader) space = writer - reader; - else if (writer < reader) space = (writer + m_size) - reader; - else space = 0; - return space; - } - - int getWriteSpace() const { - int writer = m_writer; - int reader = m_reader; - int space = (reader + m_size - writer - 1); - if (space >= m_size) space -= m_size; - return space; - } - - int peek(float *destination, int n) const { - - int available = getReadSpace(); - - if (n > available) { - for (int i = available; i < n; ++i) { - destination[i] = 0.f; - } - n = available; - } - if (n == 0) return n; - - int reader = m_reader; - int here = m_size - reader; - const float *const bufbase = m_buffer + reader; - - if (here >= n) { - for (int i = 0; i < n; ++i) { - destination[i] = bufbase[i]; - } - } else { - for (int i = 0; i < here; ++i) { - destination[i] = bufbase[i]; - } - float *const destbase = destination + here; - const int nh = n - here; - for (int i = 0; i < nh; ++i) { - destbase[i] = m_buffer[i]; - } - } - - return n; - } - - int skip(int n) { - - int available = getReadSpace(); - if (n > available) { - n = available; - } - if (n == 0) return n; - - int reader = m_reader; - reader += n; - while (reader >= m_size) reader -= m_size; - m_reader = reader; - return n; - } - - int write(const float *source, int n) { - - int available = getWriteSpace(); - if (n > available) { - n = available; - } - if (n == 0) return n; - - int writer = m_writer; - int here = m_size - writer; - float *const bufbase = m_buffer + writer; - - if (here >= n) { - for (int i = 0; i < n; ++i) { - bufbase[i] = source[i]; - } - } else { - for (int i = 0; i < here; ++i) { - bufbase[i] = source[i]; - } - const int nh = n - here; - const float *const srcbase = source + here; - float *const buf = m_buffer; - for (int i = 0; i < nh; ++i) { - buf[i] = srcbase[i]; - } - } - - writer += n; - while (writer >= m_size) writer -= m_size; - m_writer = writer; - - return n; - } - - int zero(int n) { - - int available = getWriteSpace(); - if (n > available) { - n = available; - } - if (n == 0) return n; - - int writer = m_writer; - int here = m_size - writer; - float *const bufbase = m_buffer + writer; - - if (here >= n) { - for (int i = 0; i < n; ++i) { - bufbase[i] = 0.f; - } - } else { - for (int i = 0; i < here; ++i) { - bufbase[i] = 0.f; - } - const int nh = n - here; - for (int i = 0; i < nh; ++i) { - m_buffer[i] = 0.f; - } - } - - writer += n; - while (writer >= m_size) writer -= m_size; - m_writer = writer; - - return n; - } - - protected: - float *m_buffer; - int m_writer; - int m_reader; - int m_size; - - private: - RingBuffer(const RingBuffer &); // not provided - RingBuffer &operator=(const RingBuffer &); // not provided - }; - - Plugin *m_plugin; - size_t m_inputStepSize; - size_t m_inputBlockSize; - size_t m_stepSize; - size_t m_blockSize; - size_t m_channels; - vector<RingBuffer *> m_queue; - float **m_buffers; - float m_inputSampleRate; - RealTime m_timestamp; - bool m_unrun; - OutputList m_outputs; - - void processBlock(FeatureSet& allFeatureSets, RealTime timestamp); -}; - -PluginBufferingAdapter::PluginBufferingAdapter(Plugin *plugin) : - PluginWrapper(plugin) -{ - m_impl = new Impl(plugin, m_inputSampleRate); -} - -PluginBufferingAdapter::~PluginBufferingAdapter() -{ - delete m_impl; -} - -bool -PluginBufferingAdapter::initialise(size_t channels, size_t stepSize, size_t blockSize) -{ - return m_impl->initialise(channels, stepSize, blockSize); -} - -PluginBufferingAdapter::OutputList -PluginBufferingAdapter::getOutputDescriptors() const -{ - return m_impl->getOutputDescriptors(); -} - -void -PluginBufferingAdapter::reset() -{ - m_impl->reset(); -} - -PluginBufferingAdapter::FeatureSet -PluginBufferingAdapter::process(const float *const *inputBuffers, - RealTime timestamp) -{ - return m_impl->process(inputBuffers, timestamp); -} - -PluginBufferingAdapter::FeatureSet -PluginBufferingAdapter::getRemainingFeatures() -{ - return m_impl->getRemainingFeatures(); -} - -PluginBufferingAdapter::Impl::Impl(Plugin *plugin, float inputSampleRate) : - m_plugin(plugin), - m_inputStepSize(0), - m_inputBlockSize(0), - m_stepSize(0), - m_blockSize(0), - m_channels(0), - m_queue(0), - m_buffers(0), - m_inputSampleRate(inputSampleRate), - m_timestamp(RealTime::zeroTime), - m_unrun(true) -{ - m_outputs = plugin->getOutputDescriptors(); -} - -PluginBufferingAdapter::Impl::~Impl() -{ - // the adapter will delete the plugin - - for (size_t i = 0; i < m_channels; ++i) { - delete m_queue[i]; - delete[] m_buffers[i]; - } - delete[] m_buffers; -} - -size_t -PluginBufferingAdapter::getPreferredStepSize() const -{ - return getPreferredBlockSize(); -} - -bool -PluginBufferingAdapter::Impl::initialise(size_t channels, size_t stepSize, size_t blockSize) -{ - if (stepSize != blockSize) { - std::cerr << "PluginBufferingAdapter::initialise: input stepSize must be equal to blockSize for this adapter (stepSize = " << stepSize << ", blockSize = " << blockSize << ")" << std::endl; - return false; - } - - m_channels = channels; - m_inputStepSize = stepSize; - m_inputBlockSize = blockSize; - - // use the step and block sizes which the plugin prefers - m_stepSize = m_plugin->getPreferredStepSize(); - m_blockSize = m_plugin->getPreferredBlockSize(); - - // or sensible defaults if it has no preference - if (m_blockSize == 0) { - m_blockSize = 1024; - } - if (m_stepSize == 0) { - if (m_plugin->getInputDomain() == Vamp::Plugin::FrequencyDomain) { - m_stepSize = m_blockSize/2; - } else { - m_stepSize = m_blockSize; - } - } else if (m_stepSize > m_blockSize) { - if (m_plugin->getInputDomain() == Vamp::Plugin::FrequencyDomain) { - m_blockSize = m_stepSize * 2; - } else { - m_blockSize = m_stepSize; - } - } - - // std::cerr << "PluginBufferingAdapter::initialise: stepSize " << m_inputStepSize << " -> " << m_stepSize - // << ", blockSize " << m_inputBlockSize << " -> " << m_blockSize << std::endl; - - // current implementation breaks if step is greater than block - if (m_stepSize > m_blockSize) { - std::cerr << "PluginBufferingAdapter::initialise: plugin's preferred stepSize greater than blockSize, giving up!" << std::endl; - return false; - } - - m_buffers = new float *[m_channels]; - - for (size_t i = 0; i < m_channels; ++i) { - m_queue.push_back(new RingBuffer(m_blockSize + m_inputBlockSize)); - m_buffers[i] = new float[m_blockSize]; - } - - return m_plugin->initialise(m_channels, m_stepSize, m_blockSize); -} - -PluginBufferingAdapter::OutputList -PluginBufferingAdapter::Impl::getOutputDescriptors() const -{ - OutputList outs = m_plugin->getOutputDescriptors(); - for (size_t i = 0; i < outs.size(); ++i) { - if (outs[i].sampleType == OutputDescriptor::OneSamplePerStep) { - outs[i].sampleRate = 1.f / m_stepSize; - } - outs[i].sampleType = OutputDescriptor::VariableSampleRate; - } - return outs; -} - -void -PluginBufferingAdapter::Impl::reset() -{ - m_timestamp = RealTime::zeroTime; - m_unrun = true; - - for (size_t i = 0; i < m_queue.size(); ++i) { - m_queue[i]->reset(); - } -} - -PluginBufferingAdapter::FeatureSet -PluginBufferingAdapter::Impl::process(const float *const *inputBuffers, - RealTime timestamp) -{ - FeatureSet allFeatureSets; - - if (m_unrun) { - m_timestamp = timestamp; - m_unrun = false; - } - - // queue the new input - - for (size_t i = 0; i < m_channels; ++i) { - int written = m_queue[i]->write(inputBuffers[i], m_inputBlockSize); - if (written < int(m_inputBlockSize) && i == 0) { - std::cerr << "WARNING: PluginBufferingAdapter::Impl::process: " - << "Buffer overflow: wrote " << written - << " of " << m_inputBlockSize - << " input samples (for plugin step size " - << m_stepSize << ", block size " << m_blockSize << ")" - << std::endl; - } - } - - // process as much as we can - - while (m_queue[0]->getReadSpace() >= int(m_blockSize)) { - processBlock(allFeatureSets, timestamp); - } - - return allFeatureSets; -} - -PluginBufferingAdapter::FeatureSet -PluginBufferingAdapter::Impl::getRemainingFeatures() -{ - FeatureSet allFeatureSets; - - // process remaining samples in queue - while (m_queue[0]->getReadSpace() >= int(m_blockSize)) { - processBlock(allFeatureSets, m_timestamp); - } - - // pad any last samples remaining and process - if (m_queue[0]->getReadSpace() > 0) { - for (size_t i = 0; i < m_channels; ++i) { - m_queue[i]->zero(m_blockSize - m_queue[i]->getReadSpace()); - } - processBlock(allFeatureSets, m_timestamp); - } - - // get remaining features - - FeatureSet featureSet = m_plugin->getRemainingFeatures(); - - for (map<int, FeatureList>::iterator iter = featureSet.begin(); - iter != featureSet.end(); ++iter) { - FeatureList featureList = iter->second; - for (size_t i = 0; i < featureList.size(); ++i) { - allFeatureSets[iter->first].push_back(featureList[i]); - } - } - - return allFeatureSets; -} - -void -PluginBufferingAdapter::Impl::processBlock(FeatureSet& allFeatureSets, - RealTime timestamp) -{ - for (size_t i = 0; i < m_channels; ++i) { - m_queue[i]->peek(m_buffers[i], m_blockSize); - } - - FeatureSet featureSet = m_plugin->process(m_buffers, m_timestamp); - - for (map<int, FeatureList>::iterator iter = featureSet.begin(); - iter != featureSet.end(); ++iter) { - - FeatureList featureList = iter->second; - int outputNo = iter->first; - - for (size_t i = 0; i < featureList.size(); ++i) { - - // make sure the timestamp is set - switch (m_outputs[outputNo].sampleType) { - - case OutputDescriptor::OneSamplePerStep: - // use our internal timestamp - OK???? - featureList[i].timestamp = m_timestamp; - break; - - case OutputDescriptor::FixedSampleRate: - // use our internal timestamp - featureList[i].timestamp = m_timestamp; - break; - - case OutputDescriptor::VariableSampleRate: - break; // plugin must set timestamp - - default: - break; - } - - allFeatureSets[outputNo].push_back(featureList[i]); - } - } - - // step forward - - for (size_t i = 0; i < m_channels; ++i) { - m_queue[i]->skip(m_stepSize); - } - - // fake up the timestamp each time we step forward - - long frame = RealTime::realTime2Frame(m_timestamp, - int(m_inputSampleRate + 0.5)); - m_timestamp = RealTime::frame2RealTime(frame + m_stepSize, - int(m_inputSampleRate + 0.5)); -} - -} - -} - - diff --git a/libs/vamp-sdk/vamp-sdk/hostext/PluginBufferingAdapter.h b/libs/vamp-sdk/vamp-sdk/hostext/PluginBufferingAdapter.h deleted file mode 100644 index 24ca6f8db8..0000000000 --- a/libs/vamp-sdk/vamp-sdk/hostext/PluginBufferingAdapter.h +++ /dev/null @@ -1,99 +0,0 @@ -/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ - -/* - Vamp - - An API for audio analysis and feature extraction plugins. - - Centre for Digital Music, Queen Mary, University of London. - Copyright 2006-2007 Chris Cannam and QMUL. - This file by Mark Levy, Copyright 2007 QMUL. - - Permission is hereby granted, free of charge, to any person - obtaining a copy of this software and associated documentation - files (the "Software"), to deal in the Software without - restriction, including without limitation the rights to use, copy, - modify, merge, publish, distribute, sublicense, and/or sell copies - of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR - ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF - CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - Except as contained in this notice, the names of the Centre for - Digital Music; Queen Mary, University of London; and Chris Cannam - shall not be used in advertising or otherwise to promote the sale, - use or other dealings in this Software without prior written - authorization. -*/ - -#ifndef _VAMP_PLUGIN_BUFFERING_ADAPTER_H_ -#define _VAMP_PLUGIN_BUFFERING_ADAPTER_H_ - -#include "PluginWrapper.h" - -namespace Vamp { - -namespace HostExt { - -/** - * \class PluginBufferingAdapter PluginBufferingAdapter.h <vamp-sdk/hostext/PluginBufferingAdapter.h> - * - * PluginBufferingAdapter is a Vamp plugin adapter that allows plugins - * to be used by a host supplying an audio stream in non-overlapping - * buffers of arbitrary size. - * - * A host using PluginBufferingAdapter may ignore the preferred step - * and block size reported by the plugin, and still expect the plugin - * to run. The value of blockSize and stepSize passed to initialise - * should be the size of the buffer which the host will supply; the - * stepSize should be equal to the blockSize. - * - * If the internal step size used for the plugin differs from that - * supplied by the host, the adapter will modify the sample rate - * specifications for the plugin outputs (setting them all to - * VariableSampleRate) and set timestamps on the output features for - * outputs that formerly used a different sample rate specification. - * This is necessary in order to obtain correct time stamping. - * - * In other respects, the PluginBufferingAdapter behaves identically - * to the plugin that it wraps. The wrapped plugin will be deleted - * when the wrapper is deleted. - */ - -class PluginBufferingAdapter : public PluginWrapper -{ -public: - PluginBufferingAdapter(Plugin *plugin); // I take ownership of plugin - virtual ~PluginBufferingAdapter(); - - bool initialise(size_t channels, size_t stepSize, size_t blockSize); - - size_t getPreferredStepSize() const; - - OutputList getOutputDescriptors() const; - - void reset(); - - FeatureSet process(const float *const *inputBuffers, RealTime timestamp); - - FeatureSet getRemainingFeatures(); - -protected: - class Impl; - Impl *m_impl; -}; - -} - -} - -#endif diff --git a/libs/vamp-sdk/vamp-sdk/hostext/PluginChannelAdapter.cpp b/libs/vamp-sdk/vamp-sdk/hostext/PluginChannelAdapter.cpp deleted file mode 100644 index fe676bcafd..0000000000 --- a/libs/vamp-sdk/vamp-sdk/hostext/PluginChannelAdapter.cpp +++ /dev/null @@ -1,228 +0,0 @@ -/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ - -/* - Vamp - - An API for audio analysis and feature extraction plugins. - - Centre for Digital Music, Queen Mary, University of London. - Copyright 2006-2007 Chris Cannam and QMUL. - - Permission is hereby granted, free of charge, to any person - obtaining a copy of this software and associated documentation - files (the "Software"), to deal in the Software without - restriction, including without limitation the rights to use, copy, - modify, merge, publish, distribute, sublicense, and/or sell copies - of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR - ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF - CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - Except as contained in this notice, the names of the Centre for - Digital Music; Queen Mary, University of London; and Chris Cannam - shall not be used in advertising or otherwise to promote the sale, - use or other dealings in this Software without prior written - authorization. -*/ - -#include "PluginChannelAdapter.h" - -namespace Vamp { - -namespace HostExt { - -class PluginChannelAdapter::Impl -{ -public: - Impl(Plugin *plugin); - ~Impl(); - - bool initialise(size_t channels, size_t stepSize, size_t blockSize); - - FeatureSet process(const float *const *inputBuffers, RealTime timestamp); - -protected: - Plugin *m_plugin; - size_t m_blockSize; - size_t m_inputChannels; - size_t m_pluginChannels; - float **m_buffer; - const float **m_forwardPtrs; -}; - -PluginChannelAdapter::PluginChannelAdapter(Plugin *plugin) : - PluginWrapper(plugin) -{ - m_impl = new Impl(plugin); -} - -PluginChannelAdapter::~PluginChannelAdapter() -{ - delete m_impl; -} - -bool -PluginChannelAdapter::initialise(size_t channels, size_t stepSize, size_t blockSize) -{ - return m_impl->initialise(channels, stepSize, blockSize); -} - -PluginChannelAdapter::FeatureSet -PluginChannelAdapter::process(const float *const *inputBuffers, - RealTime timestamp) -{ - return m_impl->process(inputBuffers, timestamp); -} - -PluginChannelAdapter::Impl::Impl(Plugin *plugin) : - m_plugin(plugin), - m_blockSize(0), - m_inputChannels(0), - m_pluginChannels(0), - m_buffer(0), - m_forwardPtrs(0) -{ -} - -PluginChannelAdapter::Impl::~Impl() -{ - // the adapter will delete the plugin - - if (m_buffer) { - if (m_inputChannels > m_pluginChannels) { - delete[] m_buffer[0]; - } else { - for (size_t i = 0; i < m_pluginChannels - m_inputChannels; ++i) { - delete[] m_buffer[i]; - } - } - delete[] m_buffer; - m_buffer = 0; - } - - if (m_forwardPtrs) { - delete[] m_forwardPtrs; - m_forwardPtrs = 0; - } -} - -bool -PluginChannelAdapter::Impl::initialise(size_t channels, size_t stepSize, size_t blockSize) -{ - m_blockSize = blockSize; - - size_t minch = m_plugin->getMinChannelCount(); - size_t maxch = m_plugin->getMaxChannelCount(); - - m_inputChannels = channels; - - if (m_inputChannels < minch) { - - m_forwardPtrs = new const float *[minch]; - - if (m_inputChannels > 1) { - // We need a set of zero-valued buffers to add to the - // forwarded pointers - m_buffer = new float*[minch - channels]; - for (size_t i = 0; i < minch; ++i) { - m_buffer[i] = new float[blockSize]; - for (size_t j = 0; j < blockSize; ++j) { - m_buffer[i][j] = 0.f; - } - } - } - - m_pluginChannels = minch; - - // std::cerr << "PluginChannelAdapter::initialise: expanding " << m_inputChannels << " to " << m_pluginChannels << " for plugin" << std::endl; - - } else if (m_inputChannels > maxch) { - - // We only need m_buffer if we are mixing down to a single - // channel -- otherwise we can just forward the same float* as - // passed in to process(), expecting the excess to be ignored - - if (maxch == 1) { - m_buffer = new float *[1]; - m_buffer[0] = new float[blockSize]; - - // std::cerr << "PluginChannelAdapter::initialise: mixing " << m_inputChannels << " to mono for plugin" << std::endl; - - } else { - - // std::cerr << "PluginChannelAdapter::initialise: reducing " << m_inputChannels << " to " << m_pluginChannels << " for plugin" << std::endl; - } - - m_pluginChannels = maxch; - - } else { - - // std::cerr << "PluginChannelAdapter::initialise: accepting given number of channels (" << m_inputChannels << ")" << std::endl; - m_pluginChannels = m_inputChannels; - } - - return m_plugin->initialise(m_pluginChannels, stepSize, blockSize); -} - -PluginChannelAdapter::FeatureSet -PluginChannelAdapter::Impl::process(const float *const *inputBuffers, - RealTime timestamp) -{ -// std::cerr << "PluginChannelAdapter::process: " << m_inputChannels << " -> " << m_pluginChannels << " channels" << std::endl; - - if (m_inputChannels < m_pluginChannels) { - - if (m_inputChannels == 1) { - for (size_t i = 0; i < m_pluginChannels; ++i) { - m_forwardPtrs[i] = inputBuffers[0]; - } - } else { - for (size_t i = 0; i < m_inputChannels; ++i) { - m_forwardPtrs[i] = inputBuffers[i]; - } - for (size_t i = m_inputChannels; i < m_pluginChannels; ++i) { - m_forwardPtrs[i] = m_buffer[i - m_inputChannels]; - } - } - - return m_plugin->process(m_forwardPtrs, timestamp); - - } else if (m_inputChannels > m_pluginChannels) { - - if (m_pluginChannels == 1) { - for (size_t j = 0; j < m_blockSize; ++j) { - m_buffer[0][j] = inputBuffers[0][j]; - } - for (size_t i = 1; i < m_inputChannels; ++i) { - for (size_t j = 0; j < m_blockSize; ++j) { - m_buffer[0][j] += inputBuffers[i][j]; - } - } - for (size_t j = 0; j < m_blockSize; ++j) { - m_buffer[0][j] /= m_inputChannels; - } - return m_plugin->process(m_buffer, timestamp); - } else { - return m_plugin->process(inputBuffers, timestamp); - } - - } else { - - return m_plugin->process(inputBuffers, timestamp); - } -} - -} - -} - - diff --git a/libs/vamp-sdk/vamp-sdk/hostext/PluginChannelAdapter.h b/libs/vamp-sdk/vamp-sdk/hostext/PluginChannelAdapter.h deleted file mode 100644 index a2b4d89aee..0000000000 --- a/libs/vamp-sdk/vamp-sdk/hostext/PluginChannelAdapter.h +++ /dev/null @@ -1,128 +0,0 @@ -/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ - -/* - Vamp - - An API for audio analysis and feature extraction plugins. - - Centre for Digital Music, Queen Mary, University of London. - Copyright 2006-2007 Chris Cannam and QMUL. - - Permission is hereby granted, free of charge, to any person - obtaining a copy of this software and associated documentation - files (the "Software"), to deal in the Software without - restriction, including without limitation the rights to use, copy, - modify, merge, publish, distribute, sublicense, and/or sell copies - of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR - ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF - CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - Except as contained in this notice, the names of the Centre for - Digital Music; Queen Mary, University of London; and Chris Cannam - shall not be used in advertising or otherwise to promote the sale, - use or other dealings in this Software without prior written - authorization. -*/ - -#ifndef _VAMP_PLUGIN_CHANNEL_ADAPTER_H_ -#define _VAMP_PLUGIN_CHANNEL_ADAPTER_H_ - -#include "PluginWrapper.h" - -namespace Vamp { - -namespace HostExt { - -/** - * \class PluginChannelAdapter PluginChannelAdapter.h <vamp-sdk/hostext/PluginChannelAdapter.h> - * - * PluginChannelAdapter is a Vamp plugin adapter that implements a - * policy for management of plugins that expect a different number of - * input channels from the number actually available in the source - * audio data. - * - * A host using PluginChannelAdapter may ignore the getMinChannelCount - * and getMaxChannelCount reported by the plugin, and still expect the - * plugin to run. - * - * PluginChannelAdapter implements the following policy: - * - * - If the plugin supports the provided number of channels directly, - * PluginChannelAdapter will just run the plugin as normal. - * - * - If the plugin only supports exactly one channel but more than - * one channel is provided, PluginChannelAdapter will use the mean of - * the channels. This ensures that the resulting values remain - * within the same magnitude range as expected for mono data. - * - * - If the plugin requires more than one channel but exactly one is - * provided, the provided channel will be duplicated across all the - * plugin input channels. - * - * If none of the above apply: - * - * - If the plugin requires more channels than are provided, the - * minimum acceptable number of channels will be produced by adding - * empty (zero valued) channels to those provided. - * - * - If the plugin requires fewer channels than are provided, the - * maximum acceptable number of channels will be produced by - * discarding the excess channels. - * - * Hosts requiring a different channel policy from the above will need - * to implement it themselves, instead of using PluginChannelAdapter. - * - * Note that PluginChannelAdapter does not override the minimum and - * maximum channel counts returned by the wrapped plugin. The host - * will need to be aware that it is using a PluginChannelAdapter, and - * be prepared to ignore these counts as necessary. (This contrasts - * with the approach used in PluginInputDomainAdapter, which aims to - * make the host completely unaware of which underlying input domain - * is in fact in use.) - * - * (The rationale for this is that a host may wish to use the - * PluginChannelAdapter but still discriminate in some way on the - * basis of the number of channels actually supported. For example, a - * simple stereo audio host may prefer to reject plugins that require - * more than two channels on the grounds that doesn't actually - * understand what they are for, rather than allow the channel adapter - * to make a potentially meaningless channel conversion for them.) - * - * In every respect other than its management of channels, the - * PluginChannelAdapter behaves identically to the plugin that it - * wraps. The wrapped plugin will be deleted when the wrapper is - * deleted. - * - * \note This class was introduced in version 1.1 of the Vamp plugin SDK. - */ - -class PluginChannelAdapter : public PluginWrapper -{ -public: - PluginChannelAdapter(Plugin *plugin); // I take ownership of plugin - virtual ~PluginChannelAdapter(); - - bool initialise(size_t channels, size_t stepSize, size_t blockSize); - - FeatureSet process(const float *const *inputBuffers, RealTime timestamp); - -protected: - class Impl; - Impl *m_impl; -}; - -} - -} - -#endif diff --git a/libs/vamp-sdk/vamp-sdk/hostext/PluginInputDomainAdapter.cpp b/libs/vamp-sdk/vamp-sdk/hostext/PluginInputDomainAdapter.cpp deleted file mode 100644 index 273925f96d..0000000000 --- a/libs/vamp-sdk/vamp-sdk/hostext/PluginInputDomainAdapter.cpp +++ /dev/null @@ -1,557 +0,0 @@ -/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ - -/* - Vamp - - An API for audio analysis and feature extraction plugins. - - Centre for Digital Music, Queen Mary, University of London. - Copyright 2006-2007 Chris Cannam and QMUL. - - This file is based in part on Don Cross's public domain FFT - implementation. - - Permission is hereby granted, free of charge, to any person - obtaining a copy of this software and associated documentation - files (the "Software"), to deal in the Software without - restriction, including without limitation the rights to use, copy, - modify, merge, publish, distribute, sublicense, and/or sell copies - of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR - ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF - CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - Except as contained in this notice, the names of the Centre for - Digital Music; Queen Mary, University of London; and Chris Cannam - shall not be used in advertising or otherwise to promote the sale, - use or other dealings in this Software without prior written - authorization. -*/ - -#include "PluginInputDomainAdapter.h" - -#include <cmath> - -/** - * If you want to compile using FFTW instead of the built-in FFT - * implementation for the PluginInputDomainAdapter, define HAVE_FFTW3 - * in the Makefile. - * - * Be aware that FFTW is licensed under the GPL -- unlike this SDK, - * which is provided under a more liberal BSD license in order to - * permit use in closed source applications. The use of FFTW would - * mean that your code would need to be licensed under the GPL as - * well. Do not define this symbol unless you understand and accept - * the implications of this. - * - * Parties such as Linux distribution packagers who redistribute this - * SDK for use in other programs should _not_ define this symbol, as - * it would change the effective licensing terms under which the SDK - * was available to third party developers. - * - * The default is not to use FFTW, and to use the built-in FFT instead. - * - * Note: The FFTW code uses FFTW_MEASURE, and so will perform badly on - * its first invocation unless the host has saved and restored FFTW - * wisdom (see the FFTW documentation). - */ -#ifdef HAVE_FFTW3 -#include <fftw3.h> -#endif - -namespace Vamp { - -namespace HostExt { - -class PluginInputDomainAdapter::Impl -{ -public: - Impl(Plugin *plugin, float inputSampleRate); - ~Impl(); - - bool initialise(size_t channels, size_t stepSize, size_t blockSize); - - size_t getPreferredStepSize() const; - size_t getPreferredBlockSize() const; - - FeatureSet process(const float *const *inputBuffers, RealTime timestamp); - -protected: - Plugin *m_plugin; - float m_inputSampleRate; - int m_channels; - int m_blockSize; - float **m_freqbuf; - - double *m_ri; - double *m_window; - -#ifdef HAVE_FFTW3 - fftw_plan m_plan; - fftw_complex *m_cbuf; -#else - double *m_ro; - double *m_io; - void fft(unsigned int n, bool inverse, - double *ri, double *ii, double *ro, double *io); -#endif - - size_t makeBlockSizeAcceptable(size_t) const; -}; - -PluginInputDomainAdapter::PluginInputDomainAdapter(Plugin *plugin) : - PluginWrapper(plugin) -{ - m_impl = new Impl(plugin, m_inputSampleRate); -} - -PluginInputDomainAdapter::~PluginInputDomainAdapter() -{ - delete m_impl; -} - -bool -PluginInputDomainAdapter::initialise(size_t channels, size_t stepSize, size_t blockSize) -{ - return m_impl->initialise(channels, stepSize, blockSize); -} - -Plugin::InputDomain -PluginInputDomainAdapter::getInputDomain() const -{ - return TimeDomain; -} - -size_t -PluginInputDomainAdapter::getPreferredStepSize() const -{ - return m_impl->getPreferredStepSize(); -} - -size_t -PluginInputDomainAdapter::getPreferredBlockSize() const -{ - return m_impl->getPreferredBlockSize(); -} - -Plugin::FeatureSet -PluginInputDomainAdapter::process(const float *const *inputBuffers, RealTime timestamp) -{ - return m_impl->process(inputBuffers, timestamp); -} - -PluginInputDomainAdapter::Impl::Impl(Plugin *plugin, float inputSampleRate) : - m_plugin(plugin), - m_inputSampleRate(inputSampleRate), - m_channels(0), - m_blockSize(0), - m_freqbuf(0), - m_ri(0), - m_window(0), -#ifdef HAVE_FFTW3 - m_plan(0), - m_cbuf(0) -#else - m_ro(0), - m_io(0) -#endif -{ -} - -PluginInputDomainAdapter::Impl::~Impl() -{ - // the adapter will delete the plugin - - if (m_channels > 0) { - for (int c = 0; c < m_channels; ++c) { - delete[] m_freqbuf[c]; - } - delete[] m_freqbuf; -#ifdef HAVE_FFTW3 - if (m_plan) { - fftw_destroy_plan(m_plan); - fftw_free(m_ri); - fftw_free(m_cbuf); - m_plan = 0; - } -#else - delete[] m_ri; - delete[] m_ro; - delete[] m_io; -#endif - delete[] m_window; - } -} - -// for some visual studii apparently -#ifndef M_PI -#define M_PI 3.14159265358979232846 -#endif - -bool -PluginInputDomainAdapter::Impl::initialise(size_t channels, size_t stepSize, size_t blockSize) -{ - if (m_plugin->getInputDomain() == TimeDomain) { - - m_blockSize = int(blockSize); - m_channels = int(channels); - - return m_plugin->initialise(channels, stepSize, blockSize); - } - - if (blockSize < 2) { - std::cerr << "ERROR: Vamp::HostExt::PluginInputDomainAdapter::Impl::initialise: blocksize < 2 not supported" << std::endl; - return false; - } - - if (blockSize & (blockSize-1)) { - std::cerr << "ERROR: Vamp::HostExt::PluginInputDomainAdapter::Impl::initialise: non-power-of-two\nblocksize " << blockSize << " not supported" << std::endl; - return false; - } - - if (m_channels > 0) { - for (int c = 0; c < m_channels; ++c) { - delete[] m_freqbuf[c]; - } - delete[] m_freqbuf; -#ifdef HAVE_FFTW3 - if (m_plan) { - fftw_destroy_plan(m_plan); - fftw_free(m_ri); - fftw_free(m_cbuf); - m_plan = 0; - } -#else - delete[] m_ri; - delete[] m_ro; - delete[] m_io; -#endif - delete[] m_window; - } - - m_blockSize = int(blockSize); - m_channels = int(channels); - - m_freqbuf = new float *[m_channels]; - for (int c = 0; c < m_channels; ++c) { - m_freqbuf[c] = new float[m_blockSize + 2]; - } - m_window = new double[m_blockSize]; - - for (int i = 0; i < m_blockSize; ++i) { - // Hanning window - m_window[i] = (0.50 - 0.50 * cos((2.0 * M_PI * i) / m_blockSize)); - } - -#ifdef HAVE_FFTW3 - m_ri = (double *)fftw_malloc(blockSize * sizeof(double)); - m_cbuf = (fftw_complex *)fftw_malloc((blockSize/2 + 1) * sizeof(fftw_complex)); - m_plan = fftw_plan_dft_r2c_1d(blockSize, m_ri, m_cbuf, FFTW_MEASURE); -#else - m_ri = new double[m_blockSize]; - m_ro = new double[m_blockSize]; - m_io = new double[m_blockSize]; -#endif - - return m_plugin->initialise(channels, stepSize, blockSize); -} - -size_t -PluginInputDomainAdapter::Impl::getPreferredStepSize() const -{ - size_t step = m_plugin->getPreferredStepSize(); - - if (step == 0 && (m_plugin->getInputDomain() == FrequencyDomain)) { - step = getPreferredBlockSize() / 2; - } - - return step; -} - -size_t -PluginInputDomainAdapter::Impl::getPreferredBlockSize() const -{ - size_t block = m_plugin->getPreferredBlockSize(); - - if (m_plugin->getInputDomain() == FrequencyDomain) { - if (block == 0) { - block = 1024; - } else { - block = makeBlockSizeAcceptable(block); - } - } - - return block; -} - -size_t -PluginInputDomainAdapter::Impl::makeBlockSizeAcceptable(size_t blockSize) const -{ - if (blockSize < 2) { - - std::cerr << "WARNING: Vamp::HostExt::PluginInputDomainAdapter::Impl::initialise: blocksize < 2 not" << std::endl - << "supported, increasing from " << blockSize << " to 2" << std::endl; - blockSize = 2; - - } else if (blockSize & (blockSize-1)) { - -#ifdef HAVE_FFTW3 - // not an issue with FFTW -#else - - // not a power of two, can't handle that with our built-in FFT - // implementation - - size_t nearest = blockSize; - size_t power = 0; - while (nearest > 1) { - nearest >>= 1; - ++power; - } - nearest = 1; - while (power) { - nearest <<= 1; - --power; - } - - if (blockSize - nearest > (nearest*2) - blockSize) { - nearest = nearest*2; - } - - std::cerr << "WARNING: Vamp::HostExt::PluginInputDomainAdapter::Impl::initialise: non-power-of-two\nblocksize " << blockSize << " not supported, using blocksize " << nearest << " instead" << std::endl; - blockSize = nearest; - -#endif - } - - return blockSize; -} - -Plugin::FeatureSet -PluginInputDomainAdapter::Impl::process(const float *const *inputBuffers, - RealTime timestamp) -{ - if (m_plugin->getInputDomain() == TimeDomain) { - return m_plugin->process(inputBuffers, timestamp); - } - - // The timestamp supplied should be (according to the Vamp::Plugin - // spec) the time of the start of the time-domain input block. - // However, we want to pass to the plugin an FFT output calculated - // from the block of samples _centred_ on that timestamp. - // - // We have two options: - // - // 1. Buffer the input, calculating the fft of the values at the - // passed-in block minus blockSize/2 rather than starting at the - // passed-in block. So each time we call process on the plugin, - // we are passing in the same timestamp as was passed to our own - // process plugin, but not (the frequency domain representation - // of) the same set of samples. Advantages: avoids confusion in - // the host by ensuring the returned values have timestamps - // comparable with that passed in to this function (in fact this - // is pretty much essential for one-value-per-block outputs); - // consistent with hosts such as SV that deal with the - // frequency-domain transform themselves. Disadvantages: means - // making the not necessarily correct assumption that the samples - // preceding the first official block are all zero (or some other - // known value). - // - // 2. Increase the passed-in timestamps by half the blocksize. So - // when we call process, we are passing in the frequency domain - // representation of the same set of samples as passed to us, but - // with a different timestamp. Advantages: simplicity; avoids - // iffy assumption mentioned above. Disadvantages: inconsistency - // with SV in cases where stepSize != blockSize/2; potential - // confusion arising from returned timestamps being calculated - // from the adjusted input timestamps rather than the original - // ones (and inaccuracy where the returned timestamp is implied, - // as in one-value-per-block). - // - // Neither way is ideal, but I don't think either is strictly - // incorrect either. I think this is just a case where the same - // plugin can legitimately produce differing results from the same - // input data, depending on how that data is packaged. - // - // We'll go for option 2, adjusting the timestamps. Note in - // particular that this means some results can differ from those - // produced by SV. - -// std::cerr << "PluginInputDomainAdapter: sampleRate " << m_inputSampleRate << ", blocksize " << m_blockSize << ", adjusting time from " << timestamp; - - timestamp = timestamp + RealTime::frame2RealTime - (m_blockSize/2, int(m_inputSampleRate + 0.5)); - -// std::cerr << " to " << timestamp << std::endl; - - for (int c = 0; c < m_channels; ++c) { - - for (int i = 0; i < m_blockSize; ++i) { - m_ri[i] = double(inputBuffers[c][i]) * m_window[i]; - } - - for (int i = 0; i < m_blockSize/2; ++i) { - // FFT shift - double value = m_ri[i]; - m_ri[i] = m_ri[i + m_blockSize/2]; - m_ri[i + m_blockSize/2] = value; - } - -#ifdef HAVE_FFTW3 - - fftw_execute(m_plan); - - for (int i = 0; i <= m_blockSize/2; ++i) { - m_freqbuf[c][i * 2] = float(m_cbuf[i][0]); - m_freqbuf[c][i * 2 + 1] = float(m_cbuf[i][1]); - } - -#else - - fft(m_blockSize, false, m_ri, 0, m_ro, m_io); - - for (int i = 0; i <= m_blockSize/2; ++i) { - m_freqbuf[c][i * 2] = float(m_ro[i]); - m_freqbuf[c][i * 2 + 1] = float(m_io[i]); - } - -#endif - } - - return m_plugin->process(m_freqbuf, timestamp); -} - -#ifndef HAVE_FFTW3 - -void -PluginInputDomainAdapter::Impl::fft(unsigned int n, bool inverse, - double *ri, double *ii, double *ro, double *io) -{ - if (!ri || !ro || !io) return; - - unsigned int bits; - unsigned int i, j, k, m; - unsigned int blockSize, blockEnd; - - double tr, ti; - - if (n < 2) return; - if (n & (n-1)) return; - - double angle = 2.0 * M_PI; - if (inverse) angle = -angle; - - for (i = 0; ; ++i) { - if (n & (1 << i)) { - bits = i; - break; - } - } - - static unsigned int tableSize = 0; - static int *table = 0; - - if (tableSize != n) { - - delete[] table; - - table = new int[n]; - - for (i = 0; i < n; ++i) { - - m = i; - - for (j = k = 0; j < bits; ++j) { - k = (k << 1) | (m & 1); - m >>= 1; - } - - table[i] = k; - } - - tableSize = n; - } - - if (ii) { - for (i = 0; i < n; ++i) { - ro[table[i]] = ri[i]; - io[table[i]] = ii[i]; - } - } else { - for (i = 0; i < n; ++i) { - ro[table[i]] = ri[i]; - io[table[i]] = 0.0; - } - } - - blockEnd = 1; - - for (blockSize = 2; blockSize <= n; blockSize <<= 1) { - - double delta = angle / (double)blockSize; - double sm2 = -sin(-2 * delta); - double sm1 = -sin(-delta); - double cm2 = cos(-2 * delta); - double cm1 = cos(-delta); - double w = 2 * cm1; - double ar[3], ai[3]; - - for (i = 0; i < n; i += blockSize) { - - ar[2] = cm2; - ar[1] = cm1; - - ai[2] = sm2; - ai[1] = sm1; - - for (j = i, m = 0; m < blockEnd; j++, m++) { - - ar[0] = w * ar[1] - ar[2]; - ar[2] = ar[1]; - ar[1] = ar[0]; - - ai[0] = w * ai[1] - ai[2]; - ai[2] = ai[1]; - ai[1] = ai[0]; - - k = j + blockEnd; - tr = ar[0] * ro[k] - ai[0] * io[k]; - ti = ar[0] * io[k] + ai[0] * ro[k]; - - ro[k] = ro[j] - tr; - io[k] = io[j] - ti; - - ro[j] += tr; - io[j] += ti; - } - } - - blockEnd = blockSize; - } - - if (inverse) { - - double denom = (double)n; - - for (i = 0; i < n; i++) { - ro[i] /= denom; - io[i] /= denom; - } - } -} - -#endif - -} - -} - diff --git a/libs/vamp-sdk/vamp-sdk/hostext/PluginInputDomainAdapter.h b/libs/vamp-sdk/vamp-sdk/hostext/PluginInputDomainAdapter.h deleted file mode 100644 index 73da053149..0000000000 --- a/libs/vamp-sdk/vamp-sdk/hostext/PluginInputDomainAdapter.h +++ /dev/null @@ -1,103 +0,0 @@ -/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ - -/* - Vamp - - An API for audio analysis and feature extraction plugins. - - Centre for Digital Music, Queen Mary, University of London. - Copyright 2006-2007 Chris Cannam and QMUL. - - Permission is hereby granted, free of charge, to any person - obtaining a copy of this software and associated documentation - files (the "Software"), to deal in the Software without - restriction, including without limitation the rights to use, copy, - modify, merge, publish, distribute, sublicense, and/or sell copies - of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR - ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF - CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - Except as contained in this notice, the names of the Centre for - Digital Music; Queen Mary, University of London; and Chris Cannam - shall not be used in advertising or otherwise to promote the sale, - use or other dealings in this Software without prior written - authorization. -*/ - -#ifndef _VAMP_PLUGIN_INPUT_DOMAIN_ADAPTER_H_ -#define _VAMP_PLUGIN_INPUT_DOMAIN_ADAPTER_H_ - -#include "PluginWrapper.h" - -namespace Vamp { - -namespace HostExt { - -/** - * \class PluginInputDomainAdapter PluginInputDomainAdapter.h <vamp-sdk/hostext/PluginInputDomainAdapter.h> - * - * PluginInputDomainAdapter is a Vamp plugin adapter that converts - * time-domain input into frequency-domain input for plugins that need - * it. This permits a host to use time- and frequency-domain plugins - * interchangeably without needing to handle the conversion itself. - * - * This adapter uses a basic Hanning windowed FFT that supports - * power-of-two block sizes only. If a frequency domain plugin - * requests a non-power-of-two blocksize, the adapter will adjust it - * to a nearby power of two instead. Thus, getPreferredBlockSize() - * will always return a power of two if the wrapped plugin is a - * frequency domain one. If the plugin doesn't accept the adjusted - * power of two block size, initialise() will fail. - * - * The adapter provides no way for the host to discover whether the - * underlying plugin is actually a time or frequency domain plugin - * (except that if the preferred block size is not a power of two, it - * must be a time domain plugin). - * - * The FFT implementation is simple and self-contained, but unlikely - * to be the fastest available: a host can usually do better if it - * cares enough. - * - * In every respect other than its input domain handling, the - * PluginInputDomainAdapter behaves identically to the plugin that it - * wraps. The wrapped plugin will be deleted when the wrapper is - * deleted. - * - * \note This class was introduced in version 1.1 of the Vamp plugin SDK. - */ - -class PluginInputDomainAdapter : public PluginWrapper -{ -public: - PluginInputDomainAdapter(Plugin *plugin); // I take ownership of plugin - virtual ~PluginInputDomainAdapter(); - - bool initialise(size_t channels, size_t stepSize, size_t blockSize); - - InputDomain getInputDomain() const; - - size_t getPreferredStepSize() const; - size_t getPreferredBlockSize() const; - - FeatureSet process(const float *const *inputBuffers, RealTime timestamp); - -protected: - class Impl; - Impl *m_impl; -}; - -} - -} - -#endif diff --git a/libs/vamp-sdk/vamp-sdk/hostext/PluginLoader.cpp b/libs/vamp-sdk/vamp-sdk/hostext/PluginLoader.cpp deleted file mode 100644 index 9d627a75cf..0000000000 --- a/libs/vamp-sdk/vamp-sdk/hostext/PluginLoader.cpp +++ /dev/null @@ -1,637 +0,0 @@ -/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ - -/* - Vamp - - An API for audio analysis and feature extraction plugins. - - Centre for Digital Music, Queen Mary, University of London. - Copyright 2006-2007 Chris Cannam and QMUL. - - Permission is hereby granted, free of charge, to any person - obtaining a copy of this software and associated documentation - files (the "Software"), to deal in the Software without - restriction, including without limitation the rights to use, copy, - modify, merge, publish, distribute, sublicense, and/or sell copies - of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR - ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF - CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - Except as contained in this notice, the names of the Centre for - Digital Music; Queen Mary, University of London; and Chris Cannam - shall not be used in advertising or otherwise to promote the sale, - use or other dealings in this Software without prior written - authorization. -*/ - -#include "vamp-sdk/PluginHostAdapter.h" -#include "PluginLoader.h" -#include "PluginInputDomainAdapter.h" -#include "PluginChannelAdapter.h" -#include "PluginBufferingAdapter.h" - -#include <fstream> -#include <cctype> // tolower -#include <cstring> - -#ifdef _WIN32 - -#include <windows.h> -#include <tchar.h> -#define PLUGIN_SUFFIX "dll" - -#else /* ! _WIN32 */ - -#include <dirent.h> -#include <dlfcn.h> - -#ifdef __APPLE__ -#define PLUGIN_SUFFIX "dylib" -#else /* ! __APPLE__ */ -#define PLUGIN_SUFFIX "so" -#endif /* ! __APPLE__ */ - -#endif /* ! _WIN32 */ - -using namespace std; - -namespace Vamp { - -namespace HostExt { - -class PluginLoader::Impl -{ -public: - Impl(); - virtual ~Impl(); - - PluginKeyList listPlugins(); - - Plugin *loadPlugin(PluginKey key, - float inputSampleRate, - int adapterFlags); - - PluginKey composePluginKey(string libraryName, string identifier); - - PluginCategoryHierarchy getPluginCategory(PluginKey key); - - string getLibraryPathForPlugin(PluginKey key); - - static void setInstanceToClean(PluginLoader *instance); - -protected: - class PluginDeletionNotifyAdapter : public PluginWrapper { - public: - PluginDeletionNotifyAdapter(Plugin *plugin, Impl *loader); - virtual ~PluginDeletionNotifyAdapter(); - protected: - Impl *m_loader; - }; - - class InstanceCleaner { - public: - InstanceCleaner() : m_instance(0) { } - ~InstanceCleaner() { delete m_instance; } - void setInstance(PluginLoader *instance) { m_instance = instance; } - protected: - PluginLoader *m_instance; - }; - - virtual void pluginDeleted(PluginDeletionNotifyAdapter *adapter); - - map<PluginKey, string> m_pluginLibraryNameMap; - bool m_allPluginsEnumerated; - void enumeratePlugins(PluginKey forPlugin = ""); - - map<PluginKey, PluginCategoryHierarchy> m_taxonomy; - void generateTaxonomy(); - - map<Plugin *, void *> m_pluginLibraryHandleMap; - - bool decomposePluginKey(PluginKey key, - string &libraryName, string &identifier); - - void *loadLibrary(string path); - void unloadLibrary(void *handle); - void *lookupInLibrary(void *handle, const char *symbol); - - string splicePath(string a, string b); - vector<string> listFiles(string dir, string ext); - - static InstanceCleaner m_cleaner; -}; - -PluginLoader * -PluginLoader::m_instance = 0; - -PluginLoader::Impl::InstanceCleaner -PluginLoader::Impl::m_cleaner; - -PluginLoader::PluginLoader() -{ - m_impl = new Impl(); -} - -PluginLoader::~PluginLoader() -{ - delete m_impl; -} - -PluginLoader * -PluginLoader::getInstance() -{ - if (!m_instance) { - // The cleaner doesn't own the instance, because we leave the - // instance pointer in the base class for binary backwards - // compatibility reasons and to avoid waste - m_instance = new PluginLoader(); - Impl::setInstanceToClean(m_instance); - } - return m_instance; -} - -vector<PluginLoader::PluginKey> -PluginLoader::listPlugins() -{ - return m_impl->listPlugins(); -} - -Plugin * -PluginLoader::loadPlugin(PluginKey key, - float inputSampleRate, - int adapterFlags) -{ - return m_impl->loadPlugin(key, inputSampleRate, adapterFlags); -} - -PluginLoader::PluginKey -PluginLoader::composePluginKey(string libraryName, string identifier) -{ - return m_impl->composePluginKey(libraryName, identifier); -} - -PluginLoader::PluginCategoryHierarchy -PluginLoader::getPluginCategory(PluginKey key) -{ - return m_impl->getPluginCategory(key); -} - -string -PluginLoader::getLibraryPathForPlugin(PluginKey key) -{ - return m_impl->getLibraryPathForPlugin(key); -} - -PluginLoader::Impl::Impl() : - m_allPluginsEnumerated(false) -{ -} - -PluginLoader::Impl::~Impl() -{ -} - -void -PluginLoader::Impl::setInstanceToClean(PluginLoader *instance) -{ - m_cleaner.setInstance(instance); -} - -vector<PluginLoader::PluginKey> -PluginLoader::Impl::listPlugins() -{ - if (!m_allPluginsEnumerated) enumeratePlugins(); - - vector<PluginKey> plugins; - for (map<PluginKey, string>::iterator mi = m_pluginLibraryNameMap.begin(); - mi != m_pluginLibraryNameMap.end(); ++mi) { - plugins.push_back(mi->first); - } - - return plugins; -} - -void -PluginLoader::Impl::enumeratePlugins(PluginKey forPlugin) -{ - vector<string> path = PluginHostAdapter::getPluginPath(); - - string libraryName, identifier; - if (forPlugin != "") { - if (!decomposePluginKey(forPlugin, libraryName, identifier)) { - std::cerr << "WARNING: Vamp::HostExt::PluginLoader: Invalid plugin key \"" - << forPlugin << "\" in enumerate" << std::endl; - return; - } - } - - for (size_t i = 0; i < path.size(); ++i) { - - vector<string> files = listFiles(path[i], PLUGIN_SUFFIX); - - for (vector<string>::iterator fi = files.begin(); - fi != files.end(); ++fi) { - - if (libraryName != "") { - // libraryName is lowercased and lacking an extension, - // as it came from the plugin key - string temp = *fi; - for (size_t i = 0; i < temp.length(); ++i) { - temp[i] = tolower(temp[i]); - } - string::size_type pi = temp.find('.'); - if (pi == string::npos) { - if (libraryName != temp) continue; - } else { - if (libraryName != temp.substr(0, pi)) continue; - } - } - - string fullPath = path[i]; - fullPath = splicePath(fullPath, *fi); - void *handle = loadLibrary(fullPath); - if (!handle) continue; - - VampGetPluginDescriptorFunction fn = - (VampGetPluginDescriptorFunction)lookupInLibrary - (handle, "vampGetPluginDescriptor"); - - if (!fn) { - unloadLibrary(handle); - continue; - } - - int index = 0; - const VampPluginDescriptor *descriptor = 0; - - while ((descriptor = fn(VAMP_API_VERSION, index))) { - ++index; - if (identifier != "") { - if (descriptor->identifier != identifier) continue; - } - PluginKey key = composePluginKey(*fi, descriptor->identifier); -// std::cerr << "enumerate: " << key << " (path: " << fullPath << ")" << std::endl; - if (m_pluginLibraryNameMap.find(key) == - m_pluginLibraryNameMap.end()) { - m_pluginLibraryNameMap[key] = fullPath; - } - } - - unloadLibrary(handle); - } - } - - if (forPlugin == "") m_allPluginsEnumerated = true; -} - -PluginLoader::PluginKey -PluginLoader::Impl::composePluginKey(string libraryName, string identifier) -{ - string basename = libraryName; - - string::size_type li = basename.rfind('/'); - if (li != string::npos) basename = basename.substr(li + 1); - - li = basename.find('.'); - if (li != string::npos) basename = basename.substr(0, li); - - for (size_t i = 0; i < basename.length(); ++i) { - basename[i] = tolower(basename[i]); - } - - return basename + ":" + identifier; -} - -bool -PluginLoader::Impl::decomposePluginKey(PluginKey key, - string &libraryName, - string &identifier) -{ - string::size_type ki = key.find(':'); - if (ki == string::npos) { - return false; - } - - libraryName = key.substr(0, ki); - identifier = key.substr(ki + 1); - return true; -} - -PluginLoader::PluginCategoryHierarchy -PluginLoader::Impl::getPluginCategory(PluginKey plugin) -{ - if (m_taxonomy.empty()) generateTaxonomy(); - if (m_taxonomy.find(plugin) == m_taxonomy.end()) { - return PluginCategoryHierarchy(); - } - return m_taxonomy[plugin]; -} - -string -PluginLoader::Impl::getLibraryPathForPlugin(PluginKey plugin) -{ - if (m_pluginLibraryNameMap.find(plugin) == m_pluginLibraryNameMap.end()) { - if (m_allPluginsEnumerated) return ""; - enumeratePlugins(plugin); - } - if (m_pluginLibraryNameMap.find(plugin) == m_pluginLibraryNameMap.end()) { - return ""; - } - return m_pluginLibraryNameMap[plugin]; -} - -Plugin * -PluginLoader::Impl::loadPlugin(PluginKey key, - float inputSampleRate, int adapterFlags) -{ - string libname, identifier; - if (!decomposePluginKey(key, libname, identifier)) { - std::cerr << "Vamp::HostExt::PluginLoader: Invalid plugin key \"" - << key << "\" in loadPlugin" << std::endl; - return 0; - } - - string fullPath = getLibraryPathForPlugin(key); - if (fullPath == "") return 0; - - void *handle = loadLibrary(fullPath); - if (!handle) return 0; - - VampGetPluginDescriptorFunction fn = - (VampGetPluginDescriptorFunction)lookupInLibrary - (handle, "vampGetPluginDescriptor"); - - if (!fn) { - unloadLibrary(handle); - return 0; - } - - int index = 0; - const VampPluginDescriptor *descriptor = 0; - - while ((descriptor = fn(VAMP_API_VERSION, index))) { - - if (string(descriptor->identifier) == identifier) { - - Vamp::PluginHostAdapter *plugin = - new Vamp::PluginHostAdapter(descriptor, inputSampleRate); - - Plugin *adapter = new PluginDeletionNotifyAdapter(plugin, this); - - m_pluginLibraryHandleMap[adapter] = handle; - - if (adapterFlags & ADAPT_INPUT_DOMAIN) { - if (adapter->getInputDomain() == Plugin::FrequencyDomain) { - adapter = new PluginInputDomainAdapter(adapter); - } - } - - if (adapterFlags & ADAPT_BUFFER_SIZE) { - adapter = new PluginBufferingAdapter(adapter); - } - - if (adapterFlags & ADAPT_CHANNEL_COUNT) { - adapter = new PluginChannelAdapter(adapter); - } - - return adapter; - } - - ++index; - } - - cerr << "Vamp::HostExt::PluginLoader: Plugin \"" - << identifier << "\" not found in library \"" - << fullPath << "\"" << endl; - - return 0; -} - -void -PluginLoader::Impl::generateTaxonomy() -{ -// cerr << "PluginLoader::Impl::generateTaxonomy" << endl; - - vector<string> path = PluginHostAdapter::getPluginPath(); - string libfragment = "/lib/"; - vector<string> catpath; - - string suffix = "cat"; - - for (vector<string>::iterator i = path.begin(); - i != path.end(); ++i) { - - // It doesn't matter that we're using literal forward-slash in - // this bit, as it's only relevant if the path contains - // "/lib/", which is only meaningful and only plausible on - // systems with forward-slash delimiters - - string dir = *i; - string::size_type li = dir.find(libfragment); - - if (li != string::npos) { - catpath.push_back - (dir.substr(0, li) - + "/share/" - + dir.substr(li + libfragment.length())); - } - - catpath.push_back(dir); - } - - char buffer[1024]; - - for (vector<string>::iterator i = catpath.begin(); - i != catpath.end(); ++i) { - - vector<string> files = listFiles(*i, suffix); - - for (vector<string>::iterator fi = files.begin(); - fi != files.end(); ++fi) { - - string filepath = splicePath(*i, *fi); - ifstream is(filepath.c_str(), ifstream::in | ifstream::binary); - - if (is.fail()) { -// cerr << "failed to open: " << filepath << endl; - continue; - } - -// cerr << "opened: " << filepath << endl; - - while (!!is.getline(buffer, 1024)) { - - string line(buffer); - -// cerr << "line = " << line << endl; - - string::size_type di = line.find("::"); - if (di == string::npos) continue; - - string id = line.substr(0, di); - string encodedCat = line.substr(di + 2); - - if (id.substr(0, 5) != "vamp:") continue; - id = id.substr(5); - - while (encodedCat.length() >= 1 && - encodedCat[encodedCat.length()-1] == '\r') { - encodedCat = encodedCat.substr(0, encodedCat.length()-1); - } - -// cerr << "id = " << id << ", cat = " << encodedCat << endl; - - PluginCategoryHierarchy category; - string::size_type ai; - while ((ai = encodedCat.find(" > ")) != string::npos) { - category.push_back(encodedCat.substr(0, ai)); - encodedCat = encodedCat.substr(ai + 3); - } - if (encodedCat != "") category.push_back(encodedCat); - - m_taxonomy[id] = category; - } - } - } -} - -void * -PluginLoader::Impl::loadLibrary(string path) -{ - void *handle = 0; -#ifdef _WIN32 - handle = LoadLibrary(path.c_str()); - if (!handle) { - cerr << "Vamp::HostExt::PluginLoader: Unable to load library \"" - << path << "\"" << endl; - } -#else - handle = dlopen(path.c_str(), RTLD_LAZY); - if (!handle) { - cerr << "Vamp::HostExt::PluginLoader: Unable to load library \"" - << path << "\": " << dlerror() << endl; - } -#endif - return handle; -} - -void -PluginLoader::Impl::unloadLibrary(void *handle) -{ -#ifdef _WIN32 - FreeLibrary((HINSTANCE)handle); -#else - dlclose(handle); -#endif -} - -void * -PluginLoader::Impl::lookupInLibrary(void *handle, const char *symbol) -{ -#ifdef _WIN32 - return (void *)GetProcAddress((HINSTANCE)handle, symbol); -#else - return (void *)dlsym(handle, symbol); -#endif -} - -string -PluginLoader::Impl::splicePath(string a, string b) -{ -#ifdef _WIN32 - return a + "\\" + b; -#else - return a + "/" + b; -#endif -} - -vector<string> -PluginLoader::Impl::listFiles(string dir, string extension) -{ - vector<string> files; - -#ifdef _WIN32 - - string expression = dir + "\\*." + extension; - WIN32_FIND_DATA data; - HANDLE fh = FindFirstFile(expression.c_str(), &data); - if (fh == INVALID_HANDLE_VALUE) return files; - - bool ok = true; - while (ok) { - files.push_back(data.cFileName); - ok = FindNextFile(fh, &data); - } - - FindClose(fh); - -#else - - size_t extlen = extension.length(); - DIR *d = opendir(dir.c_str()); - if (!d) return files; - - struct dirent *e = 0; - while ((e = readdir(d))) { - - if (!(e->d_type & DT_REG) && (e->d_type != DT_UNKNOWN)) continue; - - if (!e->d_name) continue; - - size_t len = strlen(e->d_name); - if (len < extlen + 2 || - e->d_name + len - extlen - 1 != "." + extension) { - continue; - } - - files.push_back(e->d_name); - } - - closedir(d); -#endif - - return files; -} - -void -PluginLoader::Impl::pluginDeleted(PluginDeletionNotifyAdapter *adapter) -{ - void *handle = m_pluginLibraryHandleMap[adapter]; - if (handle) unloadLibrary(handle); - m_pluginLibraryHandleMap.erase(adapter); -} - -PluginLoader::Impl::PluginDeletionNotifyAdapter::PluginDeletionNotifyAdapter(Plugin *plugin, - Impl *loader) : - PluginWrapper(plugin), - m_loader(loader) -{ -} - -PluginLoader::Impl::PluginDeletionNotifyAdapter::~PluginDeletionNotifyAdapter() -{ - // We need to delete the plugin before calling pluginDeleted, as - // the delete call may require calling through to the descriptor - // (for e.g. cleanup) but pluginDeleted may unload the required - // library for the call. To prevent a double deletion when our - // parent's destructor runs (after this one), be sure to set - // m_plugin to 0 after deletion. - delete m_plugin; - m_plugin = 0; - - if (m_loader) m_loader->pluginDeleted(this); -} - -} - -} diff --git a/libs/vamp-sdk/vamp-sdk/hostext/PluginLoader.h b/libs/vamp-sdk/vamp-sdk/hostext/PluginLoader.h deleted file mode 100644 index f48143c11e..0000000000 --- a/libs/vamp-sdk/vamp-sdk/hostext/PluginLoader.h +++ /dev/null @@ -1,238 +0,0 @@ -/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ - -/* - Vamp - - An API for audio analysis and feature extraction plugins. - - Centre for Digital Music, Queen Mary, University of London. - Copyright 2006-2007 Chris Cannam and QMUL. - - Permission is hereby granted, free of charge, to any person - obtaining a copy of this software and associated documentation - files (the "Software"), to deal in the Software without - restriction, including without limitation the rights to use, copy, - modify, merge, publish, distribute, sublicense, and/or sell copies - of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR - ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF - CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - Except as contained in this notice, the names of the Centre for - Digital Music; Queen Mary, University of London; and Chris Cannam - shall not be used in advertising or otherwise to promote the sale, - use or other dealings in this Software without prior written - authorization. -*/ - -#ifndef _VAMP_PLUGIN_LOADER_H_ -#define _VAMP_PLUGIN_LOADER_H_ - -#include <vector> -#include <string> -#include <map> - -#include "PluginWrapper.h" - -namespace Vamp { - -class Plugin; - -namespace HostExt { - -/** - * \class PluginLoader PluginLoader.h <vamp-sdk/hostext/PluginLoader.h> - * - * Vamp::HostExt::PluginLoader is a convenience class for discovering - * and loading Vamp plugins using the typical plugin-path, library - * naming, and categorisation conventions described in the Vamp SDK - * documentation. This class is intended to greatly simplify the task - * of becoming a Vamp plugin host for any C++ application. - * - * Hosts are not required by the Vamp specification to use the same - * plugin search path and naming conventions as implemented by this - * class, and are certainly not required to use this actual class. - * But we do strongly recommend it. - * - * \note This class was introduced in version 1.1 of the Vamp plugin SDK. - */ - -class PluginLoader -{ -public: - /** - * Obtain a pointer to the singleton instance of PluginLoader. - * Use this to obtain your loader object. - */ - static PluginLoader *getInstance(); - - /** - * PluginKey is a string type that is used to identify a plugin - * uniquely within the scope of "the current system". It consists - * of the lower-cased base name of the plugin library, a colon - * separator, and the identifier string for the plugin. It is - * only meaningful in the context of a given plugin path (the one - * returned by PluginHostAdapter::getPluginPath()). - * - * Use composePluginKey() to construct a plugin key from a known - * plugin library name and identifier. - * - * Note: the fact that the library component of the key is - * lower-cased implies that library names are matched - * case-insensitively by the PluginLoader class, regardless of the - * case sensitivity of the underlying filesystem. (Plugin - * identifiers _are_ case sensitive, however.) Also, it is not - * possible to portably extract a working library name from a - * plugin key, as the result may fail on case-sensitive - * filesystems. Use getLibraryPathForPlugin() instead. - */ - typedef std::string PluginKey; - - /** - * PluginKeyList is a sequence of plugin keys, such as returned by - * listPlugins(). - */ - typedef std::vector<PluginKey> PluginKeyList; - - /** - * PluginCategoryHierarchy is a sequence of general->specific - * category names, as may be associated with a single plugin. - * This sequence describes the location of a plugin within a - * category forest, containing the human-readable names of the - * plugin's category tree root, followed by each of the nodes down - * to the leaf containing the plugin. - * - * \see getPluginCategory() - */ - typedef std::vector<std::string> PluginCategoryHierarchy; - - /** - * Search for all available Vamp plugins, and return a list of - * them in the order in which they were found. - */ - PluginKeyList listPlugins(); - - /** - * AdapterFlags contains a set of values that may be OR'd together - * to indicate in which circumstances PluginLoader should use a - * plugin adapter to make a plugin easier to use for a host that - * does not want to cater for complex features. - * - * The available flags are: - * - * ADAPT_INPUT_DOMAIN - If the plugin expects frequency domain - * input, wrap it in a PluginInputDomainAdapter that automatically - * converts the plugin to one that expects time-domain input. - * This enables a host to accommodate time- and frequency-domain - * plugins without needing to do any conversion itself. - * - * ADAPT_CHANNEL_COUNT - Wrap the plugin in a PluginChannelAdapter - * to handle any mismatch between the number of channels of audio - * the plugin can handle and the number available in the host. - * This enables a host to use plugins that may require the input - * to be mixed down to mono, etc., without having to worry about - * doing that itself. - * - * ADAPT_BUFFER_SIZE - Wrap the plugin in a PluginBufferingAdapter - * permitting the host to provide audio input using any block - * size, with no overlap, regardless of the plugin's preferred - * block size (suitable for hosts that read from non-seekable - * streaming media, for example). This adapter introduces some - * run-time overhead and also changes the semantics of the plugin - * slightly (see the PluginBufferingAdapter header documentation - * for details). - * - * ADAPT_ALL_SAFE - Perform all available adaptations that are - * meaningful for the plugin and "safe". Currently this means to - * ADAPT_INPUT_DOMAIN if the plugin wants FrequencyDomain input; - * ADAPT_CHANNEL_COUNT always; and ADAPT_BUFFER_SIZE never. - * - * ADAPT_ALL - Perform all available adaptations that are - * meaningful for the plugin. - * - * See PluginInputDomainAdapter, PluginChannelAdapter and - * PluginBufferingAdapter for more details of the classes that the - * loader may use if these flags are set. - */ - enum AdapterFlags { - - ADAPT_INPUT_DOMAIN = 0x01, - ADAPT_CHANNEL_COUNT = 0x02, - ADAPT_BUFFER_SIZE = 0x04, - - ADAPT_ALL_SAFE = 0x03, - - ADAPT_ALL = 0xff - }; - - /** - * Load a Vamp plugin, given its identifying key. If the plugin - * could not be loaded, returns 0. - * - * The returned plugin should be deleted (using the standard C++ - * delete keyword) after use. - * - * \param adapterFlags a bitwise OR of the values in the AdapterFlags - * enumeration, indicating under which circumstances an adapter should be - * used to wrap the original plugin. If adapterFlags is 0, no - * optional adapters will be used. Otherwise, the returned plugin - * may be of an adapter class type which will behave identically - * to the original plugin, apart from any particular features - * implemented by the adapter itself. - * - * \see AdapterFlags, PluginInputDomainAdapter, PluginChannelAdapter - */ - Plugin *loadPlugin(PluginKey key, - float inputSampleRate, - int adapterFlags = 0); - - /** - * Given a Vamp plugin library name and plugin identifier, return - * the corresponding plugin key in a form suitable for passing in to - * loadPlugin(). - */ - PluginKey composePluginKey(std::string libraryName, - std::string identifier); - - /** - * Return the category hierarchy for a Vamp plugin, given its - * identifying key. - * - * If the plugin has no category information, return an empty - * hierarchy. - * - * \see PluginCategoryHierarchy - */ - PluginCategoryHierarchy getPluginCategory(PluginKey plugin); - - /** - * Return the file path of the dynamic library from which the - * given plugin will be loaded (if available). - */ - std::string getLibraryPathForPlugin(PluginKey plugin); - -protected: - PluginLoader(); - virtual ~PluginLoader(); - - class Impl; - Impl *m_impl; - - static PluginLoader *m_instance; -}; - -} - -} - -#endif - diff --git a/libs/vamp-sdk/vamp-sdk/hostext/PluginWrapper.cpp b/libs/vamp-sdk/vamp-sdk/hostext/PluginWrapper.cpp deleted file mode 100644 index dcbdf5b73a..0000000000 --- a/libs/vamp-sdk/vamp-sdk/hostext/PluginWrapper.cpp +++ /dev/null @@ -1,201 +0,0 @@ -/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ - -/* - Vamp - - An API for audio analysis and feature extraction plugins. - - Centre for Digital Music, Queen Mary, University of London. - Copyright 2006-2007 Chris Cannam and QMUL. - - Permission is hereby granted, free of charge, to any person - obtaining a copy of this software and associated documentation - files (the "Software"), to deal in the Software without - restriction, including without limitation the rights to use, copy, - modify, merge, publish, distribute, sublicense, and/or sell copies - of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR - ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF - CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - Except as contained in this notice, the names of the Centre for - Digital Music; Queen Mary, University of London; and Chris Cannam - shall not be used in advertising or otherwise to promote the sale, - use or other dealings in this Software without prior written - authorization. -*/ - -#include "PluginWrapper.h" - -namespace Vamp { - -namespace HostExt { - -class PluginRateExtractor : public Plugin -{ -public: - PluginRateExtractor() : Plugin(0) { } - float getRate() const { return m_inputSampleRate; } -}; - -PluginWrapper::PluginWrapper(Plugin *plugin) : - Plugin(((PluginRateExtractor *)plugin)->getRate()), - m_plugin(plugin) -{ -} - -PluginWrapper::~PluginWrapper() -{ - delete m_plugin; -} - -bool -PluginWrapper::initialise(size_t channels, size_t stepSize, size_t blockSize) -{ - return m_plugin->initialise(channels, stepSize, blockSize); -} - -void -PluginWrapper::reset() -{ - m_plugin->reset(); -} - -Plugin::InputDomain -PluginWrapper::getInputDomain() const -{ - return m_plugin->getInputDomain(); -} - -unsigned int -PluginWrapper::getVampApiVersion() const -{ - return m_plugin->getVampApiVersion(); -} - -std::string -PluginWrapper::getIdentifier() const -{ - return m_plugin->getIdentifier(); -} - -std::string -PluginWrapper::getName() const -{ - return m_plugin->getName(); -} - -std::string -PluginWrapper::getDescription() const -{ - return m_plugin->getDescription(); -} - -std::string -PluginWrapper::getMaker() const -{ - return m_plugin->getMaker(); -} - -int -PluginWrapper::getPluginVersion() const -{ - return m_plugin->getPluginVersion(); -} - -std::string -PluginWrapper::getCopyright() const -{ - return m_plugin->getCopyright(); -} - -PluginBase::ParameterList -PluginWrapper::getParameterDescriptors() const -{ - return m_plugin->getParameterDescriptors(); -} - -float -PluginWrapper::getParameter(std::string parameter) const -{ - return m_plugin->getParameter(parameter); -} - -void -PluginWrapper::setParameter(std::string parameter, float value) -{ - m_plugin->setParameter(parameter, value); -} - -PluginBase::ProgramList -PluginWrapper::getPrograms() const -{ - return m_plugin->getPrograms(); -} - -std::string -PluginWrapper::getCurrentProgram() const -{ - return m_plugin->getCurrentProgram(); -} - -void -PluginWrapper::selectProgram(std::string program) -{ - m_plugin->selectProgram(program); -} - -size_t -PluginWrapper::getPreferredStepSize() const -{ - return m_plugin->getPreferredStepSize(); -} - -size_t -PluginWrapper::getPreferredBlockSize() const -{ - return m_plugin->getPreferredBlockSize(); -} - -size_t -PluginWrapper::getMinChannelCount() const -{ - return m_plugin->getMinChannelCount(); -} - -size_t PluginWrapper::getMaxChannelCount() const -{ - return m_plugin->getMaxChannelCount(); -} - -Plugin::OutputList -PluginWrapper::getOutputDescriptors() const -{ - return m_plugin->getOutputDescriptors(); -} - -Plugin::FeatureSet -PluginWrapper::process(const float *const *inputBuffers, RealTime timestamp) -{ - return m_plugin->process(inputBuffers, timestamp); -} - -Plugin::FeatureSet -PluginWrapper::getRemainingFeatures() -{ - return m_plugin->getRemainingFeatures(); -} - -} - -} - diff --git a/libs/vamp-sdk/vamp-sdk/hostext/PluginWrapper.h b/libs/vamp-sdk/vamp-sdk/hostext/PluginWrapper.h deleted file mode 100644 index d5ec1da0e8..0000000000 --- a/libs/vamp-sdk/vamp-sdk/hostext/PluginWrapper.h +++ /dev/null @@ -1,106 +0,0 @@ -/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ - -/* - Vamp - - An API for audio analysis and feature extraction plugins. - - Centre for Digital Music, Queen Mary, University of London. - Copyright 2006-2007 Chris Cannam and QMUL. - - Permission is hereby granted, free of charge, to any person - obtaining a copy of this software and associated documentation - files (the "Software"), to deal in the Software without - restriction, including without limitation the rights to use, copy, - modify, merge, publish, distribute, sublicense, and/or sell copies - of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR - ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF - CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - Except as contained in this notice, the names of the Centre for - Digital Music; Queen Mary, University of London; and Chris Cannam - shall not be used in advertising or otherwise to promote the sale, - use or other dealings in this Software without prior written - authorization. -*/ - -#ifndef _VAMP_PLUGIN_WRAPPER_H_ -#define _VAMP_PLUGIN_WRAPPER_H_ - -#include <vamp-sdk/Plugin.h> - -namespace Vamp { - -namespace HostExt { - -/** - * \class PluginWrapper PluginWrapper.h <vamp-sdk/hostext/PluginWrapper.h> - * - * PluginWrapper is a simple base class for adapter plugins. It takes - * a pointer to a "to be wrapped" Vamp plugin on construction, and - * provides implementations of all the Vamp plugin methods that simply - * delegate through to the wrapped plugin. A subclass can therefore - * override only the methods that are meaningful for the particular - * adapter. - * - * \note This class was introduced in version 1.1 of the Vamp plugin SDK. - */ - -class PluginWrapper : public Plugin -{ -public: - virtual ~PluginWrapper(); - - bool initialise(size_t channels, size_t stepSize, size_t blockSize); - void reset(); - - InputDomain getInputDomain() const; - - unsigned int getVampApiVersion() const; - std::string getIdentifier() const; - std::string getName() const; - std::string getDescription() const; - std::string getMaker() const; - int getPluginVersion() const; - std::string getCopyright() const; - - ParameterList getParameterDescriptors() const; - float getParameter(std::string) const; - void setParameter(std::string, float); - - ProgramList getPrograms() const; - std::string getCurrentProgram() const; - void selectProgram(std::string); - - size_t getPreferredStepSize() const; - size_t getPreferredBlockSize() const; - - size_t getMinChannelCount() const; - size_t getMaxChannelCount() const; - - OutputList getOutputDescriptors() const; - - FeatureSet process(const float *const *inputBuffers, RealTime timestamp); - - FeatureSet getRemainingFeatures(); - -protected: - PluginWrapper(Plugin *plugin); // I take ownership of plugin - Plugin *m_plugin; -}; - -} - -} - -#endif diff --git a/libs/vamp-sdk/vamp-sdk/libvamp-hostsdk.la.in b/libs/vamp-sdk/vamp-sdk/libvamp-hostsdk.la.in deleted file mode 100644 index 83362dc39c..0000000000 --- a/libs/vamp-sdk/vamp-sdk/libvamp-hostsdk.la.in +++ /dev/null @@ -1,9 +0,0 @@ -dlname='%LINK_ABI%' -library_names='%LIBNAME% %LINK_ABI% %LINK_DEV%' -old_library='%STATIC%' -dependency_libs='' -current=2 -age=0 -revision=0 -installed=yes -libdir='%LIBS%' diff --git a/libs/vamp-sdk/vamp-sdk/libvamp-sdk.la.in b/libs/vamp-sdk/vamp-sdk/libvamp-sdk.la.in deleted file mode 100644 index 1674afe3e4..0000000000 --- a/libs/vamp-sdk/vamp-sdk/libvamp-sdk.la.in +++ /dev/null @@ -1,9 +0,0 @@ -dlname='%LINK_ABI%' -library_names='%LIBNAME% %LINK_ABI% %LINK_DEV%' -old_library='%STATIC%' -dependency_libs='' -current=1 -age=1 -revision=0 -installed=yes -libdir='%LIBS%' diff --git a/libs/vamp-sdk/vamp/vamp.h b/libs/vamp-sdk/vamp/vamp.h deleted file mode 100644 index 4f0145ab59..0000000000 --- a/libs/vamp-sdk/vamp/vamp.h +++ /dev/null @@ -1,339 +0,0 @@ -/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ - -/* - Vamp - - An API for audio analysis and feature extraction plugins. - - Centre for Digital Music, Queen Mary, University of London. - Copyright 2006 Chris Cannam. - - Permission is hereby granted, free of charge, to any person - obtaining a copy of this software and associated documentation - files (the "Software"), to deal in the Software without - restriction, including without limitation the rights to use, copy, - modify, merge, publish, distribute, sublicense, and/or sell copies - of the Software, and to permit persons to whom the Software is - furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR - ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF - CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - Except as contained in this notice, the names of the Centre for - Digital Music; Queen Mary, University of London; and Chris Cannam - shall not be used in advertising or otherwise to promote the sale, - use or other dealings in this Software without prior written - authorization. -*/ - -#ifndef VAMP_HEADER_INCLUDED -#define VAMP_HEADER_INCLUDED - -#ifdef __cplusplus -extern "C" { -#endif - -/** - * Plugin API version. This is incremented when a change is made that - * changes the binary layout of the descriptor records. When this - * happens, there should be a mechanism for retaining compatibility - * with older hosts and/or plugins. - * - * See also the vampApiVersion field in the plugin descriptor, and the - * hostApiVersion argument to the vampGetPluginDescriptor function. - */ -#define VAMP_API_VERSION 1 - -/** - * C language API for Vamp plugins. - * - * This is the formal plugin API for Vamp. Plugin authors may prefer - * to use the C++ classes provided in the Vamp plugin SDK, instead of - * using this API directly. There is an adapter class provided that - * makes C++ plugins available using this C API with relatively little - * work, and the C++ headers are more thoroughly documented. - * - * IMPORTANT: The comments in this file summarise the purpose of each - * of the declared fields and functions, but do not provide a complete - * guide to their permitted values and expected usage. Please refer - * to the C++ headers in the Vamp plugin SDK for further details and - * plugin lifecycle documentation. - */ - -typedef struct _VampParameterDescriptor -{ - /** Computer-usable name of the parameter. Must not change. [a-zA-Z0-9_] */ - const char *identifier; - - /** Human-readable name of the parameter. May be translatable. */ - const char *name; - - /** Human-readable short text about the parameter. May be translatable. */ - const char *description; - - /** Human-readable unit of the parameter. */ - const char *unit; - - /** Minimum value. */ - float minValue; - - /** Maximum value. */ - float maxValue; - - /** Default value. Plugin is responsible for setting this on initialise. */ - float defaultValue; - - /** 1 if parameter values are quantized to a particular resolution. */ - int isQuantized; - - /** Quantization resolution, if isQuantized. */ - float quantizeStep; - - /** Human-readable names of the values, if isQuantized. May be NULL. */ - const char **valueNames; - -} VampParameterDescriptor; - -typedef enum -{ - /** Each process call returns results aligned with call's block start. */ - vampOneSamplePerStep, - - /** Returned results are evenly spaced at samplerate specified below. */ - vampFixedSampleRate, - - /** Returned results have their own individual timestamps. */ - vampVariableSampleRate - -} VampSampleType; - -typedef struct _VampOutputDescriptor -{ - /** Computer-usable name of the output. Must not change. [a-zA-Z0-9_] */ - const char *identifier; - - /** Human-readable name of the output. May be translatable. */ - const char *name; - - /** Human-readable short text about the output. May be translatable. */ - const char *description; - - /** Human-readable name of the unit of the output. */ - const char *unit; - - /** 1 if output has equal number of values for each returned result. */ - int hasFixedBinCount; - - /** Number of values per result, if hasFixedBinCount. */ - unsigned int binCount; - - /** Names of returned value bins, if hasFixedBinCount. May be NULL. */ - const char **binNames; - - /** 1 if each returned value falls within the same fixed min/max range. */ - int hasKnownExtents; - - /** Minimum value for a returned result in any bin, if hasKnownExtents. */ - float minValue; - - /** Maximum value for a returned result in any bin, if hasKnownExtents. */ - float maxValue; - - /** 1 if returned results are quantized to a particular resolution. */ - int isQuantized; - - /** Quantization resolution for returned results, if isQuantized. */ - float quantizeStep; - - /** Time positioning method for returned results (see VampSampleType). */ - VampSampleType sampleType; - - /** Sample rate of returned results, if sampleType is vampFixedSampleRate. - "Resolution" of result, if sampleType is vampVariableSampleRate. */ - float sampleRate; - -} VampOutputDescriptor; - -typedef struct _VampFeature -{ - /** 1 if the feature has a timestamp (i.e. if vampVariableSampleRate). */ - int hasTimestamp; - - /** Seconds component of timestamp. */ - int sec; - - /** Nanoseconds component of timestamp. */ - int nsec; - - /** Number of values. Must be binCount if hasFixedBinCount. */ - unsigned int valueCount; - - /** Values for this returned sample. */ - float *values; - - /** Label for this returned sample. May be NULL. */ - char *label; - -} VampFeature; - -typedef struct _VampFeatureList -{ - /** Number of features in this feature list. */ - unsigned int featureCount; - - /** Features in this feature list. May be NULL if featureCount is zero. */ - VampFeature *features; - -} VampFeatureList; - -typedef enum -{ - vampTimeDomain, - vampFrequencyDomain - -} VampInputDomain; - -typedef void *VampPluginHandle; - -typedef struct _VampPluginDescriptor -{ - /** API version with which this descriptor is compatible. */ - unsigned int vampApiVersion; - - /** Computer-usable name of the plugin. Must not change. [a-zA-Z0-9_] */ - const char *identifier; - - /** Human-readable name of the plugin. May be translatable. */ - const char *name; - - /** Human-readable short text about the plugin. May be translatable. */ - const char *description; - - /** Human-readable name of plugin's author or vendor. */ - const char *maker; - - /** Version number of the plugin. */ - int pluginVersion; - - /** Human-readable summary of copyright or licensing for plugin. */ - const char *copyright; - - /** Number of parameter inputs. */ - unsigned int parameterCount; - - /** Fixed descriptors for parameter inputs. */ - const VampParameterDescriptor **parameters; - - /** Number of programs. */ - unsigned int programCount; - - /** Fixed names for programs. */ - const char **programs; - - /** Preferred input domain for audio input (time or frequency). */ - VampInputDomain inputDomain; - - /** Create and return a new instance of this plugin. */ - VampPluginHandle (*instantiate)(const struct _VampPluginDescriptor *, - float inputSampleRate); - - /** Destroy an instance of this plugin. */ - void (*cleanup)(VampPluginHandle); - - /** Initialise an instance following parameter configuration. */ - int (*initialise)(VampPluginHandle, - unsigned int inputChannels, - unsigned int stepSize, - unsigned int blockSize); - - /** Reset an instance, ready to use again on new input data. */ - void (*reset)(VampPluginHandle); - - /** Get a parameter value. */ - float (*getParameter)(VampPluginHandle, int); - - /** Set a parameter value. May only be called before initialise. */ - void (*setParameter)(VampPluginHandle, int, float); - - /** Get the current program (if programCount > 0). */ - unsigned int (*getCurrentProgram)(VampPluginHandle); - - /** Set the current program. May only be called before initialise. */ - void (*selectProgram)(VampPluginHandle, unsigned int); - - /** Get the plugin's preferred processing window increment in samples. */ - unsigned int (*getPreferredStepSize)(VampPluginHandle); - - /** Get the plugin's preferred processing window size in samples. */ - unsigned int (*getPreferredBlockSize)(VampPluginHandle); - - /** Get the minimum number of input channels this plugin can handle. */ - unsigned int (*getMinChannelCount)(VampPluginHandle); - - /** Get the maximum number of input channels this plugin can handle. */ - unsigned int (*getMaxChannelCount)(VampPluginHandle); - - /** Get the number of feature outputs (distinct sets of results). */ - unsigned int (*getOutputCount)(VampPluginHandle); - - /** Get a descriptor for a given feature output. Returned pointer - is valid only until next call to getOutputDescriptor for this - handle, or releaseOutputDescriptor for this descriptor. Host - must call releaseOutputDescriptor after use. */ - VampOutputDescriptor *(*getOutputDescriptor)(VampPluginHandle, - unsigned int); - - /** Destroy a descriptor for a feature output. */ - void (*releaseOutputDescriptor)(VampOutputDescriptor *); - - /** Process an input block and return a set of features. Returned - pointer is valid only until next call to process, - getRemainingFeatures, or cleanup for this handle, or - releaseFeatureSet for this feature set. Host must call - releaseFeatureSet after use. */ - VampFeatureList *(*process)(VampPluginHandle, - const float *const *inputBuffers, - int sec, - int nsec); - - /** Return any remaining features at the end of processing. */ - VampFeatureList *(*getRemainingFeatures)(VampPluginHandle); - - /** Release a feature set returned from process or getRemainingFeatures. */ - void (*releaseFeatureSet)(VampFeatureList *); - -} VampPluginDescriptor; - -/** Get the descriptor for a given plugin index in this library. - Return NULL if the index is outside the range of valid indices for - this plugin library. - - The hostApiVersion argument tells the library code the highest - Vamp API version supported by the host. The function should - return a plugin descriptor compatible with the highest API version - supported by the library that is no higher than that supported by - the host. Provided the descriptor has the correct vampApiVersion - field for its actual compatibility level, the host should be able - to do the right thing with it: use it if possible, discard it - otherwise. -*/ -const VampPluginDescriptor *vampGetPluginDescriptor - (unsigned int hostApiVersion, unsigned int index); - -/** Function pointer type for vampGetPluginDescriptor. */ -typedef const VampPluginDescriptor *(*VampGetPluginDescriptorFunction) - (unsigned int, unsigned int); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/libs/vamp-sdk/vamp/vamp.pc.in b/libs/vamp-sdk/vamp/vamp.pc.in deleted file mode 100644 index 82d4decd34..0000000000 --- a/libs/vamp-sdk/vamp/vamp.pc.in +++ /dev/null @@ -1,10 +0,0 @@ -prefix=%PREFIX% -exec_prefix=${prefix} -libdir=${exec_prefix}/lib -includedir=${prefix}/include - -Name: vamp -Version: 1.0 -Description: An API for audio analysis and feature extraction plugins -Libs: -Cflags: -I${includedir} |