Mercurial > hg > piper-vamp-js
diff VamPipeAdapter.h @ 88:6c4b43298968
Introduce a new layer to abstract away plugin construction, so plugins needing more constructor arguments can easily be dealt with
author | Chris Cannam <c.cannam@qmul.ac.uk> |
---|---|
date | Wed, 14 Sep 2016 17:58:41 +0100 |
parents | 967b0619b090 |
children |
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