annotate BeatRootVampPlugin.cpp @ 19:f66ed426a14f

Fix uninitialised sample rate in descriptor
author Chris Cannam
date Mon, 17 Oct 2011 13:08:19 +0100
parents 0d4048bfadbb
children 6afcb5edd7ab
rev   line source
Chris@0 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@0 2
Chris@0 3 /*
Chris@0 4 Vamp feature extraction plugin for the BeatRoot beat tracker.
Chris@0 5
Chris@0 6 Centre for Digital Music, Queen Mary, University of London.
Chris@0 7 This file copyright 2011 Simon Dixon, Chris Cannam and QMUL.
Chris@0 8
Chris@0 9 This program is free software; you can redistribute it and/or
Chris@0 10 modify it under the terms of the GNU General Public License as
Chris@0 11 published by the Free Software Foundation; either version 2 of the
Chris@0 12 License, or (at your option) any later version. See the file
Chris@0 13 COPYING included with this distribution for more information.
Chris@0 14 */
Chris@0 15
Chris@0 16 #include "BeatRootVampPlugin.h"
Chris@2 17 #include "BeatRootProcessor.h"
Chris@0 18
Chris@10 19 #include "Event.h"
Chris@10 20
Chris@10 21 #include <vamp-sdk/RealTime.h>
Chris@9 22 #include <vamp-sdk/PluginAdapter.h>
Chris@0 23
Chris@0 24 BeatRootVampPlugin::BeatRootVampPlugin(float inputSampleRate) :
Chris@0 25 Plugin(inputSampleRate)
Chris@0 26 {
Chris@0 27 m_processor = new BeatRootProcessor(inputSampleRate);
Chris@0 28 }
Chris@0 29
Chris@0 30 BeatRootVampPlugin::~BeatRootVampPlugin()
Chris@0 31 {
Chris@0 32 delete m_processor;
Chris@0 33 }
Chris@0 34
Chris@0 35 string
Chris@0 36 BeatRootVampPlugin::getIdentifier() const
Chris@0 37 {
Chris@0 38 return "beatroot";
Chris@0 39 }
Chris@0 40
Chris@0 41 string
Chris@0 42 BeatRootVampPlugin::getName() const
Chris@0 43 {
Chris@0 44 return "BeatRoot Beat Tracker";
Chris@0 45 }
Chris@0 46
Chris@0 47 string
Chris@0 48 BeatRootVampPlugin::getDescription() const
Chris@0 49 {
Chris@0 50 return "Identify beat locations in music";
Chris@0 51 }
Chris@0 52
Chris@0 53 string
Chris@0 54 BeatRootVampPlugin::getMaker() const
Chris@0 55 {
Chris@0 56 return "Simon Dixon (plugin by Chris Cannam)";
Chris@0 57 }
Chris@0 58
Chris@0 59 int
Chris@0 60 BeatRootVampPlugin::getPluginVersion() const
Chris@0 61 {
Chris@0 62 // Increment this each time you release a version that behaves
Chris@0 63 // differently from the previous one
Chris@0 64 return 1;
Chris@0 65 }
Chris@0 66
Chris@0 67 string
Chris@0 68 BeatRootVampPlugin::getCopyright() const
Chris@0 69 {
Chris@0 70 return "GPL";
Chris@0 71 }
Chris@0 72
Chris@0 73 BeatRootVampPlugin::InputDomain
Chris@0 74 BeatRootVampPlugin::getInputDomain() const
Chris@0 75 {
Chris@0 76 return FrequencyDomain;
Chris@0 77 }
Chris@0 78
Chris@0 79 size_t
Chris@0 80 BeatRootVampPlugin::getPreferredBlockSize() const
Chris@0 81 {
Chris@0 82 return m_processor->getFFTSize();
Chris@0 83 }
Chris@0 84
Chris@0 85 size_t
Chris@0 86 BeatRootVampPlugin::getPreferredStepSize() const
Chris@0 87 {
Chris@0 88 return m_processor->getHopSize();
Chris@0 89 }
Chris@0 90
Chris@0 91 size_t
Chris@0 92 BeatRootVampPlugin::getMinChannelCount() const
Chris@0 93 {
Chris@0 94 return 1;
Chris@0 95 }
Chris@0 96
Chris@0 97 size_t
Chris@0 98 BeatRootVampPlugin::getMaxChannelCount() const
Chris@0 99 {
Chris@0 100 return 1;
Chris@0 101 }
Chris@0 102
Chris@0 103 BeatRootVampPlugin::ParameterList
Chris@0 104 BeatRootVampPlugin::getParameterDescriptors() const
Chris@0 105 {
Chris@0 106 ParameterList list;
Chris@0 107 return list;
Chris@0 108 }
Chris@0 109
Chris@0 110 float
Chris@0 111 BeatRootVampPlugin::getParameter(string identifier) const
Chris@0 112 {
Chris@0 113 return 0;
Chris@0 114 }
Chris@0 115
Chris@0 116 void
Chris@0 117 BeatRootVampPlugin::setParameter(string identifier, float value)
Chris@0 118 {
Chris@0 119 }
Chris@0 120
Chris@0 121 BeatRootVampPlugin::ProgramList
Chris@0 122 BeatRootVampPlugin::getPrograms() const
Chris@0 123 {
Chris@0 124 ProgramList list;
Chris@0 125 return list;
Chris@0 126 }
Chris@0 127
Chris@0 128 string
Chris@0 129 BeatRootVampPlugin::getCurrentProgram() const
Chris@0 130 {
Chris@0 131 return ""; // no programs
Chris@0 132 }
Chris@0 133
Chris@0 134 void
Chris@0 135 BeatRootVampPlugin::selectProgram(string name)
Chris@0 136 {
Chris@0 137 }
Chris@0 138
Chris@0 139 BeatRootVampPlugin::OutputList
Chris@0 140 BeatRootVampPlugin::getOutputDescriptors() const
Chris@0 141 {
Chris@0 142 OutputList list;
Chris@0 143
Chris@0 144 // See OutputDescriptor documentation for the possibilities here.
Chris@0 145 // Every plugin must have at least one output.
Chris@0 146
Chris@0 147 OutputDescriptor d;
Chris@0 148 d.identifier = "beats";
Chris@0 149 d.name = "Beats";
Chris@0 150 d.description = "Estimated beat locations";
Chris@0 151 d.unit = "";
Chris@0 152 d.hasFixedBinCount = true;
Chris@0 153 d.binCount = 0;
Chris@0 154 d.hasKnownExtents = false;
Chris@0 155 d.isQuantized = false;
Chris@0 156 d.sampleType = OutputDescriptor::VariableSampleRate;
Chris@19 157 d.sampleRate = m_inputSampleRate;
Chris@0 158 d.hasDuration = false;
Chris@0 159 list.push_back(d);
Chris@0 160
Chris@0 161 return list;
Chris@0 162 }
Chris@0 163
Chris@0 164 bool
Chris@0 165 BeatRootVampPlugin::initialise(size_t channels, size_t stepSize, size_t blockSize)
Chris@0 166 {
Chris@0 167 if (channels < getMinChannelCount() ||
Chris@0 168 channels > getMaxChannelCount()) {
Chris@0 169 std::cerr << "BeatRootVampPlugin::initialise: Unsupported number ("
Chris@0 170 << channels << ") of channels" << std::endl;
Chris@0 171 return false;
Chris@0 172 }
Chris@0 173
Chris@0 174 if (stepSize != getPreferredStepSize()) {
Chris@0 175 std::cerr << "BeatRootVampPlugin::initialise: Unsupported step size "
Chris@0 176 << "for sample rate (" << stepSize << ", required step is "
Chris@0 177 << getPreferredStepSize() << " for rate " << m_inputSampleRate
Chris@0 178 << ")" << std::endl;
Chris@0 179 return false;
Chris@0 180 }
Chris@0 181
Chris@0 182 if (blockSize != getPreferredBlockSize()) {
Chris@0 183 std::cerr << "BeatRootVampPlugin::initialise: Unsupported block size "
Chris@0 184 << "for sample rate (" << blockSize << ", required size is "
Chris@0 185 << getPreferredBlockSize() << " for rate " << m_inputSampleRate
Chris@0 186 << ")" << std::endl;
Chris@0 187 return false;
Chris@0 188 }
Chris@0 189
Chris@9 190 m_processor->reset();
Chris@0 191
Chris@0 192 return true;
Chris@0 193 }
Chris@0 194
Chris@0 195 void
Chris@0 196 BeatRootVampPlugin::reset()
Chris@0 197 {
Chris@0 198 m_processor->reset();
Chris@0 199 }
Chris@0 200
Chris@0 201 BeatRootVampPlugin::FeatureSet
Chris@0 202 BeatRootVampPlugin::process(const float *const *inputBuffers, Vamp::RealTime timestamp)
Chris@0 203 {
Chris@10 204 m_processor->processFrame(inputBuffers);
Chris@0 205 return FeatureSet();
Chris@0 206 }
Chris@0 207
Chris@0 208 BeatRootVampPlugin::FeatureSet
Chris@0 209 BeatRootVampPlugin::getRemainingFeatures()
Chris@0 210 {
Chris@10 211 EventList el = m_processor->beatTrack();
Chris@10 212
Chris@10 213 Feature f;
Chris@10 214 f.hasTimestamp = true;
Chris@10 215 f.hasDuration = false;
Chris@10 216 f.label = "";
Chris@10 217 f.values.clear();
Chris@10 218
Chris@10 219 FeatureSet fs;
Chris@10 220
Chris@13 221 for (EventList::const_iterator i = el.begin(); i != el.end(); ++i) {
Chris@13 222 f.timestamp = Vamp::RealTime::fromSeconds(i->time);
Chris@10 223 fs[0].push_back(f);
Chris@10 224 }
Chris@10 225
Chris@10 226 return fs;
Chris@0 227 }
Chris@0 228
Chris@0 229
Chris@0 230 static Vamp::PluginAdapter<BeatRootVampPlugin> brAdapter;
Chris@0 231
Chris@0 232 const VampPluginDescriptor *vampGetPluginDescriptor(unsigned int version,
Chris@0 233 unsigned int index)
Chris@0 234 {
Chris@0 235 if (version < 1) return 0;
Chris@0 236
Chris@0 237 switch (index) {
Chris@0 238 case 0: return brAdapter.getDescriptor();
Chris@0 239 default: return 0;
Chris@0 240 }
Chris@0 241 }
Chris@0 242