diff options
author | David Robillard <d@drobilla.net> | 2007-09-20 02:43:59 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2007-09-20 02:43:59 +0000 |
commit | 8e747504412c62f27c599f3f5e001ff3e2e36a82 (patch) | |
tree | 78c96ae09ae1c3c52ccdee28dbf0851651d3c3c9 /src/libs/engine | |
parent | ed782b485becdaa2db064adaa00f1ffcd4880c26 (diff) | |
download | ingen-8e747504412c62f27c599f3f5e001ff3e2e36a82.tar.gz ingen-8e747504412c62f27c599f3f5e001ff3e2e36a82.tar.bz2 ingen-8e747504412c62f27c599f3f5e001ff3e2e36a82.zip |
Fix voice-specific polyphony controls.
Restore patch polyphony correctly on client reattach.
Fix crash on multiple polyphony changes w/ LV2 plugins.
git-svn-id: http://svn.drobilla.net/lad/ingen@737 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src/libs/engine')
-rw-r--r-- | src/libs/engine/LV2Node.cpp | 24 | ||||
-rw-r--r-- | src/libs/engine/MidiNoteNode.cpp | 2 | ||||
-rw-r--r-- | src/libs/engine/Patch.cpp | 2 |
3 files changed, 18 insertions, 10 deletions
diff --git a/src/libs/engine/LV2Node.cpp b/src/libs/engine/LV2Node.cpp index c8c13f38..146bc4bf 100644 --- a/src/libs/engine/LV2Node.cpp +++ b/src/libs/engine/LV2Node.cpp @@ -43,9 +43,11 @@ LV2Node::LV2Node(const Plugin* plugin, Patch* parent, SampleRate srate, size_t buffer_size) -: NodeBase(plugin, name, poly, parent, srate, buffer_size), - _lv2_plugin(plugin->slv2_plugin()), - _instances(NULL) + : NodeBase(plugin, name, poly, parent, srate, buffer_size) + , _lv2_plugin(plugin->slv2_plugin()) + , _instances(NULL) + , _prepared_instances(NULL) + , _prepared_poly(poly) { assert(_lv2_plugin); } @@ -83,13 +85,15 @@ LV2Node::apply_poly(Raul::Maid& maid, uint32_t poly) NodeBase::apply_poly(maid, poly); - maid.push(_instances); - _instances = _prepared_instances; - - for (uint32_t port=0; port < num_ports(); ++port) - for (uint32_t voice = _polyphony; voice < _prepared_poly; ++voice) - slv2_instance_connect_port((*_instances)[voice], port, - _ports->at(port)->buffer(voice)->raw_data()); + if (_prepared_instances) { + maid.push(_instances); + _instances = _prepared_instances; + + for (uint32_t port=0; port < num_ports(); ++port) + for (uint32_t voice = _polyphony; voice < _prepared_poly; ++voice) + slv2_instance_connect_port((*_instances)[voice], port, + _ports->at(port)->buffer(voice)->raw_data()); + } _polyphony = poly; _prepared_instances = NULL; diff --git a/src/libs/engine/MidiNoteNode.cpp b/src/libs/engine/MidiNoteNode.cpp index 91c9d542..03dc01b3 100644 --- a/src/libs/engine/MidiNoteNode.cpp +++ b/src/libs/engine/MidiNoteNode.cpp @@ -38,6 +38,8 @@ namespace Ingen { MidiNoteNode::MidiNoteNode(const string& path, uint32_t poly, Patch* parent, SampleRate srate, size_t buffer_size) : InternalNode(new Plugin(Plugin::Internal, "ingen:note_node"), path, poly, parent, srate, buffer_size), _voices(new Raul::Array<Voice>(poly)), + _prepared_voices(NULL), + _prepared_poly(poly), _sustain(false) { _ports = new Raul::Array<Port*>(5); diff --git a/src/libs/engine/Patch.cpp b/src/libs/engine/Patch.cpp index 77b043eb..3d8e7756 100644 --- a/src/libs/engine/Patch.cpp +++ b/src/libs/engine/Patch.cpp @@ -129,6 +129,8 @@ Patch::apply_internal_poly(Raul::Maid& maid, uint32_t poly) for (Raul::List<Node*>::iterator i = _nodes.begin(); i != _nodes.end(); ++i) (*i)->apply_poly(maid, poly); + + _internal_poly = poly; return true; } |