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