annotate plugin/FeatureExtractionPluginHostAdapter.cpp @ 65:e1aad27029e3

* Add stub for item-edit dialog (for editing properties of an item on double- click) -- doesn't actually do anything yet * Add code to invoke said non-working item-edit dialog on double-click in time-value, time-instants and note layers * Add overlay mode (no text, basic text, all text)
author Chris Cannam
date Thu, 30 Mar 2006 15:00:22 +0000
parents 3086ff194ea0
children
rev   line source
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