diff options
Diffstat (limited to 'libs/vamp-sdk/vamp-sdk')
-rw-r--r-- | libs/vamp-sdk/vamp-sdk/Plugin.h | 62 | ||||
-rw-r--r-- | libs/vamp-sdk/vamp-sdk/PluginAdapter.h | 6 | ||||
-rw-r--r-- | libs/vamp-sdk/vamp-sdk/PluginBase.h | 22 | ||||
-rw-r--r-- | libs/vamp-sdk/vamp-sdk/RealTime.h | 5 | ||||
-rw-r--r-- | libs/vamp-sdk/vamp-sdk/hostext/PluginBufferingAdapter.cpp | 516 | ||||
-rw-r--r-- | libs/vamp-sdk/vamp-sdk/hostext/PluginBufferingAdapter.h | 99 | ||||
-rw-r--r-- | libs/vamp-sdk/vamp-sdk/hostext/PluginChannelAdapter.cpp | 228 | ||||
-rw-r--r-- | libs/vamp-sdk/vamp-sdk/hostext/PluginChannelAdapter.h | 128 | ||||
-rw-r--r-- | libs/vamp-sdk/vamp-sdk/hostext/PluginInputDomainAdapter.cpp | 557 | ||||
-rw-r--r-- | libs/vamp-sdk/vamp-sdk/hostext/PluginInputDomainAdapter.h | 103 | ||||
-rw-r--r-- | libs/vamp-sdk/vamp-sdk/hostext/PluginLoader.cpp | 639 | ||||
-rw-r--r-- | libs/vamp-sdk/vamp-sdk/hostext/PluginLoader.h | 238 | ||||
-rw-r--r-- | libs/vamp-sdk/vamp-sdk/hostext/PluginWrapper.cpp | 201 | ||||
-rw-r--r-- | libs/vamp-sdk/vamp-sdk/hostext/PluginWrapper.h | 106 | ||||
-rw-r--r-- | libs/vamp-sdk/vamp-sdk/plugguard.h | 98 | ||||
-rw-r--r-- | libs/vamp-sdk/vamp-sdk/vamp-sdk.h | 46 |
16 files changed, 219 insertions, 2835 deletions
diff --git a/libs/vamp-sdk/vamp-sdk/Plugin.h b/libs/vamp-sdk/vamp-sdk/Plugin.h index 159bf4fac6..4709b19b67 100644 --- a/libs/vamp-sdk/vamp-sdk/Plugin.h +++ b/libs/vamp-sdk/vamp-sdk/Plugin.h @@ -34,16 +34,19 @@ authorization. */ -#ifndef _VAMP_PLUGIN_H_ -#define _VAMP_PLUGIN_H_ - -#include "PluginBase.h" -#include "RealTime.h" +#ifndef _VAMP_SDK_PLUGIN_H_ +#define _VAMP_SDK_PLUGIN_H_ #include <string> #include <vector> #include <map> +#include "PluginBase.h" +#include "RealTime.h" + +#include "plugguard.h" +_VAMP_SDK_PLUGSPACE_BEGIN(Plugin.h) + namespace Vamp { /** @@ -200,7 +203,7 @@ public: /** * 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. + * the characters [a-zA-Z0-9_-] only. * Example: "zero_crossing_count" */ std::string identifier; @@ -304,6 +307,16 @@ public: * this to zero if that behaviour is not desired. */ float sampleRate; + + /** + * True if the returned results for this output are known to + * have a duration field. + */ + bool hasDuration; + + OutputDescriptor() : // defaults for mandatory non-class-type members + hasFixedBinCount(false), hasKnownExtents(false), isQuantized(false), + sampleType(OneSamplePerStep), hasDuration(false) { } }; typedef std::vector<OutputDescriptor> OutputList; @@ -319,17 +332,34 @@ public: { /** * True if an output feature has its own timestamp. This is - * mandatory if the output has VariableSampleRate, and is - * likely to be disregarded otherwise. + * mandatory if the output has VariableSampleRate, optional if + * the output has FixedSampleRate, and unused if the output + * has OneSamplePerStep. */ 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. + * output has VariableSampleRate or if the output has + * FixedSampleRate and hasTimestamp is true, and unused + * otherwise. */ RealTime timestamp; + + /** + * True if an output feature has a specified duration. This + * is optional if the output has VariableSampleRate or + * FixedSampleRate, and and unused if the output has + * OneSamplePerStep. + */ + bool hasDuration; + + /** + * Duration of the output feature. This is mandatory if the + * output has VariableSampleRate or FixedSampleRate and + * hasDuration is true, and unused otherwise. + */ + RealTime duration; /** * Results for a single sample of this feature. If the output @@ -342,9 +372,13 @@ public: * Label for the sample of this feature. */ std::string label; + + Feature() : // defaults for mandatory non-class-type members + hasTimestamp(false), hasDuration(false) { } }; typedef std::vector<Feature> FeatureList; + typedef std::map<int, FeatureList> FeatureSet; // key is output no /** @@ -353,9 +387,9 @@ public: * 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. + * (the host will zero-pad as necessary). The timestamp in this + * case 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 @@ -399,6 +433,8 @@ protected: } +_VAMP_SDK_PLUGSPACE_END(Plugin.h) + #endif diff --git a/libs/vamp-sdk/vamp-sdk/PluginAdapter.h b/libs/vamp-sdk/vamp-sdk/PluginAdapter.h index bfc97508eb..dafd532a3b 100644 --- a/libs/vamp-sdk/vamp-sdk/PluginAdapter.h +++ b/libs/vamp-sdk/vamp-sdk/PluginAdapter.h @@ -37,11 +37,13 @@ #ifndef _VAMP_PLUGIN_ADAPTER_H_ #define _VAMP_PLUGIN_ADAPTER_H_ +#include <map> #include <vamp/vamp.h> #include "Plugin.h" -#include <map> +#include "plugguard.h" +_VAMP_SDK_PLUGSPACE_BEGIN(PluginAdapter.h) namespace Vamp { @@ -113,5 +115,7 @@ protected: } +_VAMP_SDK_PLUGSPACE_END(PluginAdapter.h) + #endif diff --git a/libs/vamp-sdk/vamp-sdk/PluginBase.h b/libs/vamp-sdk/vamp-sdk/PluginBase.h index 38d2b49904..147ffdc153 100644 --- a/libs/vamp-sdk/vamp-sdk/PluginBase.h +++ b/libs/vamp-sdk/vamp-sdk/PluginBase.h @@ -34,13 +34,18 @@ authorization. */ -#ifndef _VAMP_PLUGIN_BASE_H_ -#define _VAMP_PLUGIN_BASE_H_ +#ifndef _VAMP_SDK_PLUGIN_BASE_H_ +#define _VAMP_SDK_PLUGIN_BASE_H_ #include <string> #include <vector> -#define VAMP_SDK_VERSION "1.1" +#define VAMP_SDK_VERSION "2.0" +#define VAMP_SDK_MAJOR_VERSION 2 +#define VAMP_SDK_MINOR_VERSION 0 + +#include "plugguard.h" +_VAMP_SDK_PLUGSPACE_BEGIN(PluginBase.h) namespace Vamp { @@ -64,12 +69,12 @@ public: /** * Get the Vamp API compatibility level of the plugin. */ - virtual unsigned int getVampApiVersion() const { return 1; } + virtual unsigned int getVampApiVersion() const { return 2; } /** * 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_]. + * 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. * @@ -127,7 +132,7 @@ public: /** * The name of the parameter, in computer-usable form. Should * be reasonably short, and may only contain the characters - * [a-zA-Z0-9_]. + * [a-zA-Z0-9_-]. */ std::string identifier; @@ -190,6 +195,9 @@ public: * encoded in the names. */ std::vector<std::string> valueNames; + + ParameterDescriptor() : // the defaults are invalid: you must set them + minValue(0), maxValue(0), defaultValue(0), isQuantized(false) { } }; typedef std::vector<ParameterDescriptor> ParameterList; @@ -249,4 +257,6 @@ public: } +_VAMP_SDK_PLUGSPACE_END(PluginBase.h) + #endif diff --git a/libs/vamp-sdk/vamp-sdk/RealTime.h b/libs/vamp-sdk/vamp-sdk/RealTime.h index 6b88ed53f0..297c4ad524 100644 --- a/libs/vamp-sdk/vamp-sdk/RealTime.h +++ b/libs/vamp-sdk/vamp-sdk/RealTime.h @@ -51,6 +51,9 @@ struct timeval; #endif +#include "plugguard.h" +_VAMP_SDK_PLUGSPACE_BEGIN(RealTime.h) + namespace Vamp { /** @@ -158,5 +161,7 @@ struct RealTime std::ostream &operator<<(std::ostream &out, const RealTime &rt); } + +_VAMP_SDK_PLUGSPACE_END(RealTime.h) #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 e9d75ee181..0000000000 --- a/libs/vamp-sdk/vamp-sdk/hostext/PluginLoader.cpp +++ /dev/null @@ -1,639 +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 <string> -#include <cstring> -#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/plugguard.h b/libs/vamp-sdk/vamp-sdk/plugguard.h new file mode 100644 index 0000000000..311dd488e0 --- /dev/null +++ b/libs/vamp-sdk/vamp-sdk/plugguard.h @@ -0,0 +1,98 @@ +/* -*- 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_SDK_PLUGGUARD_H_ +#define _VAMP_SDK_PLUGGUARD_H_ + +/** + * Normal usage should be: + * + * - Plugins include vamp-sdk/Plugin.h or vamp-sdk/PluginBase.h. + * These files include this header, which specifies an appropriate + * namespace for the plugin classes to avoid any risk of conflict + * with non-plugin class implementations in the host on load. + * + * - Hosts include vamp-hostsdk/Plugin.h, vamp-hostsdk/PluginBase.h, + * vamp-hostsdk/PluginHostAdapter, vamp-hostsdk/PluginLoader.h etc. + * These files include vamp-hostsdk/hostguard.h, which makes a note + * that we are in a host. A file such as vamp-hostsdk/Plugin.h + * then simply includes vamp-sdk/Plugin.h, and this guard header + * takes notice of the fact that it has been included from a host + * and leaves the plugin namespace unset. + * + * Problems will occur when a host includes files directly from the + * vamp-sdk directory. There are two reasons this might happen: + * mistake, perhaps owing to ignorance of the fact that this isn't + * allowed (particularly since it was the normal mechanism in v1 of + * the SDK); and a wish to incorporate plugin code directly into the + * host rather than having to load it. + * + * What if the host does include a vamp-sdk header by mistake? We can + * catch it if it's included before something from vamp-hostsdk. If + * it's included after something from vamp-hostsdk, it will work OK + * anyway. The remaining problem case is where nothing from + * vamp-hostsdk is included in the same file. We can't catch that. + */ + +#ifndef _VAMP_IN_HOSTSDK + +#define _VAMP_IN_PLUGINSDK 1 + +#ifdef _VAMP_NO_PLUGIN_NAMESPACE +#define _VAMP_SDK_PLUGSPACE_BEGIN(h) +#define _VAMP_SDK_PLUGSPACE_END(h) +#else +#ifdef _VAMP_PLUGIN_IN_HOST_NAMESPACE +#define _VAMP_SDK_PLUGSPACE_BEGIN(h) \ + namespace _VampHost { + +#define _VAMP_SDK_PLUGSPACE_END(h) \ + } \ + using namespace _VampHost; +#else +#define _VAMP_SDK_PLUGSPACE_BEGIN(h) \ + namespace _VampPlugin { + +#define _VAMP_SDK_PLUGSPACE_END(h) \ + } \ + using namespace _VampPlugin; +#endif +#endif + +#endif + +#endif + diff --git a/libs/vamp-sdk/vamp-sdk/vamp-sdk.h b/libs/vamp-sdk/vamp-sdk/vamp-sdk.h new file mode 100644 index 0000000000..3ac2f8bc05 --- /dev/null +++ b/libs/vamp-sdk/vamp-sdk/vamp-sdk.h @@ -0,0 +1,46 @@ +/* -*- 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_SDK_SINGLE_INCLUDE_H_ +#define _VAMP_SDK_SINGLE_INCLUDE_H_ + +#include "PluginBase.h" +#include "Plugin.h" +#include "RealTime.h" + +#endif + + |