Chris@58
|
1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
|
Chris@58
|
2
|
Chris@58
|
3 /*
|
Chris@58
|
4 Sonic Visualiser
|
Chris@58
|
5 An audio file viewer and annotation editor.
|
Chris@58
|
6 Centre for Digital Music, Queen Mary, University of London.
|
Chris@58
|
7 This file copyright 2006 Chris Cannam.
|
Chris@58
|
8
|
Chris@58
|
9 This program is free software; you can redistribute it and/or
|
Chris@58
|
10 modify it under the terms of the GNU General Public License as
|
Chris@58
|
11 published by the Free Software Foundation; either version 2 of the
|
Chris@58
|
12 License, or (at your option) any later version. See the file
|
Chris@58
|
13 COPYING included with this distribution for more information.
|
Chris@58
|
14 */
|
Chris@58
|
15
|
Chris@58
|
16 #ifndef _FEATURE_EXTRACTION_PLUGIN_ADAPTER_H_
|
Chris@58
|
17 #define _FEATURE_EXTRACTION_PLUGIN_ADAPTER_H_
|
Chris@58
|
18
|
Chris@58
|
19 #include "api/svp.h"
|
Chris@58
|
20 #include "FeatureExtractionPlugin.h"
|
Chris@58
|
21
|
Chris@58
|
22 #include <map>
|
Chris@58
|
23
|
Chris@60
|
24 class FeatureExtractionPluginAdapterBase
|
Chris@58
|
25 {
|
Chris@58
|
26 public:
|
Chris@60
|
27 virtual ~FeatureExtractionPluginAdapterBase();
|
Chris@60
|
28 const SVPPluginDescriptor *getDescriptor();
|
Chris@58
|
29
|
Chris@58
|
30 protected:
|
Chris@60
|
31 FeatureExtractionPluginAdapterBase();
|
Chris@60
|
32
|
Chris@60
|
33 virtual FeatureExtractionPlugin *createPlugin(float inputSampleRate) = 0;
|
Chris@60
|
34
|
Chris@58
|
35 static SVPPluginHandle svpInstantiate(const SVPPluginDescriptor *desc,
|
Chris@60
|
36 float inputSampleRate);
|
Chris@58
|
37
|
Chris@60
|
38 static void svpCleanup(SVPPluginHandle handle);
|
Chris@58
|
39
|
Chris@58
|
40 static int svpInitialise(SVPPluginHandle handle, unsigned int channels,
|
Chris@60
|
41 unsigned int stepSize, unsigned int blockSize);
|
Chris@58
|
42
|
Chris@60
|
43 static void svpReset(SVPPluginHandle handle);
|
Chris@58
|
44
|
Chris@60
|
45 static float svpGetParameter(SVPPluginHandle handle, int param);
|
Chris@60
|
46 static void svpSetParameter(SVPPluginHandle handle, int param, float value);
|
Chris@58
|
47
|
Chris@60
|
48 static unsigned int svpGetCurrentProgram(SVPPluginHandle handle);
|
Chris@60
|
49 static void svpSelectProgram(SVPPluginHandle handle, unsigned int program);
|
Chris@58
|
50
|
Chris@60
|
51 static unsigned int svpGetPreferredStepSize(SVPPluginHandle handle);
|
Chris@60
|
52 static unsigned int svpGetPreferredBlockSize(SVPPluginHandle handle);
|
Chris@60
|
53 static unsigned int svpGetMinChannelCount(SVPPluginHandle handle);
|
Chris@60
|
54 static unsigned int svpGetMaxChannelCount(SVPPluginHandle handle);
|
Chris@58
|
55
|
Chris@60
|
56 static unsigned int svpGetOutputCount(SVPPluginHandle handle);
|
Chris@58
|
57
|
Chris@58
|
58 static SVPOutputDescriptor *svpGetOutputDescriptor(SVPPluginHandle handle,
|
Chris@60
|
59 unsigned int i);
|
Chris@58
|
60
|
Chris@60
|
61 static void svpReleaseOutputDescriptor(SVPOutputDescriptor *desc);
|
Chris@58
|
62
|
Chris@58
|
63 static SVPFeatureList **svpProcess(SVPPluginHandle handle,
|
Chris@58
|
64 float **inputBuffers,
|
Chris@58
|
65 int sec,
|
Chris@60
|
66 int nsec);
|
Chris@58
|
67
|
Chris@60
|
68 static SVPFeatureList **svpGetRemainingFeatures(SVPPluginHandle handle);
|
Chris@58
|
69
|
Chris@60
|
70 static void svpReleaseFeatureSet(SVPFeatureList **fs);
|
Chris@58
|
71
|
Chris@60
|
72 void cleanup(FeatureExtractionPlugin *plugin);
|
Chris@60
|
73 void checkOutputMap(FeatureExtractionPlugin *plugin);
|
Chris@60
|
74 unsigned int getOutputCount(FeatureExtractionPlugin *plugin);
|
Chris@60
|
75 SVPOutputDescriptor *getOutputDescriptor(FeatureExtractionPlugin *plugin,
|
Chris@60
|
76 unsigned int i);
|
Chris@60
|
77 SVPFeatureList **process(FeatureExtractionPlugin *plugin,
|
Chris@60
|
78 float **inputBuffers,
|
Chris@60
|
79 int sec, int nsec);
|
Chris@60
|
80 SVPFeatureList **getRemainingFeatures(FeatureExtractionPlugin *plugin);
|
Chris@60
|
81 SVPFeatureList **convertFeatures(const FeatureExtractionPlugin::FeatureSet &features);
|
Chris@60
|
82
|
Chris@60
|
83 typedef std::map<const void *, FeatureExtractionPluginAdapterBase *> AdapterMap;
|
Chris@60
|
84 static AdapterMap m_adapterMap;
|
Chris@60
|
85 static FeatureExtractionPluginAdapterBase *lookupAdapter(SVPPluginHandle);
|
Chris@58
|
86
|
Chris@60
|
87 bool m_populated;
|
Chris@58
|
88 SVPPluginDescriptor m_descriptor;
|
Chris@58
|
89 FeatureExtractionPlugin::ParameterList m_parameters;
|
Chris@58
|
90 FeatureExtractionPlugin::ProgramList m_programs;
|
Chris@60
|
91
|
Chris@60
|
92 typedef std::map<FeatureExtractionPlugin *,
|
Chris@60
|
93 FeatureExtractionPlugin::OutputList *> OutputMap;
|
Chris@58
|
94 OutputMap m_pluginOutputs;
|
Chris@58
|
95
|
Chris@60
|
96 typedef std::map<FeatureExtractionPlugin *,
|
Chris@60
|
97 SVPFeature ***> FeatureBufferMap;
|
Chris@58
|
98 FeatureBufferMap m_pluginFeatures;
|
Chris@58
|
99 };
|
Chris@58
|
100
|
Chris@58
|
101 template <typename Plugin>
|
Chris@60
|
102 class FeatureExtractionPluginAdapter : public FeatureExtractionPluginAdapterBase
|
Chris@60
|
103 {
|
Chris@60
|
104 public:
|
Chris@60
|
105 FeatureExtractionPluginAdapter() : FeatureExtractionPluginAdapterBase() { }
|
Chris@60
|
106 ~FeatureExtractionPluginAdapter() { }
|
Chris@60
|
107
|
Chris@60
|
108 protected:
|
Chris@60
|
109 FeatureExtractionPlugin *createPlugin(float inputSampleRate) {
|
Chris@60
|
110 Plugin *plugin = new Plugin(inputSampleRate);
|
Chris@60
|
111 FeatureExtractionPlugin *fep =
|
Chris@60
|
112 dynamic_cast<FeatureExtractionPlugin *>(plugin);
|
Chris@60
|
113 if (!fep) {
|
Chris@60
|
114 std::cerr << "ERROR: FeatureExtractionPlugin::createPlugin: "
|
Chris@60
|
115 << "Plugin is not a feature extraction plugin"
|
Chris@60
|
116 << std::endl;
|
Chris@60
|
117 delete plugin;
|
Chris@60
|
118 return 0;
|
Chris@60
|
119 }
|
Chris@60
|
120 return fep;
|
Chris@60
|
121 }
|
Chris@60
|
122 };
|
Chris@60
|
123
|
Chris@58
|
124
|
Chris@58
|
125 #endif
|
Chris@58
|
126
|