annotate VampTestPlugin.cpp @ 4:6ece30ceb931

Output something on all outputs defined so far
author Chris Cannam
date Mon, 25 Mar 2013 22:46:17 +0000
parents 72c80798371e
children d83566810b96
rev   line source
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@4 195 d.binCount = 10;
Chris@2 196 d.hasKnownExtents = false;
Chris@2 197 d.isQuantized = false;
Chris@4 198 d.sampleType = OutputDescriptor::OneSamplePerStep;
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@4 209 d.binCount = 10;
Chris@2 210 d.hasKnownExtents = false;
Chris@2 211 d.isQuantized = false;
Chris@4 212 d.sampleType = OutputDescriptor::FixedSampleRate;
Chris@4 213 d.sampleRate = 2;
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@4 266 static Vamp::Plugin::Feature
Chris@4 267 timedCurveValue(RealTime r, int i, int n)
Chris@4 268 {
Chris@4 269 std::stringstream s;
Chris@4 270 Vamp::Plugin::Feature f;
Chris@4 271 f.hasTimestamp = true;
Chris@4 272 f.timestamp = r;
Chris@4 273 f.hasDuration = false;
Chris@4 274 float v = float(i) / float(n);
Chris@4 275 f.values.push_back(v);
Chris@4 276 s << i+1 << " of " << n << ": " << v << " at " << r.toText();
Chris@4 277 f.label = s.str();
Chris@4 278 return f;
Chris@4 279 }
Chris@4 280
Chris@4 281 static Vamp::Plugin::Feature
Chris@4 282 gridColumn(RealTime r, int i, int n)
Chris@4 283 {
Chris@4 284 std::stringstream s;
Chris@4 285 Vamp::Plugin::Feature f;
Chris@4 286 f.hasTimestamp = false;
Chris@4 287 f.hasDuration = false;
Chris@4 288 for (int j = 0; j < 10; ++j) {
Chris@4 289 float v = float(j + i + 2) / float(n + 10);
Chris@4 290 f.values.push_back(v);
Chris@4 291 }
Chris@4 292 s << i+1 << " of " << n << " at " << r.toText();
Chris@4 293 f.label = s.str();
Chris@4 294 return f;
Chris@4 295 }
Chris@4 296
Chris@0 297 VampTestPlugin::FeatureSet
Chris@3 298 VampTestPlugin::process(const float *const *inputBuffers, RealTime timestamp)
Chris@0 299 {
Chris@3 300 FeatureSet fs;
Chris@3 301
Chris@3 302 RealTime endTime = timestamp + RealTime::frame2RealTime
Chris@3 303 (m_stepSize, m_inputSampleRate);
Chris@3 304
Chris@3 305 for (int i = 0; i < (int)m_instants.size(); ++i) {
Chris@3 306 if (m_instants[i] >= timestamp && m_instants[i] < endTime) {
Chris@3 307 // instants output
Chris@3 308 fs[0].push_back(instant(m_instants[i], i, m_instants.size()));
Chris@3 309 }
Chris@4 310
Chris@4 311 RealTime variCurveTime = m_instants[i] / 2;
Chris@4 312 if (variCurveTime >= timestamp && variCurveTime < endTime) {
Chris@4 313 // curve-vsr output
Chris@4 314 fs[3].push_back(timedCurveValue(variCurveTime, i, m_instants.size()));
Chris@4 315 }
Chris@3 316 }
Chris@3 317
Chris@3 318 if (m_n < 20) {
Chris@3 319 // curve-oss output
Chris@3 320 fs[1].push_back(untimedCurveValue(timestamp, m_n, 20));
Chris@3 321 }
Chris@3 322
Chris@3 323 if (m_n < 5) {
Chris@3 324 // curve-fsr output
Chris@3 325 fs[2].push_back(untimedCurveValue(RealTime::fromSeconds(m_n / 2.0), m_n, 10));
Chris@3 326 }
Chris@3 327
Chris@4 328 if (m_n < 20) {
Chris@4 329 // grid-oss output
Chris@4 330 fs[4].push_back(gridColumn(timestamp, m_n, 20));
Chris@4 331 }
Chris@4 332
Chris@3 333 m_lastTime = endTime;
Chris@3 334 m_n = m_n + 1;
Chris@3 335 return fs;
Chris@0 336 }
Chris@0 337
Chris@0 338 VampTestPlugin::FeatureSet
Chris@0 339 VampTestPlugin::getRemainingFeatures()
Chris@0 340 {
Chris@3 341 FeatureSet fs;
Chris@3 342
Chris@3 343 for (int i = 0; i < (int)m_instants.size(); ++i) {
Chris@3 344 if (m_instants[i] >= m_lastTime) {
Chris@4 345 // instants output
Chris@3 346 fs[0].push_back(instant(m_instants[i], i, m_instants.size()));
Chris@3 347 }
Chris@4 348
Chris@4 349 RealTime variCurveTime = m_instants[i] / 2;
Chris@4 350 if (variCurveTime >= m_lastTime) {
Chris@4 351 // curve-vsr output
Chris@4 352 fs[3].push_back(timedCurveValue(m_instants[i], i, m_instants.size()));
Chris@4 353 }
Chris@3 354 }
Chris@3 355
Chris@3 356 for (int i = (m_n > 5 ? 5 : m_n); i < 10; ++i) {
Chris@3 357 // curve-fsr output
Chris@3 358 fs[2].push_back(untimedCurveValue(RealTime::fromSeconds(i / 2.0), i, 10));
Chris@3 359 }
Chris@3 360
Chris@4 361 for (int i = (m_n > 5 ? 5 : m_n); i < 10; ++i) {
Chris@4 362 // grid-fsr output
Chris@4 363 fs[5].push_back(gridColumn(RealTime::fromSeconds(i / 2.0), i, 10));
Chris@4 364 }
Chris@4 365
Chris@3 366 return fs;
Chris@0 367 }
Chris@0 368