lbajardsilogic@0: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ lbajardsilogic@0: lbajardsilogic@0: /* lbajardsilogic@0: Sonic Visualiser lbajardsilogic@0: An audio file viewer and annotation editor. lbajardsilogic@0: Centre for Digital Music, Queen Mary, University of London. lbajardsilogic@0: lbajardsilogic@0: This program is free software; you can redistribute it and/or lbajardsilogic@0: modify it under the terms of the GNU General Public License as lbajardsilogic@0: published by the Free Software Foundation; either version 2 of the lbajardsilogic@0: License, or (at your option) any later version. See the file lbajardsilogic@0: COPYING included with this distribution for more information. lbajardsilogic@0: */ lbajardsilogic@0: lbajardsilogic@0: /* lbajardsilogic@0: This is a modified version of a source file from the lbajardsilogic@0: Rosegarden MIDI and audio sequencer and notation editor. lbajardsilogic@0: This file copyright 2000-2006 Chris Cannam, Richard Bown, and QMUL. lbajardsilogic@0: */ lbajardsilogic@0: lbajardsilogic@0: #include lbajardsilogic@0: #include lbajardsilogic@0: lbajardsilogic@0: #include "LADSPAPluginInstance.h" lbajardsilogic@0: #include "LADSPAPluginFactory.h" lbajardsilogic@0: lbajardsilogic@0: #ifdef HAVE_LRDF lbajardsilogic@0: #include "lrdf.h" lbajardsilogic@0: #endif // HAVE_LRDF lbajardsilogic@0: lbajardsilogic@0: //#define DEBUG_LADSPA 1 lbajardsilogic@0: lbajardsilogic@0: #include lbajardsilogic@0: lbajardsilogic@0: lbajardsilogic@0: LADSPAPluginInstance::LADSPAPluginInstance(RealTimePluginFactory *factory, lbajardsilogic@0: int clientId, lbajardsilogic@0: QString identifier, lbajardsilogic@0: int position, lbajardsilogic@0: unsigned long sampleRate, lbajardsilogic@0: size_t blockSize, lbajardsilogic@0: int idealChannelCount, lbajardsilogic@0: const LADSPA_Descriptor* descriptor) : lbajardsilogic@0: RealTimePluginInstance(factory, identifier), lbajardsilogic@0: m_client(clientId), lbajardsilogic@0: m_position(position), lbajardsilogic@0: m_instanceCount(0), lbajardsilogic@0: m_descriptor(descriptor), lbajardsilogic@0: m_blockSize(blockSize), lbajardsilogic@0: m_sampleRate(sampleRate), lbajardsilogic@0: m_latencyPort(0), lbajardsilogic@0: m_run(false), lbajardsilogic@0: m_bypassed(false) lbajardsilogic@0: { lbajardsilogic@0: init(idealChannelCount); lbajardsilogic@0: lbajardsilogic@0: if (m_audioPortsIn.size() == 0) { lbajardsilogic@0: m_inputBuffers = 0; lbajardsilogic@0: } else { lbajardsilogic@0: m_inputBuffers = new sample_t*[m_instanceCount * m_audioPortsIn.size()]; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: if (m_audioPortsOut.size() == 0) { lbajardsilogic@0: m_outputBuffers = 0; lbajardsilogic@0: } else { lbajardsilogic@0: m_outputBuffers = new sample_t*[m_instanceCount * m_audioPortsOut.size()]; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: for (size_t i = 0; i < m_instanceCount * m_audioPortsIn.size(); ++i) { lbajardsilogic@0: m_inputBuffers[i] = new sample_t[blockSize]; lbajardsilogic@0: } lbajardsilogic@0: for (size_t i = 0; i < m_instanceCount * m_audioPortsOut.size(); ++i) { lbajardsilogic@0: m_outputBuffers[i] = new sample_t[blockSize]; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: m_ownBuffers = true; lbajardsilogic@0: lbajardsilogic@0: instantiate(sampleRate); lbajardsilogic@0: if (isOK()) { lbajardsilogic@0: connectPorts(); lbajardsilogic@0: activate(); lbajardsilogic@0: } lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: std::string lbajardsilogic@0: LADSPAPluginInstance::getIdentifier() const lbajardsilogic@0: { lbajardsilogic@0: return m_descriptor->Label; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: std::string lbajardsilogic@0: LADSPAPluginInstance::getName() const lbajardsilogic@0: { lbajardsilogic@0: return m_descriptor->Name; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: std::string lbajardsilogic@0: LADSPAPluginInstance::getDescription() const lbajardsilogic@0: { lbajardsilogic@0: return ""; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: std::string lbajardsilogic@0: LADSPAPluginInstance::getMaker() const lbajardsilogic@0: { lbajardsilogic@0: return m_descriptor->Maker; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: int lbajardsilogic@0: LADSPAPluginInstance::getPluginVersion() const lbajardsilogic@0: { lbajardsilogic@0: return 1; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: std::string lbajardsilogic@0: LADSPAPluginInstance::getCopyright() const lbajardsilogic@0: { lbajardsilogic@0: return m_descriptor->Copyright; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: LADSPAPluginInstance::ParameterList lbajardsilogic@0: LADSPAPluginInstance::getParameterDescriptors() const lbajardsilogic@0: { lbajardsilogic@0: ParameterList list; lbajardsilogic@0: LADSPAPluginFactory *f = dynamic_cast(m_factory); lbajardsilogic@0: lbajardsilogic@0: for (unsigned int i = 0; i < m_controlPortsIn.size(); ++i) { lbajardsilogic@0: lbajardsilogic@0: ParameterDescriptor pd; lbajardsilogic@0: unsigned int pn = m_controlPortsIn[i].first; lbajardsilogic@0: lbajardsilogic@0: pd.identifier = m_descriptor->PortNames[pn]; lbajardsilogic@0: pd.name = pd.identifier; lbajardsilogic@0: pd.description = ""; lbajardsilogic@0: pd.minValue = f->getPortMinimum(m_descriptor, pn); lbajardsilogic@0: pd.maxValue = f->getPortMaximum(m_descriptor, pn); lbajardsilogic@0: pd.defaultValue = f->getPortDefault(m_descriptor, pn); lbajardsilogic@0: lbajardsilogic@0: float q = f->getPortQuantization(m_descriptor, pn); lbajardsilogic@0: if (q == 0.0) { lbajardsilogic@0: pd.isQuantized = false; lbajardsilogic@0: } else { lbajardsilogic@0: pd.isQuantized = true; lbajardsilogic@0: pd.quantizeStep = q; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: bool haveLabels = false; lbajardsilogic@0: lbajardsilogic@0: #ifdef HAVE_LRDF lbajardsilogic@0: if (pd.isQuantized && pd.quantizeStep == 1.0) { lbajardsilogic@0: lbajardsilogic@0: lrdf_defaults *defaults = lbajardsilogic@0: lrdf_get_scale_values(m_descriptor->UniqueID, pn); lbajardsilogic@0: lbajardsilogic@0: if (defaults) { lbajardsilogic@0: if (defaults->count > 0) { lbajardsilogic@0: std::map values; lbajardsilogic@0: size_t v = 0; lbajardsilogic@0: for (size_t i = 0; i < defaults->count; ++i) { lbajardsilogic@0: v = size_t(lrintf(fabsf(defaults->items[i].value))); lbajardsilogic@0: values[v] = defaults->items[i].label; lbajardsilogic@0: } lbajardsilogic@0: for (size_t i = 0; i <= v; ++i) { lbajardsilogic@0: pd.valueNames.push_back(values[i]); lbajardsilogic@0: } lbajardsilogic@0: haveLabels = true; lbajardsilogic@0: } lbajardsilogic@0: lrdf_free_setting_values(defaults); lbajardsilogic@0: } lbajardsilogic@0: } lbajardsilogic@0: #endif lbajardsilogic@0: lbajardsilogic@0: if (haveLabels) { lbajardsilogic@0: pd.name = QString(pd.name.c_str()) lbajardsilogic@0: .replace(QRegExp("\\([^\\(\\)]+=[^\\(\\)]+\\)$"), "") lbajardsilogic@0: .toStdString(); lbajardsilogic@0: } else { lbajardsilogic@0: static QRegExp unitRE("[\\[\\(]([A-Za-z0-9/]+)[\\)\\]]$"); lbajardsilogic@0: if (unitRE.indexIn(pd.name.c_str()) >= 0) { lbajardsilogic@0: pd.unit = unitRE.cap(1).toStdString(); lbajardsilogic@0: pd.name = QString(pd.name.c_str()) lbajardsilogic@0: .replace(unitRE, "").toStdString(); lbajardsilogic@0: } lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: list.push_back(pd); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: return list; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: float lbajardsilogic@0: LADSPAPluginInstance::getParameter(std::string id) const lbajardsilogic@0: { lbajardsilogic@0: for (unsigned int i = 0; i < m_controlPortsIn.size(); ++i) { lbajardsilogic@0: if (id == m_descriptor->PortNames[m_controlPortsIn[i].first]) { lbajardsilogic@0: return getParameterValue(i); lbajardsilogic@0: } lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: return 0.0; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: void lbajardsilogic@0: LADSPAPluginInstance::setParameter(std::string id, float value) lbajardsilogic@0: { lbajardsilogic@0: for (unsigned int i = 0; i < m_controlPortsIn.size(); ++i) { lbajardsilogic@0: if (id == m_descriptor->PortNames[m_controlPortsIn[i].first]) { lbajardsilogic@0: #ifdef DEBUG_LADSPA lbajardsilogic@0: std::cerr << "LADSPAPluginInstance::setParameter: Found id " lbajardsilogic@0: << id << " at control port " << i << std::endl; lbajardsilogic@0: #endif lbajardsilogic@0: setParameterValue(i, value); lbajardsilogic@0: break; lbajardsilogic@0: } lbajardsilogic@0: } lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: void lbajardsilogic@0: LADSPAPluginInstance::init(int idealChannelCount) lbajardsilogic@0: { lbajardsilogic@0: #ifdef DEBUG_LADSPA lbajardsilogic@0: std::cerr << "LADSPAPluginInstance::init(" << idealChannelCount << "): plugin has " lbajardsilogic@0: << m_descriptor->PortCount << " ports" << std::endl; lbajardsilogic@0: #endif lbajardsilogic@0: lbajardsilogic@0: // Discover ports numbers and identities lbajardsilogic@0: // lbajardsilogic@0: for (unsigned long i = 0; i < m_descriptor->PortCount; ++i) { lbajardsilogic@0: lbajardsilogic@0: if (LADSPA_IS_PORT_AUDIO(m_descriptor->PortDescriptors[i])) { lbajardsilogic@0: lbajardsilogic@0: if (LADSPA_IS_PORT_INPUT(m_descriptor->PortDescriptors[i])) { lbajardsilogic@0: #ifdef DEBUG_LADSPA lbajardsilogic@0: std::cerr << "LADSPAPluginInstance::init: port " << i << " is audio in" << std::endl; lbajardsilogic@0: #endif lbajardsilogic@0: m_audioPortsIn.push_back(i); lbajardsilogic@0: } else { lbajardsilogic@0: #ifdef DEBUG_LADSPA lbajardsilogic@0: std::cerr << "LADSPAPluginInstance::init: port " << i << " is audio out" << std::endl; lbajardsilogic@0: #endif lbajardsilogic@0: m_audioPortsOut.push_back(i); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: } else if (LADSPA_IS_PORT_CONTROL(m_descriptor->PortDescriptors[i])) { lbajardsilogic@0: lbajardsilogic@0: if (LADSPA_IS_PORT_INPUT(m_descriptor->PortDescriptors[i])) { lbajardsilogic@0: lbajardsilogic@0: #ifdef DEBUG_LADSPA lbajardsilogic@0: std::cerr << "LADSPAPluginInstance::init: port " << i << " is control in" << std::endl; lbajardsilogic@0: #endif lbajardsilogic@0: LADSPA_Data *data = new LADSPA_Data(0.0); lbajardsilogic@0: m_controlPortsIn.push_back( lbajardsilogic@0: std::pair(i, data)); lbajardsilogic@0: lbajardsilogic@0: } else { lbajardsilogic@0: lbajardsilogic@0: #ifdef DEBUG_LADSPA lbajardsilogic@0: std::cerr << "LADSPAPluginInstance::init: port " << i << " is control out" << std::endl; lbajardsilogic@0: #endif lbajardsilogic@0: LADSPA_Data *data = new LADSPA_Data(0.0); lbajardsilogic@0: m_controlPortsOut.push_back( lbajardsilogic@0: std::pair(i, data)); lbajardsilogic@0: if (!strcmp(m_descriptor->PortNames[i], "latency") || lbajardsilogic@0: !strcmp(m_descriptor->PortNames[i], "_latency")) { lbajardsilogic@0: #ifdef DEBUG_LADSPA lbajardsilogic@0: std::cerr << "Wooo! We have a latency port!" << std::endl; lbajardsilogic@0: #endif lbajardsilogic@0: m_latencyPort = data; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: } lbajardsilogic@0: } lbajardsilogic@0: #ifdef DEBUG_LADSPA lbajardsilogic@0: else lbajardsilogic@0: std::cerr << "LADSPAPluginInstance::init - " lbajardsilogic@0: << "unrecognised port type" << std::endl; lbajardsilogic@0: #endif lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: m_instanceCount = 1; lbajardsilogic@0: lbajardsilogic@0: if (idealChannelCount > 0) { lbajardsilogic@0: if (m_audioPortsIn.size() == 1) { lbajardsilogic@0: // mono plugin: duplicate it if need be lbajardsilogic@0: m_instanceCount = idealChannelCount; lbajardsilogic@0: } lbajardsilogic@0: } lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: size_t lbajardsilogic@0: LADSPAPluginInstance::getLatency() lbajardsilogic@0: { lbajardsilogic@0: if (m_latencyPort) { lbajardsilogic@0: if (!m_run) { lbajardsilogic@0: for (size_t i = 0; i < getAudioInputCount(); ++i) { lbajardsilogic@0: for (size_t j = 0; j < m_blockSize; ++j) { lbajardsilogic@0: m_inputBuffers[i][j] = 0.f; lbajardsilogic@0: } lbajardsilogic@0: } lbajardsilogic@0: run(Vamp::RealTime::zeroTime); lbajardsilogic@0: } lbajardsilogic@0: if (*m_latencyPort > 0) return (size_t)*m_latencyPort; lbajardsilogic@0: } lbajardsilogic@0: return 0; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: void lbajardsilogic@0: LADSPAPluginInstance::silence() lbajardsilogic@0: { lbajardsilogic@0: if (isOK()) { lbajardsilogic@0: deactivate(); lbajardsilogic@0: activate(); lbajardsilogic@0: } lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: void lbajardsilogic@0: LADSPAPluginInstance::setIdealChannelCount(size_t channels) lbajardsilogic@0: { lbajardsilogic@0: if (m_audioPortsIn.size() != 1 || channels == m_instanceCount) { lbajardsilogic@0: silence(); lbajardsilogic@0: return; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: if (isOK()) { lbajardsilogic@0: deactivate(); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: //!!! don't we need to reallocate inputBuffers and outputBuffers? lbajardsilogic@0: lbajardsilogic@0: cleanup(); lbajardsilogic@0: m_instanceCount = channels; lbajardsilogic@0: instantiate(m_sampleRate); lbajardsilogic@0: if (isOK()) { lbajardsilogic@0: connectPorts(); lbajardsilogic@0: activate(); lbajardsilogic@0: } lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: lbajardsilogic@0: LADSPAPluginInstance::~LADSPAPluginInstance() lbajardsilogic@0: { lbajardsilogic@0: #ifdef DEBUG_LADSPA lbajardsilogic@0: std::cerr << "LADSPAPluginInstance::~LADSPAPluginInstance" << std::endl; lbajardsilogic@0: #endif lbajardsilogic@0: lbajardsilogic@0: if (m_instanceHandles.size() != 0) { // "isOK()" lbajardsilogic@0: deactivate(); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: cleanup(); lbajardsilogic@0: lbajardsilogic@0: for (unsigned int i = 0; i < m_controlPortsIn.size(); ++i) lbajardsilogic@0: delete m_controlPortsIn[i].second; lbajardsilogic@0: lbajardsilogic@0: for (unsigned int i = 0; i < m_controlPortsOut.size(); ++i) lbajardsilogic@0: delete m_controlPortsOut[i].second; lbajardsilogic@0: lbajardsilogic@0: m_controlPortsIn.clear(); lbajardsilogic@0: m_controlPortsOut.clear(); lbajardsilogic@0: lbajardsilogic@0: if (m_ownBuffers) { lbajardsilogic@0: for (size_t i = 0; i < m_instanceCount * m_audioPortsIn.size(); ++i) { lbajardsilogic@0: delete[] m_inputBuffers[i]; lbajardsilogic@0: } lbajardsilogic@0: for (size_t i = 0; i < m_instanceCount * m_audioPortsOut.size(); ++i) { lbajardsilogic@0: delete[] m_outputBuffers[i]; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: delete[] m_inputBuffers; lbajardsilogic@0: delete[] m_outputBuffers; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: m_audioPortsIn.clear(); lbajardsilogic@0: m_audioPortsOut.clear(); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: lbajardsilogic@0: void lbajardsilogic@0: LADSPAPluginInstance::instantiate(unsigned long sampleRate) lbajardsilogic@0: { lbajardsilogic@0: #ifdef DEBUG_LADSPA lbajardsilogic@0: std::cout << "LADSPAPluginInstance::instantiate - plugin unique id = " lbajardsilogic@0: << m_descriptor->UniqueID << std::endl; lbajardsilogic@0: #endif lbajardsilogic@0: if (!m_descriptor) return; lbajardsilogic@0: lbajardsilogic@0: if (!m_descriptor->instantiate) { lbajardsilogic@0: std::cerr << "Bad plugin: plugin id " << m_descriptor->UniqueID lbajardsilogic@0: << ":" << m_descriptor->Label lbajardsilogic@0: << " has no instantiate method!" << std::endl; lbajardsilogic@0: return; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: for (size_t i = 0; i < m_instanceCount; ++i) { lbajardsilogic@0: m_instanceHandles.push_back lbajardsilogic@0: (m_descriptor->instantiate(m_descriptor, sampleRate)); lbajardsilogic@0: } lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: void lbajardsilogic@0: LADSPAPluginInstance::activate() lbajardsilogic@0: { lbajardsilogic@0: if (!m_descriptor || !m_descriptor->activate) return; lbajardsilogic@0: lbajardsilogic@0: for (std::vector::iterator hi = m_instanceHandles.begin(); lbajardsilogic@0: hi != m_instanceHandles.end(); ++hi) { lbajardsilogic@0: m_descriptor->activate(*hi); lbajardsilogic@0: } lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: void lbajardsilogic@0: LADSPAPluginInstance::connectPorts() lbajardsilogic@0: { lbajardsilogic@0: if (!m_descriptor || !m_descriptor->connect_port) return; lbajardsilogic@0: lbajardsilogic@0: assert(sizeof(LADSPA_Data) == sizeof(float)); lbajardsilogic@0: assert(sizeof(sample_t) == sizeof(float)); lbajardsilogic@0: lbajardsilogic@0: LADSPAPluginFactory *f = dynamic_cast(m_factory); lbajardsilogic@0: int inbuf = 0, outbuf = 0; lbajardsilogic@0: lbajardsilogic@0: for (std::vector::iterator hi = m_instanceHandles.begin(); lbajardsilogic@0: hi != m_instanceHandles.end(); ++hi) { lbajardsilogic@0: lbajardsilogic@0: for (unsigned int i = 0; i < m_audioPortsIn.size(); ++i) { lbajardsilogic@0: m_descriptor->connect_port(*hi, lbajardsilogic@0: m_audioPortsIn[i], lbajardsilogic@0: (LADSPA_Data *)m_inputBuffers[inbuf]); lbajardsilogic@0: ++inbuf; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: for (unsigned int i = 0; i < m_audioPortsOut.size(); ++i) { lbajardsilogic@0: m_descriptor->connect_port(*hi, lbajardsilogic@0: m_audioPortsOut[i], lbajardsilogic@0: (LADSPA_Data *)m_outputBuffers[outbuf]); lbajardsilogic@0: ++outbuf; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: // If there is more than one instance, they all share the same lbajardsilogic@0: // control port ins (and outs, for the moment, because we lbajardsilogic@0: // don't actually do anything with the outs anyway -- but they lbajardsilogic@0: // do have to be connected as the plugin can't know if they're lbajardsilogic@0: // not and will write to them anyway). lbajardsilogic@0: lbajardsilogic@0: for (unsigned int i = 0; i < m_controlPortsIn.size(); ++i) { lbajardsilogic@0: m_descriptor->connect_port(*hi, lbajardsilogic@0: m_controlPortsIn[i].first, lbajardsilogic@0: m_controlPortsIn[i].second); lbajardsilogic@0: if (f) { lbajardsilogic@0: float defaultValue = f->getPortDefault lbajardsilogic@0: (m_descriptor, m_controlPortsIn[i].first); lbajardsilogic@0: *m_controlPortsIn[i].second = defaultValue; lbajardsilogic@0: } lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: for (unsigned int i = 0; i < m_controlPortsOut.size(); ++i) { lbajardsilogic@0: m_descriptor->connect_port(*hi, lbajardsilogic@0: m_controlPortsOut[i].first, lbajardsilogic@0: m_controlPortsOut[i].second); lbajardsilogic@0: } lbajardsilogic@0: } lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: unsigned int lbajardsilogic@0: LADSPAPluginInstance::getParameterCount() const lbajardsilogic@0: { lbajardsilogic@0: return m_controlPortsIn.size(); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: void lbajardsilogic@0: LADSPAPluginInstance::setParameterValue(unsigned int parameter, float value) lbajardsilogic@0: { lbajardsilogic@0: if (parameter >= m_controlPortsIn.size()) return; lbajardsilogic@0: lbajardsilogic@0: unsigned int portNumber = m_controlPortsIn[parameter].first; lbajardsilogic@0: lbajardsilogic@0: LADSPAPluginFactory *f = dynamic_cast(m_factory); lbajardsilogic@0: if (f) { lbajardsilogic@0: if (value < f->getPortMinimum(m_descriptor, portNumber)) { lbajardsilogic@0: value = f->getPortMinimum(m_descriptor, portNumber); lbajardsilogic@0: } lbajardsilogic@0: if (value > f->getPortMaximum(m_descriptor, portNumber)) { lbajardsilogic@0: value = f->getPortMaximum(m_descriptor, portNumber); lbajardsilogic@0: } lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: (*m_controlPortsIn[parameter].second) = value; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: float lbajardsilogic@0: LADSPAPluginInstance::getControlOutputValue(size_t output) const lbajardsilogic@0: { lbajardsilogic@0: if (output > m_controlPortsOut.size()) return 0.0; lbajardsilogic@0: return (*m_controlPortsOut[output].second); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: float lbajardsilogic@0: LADSPAPluginInstance::getParameterValue(unsigned int parameter) const lbajardsilogic@0: { lbajardsilogic@0: if (parameter >= m_controlPortsIn.size()) return 0.0; lbajardsilogic@0: return (*m_controlPortsIn[parameter].second); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: float lbajardsilogic@0: LADSPAPluginInstance::getParameterDefault(unsigned int parameter) const lbajardsilogic@0: { lbajardsilogic@0: if (parameter >= m_controlPortsIn.size()) return 0.0; lbajardsilogic@0: lbajardsilogic@0: LADSPAPluginFactory *f = dynamic_cast(m_factory); lbajardsilogic@0: if (f) { lbajardsilogic@0: return f->getPortDefault(m_descriptor, m_controlPortsIn[parameter].first); lbajardsilogic@0: } else { lbajardsilogic@0: return 0.0f; lbajardsilogic@0: } lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: void lbajardsilogic@0: LADSPAPluginInstance::run(const Vamp::RealTime &) lbajardsilogic@0: { lbajardsilogic@0: if (!m_descriptor || !m_descriptor->run) return; lbajardsilogic@0: lbajardsilogic@0: for (std::vector::iterator hi = m_instanceHandles.begin(); lbajardsilogic@0: hi != m_instanceHandles.end(); ++hi) { lbajardsilogic@0: lbajardsilogic@0: m_descriptor->run(*hi, m_blockSize); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: m_run = true; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: void lbajardsilogic@0: LADSPAPluginInstance::deactivate() lbajardsilogic@0: { lbajardsilogic@0: if (!m_descriptor || !m_descriptor->deactivate) return; lbajardsilogic@0: lbajardsilogic@0: for (std::vector::iterator hi = m_instanceHandles.begin(); lbajardsilogic@0: hi != m_instanceHandles.end(); ++hi) { lbajardsilogic@0: m_descriptor->deactivate(*hi); lbajardsilogic@0: } lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: void lbajardsilogic@0: LADSPAPluginInstance::cleanup() lbajardsilogic@0: { lbajardsilogic@0: if (!m_descriptor) return; lbajardsilogic@0: lbajardsilogic@0: if (!m_descriptor->cleanup) { lbajardsilogic@0: std::cerr << "Bad plugin: plugin id " << m_descriptor->UniqueID lbajardsilogic@0: << ":" << m_descriptor->Label lbajardsilogic@0: << " has no cleanup method!" << std::endl; lbajardsilogic@0: return; lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: for (std::vector::iterator hi = m_instanceHandles.begin(); lbajardsilogic@0: hi != m_instanceHandles.end(); ++hi) { lbajardsilogic@0: m_descriptor->cleanup(*hi); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: m_instanceHandles.clear(); lbajardsilogic@0: } lbajardsilogic@0: lbajardsilogic@0: