annotate plugin/LADSPAPluginInstance.cpp @ 795:dc20458f6f85 qt5

Don't need to check for Dataquay, and in fact we can pick up the wrong version if we do. Just assume it is available (building in e.g. sv subdir configuration)
author Chris Cannam
date Tue, 07 May 2013 15:41:58 +0100
parents 7eb389da7976
children e802e550a1f2
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@473 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@690 210 SVDEBUG << "LADSPAPluginInstance::setParameter: Found id "
Chris@687 211 << id << " at control port " << i << 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@690 223 SVDEBUG << "LADSPAPluginInstance::init(" << idealChannelCount << "): plugin has "
Chris@687 224 << m_descriptor->PortCount << " ports" << 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@690 235 SVDEBUG << "LADSPAPluginInstance::init: port " << i << " is audio in" << endl;
Chris@0 236 #endif
Chris@0 237 m_audioPortsIn.push_back(i);
Chris@0 238 } else {
Chris@0 239 #ifdef DEBUG_LADSPA
Chris@690 240 SVDEBUG << "LADSPAPluginInstance::init: port " << i << " is audio out" << 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@690 250 SVDEBUG << "LADSPAPluginInstance::init: port " << i << " is control in" << 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@690 259 SVDEBUG << "LADSPAPluginInstance::init: port " << i << " is control out" << 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@690 276 SVDEBUG << "LADSPAPluginInstance::init - "
Chris@687 277 << "unrecognised port type" << 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@690 344 SVDEBUG << "LADSPAPluginInstance::~LADSPAPluginInstance" << 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@724 382 if (!m_descriptor) return;
Chris@724 383
Chris@0 384 #ifdef DEBUG_LADSPA
Chris@0 385 std::cout << "LADSPAPluginInstance::instantiate - plugin unique id = "
Chris@0 386 << m_descriptor->UniqueID << std::endl;
Chris@0 387 #endif
Chris@0 388
Chris@0 389 if (!m_descriptor->instantiate) {
Chris@0 390 std::cerr << "Bad plugin: plugin id " << m_descriptor->UniqueID
Chris@0 391 << ":" << m_descriptor->Label
Chris@0 392 << " has no instantiate method!" << std::endl;
Chris@0 393 return;
Chris@0 394 }
Chris@0 395
Chris@0 396 for (size_t i = 0; i < m_instanceCount; ++i) {
Chris@0 397 m_instanceHandles.push_back
Chris@0 398 (m_descriptor->instantiate(m_descriptor, sampleRate));
Chris@0 399 }
Chris@0 400 }
Chris@0 401
Chris@0 402 void
Chris@0 403 LADSPAPluginInstance::activate()
Chris@0 404 {
Chris@0 405 if (!m_descriptor || !m_descriptor->activate) return;
Chris@0 406
Chris@0 407 for (std::vector<LADSPA_Handle>::iterator hi = m_instanceHandles.begin();
Chris@0 408 hi != m_instanceHandles.end(); ++hi) {
Chris@0 409 m_descriptor->activate(*hi);
Chris@0 410 }
Chris@0 411 }
Chris@0 412
Chris@0 413 void
Chris@0 414 LADSPAPluginInstance::connectPorts()
Chris@0 415 {
Chris@0 416 if (!m_descriptor || !m_descriptor->connect_port) return;
Chris@0 417
Chris@0 418 assert(sizeof(LADSPA_Data) == sizeof(float));
Chris@0 419 assert(sizeof(sample_t) == sizeof(float));
Chris@0 420
Chris@57 421 LADSPAPluginFactory *f = dynamic_cast<LADSPAPluginFactory *>(m_factory);
Chris@0 422 int inbuf = 0, outbuf = 0;
Chris@0 423
Chris@0 424 for (std::vector<LADSPA_Handle>::iterator hi = m_instanceHandles.begin();
Chris@0 425 hi != m_instanceHandles.end(); ++hi) {
Chris@0 426
Chris@0 427 for (unsigned int i = 0; i < m_audioPortsIn.size(); ++i) {
Chris@0 428 m_descriptor->connect_port(*hi,
Chris@0 429 m_audioPortsIn[i],
Chris@0 430 (LADSPA_Data *)m_inputBuffers[inbuf]);
Chris@0 431 ++inbuf;
Chris@0 432 }
Chris@0 433
Chris@0 434 for (unsigned int i = 0; i < m_audioPortsOut.size(); ++i) {
Chris@0 435 m_descriptor->connect_port(*hi,
Chris@0 436 m_audioPortsOut[i],
Chris@0 437 (LADSPA_Data *)m_outputBuffers[outbuf]);
Chris@0 438 ++outbuf;
Chris@0 439 }
Chris@0 440
Chris@0 441 // If there is more than one instance, they all share the same
Chris@0 442 // control port ins (and outs, for the moment, because we
Chris@0 443 // don't actually do anything with the outs anyway -- but they
Chris@0 444 // do have to be connected as the plugin can't know if they're
Chris@0 445 // not and will write to them anyway).
Chris@0 446
Chris@0 447 for (unsigned int i = 0; i < m_controlPortsIn.size(); ++i) {
Chris@0 448 m_descriptor->connect_port(*hi,
Chris@0 449 m_controlPortsIn[i].first,
Chris@0 450 m_controlPortsIn[i].second);
Chris@57 451 if (f) {
Chris@57 452 float defaultValue = f->getPortDefault
Chris@57 453 (m_descriptor, m_controlPortsIn[i].first);
Chris@57 454 *m_controlPortsIn[i].second = defaultValue;
Chris@57 455 }
Chris@0 456 }
Chris@0 457
Chris@0 458 for (unsigned int i = 0; i < m_controlPortsOut.size(); ++i) {
Chris@0 459 m_descriptor->connect_port(*hi,
Chris@0 460 m_controlPortsOut[i].first,
Chris@0 461 m_controlPortsOut[i].second);
Chris@0 462 }
Chris@0 463 }
Chris@0 464 }
Chris@0 465
Chris@0 466 unsigned int
Chris@0 467 LADSPAPluginInstance::getParameterCount() const
Chris@0 468 {
Chris@0 469 return m_controlPortsIn.size();
Chris@0 470 }
Chris@0 471
Chris@0 472 void
Chris@0 473 LADSPAPluginInstance::setParameterValue(unsigned int parameter, float value)
Chris@0 474 {
Chris@0 475 if (parameter >= m_controlPortsIn.size()) return;
Chris@0 476
Chris@0 477 unsigned int portNumber = m_controlPortsIn[parameter].first;
Chris@0 478
Chris@0 479 LADSPAPluginFactory *f = dynamic_cast<LADSPAPluginFactory *>(m_factory);
Chris@0 480 if (f) {
Chris@0 481 if (value < f->getPortMinimum(m_descriptor, portNumber)) {
Chris@0 482 value = f->getPortMinimum(m_descriptor, portNumber);
Chris@0 483 }
Chris@0 484 if (value > f->getPortMaximum(m_descriptor, portNumber)) {
Chris@0 485 value = f->getPortMaximum(m_descriptor, portNumber);
Chris@0 486 }
Chris@0 487 }
Chris@0 488
Chris@0 489 (*m_controlPortsIn[parameter].second) = value;
Chris@0 490 }
Chris@0 491
Chris@0 492 float
Martin@62 493 LADSPAPluginInstance::getControlOutputValue(size_t output) const
Chris@60 494 {
Chris@60 495 if (output > m_controlPortsOut.size()) return 0.0;
Chris@60 496 return (*m_controlPortsOut[output].second);
Chris@60 497 }
Chris@60 498
Chris@60 499 float
Chris@0 500 LADSPAPluginInstance::getParameterValue(unsigned int parameter) const
Chris@0 501 {
Chris@0 502 if (parameter >= m_controlPortsIn.size()) return 0.0;
Chris@0 503 return (*m_controlPortsIn[parameter].second);
Chris@0 504 }
Chris@0 505
Chris@0 506 float
Chris@0 507 LADSPAPluginInstance::getParameterDefault(unsigned int parameter) const
Chris@0 508 {
Chris@0 509 if (parameter >= m_controlPortsIn.size()) return 0.0;
Chris@0 510
Chris@0 511 LADSPAPluginFactory *f = dynamic_cast<LADSPAPluginFactory *>(m_factory);
Chris@0 512 if (f) {
Chris@0 513 return f->getPortDefault(m_descriptor, m_controlPortsIn[parameter].first);
Chris@0 514 } else {
Chris@0 515 return 0.0f;
Chris@0 516 }
Chris@0 517 }
Chris@0 518
Chris@356 519 int
Chris@356 520 LADSPAPluginInstance::getParameterDisplayHint(unsigned int parameter) const
Chris@356 521 {
Chris@356 522 if (parameter >= m_controlPortsIn.size()) return 0.0;
Chris@356 523
Chris@356 524 LADSPAPluginFactory *f = dynamic_cast<LADSPAPluginFactory *>(m_factory);
Chris@356 525 if (f) {
Chris@356 526 return f->getPortDisplayHint(m_descriptor, m_controlPortsIn[parameter].first);
Chris@356 527 } else {
Chris@356 528 return PortHint::NoHint;
Chris@356 529 }
Chris@356 530 }
Chris@356 531
Chris@0 532 void
Chris@385 533 LADSPAPluginInstance::run(const Vamp::RealTime &, size_t count)
Chris@0 534 {
Chris@0 535 if (!m_descriptor || !m_descriptor->run) return;
Chris@0 536
Chris@385 537 if (count == 0) count = m_blockSize;
Chris@385 538
Chris@0 539 for (std::vector<LADSPA_Handle>::iterator hi = m_instanceHandles.begin();
Chris@0 540 hi != m_instanceHandles.end(); ++hi) {
Chris@242 541
Chris@385 542 m_descriptor->run(*hi, count);
Chris@0 543 }
Chris@0 544
Chris@0 545 m_run = true;
Chris@0 546 }
Chris@0 547
Chris@0 548 void
Chris@0 549 LADSPAPluginInstance::deactivate()
Chris@0 550 {
Chris@0 551 if (!m_descriptor || !m_descriptor->deactivate) return;
Chris@0 552
Chris@0 553 for (std::vector<LADSPA_Handle>::iterator hi = m_instanceHandles.begin();
Chris@0 554 hi != m_instanceHandles.end(); ++hi) {
Chris@0 555 m_descriptor->deactivate(*hi);
Chris@0 556 }
Chris@0 557 }
Chris@0 558
Chris@0 559 void
Chris@0 560 LADSPAPluginInstance::cleanup()
Chris@0 561 {
Chris@0 562 if (!m_descriptor) return;
Chris@0 563
Chris@0 564 if (!m_descriptor->cleanup) {
Chris@0 565 std::cerr << "Bad plugin: plugin id " << m_descriptor->UniqueID
Chris@0 566 << ":" << m_descriptor->Label
Chris@0 567 << " has no cleanup method!" << std::endl;
Chris@0 568 return;
Chris@0 569 }
Chris@0 570
Chris@0 571 for (std::vector<LADSPA_Handle>::iterator hi = m_instanceHandles.begin();
Chris@0 572 hi != m_instanceHandles.end(); ++hi) {
Chris@0 573 m_descriptor->cleanup(*hi);
Chris@0 574 }
Chris@0 575
Chris@0 576 m_instanceHandles.clear();
Chris@0 577 }
Chris@0 578
Chris@0 579