From 1bc00c68d7eebb7009cba0ba5e705cb7c15f77df Mon Sep 17 00:00:00 2001 From: David Robillard Date: Mon, 16 Jul 2012 21:20:03 +0000 Subject: Preliminary somewhat kludgey support for UIs sending messages to Sequence inputs. git-svn-id: http://svn.drobilla.net/lad/trunk/ingen@4541 a436a847-0d15-0410-975c-d299462d15a1 --- src/server/events/SetPortValue.cpp | 56 +++++++++++++++++--------------------- src/server/events/SetPortValue.hpp | 1 - 2 files changed, 25 insertions(+), 32 deletions(-) (limited to 'src/server/events') diff --git a/src/server/events/SetPortValue.cpp b/src/server/events/SetPortValue.cpp index 31152e01..e2abcb17 100644 --- a/src/server/events/SetPortValue.cpp +++ b/src/server/events/SetPortValue.cpp @@ -43,7 +43,6 @@ SetPortValue::SetPortValue(Engine& engine, PortImpl* port, const Raul::Atom& value) : Event(engine, client, id, timestamp) - , _queued(false) , _port_path(port->path()) , _value(value) , _port(port) @@ -57,16 +56,11 @@ SetPortValue::~SetPortValue() bool SetPortValue::pre_process() { - if (_queued && !_port) { - _port = _engine.engine_store()->find_port(_port_path); + if (_port->is_output()) { + return Event::pre_process_done(DIRECTION_MISMATCH); } - if (!_port) { - return Event::pre_process_done(PORT_NOT_FOUND); - } - - // Port is a message context port, set its value and - // call the plugin's message run function once + // Port is on a message context node, set value and run if (_port->parent_node()->context() == Context::MESSAGE) { apply(_engine.message_context()); _engine.message_context().run( @@ -89,7 +83,7 @@ SetPortValue::execute(ProcessContext& context) { assert(_time >= context.start() && _time <= context.end()); - if (_port && _port->parent_node()->context() == Context::MESSAGE) + if (_port->parent_node()->context() == Context::MESSAGE) return; apply(context); @@ -99,33 +93,33 @@ SetPortValue::execute(ProcessContext& context) void SetPortValue::apply(Context& context) { - uint32_t start = context.start(); - if (_status == SUCCESS && !_port) - _port = _engine.engine_store()->find_port(_port_path); + if (_status) { + return; + } Ingen::Shared::URIs& uris = _engine.world()->uris(); + Buffer* const buf = _port->buffer(0).get(); - if (!_port) { - if (_status == SUCCESS) - _status = PORT_NOT_FOUND; - /*} else if (_port->buffer(0)->capacity() < _data_size) { - _status = NO_SPACE;*/ - } else { - Buffer* const buf = _port->buffer(0).get(); - AudioBuffer* const abuf = dynamic_cast(buf); - if (abuf) { - if (_value.type() != uris.forge.Float) { - _status = TYPE_MISMATCH; - return; - } - - for (uint32_t v = 0; v < _port->poly(); ++v) { - ((AudioBuffer*)_port->buffer(v).get())->set_value( - _value.get_float(), start, _time); - } + AudioBuffer* const abuf = dynamic_cast(buf); + if (abuf) { + if (_value.type() != uris.forge.Float) { + _status = TYPE_MISMATCH; return; } + for (uint32_t v = 0; v < _port->poly(); ++v) { + ((AudioBuffer*)_port->buffer(v).get())->set_value( + _value.get_float(), context.start(), _time); + } + } else if (buf->type() == uris.atom_Sequence) { + buf->prepare_write(context); // FIXME: incorrect + if (!buf->append_event(_time - context.start(), + _value.size(), + _value.type(), + (const uint8_t*)_value.get_body())) { + Raul::warn(Raul::fmt("Error writing to port %1%\n") % _port_path); + } + } else { Raul::warn(Raul::fmt("Unknown value type %1%\n") % _value.type()); } } diff --git a/src/server/events/SetPortValue.hpp b/src/server/events/SetPortValue.hpp index 569023c5..e328ff9e 100644 --- a/src/server/events/SetPortValue.hpp +++ b/src/server/events/SetPortValue.hpp @@ -58,7 +58,6 @@ public: private: void apply(Context& context); - bool _queued; const Raul::Path _port_path; const Raul::Atom _value; PortImpl* _port; -- cgit v1.2.1