# HG changeset patch # User Chris Cannam # Date 1473872321 -3600 # Node ID 0e1909abe92193363a921fbcc6d94b58589ff379 # Parent 6871a49ccf178d67ecb5d39c339e3c9d3834496e Introduce a new layer to abstract away plugin construction, so plugins needing more constructor arguments can easily be dealt with diff -r 6871a49ccf17 -r 0e1909abe921 VamPipeAdapter.h --- 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 -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 +class VamPipeAdapter : public VamPipeAdapterBase

+{ +public: + VamPipeAdapter(std::string libname) : VamPipeAdapterBase

(libname) { } + + virtual Vamp::Plugin *createPlugin(float inputSampleRate) const { + return new P(inputSampleRate); + } +}; + } #endif diff -r 6871a49ccf17 -r 0e1909abe921 VamPipePluginLibrary.cpp --- 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 pp) : +VamPipePluginLibrary::VamPipePluginLibrary(vector pp) : m_useBase64(false) { - for (VamPipeAdapterBase *p: pp) { + for (VamPipeAdapterInterface *p: pp) { string key = p->getStaticData().pluginKey; m_adapters[key] = p; } diff -r 6871a49ccf17 -r 0e1909abe921 VamPipePluginLibrary.h --- 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 pp); + VamPipePluginLibrary(std::vector 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 m_adapters; // pluginKey -> adapter + std::map m_adapters; // pluginKey -> adapter CountingPluginHandleMapper m_mapper; bool m_useBase64; };