Mercurial > hg > vamp-live-host
changeset 16:dbbd2b473eee
Convert to using Vamp HostExt loader, no longer depends on svcore
author | Chris Cannam |
---|---|
date | Tue, 03 Dec 2013 16:27:26 +0000 |
parents | df33703ace3b |
children | 3cbd40805795 |
files | .hgsub .hgsubstate audioio/BufferingAudioCallbackRecordTarget.h host/Processor.cpp host/host.cpp livehost.pro vamp-live-host.pro |
diffstat | 7 files changed, 17 insertions(+), 207 deletions(-) [+] |
line wrap: on
line diff
--- a/.hgsub Tue Dec 03 16:05:14 2013 +0000 +++ b/.hgsub Tue Dec 03 16:27:26 2013 +0000 @@ -1,2 +0,0 @@ -dataquay = https://bitbucket.org/breakfastquay/dataquay -svcore = https://code.soundsoftware.ac.uk/hg/svcore
--- a/.hgsubstate Tue Dec 03 16:05:14 2013 +0000 +++ b/.hgsubstate Tue Dec 03 16:27:26 2013 +0000 @@ -1,2 +0,0 @@ -53939f99655e07866d8e9b5a0a10015335d8075f dataquay -2010409af2039ef7c1e5a02d49b3f0c4a3bdddf3 svcore
--- a/audioio/BufferingAudioCallbackRecordTarget.h Tue Dec 03 16:05:14 2013 +0000 +++ b/audioio/BufferingAudioCallbackRecordTarget.h Tue Dec 03 16:27:26 2013 +0000 @@ -4,7 +4,7 @@ #define _BUFFERING_AUDIO_CALLBACK_RECORD_TARGET_H_ #include "AudioCallbackRecordTarget.h" -#include "base/RingBuffer.h" +#include "RingBuffer.h" #define MAX_DISTINCT_STEP_SIZES 16
--- a/host/Processor.cpp Tue Dec 03 16:05:14 2013 +0000 +++ b/host/Processor.cpp Tue Dec 03 16:27:26 2013 +0000 @@ -2,10 +2,12 @@ #include "Processor.h" -#include "plugin/FeatureExtractionPluginFactory.h" +#include <vamp-hostsdk/PluginLoader.h> //#define DEBUG_RUN_PROCESSOR 1 +using Vamp::HostExt::PluginLoader; + using std::cout; using std::cerr; using std::endl; @@ -96,10 +98,8 @@ //!!! size_t ch = m_audioRecordTarget->getChannelCount(); float **buffers = new float *[ch]; - float **transformed = new float *[ch]; for (size_t c = 0; c < ch; ++c) { buffers[c] = new float[m_maxBlockSize]; - transformed[c] = new float[m_maxBlockSize + 2]; } bool doneWork = false; @@ -172,8 +172,6 @@ if (!silentInput) break; } - bool haveTransformed = false; - for (PluginSet::iterator k = j->second.begin(); k != j->second.end(); ++k) { @@ -187,30 +185,14 @@ Vamp::RealTime timestamp = Vamp::RealTime::frame2RealTime(frame[reader], sr); - if (plugin->getInputDomain() == Vamp::Plugin::FrequencyDomain) { - if (!haveTransformed) { - for (size_t c = 0; c < ch; ++c) { - for (size_t s = 0; s < block; ++s) { - transformed[c][s] = buffers[c][s + off]; - } - transformInput(transformed[c], block); - } - haveTransformed = true; - } #ifdef DEBUG_RUN_PROCESSOR - cerr << "running " << plugin->getName() << " (transformed) frame = " << frame[reader] << endl; + cerr << "running " << plugin->getName() << " frame = " << frame[reader] << endl; #endif - fs = plugin->process(transformed, timestamp); - } else { -#ifdef DEBUG_RUN_PROCESSOR - cerr << "running " << plugin->getName() << " frame = " << frame[reader] << endl; -#endif - float *tmp[10]; - for (size_t c = 0; c < ch; ++c) { - tmp[c] = buffers[c] + off; - } - fs = plugin->process(tmp, timestamp); + float *tmp[10]; + for (size_t c = 0; c < ch; ++c) { + tmp[c] = buffers[c] + off; } + fs = plugin->process(tmp, timestamp); int pluginIndex = m_pluginRMap[plugin]; @@ -316,10 +298,8 @@ for (size_t c = 0; c < ch; ++c) { delete[] buffers[c]; - delete[] transformed[c]; } delete[] buffers; - delete[] transformed; return doneWork; } @@ -336,15 +316,13 @@ return 0; } - FeatureExtractionPluginFactory *factory = - FeatureExtractionPluginFactory::instanceFor(pluginId); - - if (!factory) { - cerr << "ERROR: Processor::addPlugin: No factory for plugin \"" << pluginId.toStdString() << "\"" << endl; - return 0; + if (pluginId.startsWith("vamp:")) { + pluginId = pluginId.right(pluginId.size() - 5); } - Vamp::Plugin *plugin = factory->instantiatePlugin(pluginId, sr); + PluginLoader *loader = PluginLoader::getInstance(); + Vamp::Plugin *plugin = loader->loadPlugin + (pluginId.toStdString(), sr, PluginLoader::ADAPT_ALL_SAFE); if (!plugin) { cerr << "ERROR: Processor::addPlugin: Failed to instantiate plugin \"" << pluginId.toStdString() << "\"" << endl; @@ -355,13 +333,7 @@ if (block == 0) block = m_audioRecordTarget->getSourceBlockSize(); size_t step = plugin->getPreferredStepSize(); - if (step == 0) { - if (plugin->getInputDomain() == Vamp::Plugin::TimeDomain) { - step = block; - } else { - step = block/2; - } - } + if (step == 0) step = block; if (m_stepSizeReaderMap.find(step) == m_stepSizeReaderMap.end()) { if (m_unusedReaders.empty()) { @@ -375,7 +347,6 @@ } size_t ch = m_audioRecordTarget->getChannelCount(); - if (ch > plugin->getMaxChannelCount()) ch = plugin->getMaxChannelCount(); if (!plugin->initialise(ch, step, block)) { cerr << "ERROR: Processor::addPlugin: Initialisation failed with step size " << step << ", block size " << block << ", channels " << ch << endl; @@ -383,9 +354,6 @@ return 0; } - if (plugin->getInputDomain() == Vamp::Plugin::FrequencyDomain) { - block = block + 2; // but we should just use plugin adapter - } if (!m_havePlugins || block < m_minBlockSize) m_minBlockSize = block; if (!m_havePlugins || block > m_maxBlockSize) m_maxBlockSize = block; @@ -571,149 +539,4 @@ cout << endl; } } - -void -transformInput(float *buffer, size_t size) -{ - double *inbuf = new double[size * 2]; - double *outbuf = new double[size * 2]; - // Copy across with Hanning window - for (size_t i = 0; i < size; ++i) { - inbuf[i] = double(buffer[i]) * (0.50 - 0.50 * cos(2 * M_PI * i / size)); - inbuf[i + size] = 0.0; - } - - for (size_t i = 0; i < size/2; ++i) { - double temp = inbuf[i]; - inbuf[i] = inbuf[i + size/2]; - inbuf[i + size/2] = temp; - } - - fft(size, false, inbuf, inbuf + size, outbuf, outbuf + size); - - for (size_t i = 0; i <= size/2; ++i) { - buffer[i * 2] = outbuf[i]; - buffer[i * 2 + 1] = outbuf[i + size]; - } - - delete[] inbuf; - delete[] outbuf; -} - -void -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; - } - } -} -
--- a/host/host.cpp Tue Dec 03 16:05:14 2013 +0000 +++ b/host/host.cpp Tue Dec 03 16:27:26 2013 +0000 @@ -8,7 +8,7 @@ #include <iostream> #include <sndfile.h> -#include "system/System.h" +#include "audioio/System.h" #include "Processor.h" #include "SimpleXMLRuleLoader.h"
--- a/livehost.pro Tue Dec 03 16:05:14 2013 +0000 +++ b/livehost.pro Tue Dec 03 16:27:26 2013 +0000 @@ -14,15 +14,9 @@ } } -DEPENDPATH += . svcore -INCLUDEPATH += . svcore -LIBPATH += svcore - CONFIG += qt thread warn_on stl rtti exceptions QT += network xml gui widgets -LIBS += -lsvcore -ldataquay - OBJECTS_DIR = o MOC_DIR = o
--- a/vamp-live-host.pro Tue Dec 03 16:05:14 2013 +0000 +++ b/vamp-live-host.pro Tue Dec 03 16:27:26 2013 +0000 @@ -1,8 +1,5 @@ TEMPLATE = subdirs -SUBDIRS = sub_dataquay svcore sub_livehost - -sub_dataquay.file = dataquay/lib.pro +SUBDIRS = sub_livehost sub_livehost.file = livehost.pro -sub_livehost.depends = svcore