summaryrefslogtreecommitdiffstats
path: root/src/server/internals/Controller.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/internals/Controller.cpp')
-rw-r--r--src/server/internals/Controller.cpp89
1 files changed, 49 insertions, 40 deletions
diff --git a/src/server/internals/Controller.cpp b/src/server/internals/Controller.cpp
index b8738e1e..9103649e 100644
--- a/src/server/internals/Controller.cpp
+++ b/src/server/internals/Controller.cpp
@@ -14,42 +14,51 @@
along with Ingen. If not, see <http://www.gnu.org/licenses/>.
*/
+#include "Controller.hpp"
+
#include "Buffer.hpp"
-#include "Engine.hpp"
+#include "BufferFactory.hpp"
+#include "BufferRef.hpp"
#include "InputPort.hpp"
#include "InternalPlugin.hpp"
#include "OutputPort.hpp"
-#include "PostProcessor.hpp"
+#include "PortType.hpp"
#include "RunContext.hpp"
-#include "util.hpp"
-#include "ingen/Forge.hpp"
-#include "ingen/URIs.hpp"
-#include "internals/Controller.hpp"
-#include "lv2/atom/util.h"
-#include "lv2/midi/midi.h"
+#include <ingen/Atom.hpp>
+#include <ingen/Forge.hpp>
+#include <ingen/URI.hpp>
+#include <ingen/URIs.hpp>
+#include <lv2/atom/atom.h>
+#include <lv2/atom/util.h>
+#include <lv2/midi/midi.h>
+#include <raul/Array.hpp>
+#include <raul/Maid.hpp>
+#include <raul/Symbol.hpp>
#include <cassert>
#include <cmath>
#include <initializer_list>
+#include <memory>
+
+namespace ingen::server {
+
+class GraphImpl;
-namespace ingen {
-namespace server {
namespace internals {
InternalPlugin* ControllerNode::internal_plugin(URIs& uris) {
return new InternalPlugin(
- uris, URI(NS_INTERNALS "Controller"), Raul::Symbol("controller"));
+ uris, URI(NS_INTERNALS "Controller"), raul::Symbol("controller"));
}
ControllerNode::ControllerNode(InternalPlugin* plugin,
BufferFactory& bufs,
- const Raul::Symbol& symbol,
+ const raul::Symbol& symbol,
bool polyphonic,
GraphImpl* parent,
SampleRate srate)
: InternalBlock(plugin, symbol, false, parent, srate)
- , _learning(false)
{
const ingen::URIs& uris = bufs.uris();
_ports = bufs.maid().make_managed<Ports>(7);
@@ -58,21 +67,21 @@ ControllerNode::ControllerNode(InternalPlugin* plugin,
const Atom one = bufs.forge().make(1.0f);
const Atom atom_Float = bufs.forge().make_urid(URI(LV2_ATOM__Float));
- _midi_in_port = new InputPort(bufs, this, Raul::Symbol("input"), 0, 1,
+ _midi_in_port = new InputPort(bufs, this, raul::Symbol("input"), 0, 1,
PortType::ATOM, uris.atom_Sequence, Atom());
_midi_in_port->set_property(uris.lv2_name, bufs.forge().alloc("Input"));
_midi_in_port->set_property(uris.atom_supports,
bufs.forge().make_urid(uris.midi_MidiEvent));
_ports->at(0) = _midi_in_port;
- _midi_out_port = new OutputPort(bufs, this, Raul::Symbol("event"), 1, 1,
+ _midi_out_port = new OutputPort(bufs, this, raul::Symbol("event"), 1, 1,
PortType::ATOM, uris.atom_Sequence, Atom());
_midi_out_port->set_property(uris.lv2_name, bufs.forge().alloc("Event"));
_midi_out_port->set_property(uris.atom_supports,
bufs.forge().make_urid(uris.midi_MidiEvent));
_ports->at(1) = _midi_out_port;
- _param_port = new InputPort(bufs, this, Raul::Symbol("controller"), 2, 1,
+ _param_port = new InputPort(bufs, this, raul::Symbol("controller"), 2, 1,
PortType::ATOM, uris.atom_Sequence, zero);
_param_port->set_property(uris.atom_supports, atom_Float);
_param_port->set_property(uris.lv2_minimum, zero);
@@ -81,26 +90,26 @@ ControllerNode::ControllerNode(InternalPlugin* plugin,
_param_port->set_property(uris.lv2_name, bufs.forge().alloc("Controller"));
_ports->at(2) = _param_port;
- _log_port = new InputPort(bufs, this, Raul::Symbol("logarithmic"), 3, 1,
+ _log_port = new InputPort(bufs, this, raul::Symbol("logarithmic"), 3, 1,
PortType::ATOM, uris.atom_Sequence, zero);
_log_port->set_property(uris.atom_supports, atom_Float);
_log_port->set_property(uris.lv2_portProperty, uris.lv2_toggled);
_log_port->set_property(uris.lv2_name, bufs.forge().alloc("Logarithmic"));
_ports->at(3) = _log_port;
- _min_port = new InputPort(bufs, this, Raul::Symbol("minimum"), 4, 1,
+ _min_port = new InputPort(bufs, this, raul::Symbol("minimum"), 4, 1,
PortType::ATOM, uris.atom_Sequence, zero);
_min_port->set_property(uris.atom_supports, atom_Float);
_min_port->set_property(uris.lv2_name, bufs.forge().alloc("Minimum"));
_ports->at(4) = _min_port;
- _max_port = new InputPort(bufs, this, Raul::Symbol("maximum"), 5, 1,
+ _max_port = new InputPort(bufs, this, raul::Symbol("maximum"), 5, 1,
PortType::ATOM, uris.atom_Sequence, one);
_max_port->set_property(uris.atom_supports, atom_Float);
_max_port->set_property(uris.lv2_name, bufs.forge().alloc("Maximum"));
_ports->at(5) = _max_port;
- _audio_port = new OutputPort(bufs, this, Raul::Symbol("output"), 6, 1,
+ _audio_port = new OutputPort(bufs, this, raul::Symbol("output"), 6, 1,
PortType::ATOM, uris.atom_Sequence, zero);
_audio_port->set_property(uris.atom_supports, atom_Float);
_audio_port->set_property(uris.lv2_name, bufs.forge().alloc("Output"));
@@ -108,17 +117,18 @@ ControllerNode::ControllerNode(InternalPlugin* plugin,
}
void
-ControllerNode::run(RunContext& context)
+ControllerNode::run(RunContext& ctx)
{
- const BufferRef midi_in = _midi_in_port->buffer(0);
- LV2_Atom_Sequence* seq = midi_in->get<LV2_Atom_Sequence>();
- const BufferRef midi_out = _midi_out_port->buffer(0);
- LV2_ATOM_SEQUENCE_FOREACH(seq, ev) {
- const uint8_t* buf = (const uint8_t*)LV2_ATOM_BODY(&ev->body);
+ const BufferRef midi_in = _midi_in_port->buffer(0);
+ auto* seq = midi_in->get<LV2_Atom_Sequence>();
+ const BufferRef midi_out = _midi_out_port->buffer(0);
+
+ LV2_ATOM_SEQUENCE_FOREACH (seq, ev) {
+ const auto* buf = static_cast<const uint8_t*>(LV2_ATOM_BODY_CONST(&ev->body));
if (ev->body.type == _midi_in_port->bufs().uris().midi_MidiEvent &&
ev->body.size >= 3 &&
lv2_midi_message_type(buf) == LV2_MIDI_MSG_CONTROLLER) {
- if (control(context, buf[1], buf[2], ev->time.frames + context.start())) {
+ if (control(ctx, buf[1], buf[2], ev->time.frames + ctx.start())) {
midi_out->append_event(ev->time.frames, &ev->body);
}
}
@@ -126,15 +136,15 @@ ControllerNode::run(RunContext& context)
}
bool
-ControllerNode::control(RunContext& context, uint8_t control_num, uint8_t val, FrameTime time)
+ControllerNode::control(RunContext& ctx, uint8_t control_num, uint8_t val, FrameTime time)
{
- assert(time >= context.start() && time <= context.end());
- const uint32_t offset = time - context.start();
+ assert(time >= ctx.start() && time <= ctx.end());
+ const uint32_t offset = time - ctx.start();
const Sample nval = (val / 127.0f); // normalized [0, 1]
if (_learning) {
- _param_port->set_control_value(context, time, control_num);
+ _param_port->set_control_value(ctx, time, control_num);
_param_port->force_monitor_update();
_learning = false;
} else {
@@ -153,25 +163,24 @@ ControllerNode::control(RunContext& context, uint8_t control_num, uint8_t val, F
const Sample max_port_val = _max_port->buffer(0)->value_at(offset);
const Sample log_port_val = _log_port->buffer(0)->value_at(offset);
- Sample scaled_value;
+ Sample scaled_value = 0.0f;
if (log_port_val > 0.0f) {
// haaaaack, stupid negatives and logarithms
- Sample log_offset = 0;
+ Sample log_offset = 0.0f;
if (min_port_val < 0) {
- log_offset = fabs(min_port_val);
+ log_offset = fabsf(min_port_val);
}
- const Sample min = log(min_port_val + 1 + log_offset);
- const Sample max = log(max_port_val + 1 + log_offset);
- scaled_value = expf(nval * (max - min) + min) - 1 - log_offset;
+ const Sample min = logf(min_port_val + 1 + log_offset);
+ const Sample max = logf(max_port_val + 1 + log_offset);
+ scaled_value = expf((nval * (max - min)) + min) - 1 - log_offset;
} else {
scaled_value = ((nval) * (max_port_val - min_port_val)) + min_port_val;
}
- _audio_port->set_control_value(context, time, scaled_value);
+ _audio_port->set_control_value(ctx, time, scaled_value);
return true;
}
} // namespace internals
-} // namespace server
-} // namespace ingen
+} // namespace ingen::server