From 4d440f54870cd3934a49bab1ae98fad3f13f00d4 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Sat, 13 Oct 2007 18:01:56 +0000 Subject: Send polyphonic state on object creation. git-svn-id: http://svn.drobilla.net/lad/ingen@881 a436a847-0d15-0410-975c-d299462d15a1 --- src/libs/engine/GraphObjectImpl.hpp | 2 +- src/libs/engine/OSCClientSender.cpp | 2 +- src/libs/engine/ObjectSender.cpp | 3 +++ src/libs/engine/PortImpl.cpp | 12 +++++++++++- src/libs/engine/PortImpl.hpp | 2 ++ src/libs/engine/events/SetPolyphonicEvent.cpp | 13 +++++++++---- src/libs/engine/events/SetPolyphonicEvent.hpp | 1 + 7 files changed, 28 insertions(+), 7 deletions(-) diff --git a/src/libs/engine/GraphObjectImpl.hpp b/src/libs/engine/GraphObjectImpl.hpp index dc833b08..8563035b 100644 --- a/src/libs/engine/GraphObjectImpl.hpp +++ b/src/libs/engine/GraphObjectImpl.hpp @@ -53,7 +53,7 @@ public: virtual ~GraphObjectImpl() {} bool polyphonic() const { return _polyphonic; } - virtual void set_polyphonic(Raul::Maid& maid, bool p) { _polyphonic = p; } + virtual bool set_polyphonic(Raul::Maid& maid, bool p) { _polyphonic = p; return true; } GraphObject* graph_parent() const { return _parent; } diff --git a/src/libs/engine/OSCClientSender.cpp b/src/libs/engine/OSCClientSender.cpp index 53ff35e5..365efeea 100644 --- a/src/libs/engine/OSCClientSender.cpp +++ b/src/libs/engine/OSCClientSender.cpp @@ -285,7 +285,7 @@ void OSCClientSender::new_node(const std::string& plugin_uri, void OSCClientSender::new_port(const std::string& path, const std::string& data_type, - bool is_output) + bool is_output) { if (!_enabled) return; diff --git a/src/libs/engine/ObjectSender.cpp b/src/libs/engine/ObjectSender.cpp index 4b2497e6..bb1b5c54 100644 --- a/src/libs/engine/ObjectSender.cpp +++ b/src/libs/engine/ObjectSender.cpp @@ -34,6 +34,7 @@ void ObjectSender::send_patch(ClientInterface* client, const PatchImpl* patch, bool recursive) { client->new_patch(patch->path(), patch->internal_polyphony()); + client->polyphonic(patch->path(), patch->polyphonic()); if (recursive) { @@ -91,6 +92,7 @@ ObjectSender::send_node(ClientInterface* client, const NodeImpl* node, bool recu client->bundle_begin(); client->new_node(node->plugin()->uri(), node->path(), node->polyphonic(), node->num_ports()); + client->polyphonic(node->path(), node->polyphonic()); // Send variable const GraphObjectImpl::Variables& data = node->variables(); @@ -115,6 +117,7 @@ ObjectSender::send_port(ClientInterface* client, const PortImpl* port) client->bundle_begin(); client->new_port(port->path(), port->type().uri(), port->is_output()); + client->polyphonic(port->path(), port->polyphonic()); // Send variable const GraphObjectImpl::Variables& data = port->variables(); diff --git a/src/libs/engine/PortImpl.cpp b/src/libs/engine/PortImpl.cpp index 7ef4a82a..800ba011 100644 --- a/src/libs/engine/PortImpl.cpp +++ b/src/libs/engine/PortImpl.cpp @@ -39,7 +39,7 @@ PortImpl::PortImpl(NodeImpl* const node, uint32_t poly, DataType type, size_t buffer_size) - : GraphObjectImpl(node, name, true) + : GraphObjectImpl(node, name, (type == DataType::AUDIO || type == DataType::CONTROL)) , _index(index) , _poly(poly) , _buffer_size(buffer_size) @@ -73,6 +73,16 @@ PortImpl::~PortImpl() delete _buffers; } + +bool +PortImpl::set_polyphonic(Raul::Maid& maid, bool p) +{ + if (_type == DataType::CONTROL || _type == DataType::AUDIO) + return GraphObjectImpl::set_polyphonic(maid, p); + else + return (!p); +} + bool PortImpl::prepare_poly(uint32_t poly) diff --git a/src/libs/engine/PortImpl.hpp b/src/libs/engine/PortImpl.hpp index c43a79b0..93972f58 100644 --- a/src/libs/engine/PortImpl.hpp +++ b/src/libs/engine/PortImpl.hpp @@ -51,6 +51,8 @@ public: /** A port's parent is always a node, so static cast should be safe */ NodeImpl* parent_node() const { return (NodeImpl*)_parent; } + bool set_polyphonic(Raul::Maid& maid, bool p); + /** Prepare for a new (external) polyphony value. * * Preprocessor thread, poly is actually applied by apply_poly. diff --git a/src/libs/engine/events/SetPolyphonicEvent.cpp b/src/libs/engine/events/SetPolyphonicEvent.cpp index ebaf9a22..73e27c93 100644 --- a/src/libs/engine/events/SetPolyphonicEvent.cpp +++ b/src/libs/engine/events/SetPolyphonicEvent.cpp @@ -35,7 +35,8 @@ SetPolyphonicEvent::SetPolyphonicEvent(Engine& engine, SharedPtr resp : QueuedEvent(engine, responder, time, true, source), _path(path), _object(NULL), - _poly(poly) + _poly(poly), + _success(false) { } @@ -55,7 +56,7 @@ SetPolyphonicEvent::execute(ProcessContext& context) QueuedEvent::execute(context); if (_object) - _object->set_polyphonic(*_engine.maid(), _poly); + _success = _object->set_polyphonic(*_engine.maid(), _poly); _source->unblock(); } @@ -65,8 +66,12 @@ void SetPolyphonicEvent::post_process() { if (_object) { - _responder->respond_ok(); - _engine.broadcaster()->send_polyphonic(_path, _poly); + if (_success) { + _responder->respond_ok(); + _engine.broadcaster()->send_polyphonic(_path, _poly); + } else { + _responder->respond_error("Unable to set object as polyphonic"); + } } else { _responder->respond_error("Unable to find object"); } diff --git a/src/libs/engine/events/SetPolyphonicEvent.hpp b/src/libs/engine/events/SetPolyphonicEvent.hpp index 5922d443..9079d49f 100644 --- a/src/libs/engine/events/SetPolyphonicEvent.hpp +++ b/src/libs/engine/events/SetPolyphonicEvent.hpp @@ -46,6 +46,7 @@ private: const string _path; GraphObjectImpl* _object; bool _poly; + bool _success; }; -- cgit v1.2.1