X-Git-Url: https://git.aubio.org/?p=vamp-aubio-plugins.git;a=blobdiff_plain;f=libmain.cpp;h=007d209de8a65255cdb72780193bf36d01039f6c;hp=787ef0cee6d0b1318f212482b89518119a01678c;hb=340474448bee6047ee27d4d7b80bd9f1477bc810;hpb=d8075e20c6eaafa643b543d08c1299ea16b7e150 diff --git a/libmain.cpp b/libmain.cpp index 787ef0c..007d209 100644 --- a/libmain.cpp +++ b/libmain.cpp @@ -23,11 +23,35 @@ #include "plugins/Tempo.h" #include "plugins/Silence.h" +template +class VersionedPluginAdapter : public Vamp::PluginAdapterBase +{ +public: + VersionedPluginAdapter(unsigned int v) : PluginAdapterBase(), m_v(v) { } + virtual ~VersionedPluginAdapter() { } + +protected: + Vamp::Plugin *createPlugin(float inputSampleRate) { + P *p = new P(inputSampleRate, m_v); + Vamp::Plugin *plugin = dynamic_cast(p); + return plugin; + } + unsigned int m_v; +}; + static Vamp::PluginAdapter onsetAdapter; static Vamp::PluginAdapter pitchAdapter; -static Vamp::PluginAdapter notesAdapter; static Vamp::PluginAdapter tempoAdapter; -static Vamp::PluginAdapter silenceAdapter; + +// These two plugins both benefit from the Vamp v2 API if available +static VersionedPluginAdapter *notesAdapter = 0; +static VersionedPluginAdapter *silenceAdapter = 0; + +struct Tidy +{ + ~Tidy() { delete notesAdapter; delete silenceAdapter; } +}; +static Tidy tidy; const VampPluginDescriptor *vampGetPluginDescriptor(unsigned int vampApiVersion, unsigned int index) @@ -37,9 +61,20 @@ const VampPluginDescriptor *vampGetPluginDescriptor(unsigned int vampApiVersion, switch (index) { case 0: return onsetAdapter.getDescriptor(); case 1: return pitchAdapter.getDescriptor(); - case 2: return notesAdapter.getDescriptor(); case 3: return tempoAdapter.getDescriptor(); - case 4: return silenceAdapter.getDescriptor(); + + case 2: + if (!notesAdapter) { + notesAdapter = new VersionedPluginAdapter(vampApiVersion); + } + return notesAdapter->getDescriptor(); + + case 4: + if (!silenceAdapter) { + silenceAdapter = new VersionedPluginAdapter(vampApiVersion); + } + return silenceAdapter->getDescriptor(); + default: return 0; } }