diff options
author | David Robillard <d@drobilla.net> | 2008-05-23 04:30:24 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2008-05-23 04:30:24 +0000 |
commit | 0dbcca14bcbcb3aa7e7c0ae24934463a5973a651 (patch) | |
tree | d85dd8d74e4d5ea5c8b4400255c03adb79cda2c5 /src/libs/engine/LADSPANode.cpp | |
parent | 9cec63d68fef0e9fd5d3ee5b99a080dbd9180a88 (diff) | |
download | ingen-0dbcca14bcbcb3aa7e7c0ae24934463a5973a651.tar.gz ingen-0dbcca14bcbcb3aa7e7c0ae24934463a5973a651.tar.bz2 ingen-0dbcca14bcbcb3aa7e7c0ae24934463a5973a651.zip |
Fix crash when trying to add multiple objects with the same path.
Handle failed jack port registrations more gracefully.
Don't assume all LADSPA plugins have minimum and maximum port range values.
git-svn-id: http://svn.drobilla.net/lad/ingen@1230 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src/libs/engine/LADSPANode.cpp')
-rw-r--r-- | src/libs/engine/LADSPANode.cpp | 50 |
1 files changed, 34 insertions, 16 deletions
diff --git a/src/libs/engine/LADSPANode.cpp b/src/libs/engine/LADSPANode.cpp index 7e19a6b6..767c0cb4 100644 --- a/src/libs/engine/LADSPANode.cpp +++ b/src/libs/engine/LADSPANode.cpp @@ -20,6 +20,7 @@ #include <cmath> #include <stdint.h> #include <raul/Maid.hpp> +#include <boost/optional.hpp> #include "LADSPANode.hpp" #include "AudioBuffer.hpp" #include "InputPort.hpp" @@ -172,14 +173,17 @@ LADSPANode::instantiate() assert (LADSPA_IS_PORT_INPUT(_descriptor->PortDescriptors[j]) || LADSPA_IS_PORT_OUTPUT(_descriptor->PortDescriptors[j])); - Sample default_val, min, max; + boost::optional<Sample> default_val, min, max; get_port_limits(j, default_val, min, max); + if (!default_val) + default_val = 0.0f; + if (LADSPA_IS_PORT_INPUT(_descriptor->PortDescriptors[j])) { - port = new InputPort(this, port_name, j, _polyphony, type, default_val, port_buffer_size); + port = new InputPort(this, port_name, j, _polyphony, type, default_val.get(), port_buffer_size); _ports->at(j) = port; } else if (LADSPA_IS_PORT_OUTPUT(_descriptor->PortDescriptors[j])) { - port = new OutputPort(this, port_name, j, _polyphony, type, default_val, port_buffer_size); + port = new OutputPort(this, port_name, j, _polyphony, type, default_val.get(), port_buffer_size); _ports->at(j) = port; } @@ -202,12 +206,14 @@ LADSPANode::instantiate() // Set default value if (port->buffer_size() == 1) { for (uint32_t i=0; i < _polyphony; ++i) - ((AudioBuffer*)port->buffer(i))->set(default_val, 0); + ((AudioBuffer*)port->buffer(i))->set(default_val.get(), 0); } if (port->is_input() && port->buffer_size() == 1) { - port->set_variable("ingen:minimum", min); - port->set_variable("ingen:maximum", max); + if (min) + port->set_variable("ingen:minimum", min.get()); + if (max) + port->set_variable("ingen:maximum", max.get()); } } @@ -272,7 +278,10 @@ LADSPANode::set_port_buffer(uint32_t voice, uint32_t port_num, Buffer* buf) void -LADSPANode::get_port_limits(unsigned long port_index, Sample& normal, Sample& lower, Sample& upper) +LADSPANode::get_port_limits(unsigned long port_index, + boost::optional<Sample>& normal, + boost::optional<Sample>& lower, + boost::optional<Sample>& upper) { LADSPA_PortRangeHintDescriptor hint_descriptor = _descriptor->PortRangeHints[port_index].HintDescriptor; @@ -299,25 +308,32 @@ LADSPANode::get_port_limits(unsigned long port_index, Sample& normal, Sample& lo if (LADSPA_IS_HINT_DEFAULT_MINIMUM(hint_descriptor)) { normal = lower; } else if (LADSPA_IS_HINT_DEFAULT_LOW(hint_descriptor)) { + assert(lower); + assert(upper); if (LADSPA_IS_HINT_LOGARITHMIC(hint_descriptor)) { - normal = exp(log(lower) * 0.75 + log(upper) * 0.25); + normal = exp(log(lower.get()) * 0.75 + log(upper.get()) * 0.25); } else { - normal = lower * 0.75 + upper * 0.25; + normal = lower.get() * 0.75 + upper.get() * 0.25; } } else if (LADSPA_IS_HINT_DEFAULT_MIDDLE(hint_descriptor)) { + assert(lower); + assert(upper); if (LADSPA_IS_HINT_LOGARITHMIC(hint_descriptor)) { - normal = exp(log(lower) * 0.5 + log(upper) * 0.5); + normal = exp(log(lower.get()) * 0.5 + log(upper.get()) * 0.5); } else { - normal = lower * 0.5 + upper * 0.5; + normal = lower.get() * 0.5 + upper.get() * 0.5; } } else if (LADSPA_IS_HINT_DEFAULT_HIGH(hint_descriptor)) { + assert(lower); + assert(upper); if (LADSPA_IS_HINT_LOGARITHMIC(hint_descriptor)) { - normal = exp(log(lower) * 0.25 + log(upper) * 0.75); + normal = exp(log(lower.get()) * 0.25 + log(upper.get()) * 0.75); } else { - normal = lower * 0.25 + upper * 0.75; + normal = lower.get() * 0.25 + upper.get() * 0.75; } } else if (LADSPA_IS_HINT_DEFAULT_MAXIMUM(hint_descriptor)) { - normal = upper; + assert(upper); + normal = upper.get(); } else if (LADSPA_IS_HINT_DEFAULT_0(hint_descriptor)) { normal = 0.0; } else if (LADSPA_IS_HINT_DEFAULT_1(hint_descriptor)) { @@ -329,9 +345,11 @@ LADSPANode::get_port_limits(unsigned long port_index, Sample& normal, Sample& lo } } else { // No default hint if (LADSPA_IS_HINT_BOUNDED_BELOW(hint_descriptor)) { - normal = lower; + assert(lower); + normal = lower.get(); } else if (LADSPA_IS_HINT_BOUNDED_ABOVE(hint_descriptor)) { - normal = upper; + assert(upper); + normal = upper.get(); } } } |