changeset 19:0e1909abe921

Introduce a new layer to abstract away plugin construction, so plugins needing more constructor arguments can easily be dealt with
author Chris Cannam
date Wed, 14 Sep 2016 17:58:41 +0100
parents 6871a49ccf17
children 44826e1782c1
files VamPipeAdapter.h VamPipePluginLibrary.cpp VamPipePluginLibrary.h
diffstat 3 files changed, 30 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/VamPipeAdapter.h	Wed Sep 14 14:58:44 2016 +0100
+++ b/VamPipeAdapter.h	Wed Sep 14 17:58:41 2016 +0100
@@ -45,30 +45,35 @@
 
 namespace vampipe {
 
-class VamPipeAdapterBase
+class VamPipeAdapterInterface
 {
 public:
     virtual Vamp::HostExt::PluginStaticData getStaticData() const = 0;
     virtual Vamp::HostExt::LoadResponse loadPlugin(Vamp::HostExt::LoadRequest r) const = 0;
+    virtual Vamp::Plugin *createPlugin(float inputSampleRate) const = 0;
 };
 
 template <typename P>
-class VamPipeAdapter : public VamPipeAdapterBase
+class VamPipeAdapterBase : public VamPipeAdapterInterface
 {
     const int adaptInputDomain = 0x01;
     const int adaptChannelCount = 0x02;
     const int adaptBufferSize = 0x04;
+
+protected:
+    VamPipeAdapterBase(std::string libname) : m_soname(libname) { }
     
 public:
-    VamPipeAdapter(std::string libname) :
-	m_soname(libname) { }
+    virtual Vamp::Plugin *createPlugin(float inputSampleRate) const = 0;
     
     virtual Vamp::HostExt::PluginStaticData getStaticData() const {
-	P p(44100.f);
-	return Vamp::HostExt::PluginStaticData::fromPlugin
-	    (m_soname + ":" + p.getIdentifier(),
+        Vamp::Plugin *p = createPlugin(44100.f);
+	auto data = Vamp::HostExt::PluginStaticData::fromPlugin
+	    (m_soname + ":" + p->getIdentifier(),
 	     {}, //!!! todo: category - tricky one that
-	     &p);
+	     p);
+        delete p;
+        return data;
     }
 
     virtual Vamp::HostExt::LoadResponse loadPlugin(Vamp::HostExt::
@@ -78,7 +83,7 @@
 	// the correct plugin (so we don't have to check the plugin
 	// key field here)
 
-	Vamp::Plugin *p = new P(r.inputSampleRate);
+	Vamp::Plugin *p = createPlugin(r.inputSampleRate);
 	
 	if (r.adapterFlags & adaptInputDomain) {
 	    if (p->getInputDomain() == Vamp::Plugin::FrequencyDomain) {
@@ -120,6 +125,17 @@
     std::string m_soname;
 };
 
+template <typename P>
+class VamPipeAdapter : public VamPipeAdapterBase<P>
+{
+public:
+    VamPipeAdapter(std::string libname) : VamPipeAdapterBase<P>(libname) { }
+    
+    virtual Vamp::Plugin *createPlugin(float inputSampleRate) const {
+        return new P(inputSampleRate);
+    }
+};
+
 }
 
 #endif
--- a/VamPipePluginLibrary.cpp	Wed Sep 14 14:58:44 2016 +0100
+++ b/VamPipePluginLibrary.cpp	Wed Sep 14 17:58:41 2016 +0100
@@ -64,10 +64,10 @@
     return j;
 }
 
-VamPipePluginLibrary::VamPipePluginLibrary(vector<VamPipeAdapterBase *> pp) :
+VamPipePluginLibrary::VamPipePluginLibrary(vector<VamPipeAdapterInterface *> pp) :
     m_useBase64(false)
 {
-    for (VamPipeAdapterBase *p: pp) {
+    for (VamPipeAdapterInterface *p: pp) {
 	string key = p->getStaticData().pluginKey;
 	m_adapters[key] = p;
     }
--- a/VamPipePluginLibrary.h	Wed Sep 14 14:58:44 2016 +0100
+++ b/VamPipePluginLibrary.h	Wed Sep 14 17:58:41 2016 +0100
@@ -47,12 +47,12 @@
 
 namespace vampipe {
 
-class VamPipeAdapterBase;
+class VamPipeAdapterInterface;
 
 class VamPipePluginLibrary
 {
 public:
-    VamPipePluginLibrary(std::vector<VamPipeAdapterBase *> pp);
+    VamPipePluginLibrary(std::vector<VamPipeAdapterInterface *> pp);
     
     const char *requestJson(const char *request) {
 	return strdup(requestJsonImpl(request).c_str());
@@ -80,7 +80,7 @@
     Vamp::HostExt::ConfigurationResponse configurePlugin(Vamp::HostExt::
 							 ConfigurationRequest r) const;
 
-    std::map<std::string, VamPipeAdapterBase *> m_adapters; // pluginKey -> adapter
+    std::map<std::string, VamPipeAdapterInterface *> m_adapters; // pluginKey -> adapter
     CountingPluginHandleMapper m_mapper;
     bool m_useBase64;
 };