* Re-label tempo detector to beat tracker -- in this incarnation, it returns
[vamp-aubio-plugins.git] / libmain.cpp
1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*-  vi:set ts=8 sts=4 sw=4: */
2
3 /*
4     Vamp feature extraction plugins using Paul Brossier's Aubio library.
5
6     Centre for Digital Music, Queen Mary, University of London.
7     This file copyright 2006 Chris Cannam.
8     
9     This program is free software; you can redistribute it and/or
10     modify it under the terms of the GNU General Public License as
11     published by the Free Software Foundation; either version 2 of the
12     License, or (at your option) any later version.  See the file
13     COPYING included with this distribution for more information.
14
15 */
16
17 #include <vamp/vamp.h>
18 #include <vamp-sdk/PluginAdapter.h>
19
20 #include "plugins/Onset.h"
21 #include "plugins/Pitch.h"
22 #include "plugins/Notes.h"
23 #include "plugins/Tempo.h"
24 #include "plugins/Silence.h"
25
26 template <typename P>
27 class VersionedPluginAdapter : public Vamp::PluginAdapterBase
28 {
29 public:
30     VersionedPluginAdapter(unsigned int v) : PluginAdapterBase(), m_v(v) { }
31     virtual ~VersionedPluginAdapter() { }
32
33 protected:
34     Vamp::Plugin *createPlugin(float inputSampleRate) {
35         P *p = new P(inputSampleRate, m_v);
36         Vamp::Plugin *plugin = dynamic_cast<Vamp::Plugin *>(p);
37         return plugin;
38     }
39     unsigned int m_v;
40 };
41
42 static Vamp::PluginAdapter<Onset> onsetAdapter;
43 static Vamp::PluginAdapter<Pitch> pitchAdapter;
44 static Vamp::PluginAdapter<Tempo> tempoAdapter;
45
46 // These two plugins both benefit from the Vamp v2 API if available
47 static VersionedPluginAdapter<Notes> *notesAdapter = 0;
48 static VersionedPluginAdapter<Silence> *silenceAdapter = 0;
49
50 struct Tidy
51 {
52     ~Tidy() { delete notesAdapter; delete silenceAdapter; }
53 };
54 static Tidy tidy;
55
56 const VampPluginDescriptor *vampGetPluginDescriptor(unsigned int vampApiVersion,
57                                                     unsigned int index)
58 {
59     if (vampApiVersion < 1) return 0;
60
61     switch (index) {
62     case  0: return onsetAdapter.getDescriptor();
63     case  1: return pitchAdapter.getDescriptor();
64     case  3: return tempoAdapter.getDescriptor();
65
66     case  2: 
67         if (!notesAdapter) {
68             notesAdapter = new VersionedPluginAdapter<Notes>(vampApiVersion);
69         }
70         return notesAdapter->getDescriptor();
71
72     case  4:
73         if (!silenceAdapter) {
74             silenceAdapter = new VersionedPluginAdapter<Silence>(vampApiVersion);
75         }
76         return silenceAdapter->getDescriptor();
77
78     default: return 0;
79     }
80 }
81