annotate plugin/LADSPAPluginInstance.cpp @ 458:f60360209e5c

* Fix race condition in FFTFileCache when reading from the same FFT model from multiple threads (e.g. when applying more than one plugin at once)
author Chris Cannam
date Wed, 15 Oct 2008 12:08:02 +0000
parents 9b35a1731c3d
children 47b41ec34407
rev   line source
Chris@49 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@0 2
Chris@0 3 /*
Chris@52 4 Sonic Visualiser
Chris@52 5 An audio file viewer and annotation editor.
Chris@52 6 Centre for Digital Music, Queen Mary, University of London.
Chris@0 7
Chris@52 8 This program is free software; you can redistribute it and/or
Chris@52 9 modify it under the terms of the GNU General Public License as
Chris@52 10 published by the Free Software Foundation; either version 2 of the
Chris@52 11 License, or (at your option) any later version. See the file
Chris@52 12 COPYING included with this distribution for more information.
Chris@0 13 */
Chris@0 14
Chris@0 15 /*
Chris@0 16 This is a modified version of a source file from the
Chris@0 17 Rosegarden MIDI and audio sequencer and notation editor.
Chris@202 18 This file copyright 2000-2006 Chris Cannam, Richard Bown, and QMUL.
Chris@0 19 */
Chris@0 20
Chris@0 21 #include <iostream>
Chris@0 22 #include <cassert>
Chris@0 23
Chris@0 24 #include "LADSPAPluginInstance.h"
Chris@0 25 #include "LADSPAPluginFactory.h"
Chris@0 26
Chris@166 27 #ifdef HAVE_LRDF
Chris@166 28 #include "lrdf.h"
Chris@166 29 #endif // HAVE_LRDF
Chris@166 30
Chris@117 31 //#define DEBUG_LADSPA 1
Chris@0 32
Chris@259 33 #include <cmath>
Chris@259 34
Chris@0 35
Chris@0 36 LADSPAPluginInstance::LADSPAPluginInstance(RealTimePluginFactory *factory,
Chris@0 37 int clientId,
Chris@0 38 QString identifier,
Chris@0 39 int position,
Chris@0 40 unsigned long sampleRate,
Chris@0 41 size_t blockSize,
Chris@0 42 int idealChannelCount,
Chris@0 43 const LADSPA_Descriptor* descriptor) :
Chris@0 44 RealTimePluginInstance(factory, identifier),
Chris@0 45 m_client(clientId),
Chris@0 46 m_position(position),
Chris@0 47 m_instanceCount(0),
Chris@0 48 m_descriptor(descriptor),
Chris@0 49 m_blockSize(blockSize),
Chris@0 50 m_sampleRate(sampleRate),
Chris@0 51 m_latencyPort(0),
Chris@0 52 m_run(false),
Chris@0 53 m_bypassed(false)
Chris@0 54 {
Chris@0 55 init(idealChannelCount);
Chris@0 56
Chris@176 57 if (m_audioPortsIn.size() == 0) {
Chris@176 58 m_inputBuffers = 0;
Chris@176 59 } else {
Chris@176 60 m_inputBuffers = new sample_t*[m_instanceCount * m_audioPortsIn.size()];
Chris@176 61 }
Chris@176 62
Chris@176 63 if (m_audioPortsOut.size() == 0) {
Chris@176 64 m_outputBuffers = 0;
Chris@176 65 } else {
Chris@176 66 m_outputBuffers = new sample_t*[m_instanceCount * m_audioPortsOut.size()];
Chris@176 67 }
Chris@0 68
Chris@0 69 for (size_t i = 0; i < m_instanceCount * m_audioPortsIn.size(); ++i) {
Chris@0 70 m_inputBuffers[i] = new sample_t[blockSize];
Chris@0 71 }
Chris@0 72 for (size_t i = 0; i < m_instanceCount * m_audioPortsOut.size(); ++i) {
Chris@0 73 m_outputBuffers[i] = new sample_t[blockSize];
Chris@0 74 }
Chris@0 75
Chris@0 76 m_ownBuffers = true;
Chris@0 77
Chris@0 78 instantiate(sampleRate);
Chris@0 79 if (isOK()) {
Chris@0 80 connectPorts();
Chris@0 81 activate();
Chris@0 82 }
Chris@0 83 }
Chris@0 84
Chris@51 85 std::string
Chris@239 86 LADSPAPluginInstance::getIdentifier() const
Chris@239 87 {
Chris@239 88 return m_descriptor->Label;
Chris@239 89 }
Chris@239 90
Chris@239 91 std::string
Chris@51 92 LADSPAPluginInstance::getName() const
Chris@0 93 {
Chris@239 94 return m_descriptor->Name;
Chris@0 95 }
Chris@0 96
Chris@51 97 std::string
Chris@51 98 LADSPAPluginInstance::getDescription() const
Chris@51 99 {
Chris@239 100 return "";
Chris@51 101 }
Chris@51 102
Chris@51 103 std::string
Chris@51 104 LADSPAPluginInstance::getMaker() const
Chris@51 105 {
Chris@51 106 return m_descriptor->Maker;
Chris@51 107 }
Chris@51 108
Chris@51 109 int
Chris@51 110 LADSPAPluginInstance::getPluginVersion() const
Chris@51 111 {
Chris@51 112 return 1;
Chris@51 113 }
Chris@51 114
Chris@51 115 std::string
Chris@51 116 LADSPAPluginInstance::getCopyright() const
Chris@51 117 {
Chris@51 118 return m_descriptor->Copyright;
Chris@51 119 }
Chris@51 120
Chris@51 121 LADSPAPluginInstance::ParameterList
Chris@51 122 LADSPAPluginInstance::getParameterDescriptors() const
Chris@51 123 {
Chris@51 124 ParameterList list;
Chris@51 125 LADSPAPluginFactory *f = dynamic_cast<LADSPAPluginFactory *>(m_factory);
Chris@51 126
Chris@51 127 for (unsigned int i = 0; i < m_controlPortsIn.size(); ++i) {
Chris@51 128
Chris@51 129 ParameterDescriptor pd;
Chris@51 130 unsigned int pn = m_controlPortsIn[i].first;
Chris@51 131
Chris@239 132 pd.identifier = m_descriptor->PortNames[pn];
Chris@239 133 pd.name = pd.identifier;
Chris@239 134 pd.description = "";
Chris@51 135 pd.minValue = f->getPortMinimum(m_descriptor, pn);
Chris@51 136 pd.maxValue = f->getPortMaximum(m_descriptor, pn);
Chris@51 137 pd.defaultValue = f->getPortDefault(m_descriptor, pn);
Chris@57 138
Chris@57 139 float q = f->getPortQuantization(m_descriptor, pn);
Chris@57 140 if (q == 0.0) {
Chris@57 141 pd.isQuantized = false;
Chris@57 142 } else {
Chris@57 143 pd.isQuantized = true;
Chris@57 144 pd.quantizeStep = q;
Chris@57 145 }
Chris@51 146
Chris@166 147 bool haveLabels = false;
Chris@166 148
Chris@166 149 #ifdef HAVE_LRDF
Chris@166 150 if (pd.isQuantized && pd.quantizeStep == 1.0) {
Chris@166 151
Chris@166 152 lrdf_defaults *defaults =
Chris@166 153 lrdf_get_scale_values(m_descriptor->UniqueID, pn);
Chris@166 154
Chris@166 155 if (defaults) {
Chris@166 156 if (defaults->count > 0) {
Chris@166 157 std::map<int, std::string> values;
Chris@259 158 size_t v = 0;
Chris@166 159 for (size_t i = 0; i < defaults->count; ++i) {
Chris@259 160 v = size_t(lrintf(fabsf(defaults->items[i].value)));
Chris@166 161 values[v] = defaults->items[i].label;
Chris@166 162 }
Chris@166 163 for (size_t i = 0; i <= v; ++i) {
Chris@166 164 pd.valueNames.push_back(values[i]);
Chris@166 165 }
Chris@166 166 haveLabels = true;
Chris@166 167 }
Chris@166 168 lrdf_free_setting_values(defaults);
Chris@166 169 }
Chris@166 170 }
Chris@166 171 #endif
Chris@166 172
Chris@166 173 if (haveLabels) {
Chris@239 174 pd.name = QString(pd.name.c_str())
Chris@166 175 .replace(QRegExp("\\([^\\(\\)]+=[^\\(\\)]+\\)$"), "")
Chris@166 176 .toStdString();
Chris@166 177 } else {
Chris@166 178 static QRegExp unitRE("[\\[\\(]([A-Za-z0-9/]+)[\\)\\]]$");
Chris@166 179 if (unitRE.indexIn(pd.name.c_str()) >= 0) {
Chris@166 180 pd.unit = unitRE.cap(1).toStdString();
Chris@239 181 pd.name = QString(pd.name.c_str())
Chris@166 182 .replace(unitRE, "").toStdString();
Chris@166 183 }
Chris@166 184 }
Chris@166 185
Chris@51 186 list.push_back(pd);
Chris@51 187 }
Chris@51 188
Chris@51 189 return list;
Chris@51 190 }
Chris@51 191
Chris@51 192 float
Chris@239 193 LADSPAPluginInstance::getParameter(std::string id) const
Chris@51 194 {
Chris@51 195 for (unsigned int i = 0; i < m_controlPortsIn.size(); ++i) {
Chris@239 196 if (id == m_descriptor->PortNames[m_controlPortsIn[i].first]) {
Chris@51 197 return getParameterValue(i);
Chris@51 198 }
Chris@51 199 }
Chris@51 200
Chris@51 201 return 0.0;
Chris@51 202 }
Chris@51 203
Chris@51 204 void
Chris@239 205 LADSPAPluginInstance::setParameter(std::string id, float value)
Chris@51 206 {
Chris@51 207 for (unsigned int i = 0; i < m_controlPortsIn.size(); ++i) {
Chris@239 208 if (id == m_descriptor->PortNames[m_controlPortsIn[i].first]) {
Chris@242 209 #ifdef DEBUG_LADSPA
Chris@239 210 std::cerr << "LADSPAPluginInstance::setParameter: Found id "
Chris@239 211 << id << " at control port " << i << std::endl;
Chris@242 212 #endif
Chris@51 213 setParameterValue(i, value);
Chris@51 214 break;
Chris@51 215 }
Chris@51 216 }
Chris@51 217 }
Chris@0 218
Chris@0 219 void
Chris@0 220 LADSPAPluginInstance::init(int idealChannelCount)
Chris@0 221 {
Chris@0 222 #ifdef DEBUG_LADSPA
Chris@0 223 std::cerr << "LADSPAPluginInstance::init(" << idealChannelCount << "): plugin has "
Chris@0 224 << m_descriptor->PortCount << " ports" << std::endl;
Chris@0 225 #endif
Chris@0 226
Chris@0 227 // Discover ports numbers and identities
Chris@0 228 //
Chris@242 229 for (unsigned long i = 0; i < m_descriptor->PortCount; ++i) {
Chris@242 230
Chris@242 231 if (LADSPA_IS_PORT_AUDIO(m_descriptor->PortDescriptors[i])) {
Chris@242 232
Chris@0 233 if (LADSPA_IS_PORT_INPUT(m_descriptor->PortDescriptors[i])) {
Chris@0 234 #ifdef DEBUG_LADSPA
Chris@0 235 std::cerr << "LADSPAPluginInstance::init: port " << i << " is audio in" << std::endl;
Chris@0 236 #endif
Chris@0 237 m_audioPortsIn.push_back(i);
Chris@0 238 } else {
Chris@0 239 #ifdef DEBUG_LADSPA
Chris@0 240 std::cerr << "LADSPAPluginInstance::init: port " << i << " is audio out" << std::endl;
Chris@0 241 #endif
Chris@0 242 m_audioPortsOut.push_back(i);
Chris@0 243 }
Chris@242 244
Chris@242 245 } else if (LADSPA_IS_PORT_CONTROL(m_descriptor->PortDescriptors[i])) {
Chris@242 246
Chris@0 247 if (LADSPA_IS_PORT_INPUT(m_descriptor->PortDescriptors[i])) {
Chris@242 248
Chris@0 249 #ifdef DEBUG_LADSPA
Chris@0 250 std::cerr << "LADSPAPluginInstance::init: port " << i << " is control in" << std::endl;
Chris@0 251 #endif
Chris@0 252 LADSPA_Data *data = new LADSPA_Data(0.0);
Chris@0 253 m_controlPortsIn.push_back(
Chris@0 254 std::pair<unsigned long, LADSPA_Data*>(i, data));
Chris@242 255
Chris@0 256 } else {
Chris@242 257
Chris@0 258 #ifdef DEBUG_LADSPA
Chris@0 259 std::cerr << "LADSPAPluginInstance::init: port " << i << " is control out" << std::endl;
Chris@0 260 #endif
Chris@0 261 LADSPA_Data *data = new LADSPA_Data(0.0);
Chris@0 262 m_controlPortsOut.push_back(
Chris@0 263 std::pair<unsigned long, LADSPA_Data*>(i, data));
Chris@0 264 if (!strcmp(m_descriptor->PortNames[i], "latency") ||
Chris@0 265 !strcmp(m_descriptor->PortNames[i], "_latency")) {
Chris@0 266 #ifdef DEBUG_LADSPA
Chris@0 267 std::cerr << "Wooo! We have a latency port!" << std::endl;
Chris@0 268 #endif
Chris@0 269 m_latencyPort = data;
Chris@0 270 }
Chris@242 271
Chris@0 272 }
Chris@0 273 }
Chris@0 274 #ifdef DEBUG_LADSPA
Chris@0 275 else
Chris@0 276 std::cerr << "LADSPAPluginInstance::init - "
Chris@0 277 << "unrecognised port type" << std::endl;
Chris@0 278 #endif
Chris@0 279 }
Chris@0 280
Chris@0 281 m_instanceCount = 1;
Chris@0 282
Chris@0 283 if (idealChannelCount > 0) {
Chris@0 284 if (m_audioPortsIn.size() == 1) {
Chris@0 285 // mono plugin: duplicate it if need be
Chris@0 286 m_instanceCount = idealChannelCount;
Chris@0 287 }
Chris@0 288 }
Chris@0 289 }
Chris@0 290
Chris@0 291 size_t
Chris@0 292 LADSPAPluginInstance::getLatency()
Chris@0 293 {
Chris@0 294 if (m_latencyPort) {
Chris@242 295 if (!m_run) {
Chris@259 296 for (size_t i = 0; i < getAudioInputCount(); ++i) {
Chris@259 297 for (size_t j = 0; j < m_blockSize; ++j) {
Chris@242 298 m_inputBuffers[i][j] = 0.f;
Chris@242 299 }
Chris@242 300 }
Chris@242 301 run(Vamp::RealTime::zeroTime);
Chris@242 302 }
Chris@0 303 if (*m_latencyPort > 0) return (size_t)*m_latencyPort;
Chris@0 304 }
Chris@0 305 return 0;
Chris@0 306 }
Chris@0 307
Chris@0 308 void
Chris@0 309 LADSPAPluginInstance::silence()
Chris@0 310 {
Chris@0 311 if (isOK()) {
Chris@0 312 deactivate();
Chris@0 313 activate();
Chris@0 314 }
Chris@0 315 }
Chris@0 316
Chris@0 317 void
Chris@0 318 LADSPAPluginInstance::setIdealChannelCount(size_t channels)
Chris@0 319 {
Chris@0 320 if (m_audioPortsIn.size() != 1 || channels == m_instanceCount) {
Chris@0 321 silence();
Chris@0 322 return;
Chris@0 323 }
Chris@0 324
Chris@0 325 if (isOK()) {
Chris@0 326 deactivate();
Chris@0 327 }
Chris@0 328
Chris@0 329 //!!! don't we need to reallocate inputBuffers and outputBuffers?
Chris@0 330
Chris@0 331 cleanup();
Chris@0 332 m_instanceCount = channels;
Chris@0 333 instantiate(m_sampleRate);
Chris@0 334 if (isOK()) {
Chris@0 335 connectPorts();
Chris@0 336 activate();
Chris@0 337 }
Chris@0 338 }
Chris@0 339
Chris@0 340
Chris@0 341 LADSPAPluginInstance::~LADSPAPluginInstance()
Chris@0 342 {
Chris@0 343 #ifdef DEBUG_LADSPA
Chris@0 344 std::cerr << "LADSPAPluginInstance::~LADSPAPluginInstance" << std::endl;
Chris@0 345 #endif
Chris@0 346
Chris@0 347 if (m_instanceHandles.size() != 0) { // "isOK()"
Chris@0 348 deactivate();
Chris@0 349 }
Chris@0 350
Chris@0 351 cleanup();
Chris@0 352
Chris@0 353 for (unsigned int i = 0; i < m_controlPortsIn.size(); ++i)
Chris@0 354 delete m_controlPortsIn[i].second;
Chris@0 355
Chris@0 356 for (unsigned int i = 0; i < m_controlPortsOut.size(); ++i)
Chris@0 357 delete m_controlPortsOut[i].second;
Chris@0 358
Chris@0 359 m_controlPortsIn.clear();
Chris@0 360 m_controlPortsOut.clear();
Chris@0 361
Chris@0 362 if (m_ownBuffers) {
Chris@184 363 for (size_t i = 0; i < m_instanceCount * m_audioPortsIn.size(); ++i) {
Chris@0 364 delete[] m_inputBuffers[i];
Chris@0 365 }
Chris@184 366 for (size_t i = 0; i < m_instanceCount * m_audioPortsOut.size(); ++i) {
Chris@0 367 delete[] m_outputBuffers[i];
Chris@0 368 }
Chris@0 369
Chris@0 370 delete[] m_inputBuffers;
Chris@0 371 delete[] m_outputBuffers;
Chris@0 372 }
Chris@0 373
Chris@0 374 m_audioPortsIn.clear();
Chris@0 375 m_audioPortsOut.clear();
Chris@0 376 }
Chris@0 377
Chris@0 378
Chris@0 379 void
Chris@0 380 LADSPAPluginInstance::instantiate(unsigned long sampleRate)
Chris@0 381 {
Chris@0 382 #ifdef DEBUG_LADSPA
Chris@0 383 std::cout << "LADSPAPluginInstance::instantiate - plugin unique id = "
Chris@0 384 << m_descriptor->UniqueID << std::endl;
Chris@0 385 #endif
Chris@0 386 if (!m_descriptor) return;
Chris@0 387
Chris@0 388 if (!m_descriptor->instantiate) {
Chris@0 389 std::cerr << "Bad plugin: plugin id " << m_descriptor->UniqueID
Chris@0 390 << ":" << m_descriptor->Label
Chris@0 391 << " has no instantiate method!" << std::endl;
Chris@0 392 return;
Chris@0 393 }
Chris@0 394
Chris@0 395 for (size_t i = 0; i < m_instanceCount; ++i) {
Chris@0 396 m_instanceHandles.push_back
Chris@0 397 (m_descriptor->instantiate(m_descriptor, sampleRate));
Chris@0 398 }
Chris@0 399 }
Chris@0 400
Chris@0 401 void
Chris@0 402 LADSPAPluginInstance::activate()
Chris@0 403 {
Chris@0 404 if (!m_descriptor || !m_descriptor->activate) return;
Chris@0 405
Chris@0 406 for (std::vector<LADSPA_Handle>::iterator hi = m_instanceHandles.begin();
Chris@0 407 hi != m_instanceHandles.end(); ++hi) {
Chris@0 408 m_descriptor->activate(*hi);
Chris@0 409 }
Chris@0 410 }
Chris@0 411
Chris@0 412 void
Chris@0 413 LADSPAPluginInstance::connectPorts()
Chris@0 414 {
Chris@0 415 if (!m_descriptor || !m_descriptor->connect_port) return;
Chris@0 416
Chris@0 417 assert(sizeof(LADSPA_Data) == sizeof(float));
Chris@0 418 assert(sizeof(sample_t) == sizeof(float));
Chris@0 419
Chris@57 420 LADSPAPluginFactory *f = dynamic_cast<LADSPAPluginFactory *>(m_factory);
Chris@0 421 int inbuf = 0, outbuf = 0;
Chris@0 422
Chris@0 423 for (std::vector<LADSPA_Handle>::iterator hi = m_instanceHandles.begin();
Chris@0 424 hi != m_instanceHandles.end(); ++hi) {
Chris@0 425
Chris@0 426 for (unsigned int i = 0; i < m_audioPortsIn.size(); ++i) {
Chris@0 427 m_descriptor->connect_port(*hi,
Chris@0 428 m_audioPortsIn[i],
Chris@0 429 (LADSPA_Data *)m_inputBuffers[inbuf]);
Chris@0 430 ++inbuf;
Chris@0 431 }
Chris@0 432
Chris@0 433 for (unsigned int i = 0; i < m_audioPortsOut.size(); ++i) {
Chris@0 434 m_descriptor->connect_port(*hi,
Chris@0 435 m_audioPortsOut[i],
Chris@0 436 (LADSPA_Data *)m_outputBuffers[outbuf]);
Chris@0 437 ++outbuf;
Chris@0 438 }
Chris@0 439
Chris@0 440 // If there is more than one instance, they all share the same
Chris@0 441 // control port ins (and outs, for the moment, because we
Chris@0 442 // don't actually do anything with the outs anyway -- but they
Chris@0 443 // do have to be connected as the plugin can't know if they're
Chris@0 444 // not and will write to them anyway).
Chris@0 445
Chris@0 446 for (unsigned int i = 0; i < m_controlPortsIn.size(); ++i) {
Chris@0 447 m_descriptor->connect_port(*hi,
Chris@0 448 m_controlPortsIn[i].first,
Chris@0 449 m_controlPortsIn[i].second);
Chris@57 450 if (f) {
Chris@57 451 float defaultValue = f->getPortDefault
Chris@57 452 (m_descriptor, m_controlPortsIn[i].first);
Chris@57 453 *m_controlPortsIn[i].second = defaultValue;
Chris@57 454 }
Chris@0 455 }
Chris@0 456
Chris@0 457 for (unsigned int i = 0; i < m_controlPortsOut.size(); ++i) {
Chris@0 458 m_descriptor->connect_port(*hi,
Chris@0 459 m_controlPortsOut[i].first,
Chris@0 460 m_controlPortsOut[i].second);
Chris@0 461 }
Chris@0 462 }
Chris@0 463 }
Chris@0 464
Chris@0 465 unsigned int
Chris@0 466 LADSPAPluginInstance::getParameterCount() const
Chris@0 467 {
Chris@0 468 return m_controlPortsIn.size();
Chris@0 469 }
Chris@0 470
Chris@0 471 void
Chris@0 472 LADSPAPluginInstance::setParameterValue(unsigned int parameter, float value)
Chris@0 473 {
Chris@0 474 if (parameter >= m_controlPortsIn.size()) return;
Chris@0 475
Chris@0 476 unsigned int portNumber = m_controlPortsIn[parameter].first;
Chris@0 477
Chris@0 478 LADSPAPluginFactory *f = dynamic_cast<LADSPAPluginFactory *>(m_factory);
Chris@0 479 if (f) {
Chris@0 480 if (value < f->getPortMinimum(m_descriptor, portNumber)) {
Chris@0 481 value = f->getPortMinimum(m_descriptor, portNumber);
Chris@0 482 }
Chris@0 483 if (value > f->getPortMaximum(m_descriptor, portNumber)) {
Chris@0 484 value = f->getPortMaximum(m_descriptor, portNumber);
Chris@0 485 }
Chris@0 486 }
Chris@0 487
Chris@0 488 (*m_controlPortsIn[parameter].second) = value;
Chris@0 489 }
Chris@0 490
Chris@0 491 float
Martin@62 492 LADSPAPluginInstance::getControlOutputValue(size_t output) const
Chris@60 493 {
Chris@60 494 if (output > m_controlPortsOut.size()) return 0.0;
Chris@60 495 return (*m_controlPortsOut[output].second);
Chris@60 496 }
Chris@60 497
Chris@60 498 float
Chris@0 499 LADSPAPluginInstance::getParameterValue(unsigned int parameter) const
Chris@0 500 {
Chris@0 501 if (parameter >= m_controlPortsIn.size()) return 0.0;
Chris@0 502 return (*m_controlPortsIn[parameter].second);
Chris@0 503 }
Chris@0 504
Chris@0 505 float
Chris@0 506 LADSPAPluginInstance::getParameterDefault(unsigned int parameter) const
Chris@0 507 {
Chris@0 508 if (parameter >= m_controlPortsIn.size()) return 0.0;
Chris@0 509
Chris@0 510 LADSPAPluginFactory *f = dynamic_cast<LADSPAPluginFactory *>(m_factory);
Chris@0 511 if (f) {
Chris@0 512 return f->getPortDefault(m_descriptor, m_controlPortsIn[parameter].first);
Chris@0 513 } else {
Chris@0 514 return 0.0f;
Chris@0 515 }
Chris@0 516 }
Chris@0 517
Chris@356 518 int
Chris@356 519 LADSPAPluginInstance::getParameterDisplayHint(unsigned int parameter) const
Chris@356 520 {
Chris@356 521 if (parameter >= m_controlPortsIn.size()) return 0.0;
Chris@356 522
Chris@356 523 LADSPAPluginFactory *f = dynamic_cast<LADSPAPluginFactory *>(m_factory);
Chris@356 524 if (f) {
Chris@356 525 return f->getPortDisplayHint(m_descriptor, m_controlPortsIn[parameter].first);
Chris@356 526 } else {
Chris@356 527 return PortHint::NoHint;
Chris@356 528 }
Chris@356 529 }
Chris@356 530
Chris@0 531 void
Chris@385 532 LADSPAPluginInstance::run(const Vamp::RealTime &, size_t count)
Chris@0 533 {
Chris@0 534 if (!m_descriptor || !m_descriptor->run) return;
Chris@0 535
Chris@385 536 if (count == 0) count = m_blockSize;
Chris@385 537
Chris@0 538 for (std::vector<LADSPA_Handle>::iterator hi = m_instanceHandles.begin();
Chris@0 539 hi != m_instanceHandles.end(); ++hi) {
Chris@242 540
Chris@385 541 m_descriptor->run(*hi, count);
Chris@0 542 }
Chris@0 543
Chris@0 544 m_run = true;
Chris@0 545 }
Chris@0 546
Chris@0 547 void
Chris@0 548 LADSPAPluginInstance::deactivate()
Chris@0 549 {
Chris@0 550 if (!m_descriptor || !m_descriptor->deactivate) return;
Chris@0 551
Chris@0 552 for (std::vector<LADSPA_Handle>::iterator hi = m_instanceHandles.begin();
Chris@0 553 hi != m_instanceHandles.end(); ++hi) {
Chris@0 554 m_descriptor->deactivate(*hi);
Chris@0 555 }
Chris@0 556 }
Chris@0 557
Chris@0 558 void
Chris@0 559 LADSPAPluginInstance::cleanup()
Chris@0 560 {
Chris@0 561 if (!m_descriptor) return;
Chris@0 562
Chris@0 563 if (!m_descriptor->cleanup) {
Chris@0 564 std::cerr << "Bad plugin: plugin id " << m_descriptor->UniqueID
Chris@0 565 << ":" << m_descriptor->Label
Chris@0 566 << " has no cleanup method!" << std::endl;
Chris@0 567 return;
Chris@0 568 }
Chris@0 569
Chris@0 570 for (std::vector<LADSPA_Handle>::iterator hi = m_instanceHandles.begin();
Chris@0 571 hi != m_instanceHandles.end(); ++hi) {
Chris@0 572 m_descriptor->cleanup(*hi);
Chris@0 573 }
Chris@0 574
Chris@0 575 m_instanceHandles.clear();
Chris@0 576 }
Chris@0 577
Chris@0 578