Chris@0
|
1
|
Chris@0
|
2
|
Chris@0
|
3 #include "VampTestPlugin.h"
|
Chris@0
|
4
|
Chris@3
|
5 #include <sstream>
|
Chris@3
|
6
|
Chris@3
|
7 using std::stringstream;
|
Chris@3
|
8
|
Chris@3
|
9 using Vamp::RealTime;
|
Chris@0
|
10
|
Chris@0
|
11 VampTestPlugin::VampTestPlugin(float inputSampleRate) :
|
Chris@3
|
12 Plugin(inputSampleRate),
|
Chris@3
|
13 m_n(0),
|
Chris@3
|
14 m_stepSize(0),
|
Chris@3
|
15 m_blockSize(0)
|
Chris@0
|
16 {
|
Chris@3
|
17 for (int i = 0; i < 10; ++i) {
|
Chris@3
|
18 m_instants.push_back(RealTime::fromSeconds(1.5 * i));
|
Chris@3
|
19 }
|
Chris@0
|
20 }
|
Chris@0
|
21
|
Chris@0
|
22 VampTestPlugin::~VampTestPlugin()
|
Chris@0
|
23 {
|
Chris@0
|
24 }
|
Chris@0
|
25
|
Chris@0
|
26 string
|
Chris@0
|
27 VampTestPlugin::getIdentifier() const
|
Chris@0
|
28 {
|
Chris@0
|
29 return "vamp-test-plugin";
|
Chris@0
|
30 }
|
Chris@0
|
31
|
Chris@0
|
32 string
|
Chris@0
|
33 VampTestPlugin::getName() const
|
Chris@0
|
34 {
|
Chris@0
|
35 return "Vamp Test Plugin";
|
Chris@0
|
36 }
|
Chris@0
|
37
|
Chris@0
|
38 string
|
Chris@0
|
39 VampTestPlugin::getDescription() const
|
Chris@0
|
40 {
|
Chris@0
|
41 return "Test plugin for hosts handling various output types";
|
Chris@0
|
42 }
|
Chris@0
|
43
|
Chris@0
|
44 string
|
Chris@0
|
45 VampTestPlugin::getMaker() const
|
Chris@0
|
46 {
|
Chris@0
|
47 return "Chris Cannam";
|
Chris@0
|
48 }
|
Chris@0
|
49
|
Chris@0
|
50 int
|
Chris@0
|
51 VampTestPlugin::getPluginVersion() const
|
Chris@0
|
52 {
|
Chris@0
|
53 return 1;
|
Chris@0
|
54 }
|
Chris@0
|
55
|
Chris@0
|
56 string
|
Chris@0
|
57 VampTestPlugin::getCopyright() const
|
Chris@0
|
58 {
|
Chris@0
|
59 return "BSD";
|
Chris@0
|
60 }
|
Chris@0
|
61
|
Chris@0
|
62 VampTestPlugin::InputDomain
|
Chris@0
|
63 VampTestPlugin::getInputDomain() const
|
Chris@0
|
64 {
|
Chris@0
|
65 return TimeDomain;
|
Chris@0
|
66 }
|
Chris@0
|
67
|
Chris@0
|
68 size_t
|
Chris@0
|
69 VampTestPlugin::getPreferredBlockSize() const
|
Chris@0
|
70 {
|
Chris@0
|
71 return 0;
|
Chris@0
|
72 }
|
Chris@0
|
73
|
Chris@0
|
74 size_t
|
Chris@0
|
75 VampTestPlugin::getPreferredStepSize() const
|
Chris@0
|
76 {
|
Chris@0
|
77 return 0;
|
Chris@0
|
78 }
|
Chris@0
|
79
|
Chris@0
|
80 size_t
|
Chris@0
|
81 VampTestPlugin::getMinChannelCount() const
|
Chris@0
|
82 {
|
Chris@0
|
83 return 1;
|
Chris@0
|
84 }
|
Chris@0
|
85
|
Chris@0
|
86 size_t
|
Chris@0
|
87 VampTestPlugin::getMaxChannelCount() const
|
Chris@0
|
88 {
|
Chris@0
|
89 return 1;
|
Chris@0
|
90 }
|
Chris@0
|
91
|
Chris@0
|
92 VampTestPlugin::ParameterList
|
Chris@0
|
93 VampTestPlugin::getParameterDescriptors() const
|
Chris@0
|
94 {
|
Chris@0
|
95 ParameterList list;
|
Chris@0
|
96 return list;
|
Chris@0
|
97 }
|
Chris@0
|
98
|
Chris@0
|
99 float
|
Chris@0
|
100 VampTestPlugin::getParameter(string identifier) const
|
Chris@0
|
101 {
|
Chris@0
|
102 return 0;
|
Chris@0
|
103 }
|
Chris@0
|
104
|
Chris@0
|
105 void
|
Chris@0
|
106 VampTestPlugin::setParameter(string identifier, float value)
|
Chris@0
|
107 {
|
Chris@0
|
108 }
|
Chris@0
|
109
|
Chris@0
|
110 VampTestPlugin::ProgramList
|
Chris@0
|
111 VampTestPlugin::getPrograms() const
|
Chris@0
|
112 {
|
Chris@0
|
113 ProgramList list;
|
Chris@0
|
114 return list;
|
Chris@0
|
115 }
|
Chris@0
|
116
|
Chris@0
|
117 string
|
Chris@0
|
118 VampTestPlugin::getCurrentProgram() const
|
Chris@0
|
119 {
|
Chris@0
|
120 return ""; // no programs
|
Chris@0
|
121 }
|
Chris@0
|
122
|
Chris@0
|
123 void
|
Chris@0
|
124 VampTestPlugin::selectProgram(string name)
|
Chris@0
|
125 {
|
Chris@0
|
126 }
|
Chris@0
|
127
|
Chris@0
|
128 VampTestPlugin::OutputList
|
Chris@0
|
129 VampTestPlugin::getOutputDescriptors() const
|
Chris@0
|
130 {
|
Chris@0
|
131 OutputList list;
|
Chris@0
|
132
|
Chris@0
|
133 OutputDescriptor d;
|
Chris@1
|
134
|
Chris@3
|
135 // 0 -> instants
|
Chris@1
|
136 d.identifier = "instants";
|
Chris@1
|
137 d.name = "Instants";
|
Chris@2
|
138 d.description = "Single time points without values";
|
Chris@1
|
139 d.unit = "";
|
Chris@1
|
140 d.hasFixedBinCount = true;
|
Chris@1
|
141 d.binCount = 0;
|
Chris@1
|
142 d.hasKnownExtents = false;
|
Chris@1
|
143 d.isQuantized = false;
|
Chris@1
|
144 d.sampleType = OutputDescriptor::VariableSampleRate;
|
Chris@1
|
145 d.hasDuration = false;
|
Chris@1
|
146 list.push_back(d);
|
Chris@1
|
147
|
Chris@3
|
148 // 1 -> curve-oss
|
Chris@1
|
149 d.identifier = "curve-oss";
|
Chris@1
|
150 d.name = "Curve: OneSamplePerStep";
|
Chris@2
|
151 d.description = "A time series with one value per process block";
|
Chris@0
|
152 d.unit = "";
|
Chris@0
|
153 d.hasFixedBinCount = true;
|
Chris@0
|
154 d.binCount = 1;
|
Chris@0
|
155 d.hasKnownExtents = false;
|
Chris@0
|
156 d.isQuantized = false;
|
Chris@0
|
157 d.sampleType = OutputDescriptor::OneSamplePerStep;
|
Chris@0
|
158 d.hasDuration = false;
|
Chris@0
|
159 list.push_back(d);
|
Chris@0
|
160
|
Chris@3
|
161 // 2 -> curve-fsr
|
Chris@1
|
162 d.identifier = "curve-fsr";
|
Chris@1
|
163 d.name = "Curve: FixedSampleRate";
|
Chris@2
|
164 d.description = "A time series with equally-spaced values (independent of process step size)";
|
Chris@1
|
165 d.unit = "";
|
Chris@1
|
166 d.hasFixedBinCount = true;
|
Chris@1
|
167 d.binCount = 1;
|
Chris@1
|
168 d.hasKnownExtents = false;
|
Chris@1
|
169 d.isQuantized = false;
|
Chris@1
|
170 d.sampleType = OutputDescriptor::FixedSampleRate;
|
Chris@3
|
171 d.sampleRate = 2;
|
Chris@1
|
172 d.hasDuration = false;
|
Chris@1
|
173 list.push_back(d);
|
Chris@1
|
174
|
Chris@3
|
175 // 3 -> curve-vsr
|
Chris@1
|
176 d.identifier = "curve-vsr";
|
Chris@1
|
177 d.name = "Curve: VariableSampleRate";
|
Chris@2
|
178 d.description = "A variably-spaced series of values";
|
Chris@1
|
179 d.unit = "";
|
Chris@1
|
180 d.hasFixedBinCount = true;
|
Chris@1
|
181 d.binCount = 1;
|
Chris@1
|
182 d.hasKnownExtents = false;
|
Chris@1
|
183 d.isQuantized = false;
|
Chris@1
|
184 d.sampleType = OutputDescriptor::VariableSampleRate;
|
Chris@2
|
185 d.sampleRate = 0;
|
Chris@1
|
186 d.hasDuration = false;
|
Chris@1
|
187 list.push_back(d);
|
Chris@1
|
188
|
Chris@3
|
189 // 4 -> grid-oss
|
Chris@2
|
190 d.identifier = "grid-oss";
|
Chris@2
|
191 d.name = "Grid: OneSamplePerStep";
|
Chris@2
|
192 d.description = "A fixed-height grid of values with one column per process block";
|
Chris@2
|
193 d.unit = "";
|
Chris@2
|
194 d.hasFixedBinCount = true;
|
Chris@2
|
195 d.binCount = 1;
|
Chris@2
|
196 d.hasKnownExtents = false;
|
Chris@2
|
197 d.isQuantized = false;
|
Chris@2
|
198 d.sampleType = OutputDescriptor::VariableSampleRate;
|
Chris@2
|
199 d.sampleRate = 0;
|
Chris@2
|
200 d.hasDuration = false;
|
Chris@2
|
201 list.push_back(d);
|
Chris@2
|
202
|
Chris@3
|
203 // 5 -> grid-fsr
|
Chris@2
|
204 d.identifier = "grid-fsr";
|
Chris@2
|
205 d.name = "Grid: FixedSampleRate";
|
Chris@2
|
206 d.description = "A fixed-height grid of values with equally-spaced columns (independent of process step size)";
|
Chris@2
|
207 d.unit = "";
|
Chris@2
|
208 d.hasFixedBinCount = true;
|
Chris@2
|
209 d.binCount = 1;
|
Chris@2
|
210 d.hasKnownExtents = false;
|
Chris@2
|
211 d.isQuantized = false;
|
Chris@2
|
212 d.sampleType = OutputDescriptor::VariableSampleRate;
|
Chris@2
|
213 d.sampleRate = 0;
|
Chris@2
|
214 d.hasDuration = false;
|
Chris@2
|
215 list.push_back(d);
|
Chris@2
|
216
|
Chris@2
|
217
|
Chris@0
|
218 return list;
|
Chris@0
|
219 }
|
Chris@0
|
220
|
Chris@0
|
221 bool
|
Chris@0
|
222 VampTestPlugin::initialise(size_t channels, size_t stepSize, size_t blockSize)
|
Chris@0
|
223 {
|
Chris@0
|
224 if (channels < getMinChannelCount() ||
|
Chris@0
|
225 channels > getMaxChannelCount()) return false;
|
Chris@0
|
226
|
Chris@3
|
227 m_stepSize = stepSize;
|
Chris@3
|
228 m_blockSize = blockSize;
|
Chris@0
|
229
|
Chris@0
|
230 return true;
|
Chris@0
|
231 }
|
Chris@0
|
232
|
Chris@0
|
233 void
|
Chris@0
|
234 VampTestPlugin::reset()
|
Chris@0
|
235 {
|
Chris@3
|
236 m_n = 0;
|
Chris@3
|
237 }
|
Chris@3
|
238
|
Chris@3
|
239 static Vamp::Plugin::Feature
|
Chris@3
|
240 instant(RealTime r, int i, int n)
|
Chris@3
|
241 {
|
Chris@3
|
242 std::stringstream s;
|
Chris@3
|
243 Vamp::Plugin::Feature f;
|
Chris@3
|
244 f.hasTimestamp = true;
|
Chris@3
|
245 f.timestamp = r;
|
Chris@3
|
246 f.hasDuration = false;
|
Chris@3
|
247 s << i+1 << " of " << n << " at " << r.toText();
|
Chris@3
|
248 f.label = s.str();
|
Chris@3
|
249 return f;
|
Chris@3
|
250 }
|
Chris@3
|
251
|
Chris@3
|
252 static Vamp::Plugin::Feature
|
Chris@3
|
253 untimedCurveValue(RealTime r, int i, int n)
|
Chris@3
|
254 {
|
Chris@3
|
255 std::stringstream s;
|
Chris@3
|
256 Vamp::Plugin::Feature f;
|
Chris@3
|
257 f.hasTimestamp = false;
|
Chris@3
|
258 f.hasDuration = false;
|
Chris@3
|
259 float v = float(i) / float(n);
|
Chris@3
|
260 f.values.push_back(v);
|
Chris@3
|
261 s << i+1 << " of " << n << ": " << v << " at " << r.toText();
|
Chris@3
|
262 f.label = s.str();
|
Chris@3
|
263 return f;
|
Chris@0
|
264 }
|
Chris@0
|
265
|
Chris@0
|
266 VampTestPlugin::FeatureSet
|
Chris@3
|
267 VampTestPlugin::process(const float *const *inputBuffers, RealTime timestamp)
|
Chris@0
|
268 {
|
Chris@3
|
269 FeatureSet fs;
|
Chris@3
|
270
|
Chris@3
|
271 RealTime endTime = timestamp + RealTime::frame2RealTime
|
Chris@3
|
272 (m_stepSize, m_inputSampleRate);
|
Chris@3
|
273
|
Chris@3
|
274 for (int i = 0; i < (int)m_instants.size(); ++i) {
|
Chris@3
|
275 if (m_instants[i] >= timestamp && m_instants[i] < endTime) {
|
Chris@3
|
276 // instants output
|
Chris@3
|
277 fs[0].push_back(instant(m_instants[i], i, m_instants.size()));
|
Chris@3
|
278 }
|
Chris@3
|
279 }
|
Chris@3
|
280
|
Chris@3
|
281 if (m_n < 20) {
|
Chris@3
|
282 // curve-oss output
|
Chris@3
|
283 fs[1].push_back(untimedCurveValue(timestamp, m_n, 20));
|
Chris@3
|
284 }
|
Chris@3
|
285
|
Chris@3
|
286 if (m_n < 5) {
|
Chris@3
|
287 // curve-fsr output
|
Chris@3
|
288 fs[2].push_back(untimedCurveValue(RealTime::fromSeconds(m_n / 2.0), m_n, 10));
|
Chris@3
|
289 }
|
Chris@3
|
290
|
Chris@3
|
291 m_lastTime = endTime;
|
Chris@3
|
292 m_n = m_n + 1;
|
Chris@3
|
293 return fs;
|
Chris@0
|
294 }
|
Chris@0
|
295
|
Chris@0
|
296 VampTestPlugin::FeatureSet
|
Chris@0
|
297 VampTestPlugin::getRemainingFeatures()
|
Chris@0
|
298 {
|
Chris@3
|
299 FeatureSet fs;
|
Chris@3
|
300
|
Chris@3
|
301 for (int i = 0; i < (int)m_instants.size(); ++i) {
|
Chris@3
|
302 if (m_instants[i] >= m_lastTime) {
|
Chris@3
|
303 fs[0].push_back(instant(m_instants[i], i, m_instants.size()));
|
Chris@3
|
304 }
|
Chris@3
|
305 }
|
Chris@3
|
306
|
Chris@3
|
307 for (int i = (m_n > 5 ? 5 : m_n); i < 10; ++i) {
|
Chris@3
|
308 // curve-fsr output
|
Chris@3
|
309 fs[2].push_back(untimedCurveValue(RealTime::fromSeconds(i / 2.0), i, 10));
|
Chris@3
|
310 }
|
Chris@3
|
311
|
Chris@3
|
312 return fs;
|
Chris@0
|
313 }
|
Chris@0
|
314
|