annotate plugin/LADSPAPluginInstance.cpp @ 1008:d9e0e59a1581

When using an aggregate model to pass data to a transform, zero-pad the shorter input to the duration of the longer rather than truncating the longer. (This is better behaviour for e.g. MATCH, and in any case the code was previously truncating incorrectly and ending up with garbage data at the end.)
author Chris Cannam
date Fri, 14 Nov 2014 13:51:33 +0000
parents 7aa9088e9bcd
children b14064bd1f97
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@973 126 if (!f) return list;
Chris@51 127
Chris@51 128 for (unsigned int i = 0; i < m_controlPortsIn.size(); ++i) {
Chris@51 129
Chris@51 130 ParameterDescriptor pd;
Chris@51 131 unsigned int pn = m_controlPortsIn[i].first;
Chris@51 132
Chris@239 133 pd.identifier = m_descriptor->PortNames[pn];
Chris@239 134 pd.name = pd.identifier;
Chris@239 135 pd.description = "";
Chris@51 136 pd.minValue = f->getPortMinimum(m_descriptor, pn);
Chris@51 137 pd.maxValue = f->getPortMaximum(m_descriptor, pn);
Chris@51 138 pd.defaultValue = f->getPortDefault(m_descriptor, pn);
Chris@57 139
Chris@57 140 float q = f->getPortQuantization(m_descriptor, pn);
Chris@57 141 if (q == 0.0) {
Chris@57 142 pd.isQuantized = false;
Chris@57 143 } else {
Chris@57 144 pd.isQuantized = true;
Chris@57 145 pd.quantizeStep = q;
Chris@57 146 }
Chris@51 147
Chris@166 148 bool haveLabels = false;
Chris@166 149
Chris@166 150 #ifdef HAVE_LRDF
Chris@166 151 if (pd.isQuantized && pd.quantizeStep == 1.0) {
Chris@166 152
Chris@166 153 lrdf_defaults *defaults =
Chris@166 154 lrdf_get_scale_values(m_descriptor->UniqueID, pn);
Chris@166 155
Chris@166 156 if (defaults) {
Chris@166 157 if (defaults->count > 0) {
Chris@166 158 std::map<int, std::string> values;
Chris@259 159 size_t v = 0;
Chris@166 160 for (size_t i = 0; i < defaults->count; ++i) {
Chris@259 161 v = size_t(lrintf(fabsf(defaults->items[i].value)));
Chris@166 162 values[v] = defaults->items[i].label;
Chris@166 163 }
Chris@166 164 for (size_t i = 0; i <= v; ++i) {
Chris@166 165 pd.valueNames.push_back(values[i]);
Chris@166 166 }
Chris@166 167 haveLabels = true;
Chris@166 168 }
Chris@166 169 lrdf_free_setting_values(defaults);
Chris@166 170 }
Chris@166 171 }
Chris@166 172 #endif
Chris@166 173
Chris@166 174 if (haveLabels) {
Chris@239 175 pd.name = QString(pd.name.c_str())
Chris@166 176 .replace(QRegExp("\\([^\\(\\)]+=[^\\(\\)]+\\)$"), "")
Chris@166 177 .toStdString();
Chris@166 178 } else {
Chris@166 179 static QRegExp unitRE("[\\[\\(]([A-Za-z0-9/]+)[\\)\\]]$");
Chris@166 180 if (unitRE.indexIn(pd.name.c_str()) >= 0) {
Chris@166 181 pd.unit = unitRE.cap(1).toStdString();
Chris@239 182 pd.name = QString(pd.name.c_str())
Chris@166 183 .replace(unitRE, "").toStdString();
Chris@166 184 }
Chris@166 185 }
Chris@166 186
Chris@51 187 list.push_back(pd);
Chris@51 188 }
Chris@51 189
Chris@51 190 return list;
Chris@51 191 }
Chris@51 192
Chris@51 193 float
Chris@239 194 LADSPAPluginInstance::getParameter(std::string id) const
Chris@51 195 {
Chris@51 196 for (unsigned int i = 0; i < m_controlPortsIn.size(); ++i) {
Chris@239 197 if (id == m_descriptor->PortNames[m_controlPortsIn[i].first]) {
Chris@51 198 return getParameterValue(i);
Chris@51 199 }
Chris@51 200 }
Chris@51 201
Chris@51 202 return 0.0;
Chris@51 203 }
Chris@51 204
Chris@51 205 void
Chris@239 206 LADSPAPluginInstance::setParameter(std::string id, float value)
Chris@51 207 {
Chris@51 208 for (unsigned int i = 0; i < m_controlPortsIn.size(); ++i) {
Chris@239 209 if (id == m_descriptor->PortNames[m_controlPortsIn[i].first]) {
Chris@242 210 #ifdef DEBUG_LADSPA
Chris@690 211 SVDEBUG << "LADSPAPluginInstance::setParameter: Found id "
Chris@687 212 << id << " at control port " << i << endl;
Chris@242 213 #endif
Chris@51 214 setParameterValue(i, value);
Chris@51 215 break;
Chris@51 216 }
Chris@51 217 }
Chris@51 218 }
Chris@0 219
Chris@0 220 void
Chris@0 221 LADSPAPluginInstance::init(int idealChannelCount)
Chris@0 222 {
Chris@0 223 #ifdef DEBUG_LADSPA
Chris@690 224 SVDEBUG << "LADSPAPluginInstance::init(" << idealChannelCount << "): plugin has "
Chris@687 225 << m_descriptor->PortCount << " ports" << endl;
Chris@0 226 #endif
Chris@0 227
Chris@0 228 // Discover ports numbers and identities
Chris@0 229 //
Chris@242 230 for (unsigned long i = 0; i < m_descriptor->PortCount; ++i) {
Chris@242 231
Chris@242 232 if (LADSPA_IS_PORT_AUDIO(m_descriptor->PortDescriptors[i])) {
Chris@242 233
Chris@0 234 if (LADSPA_IS_PORT_INPUT(m_descriptor->PortDescriptors[i])) {
Chris@0 235 #ifdef DEBUG_LADSPA
Chris@690 236 SVDEBUG << "LADSPAPluginInstance::init: port " << i << " is audio in" << endl;
Chris@0 237 #endif
Chris@0 238 m_audioPortsIn.push_back(i);
Chris@0 239 } else {
Chris@0 240 #ifdef DEBUG_LADSPA
Chris@690 241 SVDEBUG << "LADSPAPluginInstance::init: port " << i << " is audio out" << endl;
Chris@0 242 #endif
Chris@0 243 m_audioPortsOut.push_back(i);
Chris@0 244 }
Chris@242 245
Chris@242 246 } else if (LADSPA_IS_PORT_CONTROL(m_descriptor->PortDescriptors[i])) {
Chris@242 247
Chris@0 248 if (LADSPA_IS_PORT_INPUT(m_descriptor->PortDescriptors[i])) {
Chris@242 249
Chris@0 250 #ifdef DEBUG_LADSPA
Chris@690 251 SVDEBUG << "LADSPAPluginInstance::init: port " << i << " is control in" << endl;
Chris@0 252 #endif
Chris@0 253 LADSPA_Data *data = new LADSPA_Data(0.0);
Chris@0 254 m_controlPortsIn.push_back(
Chris@0 255 std::pair<unsigned long, LADSPA_Data*>(i, data));
Chris@242 256
Chris@0 257 } else {
Chris@242 258
Chris@0 259 #ifdef DEBUG_LADSPA
Chris@690 260 SVDEBUG << "LADSPAPluginInstance::init: port " << i << " is control out" << endl;
Chris@0 261 #endif
Chris@0 262 LADSPA_Data *data = new LADSPA_Data(0.0);
Chris@0 263 m_controlPortsOut.push_back(
Chris@0 264 std::pair<unsigned long, LADSPA_Data*>(i, data));
Chris@0 265 if (!strcmp(m_descriptor->PortNames[i], "latency") ||
Chris@0 266 !strcmp(m_descriptor->PortNames[i], "_latency")) {
Chris@0 267 #ifdef DEBUG_LADSPA
Chris@843 268 cerr << "Wooo! We have a latency port!" << endl;
Chris@0 269 #endif
Chris@0 270 m_latencyPort = data;
Chris@0 271 }
Chris@242 272
Chris@0 273 }
Chris@0 274 }
Chris@0 275 #ifdef DEBUG_LADSPA
Chris@0 276 else
Chris@690 277 SVDEBUG << "LADSPAPluginInstance::init - "
Chris@687 278 << "unrecognised port type" << endl;
Chris@0 279 #endif
Chris@0 280 }
Chris@0 281
Chris@0 282 m_instanceCount = 1;
Chris@0 283
Chris@0 284 if (idealChannelCount > 0) {
Chris@0 285 if (m_audioPortsIn.size() == 1) {
Chris@0 286 // mono plugin: duplicate it if need be
Chris@0 287 m_instanceCount = idealChannelCount;
Chris@0 288 }
Chris@0 289 }
Chris@0 290 }
Chris@0 291
Chris@0 292 size_t
Chris@0 293 LADSPAPluginInstance::getLatency()
Chris@0 294 {
Chris@0 295 if (m_latencyPort) {
Chris@242 296 if (!m_run) {
Chris@259 297 for (size_t i = 0; i < getAudioInputCount(); ++i) {
Chris@259 298 for (size_t j = 0; j < m_blockSize; ++j) {
Chris@242 299 m_inputBuffers[i][j] = 0.f;
Chris@242 300 }
Chris@242 301 }
Chris@242 302 run(Vamp::RealTime::zeroTime);
Chris@242 303 }
Chris@0 304 if (*m_latencyPort > 0) return (size_t)*m_latencyPort;
Chris@0 305 }
Chris@0 306 return 0;
Chris@0 307 }
Chris@0 308
Chris@0 309 void
Chris@0 310 LADSPAPluginInstance::silence()
Chris@0 311 {
Chris@0 312 if (isOK()) {
Chris@0 313 deactivate();
Chris@0 314 activate();
Chris@0 315 }
Chris@0 316 }
Chris@0 317
Chris@0 318 void
Chris@0 319 LADSPAPluginInstance::setIdealChannelCount(size_t channels)
Chris@0 320 {
Chris@0 321 if (m_audioPortsIn.size() != 1 || channels == m_instanceCount) {
Chris@0 322 silence();
Chris@0 323 return;
Chris@0 324 }
Chris@0 325
Chris@0 326 if (isOK()) {
Chris@0 327 deactivate();
Chris@0 328 }
Chris@0 329
Chris@0 330 //!!! don't we need to reallocate inputBuffers and outputBuffers?
Chris@0 331
Chris@0 332 cleanup();
Chris@0 333 m_instanceCount = channels;
Chris@0 334 instantiate(m_sampleRate);
Chris@0 335 if (isOK()) {
Chris@0 336 connectPorts();
Chris@0 337 activate();
Chris@0 338 }
Chris@0 339 }
Chris@0 340
Chris@0 341
Chris@0 342 LADSPAPluginInstance::~LADSPAPluginInstance()
Chris@0 343 {
Chris@0 344 #ifdef DEBUG_LADSPA
Chris@690 345 SVDEBUG << "LADSPAPluginInstance::~LADSPAPluginInstance" << endl;
Chris@0 346 #endif
Chris@0 347
Chris@0 348 if (m_instanceHandles.size() != 0) { // "isOK()"
Chris@0 349 deactivate();
Chris@0 350 }
Chris@0 351
Chris@0 352 cleanup();
Chris@0 353
Chris@0 354 for (unsigned int i = 0; i < m_controlPortsIn.size(); ++i)
Chris@0 355 delete m_controlPortsIn[i].second;
Chris@0 356
Chris@0 357 for (unsigned int i = 0; i < m_controlPortsOut.size(); ++i)
Chris@0 358 delete m_controlPortsOut[i].second;
Chris@0 359
Chris@0 360 m_controlPortsIn.clear();
Chris@0 361 m_controlPortsOut.clear();
Chris@0 362
Chris@0 363 if (m_ownBuffers) {
Chris@184 364 for (size_t i = 0; i < m_instanceCount * m_audioPortsIn.size(); ++i) {
Chris@0 365 delete[] m_inputBuffers[i];
Chris@0 366 }
Chris@184 367 for (size_t i = 0; i < m_instanceCount * m_audioPortsOut.size(); ++i) {
Chris@0 368 delete[] m_outputBuffers[i];
Chris@0 369 }
Chris@0 370
Chris@0 371 delete[] m_inputBuffers;
Chris@0 372 delete[] m_outputBuffers;
Chris@0 373 }
Chris@0 374
Chris@0 375 m_audioPortsIn.clear();
Chris@0 376 m_audioPortsOut.clear();
Chris@0 377 }
Chris@0 378
Chris@0 379
Chris@0 380 void
Chris@0 381 LADSPAPluginInstance::instantiate(unsigned long sampleRate)
Chris@0 382 {
Chris@724 383 if (!m_descriptor) return;
Chris@724 384
Chris@0 385 #ifdef DEBUG_LADSPA
Chris@843 386 cout << "LADSPAPluginInstance::instantiate - plugin unique id = "
Chris@843 387 << m_descriptor->UniqueID << endl;
Chris@0 388 #endif
Chris@0 389
Chris@0 390 if (!m_descriptor->instantiate) {
Chris@843 391 cerr << "Bad plugin: plugin id " << m_descriptor->UniqueID
Chris@0 392 << ":" << m_descriptor->Label
Chris@843 393 << " has no instantiate method!" << endl;
Chris@0 394 return;
Chris@0 395 }
Chris@0 396
Chris@0 397 for (size_t i = 0; i < m_instanceCount; ++i) {
Chris@0 398 m_instanceHandles.push_back
Chris@0 399 (m_descriptor->instantiate(m_descriptor, sampleRate));
Chris@0 400 }
Chris@0 401 }
Chris@0 402
Chris@0 403 void
Chris@0 404 LADSPAPluginInstance::activate()
Chris@0 405 {
Chris@0 406 if (!m_descriptor || !m_descriptor->activate) return;
Chris@0 407
Chris@0 408 for (std::vector<LADSPA_Handle>::iterator hi = m_instanceHandles.begin();
Chris@0 409 hi != m_instanceHandles.end(); ++hi) {
Chris@0 410 m_descriptor->activate(*hi);
Chris@0 411 }
Chris@0 412 }
Chris@0 413
Chris@0 414 void
Chris@0 415 LADSPAPluginInstance::connectPorts()
Chris@0 416 {
Chris@0 417 if (!m_descriptor || !m_descriptor->connect_port) return;
Chris@0 418
Chris@0 419 assert(sizeof(LADSPA_Data) == sizeof(float));
Chris@0 420 assert(sizeof(sample_t) == sizeof(float));
Chris@0 421
Chris@57 422 LADSPAPluginFactory *f = dynamic_cast<LADSPAPluginFactory *>(m_factory);
Chris@0 423 int inbuf = 0, outbuf = 0;
Chris@0 424
Chris@0 425 for (std::vector<LADSPA_Handle>::iterator hi = m_instanceHandles.begin();
Chris@0 426 hi != m_instanceHandles.end(); ++hi) {
Chris@0 427
Chris@0 428 for (unsigned int i = 0; i < m_audioPortsIn.size(); ++i) {
Chris@0 429 m_descriptor->connect_port(*hi,
Chris@0 430 m_audioPortsIn[i],
Chris@0 431 (LADSPA_Data *)m_inputBuffers[inbuf]);
Chris@0 432 ++inbuf;
Chris@0 433 }
Chris@0 434
Chris@0 435 for (unsigned int i = 0; i < m_audioPortsOut.size(); ++i) {
Chris@0 436 m_descriptor->connect_port(*hi,
Chris@0 437 m_audioPortsOut[i],
Chris@0 438 (LADSPA_Data *)m_outputBuffers[outbuf]);
Chris@0 439 ++outbuf;
Chris@0 440 }
Chris@0 441
Chris@0 442 // If there is more than one instance, they all share the same
Chris@0 443 // control port ins (and outs, for the moment, because we
Chris@0 444 // don't actually do anything with the outs anyway -- but they
Chris@0 445 // do have to be connected as the plugin can't know if they're
Chris@0 446 // not and will write to them anyway).
Chris@0 447
Chris@0 448 for (unsigned int i = 0; i < m_controlPortsIn.size(); ++i) {
Chris@0 449 m_descriptor->connect_port(*hi,
Chris@0 450 m_controlPortsIn[i].first,
Chris@0 451 m_controlPortsIn[i].second);
Chris@57 452 if (f) {
Chris@57 453 float defaultValue = f->getPortDefault
Chris@57 454 (m_descriptor, m_controlPortsIn[i].first);
Chris@57 455 *m_controlPortsIn[i].second = defaultValue;
Chris@57 456 }
Chris@0 457 }
Chris@0 458
Chris@0 459 for (unsigned int i = 0; i < m_controlPortsOut.size(); ++i) {
Chris@0 460 m_descriptor->connect_port(*hi,
Chris@0 461 m_controlPortsOut[i].first,
Chris@0 462 m_controlPortsOut[i].second);
Chris@0 463 }
Chris@0 464 }
Chris@0 465 }
Chris@0 466
Chris@0 467 unsigned int
Chris@0 468 LADSPAPluginInstance::getParameterCount() const
Chris@0 469 {
Chris@0 470 return m_controlPortsIn.size();
Chris@0 471 }
Chris@0 472
Chris@0 473 void
Chris@0 474 LADSPAPluginInstance::setParameterValue(unsigned int parameter, float value)
Chris@0 475 {
Chris@0 476 if (parameter >= m_controlPortsIn.size()) return;
Chris@0 477
Chris@0 478 unsigned int portNumber = m_controlPortsIn[parameter].first;
Chris@0 479
Chris@0 480 LADSPAPluginFactory *f = dynamic_cast<LADSPAPluginFactory *>(m_factory);
Chris@0 481 if (f) {
Chris@0 482 if (value < f->getPortMinimum(m_descriptor, portNumber)) {
Chris@0 483 value = f->getPortMinimum(m_descriptor, portNumber);
Chris@0 484 }
Chris@0 485 if (value > f->getPortMaximum(m_descriptor, portNumber)) {
Chris@0 486 value = f->getPortMaximum(m_descriptor, portNumber);
Chris@0 487 }
Chris@0 488 }
Chris@0 489
Chris@0 490 (*m_controlPortsIn[parameter].second) = value;
Chris@0 491 }
Chris@0 492
Chris@0 493 float
Martin@62 494 LADSPAPluginInstance::getControlOutputValue(size_t output) const
Chris@60 495 {
Chris@60 496 if (output > m_controlPortsOut.size()) return 0.0;
Chris@60 497 return (*m_controlPortsOut[output].second);
Chris@60 498 }
Chris@60 499
Chris@60 500 float
Chris@0 501 LADSPAPluginInstance::getParameterValue(unsigned int parameter) const
Chris@0 502 {
Chris@0 503 if (parameter >= m_controlPortsIn.size()) return 0.0;
Chris@0 504 return (*m_controlPortsIn[parameter].second);
Chris@0 505 }
Chris@0 506
Chris@0 507 float
Chris@0 508 LADSPAPluginInstance::getParameterDefault(unsigned int parameter) const
Chris@0 509 {
Chris@0 510 if (parameter >= m_controlPortsIn.size()) return 0.0;
Chris@0 511
Chris@0 512 LADSPAPluginFactory *f = dynamic_cast<LADSPAPluginFactory *>(m_factory);
Chris@0 513 if (f) {
Chris@0 514 return f->getPortDefault(m_descriptor, m_controlPortsIn[parameter].first);
Chris@0 515 } else {
Chris@0 516 return 0.0f;
Chris@0 517 }
Chris@0 518 }
Chris@0 519
Chris@356 520 int
Chris@356 521 LADSPAPluginInstance::getParameterDisplayHint(unsigned int parameter) const
Chris@356 522 {
Chris@356 523 if (parameter >= m_controlPortsIn.size()) return 0.0;
Chris@356 524
Chris@356 525 LADSPAPluginFactory *f = dynamic_cast<LADSPAPluginFactory *>(m_factory);
Chris@356 526 if (f) {
Chris@356 527 return f->getPortDisplayHint(m_descriptor, m_controlPortsIn[parameter].first);
Chris@356 528 } else {
Chris@356 529 return PortHint::NoHint;
Chris@356 530 }
Chris@356 531 }
Chris@356 532
Chris@0 533 void
Chris@385 534 LADSPAPluginInstance::run(const Vamp::RealTime &, size_t count)
Chris@0 535 {
Chris@0 536 if (!m_descriptor || !m_descriptor->run) return;
Chris@0 537
Chris@385 538 if (count == 0) count = m_blockSize;
Chris@385 539
Chris@0 540 for (std::vector<LADSPA_Handle>::iterator hi = m_instanceHandles.begin();
Chris@0 541 hi != m_instanceHandles.end(); ++hi) {
Chris@242 542
Chris@385 543 m_descriptor->run(*hi, count);
Chris@0 544 }
Chris@0 545
Chris@0 546 m_run = true;
Chris@0 547 }
Chris@0 548
Chris@0 549 void
Chris@0 550 LADSPAPluginInstance::deactivate()
Chris@0 551 {
Chris@0 552 if (!m_descriptor || !m_descriptor->deactivate) return;
Chris@0 553
Chris@0 554 for (std::vector<LADSPA_Handle>::iterator hi = m_instanceHandles.begin();
Chris@0 555 hi != m_instanceHandles.end(); ++hi) {
Chris@0 556 m_descriptor->deactivate(*hi);
Chris@0 557 }
Chris@0 558 }
Chris@0 559
Chris@0 560 void
Chris@0 561 LADSPAPluginInstance::cleanup()
Chris@0 562 {
Chris@0 563 if (!m_descriptor) return;
Chris@0 564
Chris@0 565 if (!m_descriptor->cleanup) {
Chris@843 566 cerr << "Bad plugin: plugin id " << m_descriptor->UniqueID
Chris@0 567 << ":" << m_descriptor->Label
Chris@843 568 << " has no cleanup method!" << endl;
Chris@0 569 return;
Chris@0 570 }
Chris@0 571
Chris@0 572 for (std::vector<LADSPA_Handle>::iterator hi = m_instanceHandles.begin();
Chris@0 573 hi != m_instanceHandles.end(); ++hi) {
Chris@0 574 m_descriptor->cleanup(*hi);
Chris@0 575 }
Chris@0 576
Chris@0 577 m_instanceHandles.clear();
Chris@0 578 }
Chris@0 579
Chris@0 580