summaryrefslogtreecommitdiff
path: root/libs/vamp-sdk/vamp-sdk
diff options
context:
space:
mode:
Diffstat (limited to 'libs/vamp-sdk/vamp-sdk')
-rw-r--r--libs/vamp-sdk/vamp-sdk/Plugin.h62
-rw-r--r--libs/vamp-sdk/vamp-sdk/PluginAdapter.h6
-rw-r--r--libs/vamp-sdk/vamp-sdk/PluginBase.h22
-rw-r--r--libs/vamp-sdk/vamp-sdk/RealTime.h5
-rw-r--r--libs/vamp-sdk/vamp-sdk/hostext/PluginBufferingAdapter.cpp516
-rw-r--r--libs/vamp-sdk/vamp-sdk/hostext/PluginBufferingAdapter.h99
-rw-r--r--libs/vamp-sdk/vamp-sdk/hostext/PluginChannelAdapter.cpp228
-rw-r--r--libs/vamp-sdk/vamp-sdk/hostext/PluginChannelAdapter.h128
-rw-r--r--libs/vamp-sdk/vamp-sdk/hostext/PluginInputDomainAdapter.cpp557
-rw-r--r--libs/vamp-sdk/vamp-sdk/hostext/PluginInputDomainAdapter.h103
-rw-r--r--libs/vamp-sdk/vamp-sdk/hostext/PluginLoader.cpp639
-rw-r--r--libs/vamp-sdk/vamp-sdk/hostext/PluginLoader.h238
-rw-r--r--libs/vamp-sdk/vamp-sdk/hostext/PluginWrapper.cpp201
-rw-r--r--libs/vamp-sdk/vamp-sdk/hostext/PluginWrapper.h106
-rw-r--r--libs/vamp-sdk/vamp-sdk/plugguard.h98
-rw-r--r--libs/vamp-sdk/vamp-sdk/vamp-sdk.h46
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
+
+