summaryrefslogtreecommitdiffstats
path: root/src/engine/LADSPANode.cpp
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2010-02-23 03:46:44 +0000
committerDavid Robillard <d@drobilla.net>2010-02-23 03:46:44 +0000
commit3893203399c1b67fb70729558e51f014b863b307 (patch)
tree25ce8cd9847ecc3eec25396d7ae228f8e48af696 /src/engine/LADSPANode.cpp
parent48eccb2983229c33df9d3858f34a73cb698a4e61 (diff)
downloadingen-3893203399c1b67fb70729558e51f014b863b307.tar.gz
ingen-3893203399c1b67fb70729558e51f014b863b307.tar.bz2
ingen-3893203399c1b67fb70729558e51f014b863b307.zip
Free plugin instances when decreasing polyphony.
git-svn-id: http://svn.drobilla.net/lad/trunk/ingen@2482 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src/engine/LADSPANode.cpp')
-rw-r--r--src/engine/LADSPANode.cpp32
1 files changed, 14 insertions, 18 deletions
diff --git a/src/engine/LADSPANode.cpp b/src/engine/LADSPANode.cpp
index abc517fa..80e69162 100644
--- a/src/engine/LADSPANode.cpp
+++ b/src/engine/LADSPANode.cpp
@@ -60,10 +60,6 @@ LADSPANode::LADSPANode(PluginImpl* plugin,
LADSPANode::~LADSPANode()
{
- if (_instances)
- for (uint32_t i = 0; i < _polyphony; ++i)
- _descriptor->cleanup((*_instances)[i]);
-
delete _instances;
}
@@ -76,15 +72,14 @@ LADSPANode::prepare_poly(BufferFactory& bufs, uint32_t poly)
NodeBase::prepare_poly(bufs, poly);
- if ( (!_polyphonic)
- || (_prepared_instances && poly <= _prepared_instances->size()) ) {
+ if (_polyphony == poly)
return true;
- }
- _prepared_instances = new Raul::Array<LADSPA_Handle>(poly, *_instances, NULL);
+ _prepared_instances = new Instances(poly, *_instances, SharedPtr<Instance>());
for (uint32_t i = _polyphony; i < _prepared_instances->size(); ++i) {
- _prepared_instances->at(i) = _descriptor->instantiate(_descriptor, _srate);
- if (_prepared_instances->at(i) == NULL) {
+ _prepared_instances->at(i) = SharedPtr<Instance>(new Instance(_descriptor,
+ _descriptor->instantiate(_descriptor, _srate)));
+ if (!_prepared_instances->at(i)->handle) {
error << "Failed to instantiate plugin" << endl;
return false;
}
@@ -103,7 +98,7 @@ LADSPANode::prepare_poly(BufferFactory& bufs, uint32_t poly)
}
if (_activated && _descriptor->activate)
- _descriptor->activate(_prepared_instances->at(i));
+ _descriptor->activate(_prepared_instances->at(i)->handle);
}
return true;
@@ -142,11 +137,12 @@ LADSPANode::instantiate(BufferFactory& bufs)
if (!_ports)
_ports = new Raul::Array<PortImpl*>(_descriptor->PortCount);
- _instances = new Raul::Array<LADSPA_Handle>(_polyphony, NULL);
+ _instances = new Instances(_polyphony);
for (uint32_t i = 0; i < _polyphony; ++i) {
- (*_instances)[i] = _descriptor->instantiate(_descriptor, _srate);
- if ((*_instances)[i] == NULL) {
+ (*_instances)[i] = SharedPtr<Instance>(new Instance(
+ _descriptor, _descriptor->instantiate(_descriptor, _srate)));
+ if (!instance(i)) {
error << "Failed to instantiate plugin" << endl;
return false;
}
@@ -251,7 +247,7 @@ LADSPANode::activate(BufferFactory& bufs)
if (_descriptor->activate != NULL)
for (uint32_t i = 0; i < _polyphony; ++i)
- _descriptor->activate((*_instances)[i]);
+ _descriptor->activate(instance(i));
}
@@ -262,7 +258,7 @@ LADSPANode::deactivate()
for (uint32_t i = 0; i < _polyphony; ++i)
if (_descriptor->deactivate != NULL)
- _descriptor->deactivate((*_instances)[i]);
+ _descriptor->deactivate(instance(i));
}
@@ -272,7 +268,7 @@ LADSPANode::process(ProcessContext& context)
NodeBase::pre_process(context);
for (uint32_t i = 0; i < _polyphony; ++i)
- _descriptor->run((*_instances)[i], context.nframes());
+ _descriptor->run(instance(i), context.nframes());
NodeBase::post_process(context);
}
@@ -283,7 +279,7 @@ LADSPANode::set_port_buffer(uint32_t voice, uint32_t port_num, BufferFactory::Re
{
NodeBase::set_port_buffer(voice, port_num, buf);
- _descriptor->connect_port((*_instances)[voice], port_num,
+ _descriptor->connect_port(instance(voice), port_num,
buf ? (LADSPA_Data*)buf->port_data(_ports->at(port_num)->type()) : NULL);
}