Mercurial > hg > piper-vamp-js
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; };