Mercurial > hg > piper-vamp-js
comparison 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 |
comparison
equal
deleted
inserted
replaced
87:2fbefc82d460 | 88:6c4b43298968 |
---|---|
43 #include <vamp-hostsdk/PluginBufferingAdapter.h> | 43 #include <vamp-hostsdk/PluginBufferingAdapter.h> |
44 #include <vamp-hostsdk/PluginChannelAdapter.h> | 44 #include <vamp-hostsdk/PluginChannelAdapter.h> |
45 | 45 |
46 namespace vampipe { | 46 namespace vampipe { |
47 | 47 |
48 class VamPipeAdapterBase | 48 class VamPipeAdapterInterface |
49 { | 49 { |
50 public: | 50 public: |
51 virtual Vamp::HostExt::PluginStaticData getStaticData() const = 0; | 51 virtual Vamp::HostExt::PluginStaticData getStaticData() const = 0; |
52 virtual Vamp::HostExt::LoadResponse loadPlugin(Vamp::HostExt::LoadRequest r) const = 0; | 52 virtual Vamp::HostExt::LoadResponse loadPlugin(Vamp::HostExt::LoadRequest r) const = 0; |
53 virtual Vamp::Plugin *createPlugin(float inputSampleRate) const = 0; | |
53 }; | 54 }; |
54 | 55 |
55 template <typename P> | 56 template <typename P> |
56 class VamPipeAdapter : public VamPipeAdapterBase | 57 class VamPipeAdapterBase : public VamPipeAdapterInterface |
57 { | 58 { |
58 const int adaptInputDomain = 0x01; | 59 const int adaptInputDomain = 0x01; |
59 const int adaptChannelCount = 0x02; | 60 const int adaptChannelCount = 0x02; |
60 const int adaptBufferSize = 0x04; | 61 const int adaptBufferSize = 0x04; |
62 | |
63 protected: | |
64 VamPipeAdapterBase(std::string libname) : m_soname(libname) { } | |
61 | 65 |
62 public: | 66 public: |
63 VamPipeAdapter(std::string libname) : | 67 virtual Vamp::Plugin *createPlugin(float inputSampleRate) const = 0; |
64 m_soname(libname) { } | |
65 | 68 |
66 virtual Vamp::HostExt::PluginStaticData getStaticData() const { | 69 virtual Vamp::HostExt::PluginStaticData getStaticData() const { |
67 P p(44100.f); | 70 Vamp::Plugin *p = createPlugin(44100.f); |
68 return Vamp::HostExt::PluginStaticData::fromPlugin | 71 auto data = Vamp::HostExt::PluginStaticData::fromPlugin |
69 (m_soname + ":" + p.getIdentifier(), | 72 (m_soname + ":" + p->getIdentifier(), |
70 {}, //!!! todo: category - tricky one that | 73 {}, //!!! todo: category - tricky one that |
71 &p); | 74 p); |
75 delete p; | |
76 return data; | |
72 } | 77 } |
73 | 78 |
74 virtual Vamp::HostExt::LoadResponse loadPlugin(Vamp::HostExt:: | 79 virtual Vamp::HostExt::LoadResponse loadPlugin(Vamp::HostExt:: |
75 LoadRequest r) const { | 80 LoadRequest r) const { |
76 | 81 |
77 // We assume the caller has guaranteed that the request is for | 82 // We assume the caller has guaranteed that the request is for |
78 // the correct plugin (so we don't have to check the plugin | 83 // the correct plugin (so we don't have to check the plugin |
79 // key field here) | 84 // key field here) |
80 | 85 |
81 Vamp::Plugin *p = new P(r.inputSampleRate); | 86 Vamp::Plugin *p = createPlugin(r.inputSampleRate); |
82 | 87 |
83 if (r.adapterFlags & adaptInputDomain) { | 88 if (r.adapterFlags & adaptInputDomain) { |
84 if (p->getInputDomain() == Vamp::Plugin::FrequencyDomain) { | 89 if (p->getInputDomain() == Vamp::Plugin::FrequencyDomain) { |
85 p = new Vamp::HostExt::PluginInputDomainAdapter(p); | 90 p = new Vamp::HostExt::PluginInputDomainAdapter(p); |
86 } | 91 } |
118 | 123 |
119 private: | 124 private: |
120 std::string m_soname; | 125 std::string m_soname; |
121 }; | 126 }; |
122 | 127 |
128 template <typename P> | |
129 class VamPipeAdapter : public VamPipeAdapterBase<P> | |
130 { | |
131 public: | |
132 VamPipeAdapter(std::string libname) : VamPipeAdapterBase<P>(libname) { } | |
133 | |
134 virtual Vamp::Plugin *createPlugin(float inputSampleRate) const { | |
135 return new P(inputSampleRate); | |
136 } | |
137 }; | |
138 | |
123 } | 139 } |
124 | 140 |
125 #endif | 141 #endif |
126 | 142 |