annotate src/vamp-sdk/PluginAdapter.cpp @ 434:e979a9c4ffb6 vampipe

Switch from Cross FFT with option of FFTW build, to KissFFT only (code bundled). This is much faster than the default build and simpler than managing two options.
author Chris Cannam
date Tue, 16 Aug 2016 16:04:09 +0100
parents abdf03252c8a
children bd8484e19353
rev   line source
cannam@3 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
cannam@3 2
cannam@3 3 /*
cannam@3 4 Vamp
cannam@3 5
cannam@3 6 An API for audio analysis and feature extraction plugins.
cannam@3 7
cannam@3 8 Centre for Digital Music, Queen Mary, University of London.
cannam@3 9 Copyright 2006 Chris Cannam.
cannam@3 10
cannam@3 11 Permission is hereby granted, free of charge, to any person
cannam@3 12 obtaining a copy of this software and associated documentation
cannam@3 13 files (the "Software"), to deal in the Software without
cannam@3 14 restriction, including without limitation the rights to use, copy,
cannam@3 15 modify, merge, publish, distribute, sublicense, and/or sell copies
cannam@3 16 of the Software, and to permit persons to whom the Software is
cannam@3 17 furnished to do so, subject to the following conditions:
cannam@3 18
cannam@3 19 The above copyright notice and this permission notice shall be
cannam@3 20 included in all copies or substantial portions of the Software.
cannam@3 21
cannam@3 22 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
cannam@3 23 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
cannam@3 24 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
cannam@6 25 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR
cannam@3 26 ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
cannam@3 27 CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
cannam@3 28 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
cannam@3 29
cannam@3 30 Except as contained in this notice, the names of the Centre for
cannam@3 31 Digital Music; Queen Mary, University of London; and Chris Cannam
cannam@3 32 shall not be used in advertising or otherwise to promote the sale,
cannam@3 33 use or other dealings in this Software without prior written
cannam@3 34 authorization.
cannam@3 35 */
cannam@3 36
cannam@230 37 #include <vamp-sdk/PluginAdapter.h>
cannam@3 38
cannam@130 39 #include <cstring>
cannam@130 40 #include <cstdlib>
cannam@130 41
Chris@424 42 #if ( VAMP_SDK_MAJOR_VERSION != 2 || VAMP_SDK_MINOR_VERSION != 7 )
cannam@308 43 #error Unexpected version of Vamp SDK header included
cannam@234 44 #endif
cannam@234 45
cannam@234 46
cannam@23 47 //#define DEBUG_PLUGIN_ADAPTER 1
cannam@22 48
cannam@233 49 _VAMP_SDK_PLUGSPACE_BEGIN(PluginAdapter.cpp)
cannam@230 50
cannam@3 51 namespace Vamp {
cannam@3 52
cannam@76 53 class PluginAdapterBase::Impl
cannam@3 54 {
cannam@76 55 public:
cannam@76 56 Impl(PluginAdapterBase *);
cannam@76 57 ~Impl();
cannam@76 58
cannam@76 59 const VampPluginDescriptor *getDescriptor();
cannam@76 60
cannam@76 61 protected:
cannam@76 62 PluginAdapterBase *m_base;
cannam@76 63
cannam@76 64 static VampPluginHandle vampInstantiate(const VampPluginDescriptor *desc,
cannam@167 65 float inputSampleRate);
cannam@76 66
cannam@76 67 static void vampCleanup(VampPluginHandle handle);
cannam@76 68
cannam@76 69 static int vampInitialise(VampPluginHandle handle, unsigned int channels,
cannam@76 70 unsigned int stepSize, unsigned int blockSize);
cannam@76 71
cannam@76 72 static void vampReset(VampPluginHandle handle);
cannam@76 73
cannam@76 74 static float vampGetParameter(VampPluginHandle handle, int param);
cannam@76 75 static void vampSetParameter(VampPluginHandle handle, int param, float value);
cannam@76 76
cannam@76 77 static unsigned int vampGetCurrentProgram(VampPluginHandle handle);
cannam@76 78 static void vampSelectProgram(VampPluginHandle handle, unsigned int program);
cannam@76 79
cannam@76 80 static unsigned int vampGetPreferredStepSize(VampPluginHandle handle);
cannam@76 81 static unsigned int vampGetPreferredBlockSize(VampPluginHandle handle);
cannam@76 82 static unsigned int vampGetMinChannelCount(VampPluginHandle handle);
cannam@76 83 static unsigned int vampGetMaxChannelCount(VampPluginHandle handle);
cannam@76 84
cannam@76 85 static unsigned int vampGetOutputCount(VampPluginHandle handle);
cannam@76 86
cannam@76 87 static VampOutputDescriptor *vampGetOutputDescriptor(VampPluginHandle handle,
cannam@76 88 unsigned int i);
cannam@76 89
cannam@76 90 static void vampReleaseOutputDescriptor(VampOutputDescriptor *desc);
cannam@76 91
cannam@76 92 static VampFeatureList *vampProcess(VampPluginHandle handle,
cannam@76 93 const float *const *inputBuffers,
cannam@76 94 int sec,
cannam@76 95 int nsec);
cannam@76 96
cannam@76 97 static VampFeatureList *vampGetRemainingFeatures(VampPluginHandle handle);
cannam@76 98
cannam@76 99 static void vampReleaseFeatureSet(VampFeatureList *fs);
cannam@76 100
cannam@268 101 void checkOutputMap(Plugin *plugin);
cannam@268 102 void markOutputsChanged(Plugin *plugin);
cannam@268 103
cannam@76 104 void cleanup(Plugin *plugin);
cannam@76 105 unsigned int getOutputCount(Plugin *plugin);
cannam@76 106 VampOutputDescriptor *getOutputDescriptor(Plugin *plugin,
cannam@76 107 unsigned int i);
cannam@76 108 VampFeatureList *process(Plugin *plugin,
cannam@76 109 const float *const *inputBuffers,
cannam@76 110 int sec, int nsec);
cannam@76 111 VampFeatureList *getRemainingFeatures(Plugin *plugin);
cannam@76 112 VampFeatureList *convertFeatures(Plugin *plugin,
cannam@76 113 const Plugin::FeatureSet &features);
cannam@76 114
cannam@76 115 // maps both plugins and descriptors to adapters
cannam@76 116 typedef std::map<const void *, Impl *> AdapterMap;
cannam@76 117 static AdapterMap *m_adapterMap;
cannam@76 118 static Impl *lookupAdapter(VampPluginHandle);
cannam@76 119
cannam@76 120 bool m_populated;
cannam@76 121 VampPluginDescriptor m_descriptor;
cannam@76 122 Plugin::ParameterList m_parameters;
cannam@76 123 Plugin::ProgramList m_programs;
cannam@76 124
cannam@76 125 typedef std::map<Plugin *, Plugin::OutputList *> OutputMap;
cannam@76 126 OutputMap m_pluginOutputs;
cannam@76 127
cannam@76 128 std::map<Plugin *, VampFeatureList *> m_fs;
cannam@76 129 std::map<Plugin *, std::vector<size_t> > m_fsizes;
cannam@76 130 std::map<Plugin *, std::vector<std::vector<size_t> > > m_fvsizes;
cannam@76 131 void resizeFS(Plugin *plugin, int n);
cannam@76 132 void resizeFL(Plugin *plugin, int n, size_t sz);
cannam@76 133 void resizeFV(Plugin *plugin, int n, int j, size_t sz);
cannam@76 134 };
cannam@76 135
cannam@76 136 PluginAdapterBase::PluginAdapterBase()
cannam@76 137 {
cannam@76 138 m_impl = new Impl(this);
cannam@76 139 }
cannam@76 140
cannam@76 141 PluginAdapterBase::~PluginAdapterBase()
cannam@76 142 {
cannam@76 143 delete m_impl;
cannam@3 144 }
cannam@3 145
cannam@3 146 const VampPluginDescriptor *
cannam@3 147 PluginAdapterBase::getDescriptor()
cannam@3 148 {
cannam@76 149 return m_impl->getDescriptor();
cannam@76 150 }
cannam@76 151
cannam@76 152 PluginAdapterBase::Impl::Impl(PluginAdapterBase *base) :
cannam@76 153 m_base(base),
cannam@76 154 m_populated(false)
cannam@76 155 {
cannam@22 156 #ifdef DEBUG_PLUGIN_ADAPTER
cannam@76 157 std::cerr << "PluginAdapterBase::Impl[" << this << "]::Impl" << std::endl;
cannam@76 158 #endif
cannam@76 159 }
cannam@76 160
cannam@76 161 const VampPluginDescriptor *
cannam@76 162 PluginAdapterBase::Impl::getDescriptor()
cannam@76 163 {
cannam@76 164 #ifdef DEBUG_PLUGIN_ADAPTER
cannam@76 165 std::cerr << "PluginAdapterBase::Impl[" << this << "]::getDescriptor" << std::endl;
cannam@22 166 #endif
cannam@22 167
cannam@3 168 if (m_populated) return &m_descriptor;
cannam@3 169
cannam@76 170 Plugin *plugin = m_base->createPlugin(48000);
cannam@285 171
cannam@285 172 if (!plugin) {
cannam@285 173 std::cerr << "PluginAdapterBase::Impl::getDescriptor: Failed to create plugin" << std::endl;
cannam@285 174 return 0;
cannam@285 175 }
cannam@3 176
cannam@50 177 if (plugin->getVampApiVersion() != VAMP_API_VERSION) {
cannam@76 178 std::cerr << "Vamp::PluginAdapterBase::Impl::getDescriptor: ERROR: "
cannam@194 179 << "API version " << plugin->getVampApiVersion()
cannam@194 180 << " for\nplugin \"" << plugin->getIdentifier() << "\" "
cannam@194 181 << "differs from version "
cannam@194 182 << VAMP_API_VERSION << " for adapter.\n"
cannam@194 183 << "This plugin is probably linked against a different version of the Vamp SDK\n"
cannam@194 184 << "from the version it was compiled with. It will need to be re-linked correctly\n"
cannam@194 185 << "before it can be used." << std::endl;
cannam@50 186 delete plugin;
cannam@50 187 return 0;
cannam@50 188 }
cannam@50 189
cannam@3 190 m_parameters = plugin->getParameterDescriptors();
cannam@3 191 m_programs = plugin->getPrograms();
cannam@50 192
cannam@50 193 m_descriptor.vampApiVersion = plugin->getVampApiVersion();
cannam@49 194 m_descriptor.identifier = strdup(plugin->getIdentifier().c_str());
cannam@3 195 m_descriptor.name = strdup(plugin->getName().c_str());
cannam@3 196 m_descriptor.description = strdup(plugin->getDescription().c_str());
cannam@3 197 m_descriptor.maker = strdup(plugin->getMaker().c_str());
cannam@3 198 m_descriptor.pluginVersion = plugin->getPluginVersion();
cannam@3 199 m_descriptor.copyright = strdup(plugin->getCopyright().c_str());
cannam@3 200
cannam@3 201 m_descriptor.parameterCount = m_parameters.size();
cannam@3 202 m_descriptor.parameters = (const VampParameterDescriptor **)
cannam@3 203 malloc(m_parameters.size() * sizeof(VampParameterDescriptor));
cannam@7 204
cannam@7 205 unsigned int i;
cannam@3 206
cannam@7 207 for (i = 0; i < m_parameters.size(); ++i) {
cannam@3 208 VampParameterDescriptor *desc = (VampParameterDescriptor *)
cannam@3 209 malloc(sizeof(VampParameterDescriptor));
cannam@49 210 desc->identifier = strdup(m_parameters[i].identifier.c_str());
cannam@3 211 desc->name = strdup(m_parameters[i].name.c_str());
cannam@3 212 desc->description = strdup(m_parameters[i].description.c_str());
cannam@3 213 desc->unit = strdup(m_parameters[i].unit.c_str());
cannam@3 214 desc->minValue = m_parameters[i].minValue;
cannam@3 215 desc->maxValue = m_parameters[i].maxValue;
cannam@3 216 desc->defaultValue = m_parameters[i].defaultValue;
cannam@3 217 desc->isQuantized = m_parameters[i].isQuantized;
cannam@3 218 desc->quantizeStep = m_parameters[i].quantizeStep;
cannam@9 219 desc->valueNames = 0;
cannam@9 220 if (desc->isQuantized && !m_parameters[i].valueNames.empty()) {
cannam@9 221 desc->valueNames = (const char **)
cannam@9 222 malloc((m_parameters[i].valueNames.size()+1) * sizeof(char *));
cannam@9 223 for (unsigned int j = 0; j < m_parameters[i].valueNames.size(); ++j) {
cannam@9 224 desc->valueNames[j] = strdup(m_parameters[i].valueNames[j].c_str());
cannam@9 225 }
cannam@9 226 desc->valueNames[m_parameters[i].valueNames.size()] = 0;
cannam@9 227 }
cannam@3 228 m_descriptor.parameters[i] = desc;
cannam@3 229 }
cannam@3 230
cannam@3 231 m_descriptor.programCount = m_programs.size();
cannam@3 232 m_descriptor.programs = (const char **)
cannam@3 233 malloc(m_programs.size() * sizeof(const char *));
cannam@3 234
cannam@7 235 for (i = 0; i < m_programs.size(); ++i) {
cannam@3 236 m_descriptor.programs[i] = strdup(m_programs[i].c_str());
cannam@3 237 }
cannam@3 238
cannam@3 239 if (plugin->getInputDomain() == Plugin::FrequencyDomain) {
cannam@3 240 m_descriptor.inputDomain = vampFrequencyDomain;
cannam@3 241 } else {
cannam@3 242 m_descriptor.inputDomain = vampTimeDomain;
cannam@3 243 }
cannam@3 244
cannam@3 245 m_descriptor.instantiate = vampInstantiate;
cannam@3 246 m_descriptor.cleanup = vampCleanup;
cannam@3 247 m_descriptor.initialise = vampInitialise;
cannam@3 248 m_descriptor.reset = vampReset;
cannam@3 249 m_descriptor.getParameter = vampGetParameter;
cannam@3 250 m_descriptor.setParameter = vampSetParameter;
cannam@3 251 m_descriptor.getCurrentProgram = vampGetCurrentProgram;
cannam@3 252 m_descriptor.selectProgram = vampSelectProgram;
cannam@3 253 m_descriptor.getPreferredStepSize = vampGetPreferredStepSize;
cannam@3 254 m_descriptor.getPreferredBlockSize = vampGetPreferredBlockSize;
cannam@3 255 m_descriptor.getMinChannelCount = vampGetMinChannelCount;
cannam@3 256 m_descriptor.getMaxChannelCount = vampGetMaxChannelCount;
cannam@3 257 m_descriptor.getOutputCount = vampGetOutputCount;
cannam@3 258 m_descriptor.getOutputDescriptor = vampGetOutputDescriptor;
cannam@3 259 m_descriptor.releaseOutputDescriptor = vampReleaseOutputDescriptor;
cannam@3 260 m_descriptor.process = vampProcess;
cannam@3 261 m_descriptor.getRemainingFeatures = vampGetRemainingFeatures;
cannam@3 262 m_descriptor.releaseFeatureSet = vampReleaseFeatureSet;
cannam@3 263
cannam@13 264 if (!m_adapterMap) {
cannam@13 265 m_adapterMap = new AdapterMap;
cannam@13 266 }
cannam@15 267 (*m_adapterMap)[&m_descriptor] = this;
cannam@3 268
cannam@3 269 delete plugin;
cannam@3 270
cannam@3 271 m_populated = true;
cannam@3 272 return &m_descriptor;
cannam@3 273 }
cannam@3 274
cannam@76 275 PluginAdapterBase::Impl::~Impl()
cannam@3 276 {
cannam@22 277 #ifdef DEBUG_PLUGIN_ADAPTER
cannam@76 278 std::cerr << "PluginAdapterBase::Impl[" << this << "]::~Impl" << std::endl;
cannam@22 279 #endif
cannam@22 280
cannam@3 281 if (!m_populated) return;
cannam@3 282
cannam@49 283 free((void *)m_descriptor.identifier);
cannam@3 284 free((void *)m_descriptor.name);
cannam@3 285 free((void *)m_descriptor.description);
cannam@3 286 free((void *)m_descriptor.maker);
cannam@3 287 free((void *)m_descriptor.copyright);
cannam@3 288
cannam@3 289 for (unsigned int i = 0; i < m_descriptor.parameterCount; ++i) {
cannam@3 290 const VampParameterDescriptor *desc = m_descriptor.parameters[i];
cannam@49 291 free((void *)desc->identifier);
cannam@3 292 free((void *)desc->name);
cannam@3 293 free((void *)desc->description);
cannam@3 294 free((void *)desc->unit);
cannam@9 295 if (desc->valueNames) {
cannam@9 296 for (unsigned int j = 0; desc->valueNames[j]; ++j) {
cannam@9 297 free((void *)desc->valueNames[j]);
cannam@9 298 }
cannam@9 299 free((void *)desc->valueNames);
cannam@9 300 }
cannam@3 301 }
cannam@3 302 free((void *)m_descriptor.parameters);
cannam@3 303
cannam@3 304 for (unsigned int i = 0; i < m_descriptor.programCount; ++i) {
cannam@3 305 free((void *)m_descriptor.programs[i]);
cannam@3 306 }
cannam@3 307 free((void *)m_descriptor.programs);
cannam@3 308
cannam@13 309 if (m_adapterMap) {
cannam@13 310
cannam@13 311 m_adapterMap->erase(&m_descriptor);
cannam@13 312
cannam@13 313 if (m_adapterMap->empty()) {
cannam@13 314 delete m_adapterMap;
cannam@13 315 m_adapterMap = 0;
cannam@13 316 }
cannam@13 317 }
cannam@3 318 }
cannam@3 319
cannam@76 320 PluginAdapterBase::Impl *
cannam@76 321 PluginAdapterBase::Impl::lookupAdapter(VampPluginHandle handle)
cannam@3 322 {
cannam@22 323 #ifdef DEBUG_PLUGIN_ADAPTER
cannam@76 324 std::cerr << "PluginAdapterBase::Impl::lookupAdapter(" << handle << ")" << std::endl;
cannam@22 325 #endif
cannam@22 326
cannam@13 327 if (!m_adapterMap) return 0;
cannam@13 328 AdapterMap::const_iterator i = m_adapterMap->find(handle);
cannam@13 329 if (i == m_adapterMap->end()) return 0;
cannam@3 330 return i->second;
cannam@3 331 }
cannam@3 332
cannam@3 333 VampPluginHandle
cannam@76 334 PluginAdapterBase::Impl::vampInstantiate(const VampPluginDescriptor *desc,
cannam@268 335 float inputSampleRate)
cannam@3 336 {
cannam@22 337 #ifdef DEBUG_PLUGIN_ADAPTER
cannam@76 338 std::cerr << "PluginAdapterBase::Impl::vampInstantiate(" << desc << ")" << std::endl;
cannam@22 339 #endif
cannam@22 340
cannam@15 341 if (!m_adapterMap) {
cannam@15 342 m_adapterMap = new AdapterMap();
cannam@15 343 }
cannam@15 344
cannam@15 345 if (m_adapterMap->find(desc) == m_adapterMap->end()) {
cannam@76 346 std::cerr << "WARNING: PluginAdapterBase::Impl::vampInstantiate: Descriptor " << desc << " not in adapter map" << std::endl;
cannam@15 347 return 0;
cannam@15 348 }
cannam@15 349
cannam@76 350 Impl *adapter = (*m_adapterMap)[desc];
cannam@3 351 if (desc != &adapter->m_descriptor) return 0;
cannam@3 352
cannam@76 353 Plugin *plugin = adapter->m_base->createPlugin(inputSampleRate);
cannam@3 354 if (plugin) {
cannam@13 355 (*m_adapterMap)[plugin] = adapter;
cannam@3 356 }
cannam@3 357
cannam@22 358 #ifdef DEBUG_PLUGIN_ADAPTER
cannam@76 359 std::cerr << "PluginAdapterBase::Impl::vampInstantiate(" << desc << "): returning handle " << plugin << std::endl;
cannam@22 360 #endif
cannam@22 361
cannam@3 362 return plugin;
cannam@3 363 }
cannam@3 364
cannam@3 365 void
cannam@76 366 PluginAdapterBase::Impl::vampCleanup(VampPluginHandle handle)
cannam@3 367 {
cannam@22 368 #ifdef DEBUG_PLUGIN_ADAPTER
cannam@76 369 std::cerr << "PluginAdapterBase::Impl::vampCleanup(" << handle << ")" << std::endl;
cannam@22 370 #endif
cannam@22 371
cannam@76 372 Impl *adapter = lookupAdapter(handle);
cannam@3 373 if (!adapter) {
cannam@3 374 delete ((Plugin *)handle);
cannam@3 375 return;
cannam@3 376 }
cannam@3 377 adapter->cleanup(((Plugin *)handle));
cannam@3 378 }
cannam@3 379
cannam@3 380 int
cannam@76 381 PluginAdapterBase::Impl::vampInitialise(VampPluginHandle handle,
cannam@268 382 unsigned int channels,
cannam@268 383 unsigned int stepSize,
cannam@268 384 unsigned int blockSize)
cannam@3 385 {
cannam@22 386 #ifdef DEBUG_PLUGIN_ADAPTER
cannam@76 387 std::cerr << "PluginAdapterBase::Impl::vampInitialise(" << handle << ", " << channels << ", " << stepSize << ", " << blockSize << ")" << std::endl;
cannam@22 388 #endif
cannam@22 389
cannam@268 390 Impl *adapter = lookupAdapter(handle);
cannam@268 391 if (!adapter) return 0;
cannam@268 392 bool result = ((Plugin *)handle)->initialise(channels, stepSize, blockSize);
cannam@268 393 adapter->markOutputsChanged((Plugin *)handle);
cannam@3 394 return result ? 1 : 0;
cannam@3 395 }
cannam@3 396
cannam@3 397 void
cannam@76 398 PluginAdapterBase::Impl::vampReset(VampPluginHandle handle)
cannam@3 399 {
cannam@22 400 #ifdef DEBUG_PLUGIN_ADAPTER
cannam@76 401 std::cerr << "PluginAdapterBase::Impl::vampReset(" << handle << ")" << std::endl;
cannam@22 402 #endif
cannam@22 403
cannam@3 404 ((Plugin *)handle)->reset();
cannam@3 405 }
cannam@3 406
cannam@3 407 float
cannam@76 408 PluginAdapterBase::Impl::vampGetParameter(VampPluginHandle handle,
cannam@3 409 int param)
cannam@3 410 {
cannam@22 411 #ifdef DEBUG_PLUGIN_ADAPTER
cannam@76 412 std::cerr << "PluginAdapterBase::Impl::vampGetParameter(" << handle << ", " << param << ")" << std::endl;
cannam@22 413 #endif
cannam@22 414
cannam@76 415 Impl *adapter = lookupAdapter(handle);
cannam@3 416 if (!adapter) return 0.0;
cannam@3 417 Plugin::ParameterList &list = adapter->m_parameters;
cannam@49 418 return ((Plugin *)handle)->getParameter(list[param].identifier);
cannam@3 419 }
cannam@3 420
cannam@3 421 void
cannam@76 422 PluginAdapterBase::Impl::vampSetParameter(VampPluginHandle handle,
cannam@3 423 int param, float value)
cannam@3 424 {
cannam@22 425 #ifdef DEBUG_PLUGIN_ADAPTER
cannam@76 426 std::cerr << "PluginAdapterBase::Impl::vampSetParameter(" << handle << ", " << param << ", " << value << ")" << std::endl;
cannam@22 427 #endif
cannam@22 428
cannam@76 429 Impl *adapter = lookupAdapter(handle);
cannam@3 430 if (!adapter) return;
cannam@3 431 Plugin::ParameterList &list = adapter->m_parameters;
cannam@49 432 ((Plugin *)handle)->setParameter(list[param].identifier, value);
cannam@268 433 adapter->markOutputsChanged((Plugin *)handle);
cannam@3 434 }
cannam@3 435
cannam@3 436 unsigned int
cannam@76 437 PluginAdapterBase::Impl::vampGetCurrentProgram(VampPluginHandle handle)
cannam@3 438 {
cannam@22 439 #ifdef DEBUG_PLUGIN_ADAPTER
cannam@76 440 std::cerr << "PluginAdapterBase::Impl::vampGetCurrentProgram(" << handle << ")" << std::endl;
cannam@22 441 #endif
cannam@22 442
cannam@76 443 Impl *adapter = lookupAdapter(handle);
cannam@3 444 if (!adapter) return 0;
cannam@3 445 Plugin::ProgramList &list = adapter->m_programs;
cannam@3 446 std::string program = ((Plugin *)handle)->getCurrentProgram();
cannam@3 447 for (unsigned int i = 0; i < list.size(); ++i) {
cannam@3 448 if (list[i] == program) return i;
cannam@3 449 }
cannam@3 450 return 0;
cannam@3 451 }
cannam@3 452
cannam@3 453 void
cannam@76 454 PluginAdapterBase::Impl::vampSelectProgram(VampPluginHandle handle,
cannam@268 455 unsigned int program)
cannam@3 456 {
cannam@22 457 #ifdef DEBUG_PLUGIN_ADAPTER
cannam@76 458 std::cerr << "PluginAdapterBase::Impl::vampSelectProgram(" << handle << ", " << program << ")" << std::endl;
cannam@22 459 #endif
cannam@22 460
cannam@76 461 Impl *adapter = lookupAdapter(handle);
cannam@3 462 if (!adapter) return;
cannam@268 463
cannam@3 464 Plugin::ProgramList &list = adapter->m_programs;
cannam@3 465 ((Plugin *)handle)->selectProgram(list[program]);
cannam@268 466
cannam@268 467 adapter->markOutputsChanged((Plugin *)handle);
cannam@3 468 }
cannam@3 469
cannam@3 470 unsigned int
cannam@76 471 PluginAdapterBase::Impl::vampGetPreferredStepSize(VampPluginHandle handle)
cannam@3 472 {
cannam@22 473 #ifdef DEBUG_PLUGIN_ADAPTER
cannam@76 474 std::cerr << "PluginAdapterBase::Impl::vampGetPreferredStepSize(" << handle << ")" << std::endl;
cannam@22 475 #endif
cannam@22 476
cannam@3 477 return ((Plugin *)handle)->getPreferredStepSize();
cannam@3 478 }
cannam@3 479
cannam@3 480 unsigned int
cannam@76 481 PluginAdapterBase::Impl::vampGetPreferredBlockSize(VampPluginHandle handle)
cannam@3 482 {
cannam@22 483 #ifdef DEBUG_PLUGIN_ADAPTER
cannam@76 484 std::cerr << "PluginAdapterBase::Impl::vampGetPreferredBlockSize(" << handle << ")" << std::endl;
cannam@22 485 #endif
cannam@22 486
cannam@3 487 return ((Plugin *)handle)->getPreferredBlockSize();
cannam@3 488 }
cannam@3 489
cannam@3 490 unsigned int
cannam@76 491 PluginAdapterBase::Impl::vampGetMinChannelCount(VampPluginHandle handle)
cannam@3 492 {
cannam@22 493 #ifdef DEBUG_PLUGIN_ADAPTER
cannam@76 494 std::cerr << "PluginAdapterBase::Impl::vampGetMinChannelCount(" << handle << ")" << std::endl;
cannam@22 495 #endif
cannam@22 496
cannam@3 497 return ((Plugin *)handle)->getMinChannelCount();
cannam@3 498 }
cannam@3 499
cannam@3 500 unsigned int
cannam@76 501 PluginAdapterBase::Impl::vampGetMaxChannelCount(VampPluginHandle handle)
cannam@3 502 {
cannam@22 503 #ifdef DEBUG_PLUGIN_ADAPTER
cannam@76 504 std::cerr << "PluginAdapterBase::Impl::vampGetMaxChannelCount(" << handle << ")" << std::endl;
cannam@22 505 #endif
cannam@22 506
cannam@3 507 return ((Plugin *)handle)->getMaxChannelCount();
cannam@3 508 }
cannam@3 509
cannam@3 510 unsigned int
cannam@76 511 PluginAdapterBase::Impl::vampGetOutputCount(VampPluginHandle handle)
cannam@3 512 {
cannam@22 513 #ifdef DEBUG_PLUGIN_ADAPTER
cannam@76 514 std::cerr << "PluginAdapterBase::Impl::vampGetOutputCount(" << handle << ")" << std::endl;
cannam@22 515 #endif
cannam@22 516
cannam@76 517 Impl *adapter = lookupAdapter(handle);
cannam@15 518
cannam@15 519 // std::cerr << "vampGetOutputCount: handle " << handle << " -> adapter "<< adapter << std::endl;
cannam@15 520
cannam@3 521 if (!adapter) return 0;
cannam@3 522 return adapter->getOutputCount((Plugin *)handle);
cannam@3 523 }
cannam@3 524
cannam@3 525 VampOutputDescriptor *
cannam@76 526 PluginAdapterBase::Impl::vampGetOutputDescriptor(VampPluginHandle handle,
cannam@268 527 unsigned int i)
cannam@3 528 {
cannam@22 529 #ifdef DEBUG_PLUGIN_ADAPTER
cannam@76 530 std::cerr << "PluginAdapterBase::Impl::vampGetOutputDescriptor(" << handle << ", " << i << ")" << std::endl;
cannam@22 531 #endif
cannam@22 532
cannam@76 533 Impl *adapter = lookupAdapter(handle);
cannam@15 534
cannam@15 535 // std::cerr << "vampGetOutputDescriptor: handle " << handle << " -> adapter "<< adapter << std::endl;
cannam@15 536
cannam@3 537 if (!adapter) return 0;
cannam@3 538 return adapter->getOutputDescriptor((Plugin *)handle, i);
cannam@3 539 }
cannam@3 540
cannam@3 541 void
cannam@76 542 PluginAdapterBase::Impl::vampReleaseOutputDescriptor(VampOutputDescriptor *desc)
cannam@3 543 {
cannam@22 544 #ifdef DEBUG_PLUGIN_ADAPTER
cannam@76 545 std::cerr << "PluginAdapterBase::Impl::vampReleaseOutputDescriptor(" << desc << ")" << std::endl;
cannam@22 546 #endif
cannam@22 547
cannam@49 548 if (desc->identifier) free((void *)desc->identifier);
cannam@3 549 if (desc->name) free((void *)desc->name);
cannam@3 550 if (desc->description) free((void *)desc->description);
cannam@3 551 if (desc->unit) free((void *)desc->unit);
cannam@40 552 if (desc->hasFixedBinCount && desc->binNames) {
cannam@40 553 for (unsigned int i = 0; i < desc->binCount; ++i) {
cannam@40 554 if (desc->binNames[i]) {
cannam@40 555 free((void *)desc->binNames[i]);
cannam@40 556 }
cannam@40 557 }
cannam@3 558 }
cannam@9 559 if (desc->binNames) free((void *)desc->binNames);
cannam@3 560 free((void *)desc);
cannam@3 561 }
cannam@3 562
cannam@12 563 VampFeatureList *
cannam@76 564 PluginAdapterBase::Impl::vampProcess(VampPluginHandle handle,
cannam@108 565 const float *const *inputBuffers,
cannam@108 566 int sec,
cannam@108 567 int nsec)
cannam@3 568 {
cannam@22 569 #ifdef DEBUG_PLUGIN_ADAPTER
cannam@76 570 std::cerr << "PluginAdapterBase::Impl::vampProcess(" << handle << ", " << sec << ", " << nsec << ")" << std::endl;
cannam@22 571 #endif
cannam@22 572
cannam@76 573 Impl *adapter = lookupAdapter(handle);
cannam@3 574 if (!adapter) return 0;
cannam@268 575 return adapter->process((Plugin *)handle, inputBuffers, sec, nsec);
cannam@3 576 }
cannam@3 577
cannam@12 578 VampFeatureList *
cannam@76 579 PluginAdapterBase::Impl::vampGetRemainingFeatures(VampPluginHandle handle)
cannam@3 580 {
cannam@22 581 #ifdef DEBUG_PLUGIN_ADAPTER
cannam@76 582 std::cerr << "PluginAdapterBase::Impl::vampGetRemainingFeatures(" << handle << ")" << std::endl;
cannam@22 583 #endif
cannam@22 584
cannam@76 585 Impl *adapter = lookupAdapter(handle);
cannam@3 586 if (!adapter) return 0;
cannam@3 587 return adapter->getRemainingFeatures((Plugin *)handle);
cannam@3 588 }
cannam@3 589
cannam@3 590 void
Chris@398 591 PluginAdapterBase::Impl::vampReleaseFeatureSet(VampFeatureList *)
cannam@3 592 {
cannam@22 593 #ifdef DEBUG_PLUGIN_ADAPTER
cannam@76 594 std::cerr << "PluginAdapterBase::Impl::vampReleaseFeatureSet" << std::endl;
cannam@22 595 #endif
cannam@3 596 }
cannam@3 597
cannam@3 598 void
cannam@76 599 PluginAdapterBase::Impl::cleanup(Plugin *plugin)
cannam@3 600 {
cannam@12 601 if (m_fs.find(plugin) != m_fs.end()) {
cannam@12 602 size_t outputCount = 0;
cannam@12 603 if (m_pluginOutputs[plugin]) {
cannam@12 604 outputCount = m_pluginOutputs[plugin]->size();
cannam@12 605 }
cannam@12 606 VampFeatureList *list = m_fs[plugin];
cannam@12 607 for (unsigned int i = 0; i < outputCount; ++i) {
cannam@12 608 for (unsigned int j = 0; j < m_fsizes[plugin][i]; ++j) {
cannam@168 609 if (list[i].features[j].v1.label) {
cannam@168 610 free(list[i].features[j].v1.label);
cannam@12 611 }
cannam@168 612 if (list[i].features[j].v1.values) {
cannam@168 613 free(list[i].features[j].v1.values);
cannam@12 614 }
cannam@12 615 }
cannam@12 616 if (list[i].features) free(list[i].features);
cannam@12 617 }
cannam@12 618 m_fs.erase(plugin);
cannam@12 619 m_fsizes.erase(plugin);
cannam@12 620 m_fvsizes.erase(plugin);
cannam@12 621 }
cannam@12 622
cannam@3 623 if (m_pluginOutputs.find(plugin) != m_pluginOutputs.end()) {
cannam@3 624 delete m_pluginOutputs[plugin];
cannam@3 625 m_pluginOutputs.erase(plugin);
cannam@3 626 }
cannam@13 627
cannam@13 628 if (m_adapterMap) {
cannam@13 629 m_adapterMap->erase(plugin);
cannam@13 630
cannam@13 631 if (m_adapterMap->empty()) {
cannam@13 632 delete m_adapterMap;
cannam@13 633 m_adapterMap = 0;
cannam@13 634 }
cannam@13 635 }
cannam@13 636
cannam@3 637 delete ((Plugin *)plugin);
cannam@3 638 }
cannam@3 639
cannam@3 640 void
cannam@76 641 PluginAdapterBase::Impl::checkOutputMap(Plugin *plugin)
cannam@3 642 {
cannam@268 643 OutputMap::iterator i = m_pluginOutputs.find(plugin);
cannam@268 644
cannam@268 645 if (i == m_pluginOutputs.end() || !i->second) {
cannam@268 646
cannam@3 647 m_pluginOutputs[plugin] = new Plugin::OutputList
cannam@3 648 (plugin->getOutputDescriptors());
cannam@268 649
cannam@76 650 // std::cerr << "PluginAdapterBase::Impl::checkOutputMap: Have " << m_pluginOutputs[plugin]->size() << " outputs for plugin " << plugin->getIdentifier() << std::endl;
cannam@3 651 }
cannam@3 652 }
cannam@3 653
cannam@268 654 void
cannam@268 655 PluginAdapterBase::Impl::markOutputsChanged(Plugin *plugin)
cannam@268 656 {
cannam@268 657 OutputMap::iterator i = m_pluginOutputs.find(plugin);
cannam@268 658
cannam@268 659 // std::cerr << "PluginAdapterBase::Impl::markOutputsChanged" << std::endl;
cannam@268 660
cannam@268 661 if (i != m_pluginOutputs.end()) {
cannam@268 662
cannam@268 663 Plugin::OutputList *list = i->second;
cannam@268 664 m_pluginOutputs.erase(i);
cannam@268 665 delete list;
cannam@268 666 }
cannam@268 667 }
cannam@268 668
cannam@3 669 unsigned int
cannam@76 670 PluginAdapterBase::Impl::getOutputCount(Plugin *plugin)
cannam@3 671 {
cannam@3 672 checkOutputMap(plugin);
cannam@268 673
cannam@3 674 return m_pluginOutputs[plugin]->size();
cannam@3 675 }
cannam@3 676
cannam@3 677 VampOutputDescriptor *
cannam@76 678 PluginAdapterBase::Impl::getOutputDescriptor(Plugin *plugin,
cannam@268 679 unsigned int i)
cannam@3 680 {
cannam@3 681 checkOutputMap(plugin);
cannam@268 682
cannam@3 683 Plugin::OutputDescriptor &od =
cannam@3 684 (*m_pluginOutputs[plugin])[i];
cannam@3 685
cannam@3 686 VampOutputDescriptor *desc = (VampOutputDescriptor *)
cannam@3 687 malloc(sizeof(VampOutputDescriptor));
cannam@3 688
cannam@49 689 desc->identifier = strdup(od.identifier.c_str());
cannam@3 690 desc->name = strdup(od.name.c_str());
cannam@3 691 desc->description = strdup(od.description.c_str());
cannam@3 692 desc->unit = strdup(od.unit.c_str());
cannam@9 693 desc->hasFixedBinCount = od.hasFixedBinCount;
cannam@9 694 desc->binCount = od.binCount;
cannam@3 695
cannam@240 696 if (od.hasFixedBinCount && od.binCount > 0
cannam@240 697 // We would like to do "&& !od.binNames.empty()" here -- but we
cannam@240 698 // can't, because it will crash older versions of the host adapter
cannam@240 699 // which try to copy the names across whenever the bin count is
cannam@240 700 // non-zero, regardless of whether they exist or not
cannam@240 701 ) {
cannam@9 702 desc->binNames = (const char **)
cannam@9 703 malloc(od.binCount * sizeof(const char *));
cannam@3 704
cannam@9 705 for (unsigned int i = 0; i < od.binCount; ++i) {
cannam@9 706 if (i < od.binNames.size()) {
cannam@9 707 desc->binNames[i] = strdup(od.binNames[i].c_str());
cannam@7 708 } else {
cannam@9 709 desc->binNames[i] = 0;
cannam@7 710 }
cannam@3 711 }
cannam@7 712 } else {
cannam@9 713 desc->binNames = 0;
cannam@3 714 }
cannam@3 715
cannam@3 716 desc->hasKnownExtents = od.hasKnownExtents;
cannam@3 717 desc->minValue = od.minValue;
cannam@3 718 desc->maxValue = od.maxValue;
cannam@3 719 desc->isQuantized = od.isQuantized;
cannam@3 720 desc->quantizeStep = od.quantizeStep;
cannam@3 721
cannam@3 722 switch (od.sampleType) {
cannam@3 723 case Plugin::OutputDescriptor::OneSamplePerStep:
cannam@3 724 desc->sampleType = vampOneSamplePerStep; break;
cannam@3 725 case Plugin::OutputDescriptor::FixedSampleRate:
cannam@3 726 desc->sampleType = vampFixedSampleRate; break;
cannam@3 727 case Plugin::OutputDescriptor::VariableSampleRate:
cannam@3 728 desc->sampleType = vampVariableSampleRate; break;
cannam@3 729 }
cannam@3 730
cannam@3 731 desc->sampleRate = od.sampleRate;
cannam@192 732 desc->hasDuration = od.hasDuration;
cannam@3 733
cannam@3 734 return desc;
cannam@3 735 }
cannam@3 736
cannam@12 737 VampFeatureList *
cannam@76 738 PluginAdapterBase::Impl::process(Plugin *plugin,
cannam@108 739 const float *const *inputBuffers,
cannam@108 740 int sec, int nsec)
cannam@3 741 {
cannam@76 742 // std::cerr << "PluginAdapterBase::Impl::process" << std::endl;
cannam@3 743 RealTime rt(sec, nsec);
cannam@12 744 checkOutputMap(plugin);
cannam@12 745 return convertFeatures(plugin, plugin->process(inputBuffers, rt));
cannam@3 746 }
cannam@3 747
cannam@12 748 VampFeatureList *
cannam@76 749 PluginAdapterBase::Impl::getRemainingFeatures(Plugin *plugin)
cannam@3 750 {
cannam@76 751 // std::cerr << "PluginAdapterBase::Impl::getRemainingFeatures" << std::endl;
cannam@12 752 checkOutputMap(plugin);
cannam@12 753 return convertFeatures(plugin, plugin->getRemainingFeatures());
cannam@3 754 }
cannam@3 755
cannam@12 756 VampFeatureList *
cannam@76 757 PluginAdapterBase::Impl::convertFeatures(Plugin *plugin,
cannam@167 758 const Plugin::FeatureSet &features)
cannam@3 759 {
cannam@12 760 int lastN = -1;
cannam@3 761
cannam@12 762 int outputCount = 0;
cannam@12 763 if (m_pluginOutputs[plugin]) outputCount = m_pluginOutputs[plugin]->size();
cannam@12 764
cannam@12 765 resizeFS(plugin, outputCount);
cannam@12 766 VampFeatureList *fs = m_fs[plugin];
cannam@3 767
cannam@168 768 // std::cerr << "PluginAdapter(v2)::convertFeatures: NOTE: sizeof(Feature) == " << sizeof(Plugin::Feature) << ", sizeof(VampFeature) == " << sizeof(VampFeature) << ", sizeof(VampFeatureList) == " << sizeof(VampFeatureList) << std::endl;
cannam@168 769
cannam@12 770 for (Plugin::FeatureSet::const_iterator fi = features.begin();
cannam@12 771 fi != features.end(); ++fi) {
cannam@3 772
cannam@12 773 int n = fi->first;
cannam@12 774
cannam@76 775 // std::cerr << "PluginAdapterBase::Impl::convertFeatures: n = " << n << std::endl;
cannam@7 776
cannam@12 777 if (n >= int(outputCount)) {
cannam@76 778 std::cerr << "WARNING: PluginAdapterBase::Impl::convertFeatures: Too many outputs from plugin (" << n+1 << ", only should be " << outputCount << ")" << std::endl;
cannam@7 779 continue;
cannam@7 780 }
cannam@7 781
cannam@12 782 if (n > lastN + 1) {
cannam@12 783 for (int i = lastN + 1; i < n; ++i) {
cannam@12 784 fs[i].featureCount = 0;
cannam@12 785 }
cannam@12 786 }
cannam@7 787
cannam@7 788 const Plugin::FeatureList &fl = fi->second;
cannam@7 789
cannam@12 790 size_t sz = fl.size();
cannam@12 791 if (sz > m_fsizes[plugin][n]) resizeFL(plugin, n, sz);
cannam@12 792 fs[n].featureCount = sz;
cannam@12 793
cannam@12 794 for (size_t j = 0; j < sz; ++j) {
cannam@7 795
cannam@76 796 // std::cerr << "PluginAdapterBase::Impl::convertFeatures: j = " << j << std::endl;
cannam@7 797
cannam@168 798 VampFeature *feature = &fs[n].features[j].v1;
cannam@7 799
cannam@7 800 feature->hasTimestamp = fl[j].hasTimestamp;
cannam@7 801 feature->sec = fl[j].timestamp.sec;
cannam@7 802 feature->nsec = fl[j].timestamp.nsec;
cannam@7 803 feature->valueCount = fl[j].values.size();
cannam@7 804
cannam@168 805 VampFeatureV2 *v2 = &fs[n].features[j + sz].v2;
cannam@167 806
cannam@167 807 v2->hasDuration = fl[j].hasDuration;
cannam@167 808 v2->durationSec = fl[j].duration.sec;
cannam@167 809 v2->durationNsec = fl[j].duration.nsec;
cannam@167 810
cannam@12 811 if (feature->label) free(feature->label);
cannam@12 812
cannam@12 813 if (fl[j].label.empty()) {
cannam@12 814 feature->label = 0;
cannam@12 815 } else {
cannam@12 816 feature->label = strdup(fl[j].label.c_str());
cannam@7 817 }
cannam@7 818
cannam@12 819 if (feature->valueCount > m_fvsizes[plugin][n][j]) {
cannam@12 820 resizeFV(plugin, n, j, feature->valueCount);
cannam@12 821 }
cannam@7 822
cannam@7 823 for (unsigned int k = 0; k < feature->valueCount; ++k) {
cannam@76 824 // std::cerr << "PluginAdapterBase::Impl::convertFeatures: k = " << k << std::endl;
cannam@7 825 feature->values[k] = fl[j].values[k];
cannam@3 826 }
cannam@3 827 }
cannam@12 828
cannam@12 829 lastN = n;
cannam@3 830 }
cannam@3 831
cannam@12 832 if (lastN == -1) return 0;
cannam@12 833
cannam@12 834 if (int(outputCount) > lastN + 1) {
cannam@12 835 for (int i = lastN + 1; i < int(outputCount); ++i) {
cannam@12 836 fs[i].featureCount = 0;
cannam@12 837 }
cannam@12 838 }
cannam@3 839
cannam@168 840 // std::cerr << "PluginAdapter(v2)::convertFeatures: NOTE: have " << outputCount << " outputs" << std::endl;
cannam@168 841 // for (int i = 0; i < outputCount; ++i) {
cannam@168 842 // std::cerr << "PluginAdapter(v2)::convertFeatures: NOTE: output " << i << " has " << fs[i].featureCount << " features" << std::endl;
cannam@168 843 // }
cannam@168 844
cannam@168 845
cannam@3 846 return fs;
cannam@3 847 }
cannam@3 848
cannam@12 849 void
cannam@76 850 PluginAdapterBase::Impl::resizeFS(Plugin *plugin, int n)
cannam@12 851 {
cannam@76 852 // std::cerr << "PluginAdapterBase::Impl::resizeFS(" << plugin << ", " << n << ")" << std::endl;
cannam@12 853
cannam@12 854 int i = m_fsizes[plugin].size();
cannam@12 855 if (i >= n) return;
cannam@12 856
cannam@16 857 // std::cerr << "resizing from " << i << std::endl;
cannam@12 858
cannam@12 859 m_fs[plugin] = (VampFeatureList *)realloc
cannam@12 860 (m_fs[plugin], n * sizeof(VampFeatureList));
cannam@12 861
cannam@12 862 while (i < n) {
cannam@12 863 m_fs[plugin][i].featureCount = 0;
cannam@12 864 m_fs[plugin][i].features = 0;
cannam@12 865 m_fsizes[plugin].push_back(0);
cannam@12 866 m_fvsizes[plugin].push_back(std::vector<size_t>());
cannam@12 867 i++;
cannam@12 868 }
cannam@12 869 }
cannam@12 870
cannam@12 871 void
cannam@76 872 PluginAdapterBase::Impl::resizeFL(Plugin *plugin, int n, size_t sz)
cannam@12 873 {
cannam@76 874 // std::cerr << "PluginAdapterBase::Impl::resizeFL(" << plugin << ", " << n << ", "
cannam@16 875 // << sz << ")" << std::endl;
cannam@12 876
cannam@12 877 size_t i = m_fsizes[plugin][n];
cannam@12 878 if (i >= sz) return;
cannam@12 879
cannam@16 880 // std::cerr << "resizing from " << i << std::endl;
cannam@12 881
cannam@168 882 m_fs[plugin][n].features = (VampFeatureUnion *)realloc
cannam@168 883 (m_fs[plugin][n].features, 2 * sz * sizeof(VampFeatureUnion));
cannam@167 884
cannam@12 885 while (m_fsizes[plugin][n] < sz) {
cannam@168 886 m_fs[plugin][n].features[m_fsizes[plugin][n]].v1.hasTimestamp = 0;
cannam@168 887 m_fs[plugin][n].features[m_fsizes[plugin][n]].v1.valueCount = 0;
cannam@168 888 m_fs[plugin][n].features[m_fsizes[plugin][n]].v1.values = 0;
cannam@168 889 m_fs[plugin][n].features[m_fsizes[plugin][n]].v1.label = 0;
cannam@189 890 m_fs[plugin][n].features[m_fsizes[plugin][n] + sz].v2.hasDuration = 0;
cannam@12 891 m_fvsizes[plugin][n].push_back(0);
cannam@12 892 m_fsizes[plugin][n]++;
cannam@12 893 }
cannam@12 894 }
cannam@12 895
cannam@12 896 void
cannam@76 897 PluginAdapterBase::Impl::resizeFV(Plugin *plugin, int n, int j, size_t sz)
cannam@12 898 {
cannam@76 899 // std::cerr << "PluginAdapterBase::Impl::resizeFV(" << plugin << ", " << n << ", "
cannam@16 900 // << j << ", " << sz << ")" << std::endl;
cannam@12 901
cannam@12 902 size_t i = m_fvsizes[plugin][n][j];
cannam@12 903 if (i >= sz) return;
cannam@12 904
cannam@16 905 // std::cerr << "resizing from " << i << std::endl;
cannam@12 906
cannam@168 907 m_fs[plugin][n].features[j].v1.values = (float *)realloc
cannam@168 908 (m_fs[plugin][n].features[j].v1.values, sz * sizeof(float));
cannam@12 909
cannam@12 910 m_fvsizes[plugin][n][j] = sz;
cannam@12 911 }
cannam@12 912
cannam@76 913 PluginAdapterBase::Impl::AdapterMap *
cannam@76 914 PluginAdapterBase::Impl::m_adapterMap = 0;
cannam@3 915
cannam@3 916 }
cannam@3 917
cannam@233 918 _VAMP_SDK_PLUGSPACE_END(PluginAdapter.cpp)
cannam@230 919