Chris@59
|
1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
|
Chris@59
|
2
|
Chris@59
|
3 /*
|
Chris@59
|
4 Sonic Visualiser
|
Chris@59
|
5 An audio file viewer and annotation editor.
|
Chris@59
|
6 Centre for Digital Music, Queen Mary, University of London.
|
Chris@59
|
7 This file copyright 2006 Chris Cannam.
|
Chris@59
|
8
|
Chris@59
|
9 This program is free software; you can redistribute it and/or
|
Chris@59
|
10 modify it under the terms of the GNU General Public License as
|
Chris@59
|
11 published by the Free Software Foundation; either version 2 of the
|
Chris@59
|
12 License, or (at your option) any later version. See the file
|
Chris@59
|
13 COPYING included with this distribution for more information.
|
Chris@59
|
14 */
|
Chris@59
|
15
|
Chris@59
|
16 #include "FeatureExtractionPluginHostAdapter.h"
|
Chris@59
|
17
|
Chris@59
|
18 FeatureExtractionPluginHostAdapter::FeatureExtractionPluginHostAdapter(const SVPPluginDescriptor *descriptor,
|
Chris@59
|
19 float inputSampleRate) :
|
Chris@59
|
20 FeatureExtractionPlugin(inputSampleRate),
|
Chris@59
|
21 m_descriptor(descriptor)
|
Chris@59
|
22 {
|
Chris@59
|
23 m_handle = m_descriptor->instantiate(m_descriptor, inputSampleRate);
|
Chris@59
|
24 }
|
Chris@59
|
25
|
Chris@59
|
26 FeatureExtractionPluginHostAdapter::~FeatureExtractionPluginHostAdapter()
|
Chris@59
|
27 {
|
Chris@59
|
28 if (m_handle) m_descriptor->cleanup(m_handle);
|
Chris@59
|
29 }
|
Chris@59
|
30
|
Chris@59
|
31 bool
|
Chris@59
|
32 FeatureExtractionPluginHostAdapter::initialise(size_t channels,
|
Chris@59
|
33 size_t stepSize,
|
Chris@59
|
34 size_t blockSize)
|
Chris@59
|
35 {
|
Chris@59
|
36 if (!m_handle) return false;
|
Chris@59
|
37 return m_descriptor->initialise(m_handle, channels, stepSize, blockSize) ?
|
Chris@59
|
38 true : false;
|
Chris@59
|
39 }
|
Chris@59
|
40
|
Chris@59
|
41 void
|
Chris@59
|
42 FeatureExtractionPluginHostAdapter::reset()
|
Chris@59
|
43 {
|
Chris@59
|
44 if (!m_handle) return;
|
Chris@59
|
45 m_descriptor->reset(m_handle);
|
Chris@59
|
46 }
|
Chris@59
|
47
|
Chris@59
|
48 std::string
|
Chris@59
|
49 FeatureExtractionPluginHostAdapter::getName() const
|
Chris@59
|
50 {
|
Chris@59
|
51 return m_descriptor->name;
|
Chris@59
|
52 }
|
Chris@59
|
53
|
Chris@59
|
54 std::string
|
Chris@59
|
55 FeatureExtractionPluginHostAdapter::getDescription() const
|
Chris@59
|
56 {
|
Chris@59
|
57 return m_descriptor->description;
|
Chris@59
|
58 }
|
Chris@59
|
59
|
Chris@59
|
60 std::string
|
Chris@59
|
61 FeatureExtractionPluginHostAdapter::getMaker() const
|
Chris@59
|
62 {
|
Chris@59
|
63 return m_descriptor->maker;
|
Chris@59
|
64 }
|
Chris@59
|
65
|
Chris@59
|
66 int
|
Chris@59
|
67 FeatureExtractionPluginHostAdapter::getPluginVersion() const
|
Chris@59
|
68 {
|
Chris@59
|
69 return m_descriptor->pluginVersion;
|
Chris@59
|
70 }
|
Chris@59
|
71
|
Chris@59
|
72 std::string
|
Chris@59
|
73 FeatureExtractionPluginHostAdapter::getCopyright() const
|
Chris@59
|
74 {
|
Chris@59
|
75 return m_descriptor->copyright;
|
Chris@59
|
76 }
|
Chris@59
|
77
|
Chris@59
|
78 FeatureExtractionPluginHostAdapter::ParameterList
|
Chris@59
|
79 FeatureExtractionPluginHostAdapter::getParameterDescriptors() const
|
Chris@59
|
80 {
|
Chris@60
|
81 ParameterList list;
|
Chris@60
|
82 for (unsigned int i = 0; i < m_descriptor->parameterCount; ++i) {
|
Chris@60
|
83 const SVPParameterDescriptor *spd = m_descriptor->parameters[i];
|
Chris@60
|
84 ParameterDescriptor pd;
|
Chris@60
|
85 pd.name = spd->name;
|
Chris@60
|
86 pd.description = spd->description;
|
Chris@60
|
87 pd.unit = spd->unit;
|
Chris@60
|
88 pd.minValue = spd->minValue;
|
Chris@60
|
89 pd.maxValue = spd->maxValue;
|
Chris@60
|
90 pd.defaultValue = spd->defaultValue;
|
Chris@60
|
91 pd.isQuantized = spd->isQuantized;
|
Chris@60
|
92 pd.quantizeStep = spd->quantizeStep;
|
Chris@60
|
93 list.push_back(pd);
|
Chris@60
|
94 }
|
Chris@60
|
95 return list;
|
Chris@59
|
96 }
|
Chris@59
|
97
|
Chris@59
|
98 float
|
Chris@59
|
99 FeatureExtractionPluginHostAdapter::getParameter(std::string param) const
|
Chris@59
|
100 {
|
Chris@60
|
101 if (!m_handle) return 0.0;
|
Chris@60
|
102
|
Chris@60
|
103 for (unsigned int i = 0; i < m_descriptor->parameterCount; ++i) {
|
Chris@60
|
104 if (param == m_descriptor->parameters[i]->name) {
|
Chris@60
|
105 return m_descriptor->getParameter(m_handle, i);
|
Chris@60
|
106 }
|
Chris@60
|
107 }
|
Chris@60
|
108
|
Chris@59
|
109 return 0.0;
|
Chris@59
|
110 }
|
Chris@59
|
111
|
Chris@59
|
112 void
|
Chris@59
|
113 FeatureExtractionPluginHostAdapter::setParameter(std::string param,
|
Chris@59
|
114 float value)
|
Chris@59
|
115 {
|
Chris@60
|
116 if (!m_handle) return;
|
Chris@60
|
117
|
Chris@60
|
118 for (unsigned int i = 0; i < m_descriptor->parameterCount; ++i) {
|
Chris@60
|
119 if (param == m_descriptor->parameters[i]->name) {
|
Chris@60
|
120 m_descriptor->setParameter(m_handle, i, value);
|
Chris@60
|
121 return;
|
Chris@60
|
122 }
|
Chris@60
|
123 }
|
Chris@59
|
124 }
|
Chris@59
|
125
|
Chris@59
|
126 FeatureExtractionPluginHostAdapter::ProgramList
|
Chris@59
|
127 FeatureExtractionPluginHostAdapter::getPrograms() const
|
Chris@59
|
128 {
|
Chris@60
|
129 ProgramList list;
|
Chris@60
|
130
|
Chris@60
|
131 for (unsigned int i = 0; i < m_descriptor->programCount; ++i) {
|
Chris@60
|
132 list.push_back(m_descriptor->programs[i]);
|
Chris@60
|
133 }
|
Chris@60
|
134
|
Chris@60
|
135 return list;
|
Chris@59
|
136 }
|
Chris@59
|
137
|
Chris@59
|
138 std::string
|
Chris@59
|
139 FeatureExtractionPluginHostAdapter::getCurrentProgram() const
|
Chris@59
|
140 {
|
Chris@60
|
141 if (!m_handle) return "";
|
Chris@60
|
142
|
Chris@60
|
143 int pn = m_descriptor->getCurrentProgram(m_handle);
|
Chris@60
|
144 return m_descriptor->programs[pn];
|
Chris@59
|
145 }
|
Chris@59
|
146
|
Chris@59
|
147 void
|
Chris@59
|
148 FeatureExtractionPluginHostAdapter::selectProgram(std::string program)
|
Chris@59
|
149 {
|
Chris@60
|
150 if (!m_handle) return;
|
Chris@60
|
151
|
Chris@60
|
152 for (unsigned int i = 0; i < m_descriptor->programCount; ++i) {
|
Chris@60
|
153 if (program == m_descriptor->programs[i]) {
|
Chris@60
|
154 m_descriptor->selectProgram(m_handle, i);
|
Chris@60
|
155 return;
|
Chris@60
|
156 }
|
Chris@60
|
157 }
|
Chris@59
|
158 }
|
Chris@59
|
159
|
Chris@59
|
160 size_t
|
Chris@59
|
161 FeatureExtractionPluginHostAdapter::getPreferredStepSize() const
|
Chris@59
|
162 {
|
Chris@59
|
163 if (!m_handle) return 0;
|
Chris@59
|
164 return m_descriptor->getPreferredStepSize(m_handle);
|
Chris@59
|
165 }
|
Chris@59
|
166
|
Chris@59
|
167 size_t
|
Chris@59
|
168 FeatureExtractionPluginHostAdapter::getPreferredBlockSize() const
|
Chris@59
|
169 {
|
Chris@59
|
170 if (!m_handle) return 0;
|
Chris@59
|
171 return m_descriptor->getPreferredBlockSize(m_handle);
|
Chris@59
|
172 }
|
Chris@59
|
173
|
Chris@59
|
174 FeatureExtractionPluginHostAdapter::OutputList
|
Chris@59
|
175 FeatureExtractionPluginHostAdapter::getOutputDescriptors() const
|
Chris@59
|
176 {
|
Chris@60
|
177 OutputList list;
|
Chris@60
|
178 if (!m_handle) return list;
|
Chris@60
|
179
|
Chris@60
|
180 unsigned int count = m_descriptor->getOutputCount(m_handle);
|
Chris@60
|
181
|
Chris@60
|
182 for (unsigned int i = 0; i < count; ++i) {
|
Chris@60
|
183 SVPOutputDescriptor *sd = m_descriptor->getOutputDescriptor(m_handle, i);
|
Chris@60
|
184 OutputDescriptor d;
|
Chris@60
|
185 d.name = sd->name;
|
Chris@60
|
186 d.description = sd->description;
|
Chris@60
|
187 d.unit = sd->unit;
|
Chris@60
|
188 d.hasFixedValueCount = sd->hasFixedValueCount;
|
Chris@60
|
189 d.valueCount = sd->valueCount;
|
Chris@60
|
190 for (unsigned int j = 0; j < sd->valueCount; ++j) {
|
Chris@60
|
191 d.valueNames.push_back(sd->valueNames[i]);
|
Chris@60
|
192 }
|
Chris@60
|
193 d.hasKnownExtents = sd->hasKnownExtents;
|
Chris@60
|
194 d.minValue = sd->minValue;
|
Chris@60
|
195 d.maxValue = sd->maxValue;
|
Chris@60
|
196 d.isQuantized = sd->isQuantized;
|
Chris@60
|
197 d.quantizeStep = sd->quantizeStep;
|
Chris@60
|
198
|
Chris@60
|
199 switch (sd->sampleType) {
|
Chris@60
|
200 case svpOneSamplePerStep:
|
Chris@60
|
201 d.sampleType = OutputDescriptor::OneSamplePerStep; break;
|
Chris@60
|
202 case svpFixedSampleRate:
|
Chris@60
|
203 d.sampleType = OutputDescriptor::FixedSampleRate; break;
|
Chris@60
|
204 case svpVariableSampleRate:
|
Chris@60
|
205 d.sampleType = OutputDescriptor::VariableSampleRate; break;
|
Chris@60
|
206 }
|
Chris@60
|
207
|
Chris@60
|
208 d.sampleRate = sd->sampleRate;
|
Chris@60
|
209
|
Chris@60
|
210 list.push_back(d);
|
Chris@60
|
211
|
Chris@60
|
212 m_descriptor->releaseOutputDescriptor(sd);
|
Chris@60
|
213 }
|
Chris@60
|
214
|
Chris@60
|
215 return list;
|
Chris@59
|
216 }
|
Chris@59
|
217
|
Chris@59
|
218 FeatureExtractionPluginHostAdapter::FeatureSet
|
Chris@59
|
219 FeatureExtractionPluginHostAdapter::process(float **inputBuffers,
|
Chris@59
|
220 RealTime timestamp)
|
Chris@59
|
221 {
|
Chris@60
|
222 FeatureSet fs;
|
Chris@60
|
223 if (!m_handle) return fs;
|
Chris@60
|
224
|
Chris@60
|
225 int sec = timestamp.sec;
|
Chris@60
|
226 int nsec = timestamp.nsec;
|
Chris@60
|
227
|
Chris@60
|
228 SVPFeatureList **features = m_descriptor->process(m_handle,
|
Chris@60
|
229 inputBuffers,
|
Chris@60
|
230 sec, nsec);
|
Chris@60
|
231
|
Chris@60
|
232 convertFeatures(features, fs);
|
Chris@60
|
233 m_descriptor->releaseFeatureSet(features);
|
Chris@60
|
234 return fs;
|
Chris@59
|
235 }
|
Chris@59
|
236
|
Chris@59
|
237 FeatureExtractionPluginHostAdapter::FeatureSet
|
Chris@59
|
238 FeatureExtractionPluginHostAdapter::getRemainingFeatures()
|
Chris@59
|
239 {
|
Chris@60
|
240 FeatureSet fs;
|
Chris@60
|
241 if (!m_handle) return fs;
|
Chris@60
|
242
|
Chris@60
|
243 SVPFeatureList **features = m_descriptor->getRemainingFeatures(m_handle);
|
Chris@60
|
244
|
Chris@60
|
245 convertFeatures(features, fs);
|
Chris@60
|
246 m_descriptor->releaseFeatureSet(features);
|
Chris@60
|
247 return fs;
|
Chris@59
|
248 }
|
Chris@59
|
249
|
Chris@60
|
250 void
|
Chris@60
|
251 FeatureExtractionPluginHostAdapter::convertFeatures(SVPFeatureList **features,
|
Chris@60
|
252 FeatureSet &fs)
|
Chris@60
|
253 {
|
Chris@60
|
254 for (unsigned int i = 0; features[i]; ++i) {
|
Chris@60
|
255
|
Chris@60
|
256 SVPFeatureList &list = *features[i];
|
Chris@60
|
257
|
Chris@60
|
258 if (list.featureCount > 0) {
|
Chris@60
|
259
|
Chris@60
|
260 for (unsigned int j = 0; j < list.featureCount; ++j) {
|
Chris@60
|
261
|
Chris@60
|
262 Feature feature;
|
Chris@60
|
263 feature.hasTimestamp = list.features[j].hasTimestamp;
|
Chris@60
|
264 feature.timestamp = RealTime(list.features[j].sec,
|
Chris@60
|
265 list.features[j].nsec);
|
Chris@60
|
266
|
Chris@60
|
267 for (unsigned int k = 0; k < list.features[j].valueCount; ++k) {
|
Chris@60
|
268 feature.values.push_back(list.features[j].values[k]);
|
Chris@60
|
269 }
|
Chris@60
|
270
|
Chris@60
|
271 feature.label = list.features[j].label;
|
Chris@60
|
272
|
Chris@60
|
273 fs[i].push_back(feature);
|
Chris@60
|
274 }
|
Chris@60
|
275 }
|
Chris@60
|
276 }
|
Chris@60
|
277 }
|
Chris@60
|
278
|