summaryrefslogtreecommitdiffstats
path: root/src/libs/engine/LV2Node.cpp
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2007-09-19 02:46:47 +0000
committerDavid Robillard <d@drobilla.net>2007-09-19 02:46:47 +0000
commit49d6f5b2cc495052d6c5ddbb0629e178c9a2cc14 (patch)
tree4b56e8fe9f01b42e269e5423347a7cc0664599ad /src/libs/engine/LV2Node.cpp
parentcbc7847a12e57176c5bafa9baa007de6865745c7 (diff)
downloadingen-49d6f5b2cc495052d6c5ddbb0629e178c9a2cc14.tar.gz
ingen-49d6f5b2cc495052d6c5ddbb0629e178c9a2cc14.tar.bz2
ingen-49d6f5b2cc495052d6c5ddbb0629e178c9a2cc14.zip
More work on dynamic polyphony.
git-svn-id: http://svn.drobilla.net/lad/ingen@721 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src/libs/engine/LV2Node.cpp')
-rw-r--r--src/libs/engine/LV2Node.cpp54
1 files changed, 41 insertions, 13 deletions
diff --git a/src/libs/engine/LV2Node.cpp b/src/libs/engine/LV2Node.cpp
index 36bfd319..8e2e9b81 100644
--- a/src/libs/engine/LV2Node.cpp
+++ b/src/libs/engine/LV2Node.cpp
@@ -15,12 +15,13 @@
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
-#include "LV2Node.hpp"
+#include <raul/Maid.hpp>
#include <iostream>
#include <cassert>
#include <float.h>
#include <stdint.h>
#include <cmath>
+#include "LV2Node.hpp"
#include "InputPort.hpp"
#include "OutputPort.hpp"
#include "Plugin.hpp"
@@ -50,17 +51,44 @@ LV2Node::LV2Node(const Plugin* plugin,
}
-void
+bool
LV2Node::prepare_poly(uint32_t poly)
{
NodeBase::prepare_poly(poly);
+
+ if (poly <= _prepared_poly)
+ return true;
+
+ _prepared_poly = poly;
+ _prepared_instances = new Raul::Array<SLV2Instance>(_prepared_poly, *_instances);
+ for (uint32_t i=_poly; i < _prepared_poly; ++i) {
+ _prepared_instances->at(i) = slv2_plugin_instantiate(_lv2_plugin, _srate, NULL);
+ if ((*_instances)[i] == NULL) {
+ cerr << "Failed to instantiate plugin!" << endl;
+ return false;
+ }
+ }
+
+ for (uint32_t j=0; j < num_ports(); ++j)
+ _ports->at(j)->prepare_poly(poly);
+
+ return true;
}
-void
+bool
LV2Node::apply_poly(Raul::Maid& maid, uint32_t poly)
{
+ assert(poly <= _prepared_poly);
+
NodeBase::apply_poly(maid, poly);
+
+ maid.push(_instances);
+ _instances = _prepared_instances;
+ _poly = poly;
+ _prepared_instances = NULL;
+
+ return true;
}
@@ -80,13 +108,13 @@ LV2Node::instantiate()
_ports = new Raul::Array<Port*>(num_ports);
- _instances = new SLV2Instance[_poly];
+ _instances = new Raul::Array<SLV2Instance>(_poly);
uint32_t port_buffer_size = 0;
for (uint32_t i=0; i < _poly; ++i) {
- _instances[i] = slv2_plugin_instantiate(_lv2_plugin, _srate, NULL);
- if (_instances[i] == NULL) {
+ (*_instances)[i] = slv2_plugin_instantiate(_lv2_plugin, _srate, NULL);
+ if ((*_instances)[i] == NULL) {
cerr << "Failed to instantiate plugin!" << endl;
return false;
}
@@ -156,7 +184,7 @@ LV2Node::instantiate()
LV2Node::~LV2Node()
{
for (uint32_t i=0; i < _poly; ++i)
- slv2_instance_free(_instances[i]);
+ slv2_instance_free((*_instances)[i]);
delete[] _instances;
}
@@ -180,7 +208,7 @@ LV2Node::activate()
((AudioBuffer*)port->buffer(i))->set(0.0f, 0);
}
}
- slv2_instance_activate(_instances[i]);
+ slv2_instance_activate((*_instances)[i]);
}
}
@@ -191,7 +219,7 @@ LV2Node::deactivate()
NodeBase::deactivate();
for (uint32_t i=0; i < _poly; ++i)
- slv2_instance_deactivate(_instances[i]);
+ slv2_instance_deactivate((*_instances)[i]);
}
@@ -201,7 +229,7 @@ LV2Node::process(SampleCount nframes, FrameTime start, FrameTime end)
NodeBase::pre_process(nframes, start, end);
for (uint32_t i=0; i < _poly; ++i)
- slv2_instance_run(_instances[i], nframes);
+ slv2_instance_run((*_instances)[i], nframes);
NodeBase::post_process(nframes, start, end);
}
@@ -213,11 +241,11 @@ LV2Node::set_port_buffer(uint32_t voice, uint32_t port_num, Buffer* buf)
assert(voice < _poly);
if (buf->type() == DataType::FLOAT) {
- slv2_instance_connect_port(_instances[voice], port_num, ((AudioBuffer*)buf)->data());
+ slv2_instance_connect_port((*_instances)[voice], port_num, ((AudioBuffer*)buf)->data());
} else if (buf->type() == DataType::MIDI) {
- slv2_instance_connect_port(_instances[voice], port_num, ((MidiBuffer*)buf)->data());
+ slv2_instance_connect_port((*_instances)[voice], port_num, ((MidiBuffer*)buf)->data());
} else if (buf->type() == DataType::OSC) {
- slv2_instance_connect_port(_instances[voice], port_num, ((OSCBuffer*)buf)->data());
+ slv2_instance_connect_port((*_instances)[voice], port_num, ((OSCBuffer*)buf)->data());
}
}