summaryrefslogtreecommitdiffstats
path: root/src/engine/ObjectSender.cpp
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2008-09-30 16:50:21 +0000
committerDavid Robillard <d@drobilla.net>2008-09-30 16:50:21 +0000
commit93850c202de8b073a1ce1dd8bd246d407bce4e2f (patch)
tree6910b135bf4eff12de1af116cef73f6e9c107cd0 /src/engine/ObjectSender.cpp
parenta8bf5272d096de73507d2eab47f282c345f4ca8a (diff)
downloadingen-93850c202de8b073a1ce1dd8bd246d407bce4e2f.tar.gz
ingen-93850c202de8b073a1ce1dd8bd246d407bce4e2f.tar.bz2
ingen-93850c202de8b073a1ce1dd8bd246d407bce4e2f.zip
Flatten ingen source directory heirarchy a bit.
git-svn-id: http://svn.drobilla.net/lad/trunk/ingen@1551 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src/engine/ObjectSender.cpp')
-rw-r--r--src/engine/ObjectSender.cpp150
1 files changed, 150 insertions, 0 deletions
diff --git a/src/engine/ObjectSender.cpp b/src/engine/ObjectSender.cpp
new file mode 100644
index 00000000..688cea8e
--- /dev/null
+++ b/src/engine/ObjectSender.cpp
@@ -0,0 +1,150 @@
+/* This file is part of Ingen.
+ * Copyright (C) 2007 Dave Robillard <http://drobilla.net>
+ *
+ * Ingen is free software; you can redistribute it and/or modify it under the
+ * terms of the GNU General Public License as published by the Free Software
+ * Foundation; either version 2 of the License, or (at your option) any later
+ * version.
+ *
+ * Ingen is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "ObjectSender.hpp"
+#include "interface/ClientInterface.hpp"
+#include "EngineStore.hpp"
+#include "PatchImpl.hpp"
+#include "NodeImpl.hpp"
+#include "PortImpl.hpp"
+#include "PortImpl.hpp"
+#include "ConnectionImpl.hpp"
+#include "NodeFactory.hpp"
+#include "interface/DataType.hpp"
+#include "AudioBuffer.hpp"
+
+namespace Ingen {
+
+
+void
+ObjectSender::send_patch(ClientInterface* client, const PatchImpl* patch, bool recursive)
+{
+ client->bundle_begin();
+
+ client->new_patch(patch->path(), patch->internal_polyphony());
+ client->set_property(patch->path(), "ingen:polyphonic", patch->polyphonic());
+
+ // Send variable
+ const GraphObjectImpl::Variables& data = patch->variables();
+ for (GraphObjectImpl::Variables::const_iterator j = data.begin(); j != data.end(); ++j)
+ client->set_variable(patch->path(), (*j).first, (*j).second);
+
+ client->set_property(patch->path(), "ingen:enabled", (bool)patch->enabled());
+
+ client->bundle_end();
+
+ if (recursive) {
+
+ // Send nodes
+ for (List<NodeImpl*>::const_iterator j = patch->nodes().begin();
+ j != patch->nodes().end(); ++j) {
+ const NodeImpl* const node = (*j);
+ send_node(client, node, true);
+ }
+
+ // Send ports
+ for (uint32_t i=0; i < patch->num_ports(); ++i) {
+ PortImpl* const port = patch->port_impl(i);
+ send_port(client, port);
+ }
+
+ // Send connections
+ client->transfer_begin();
+ for (PatchImpl::Connections::const_iterator j = patch->connections().begin();
+ j != patch->connections().end(); ++j)
+ client->connect((*j)->src_port_path(), (*j)->dst_port_path());
+ client->transfer_end();
+ }
+}
+
+
+/** Sends a node or a patch */
+void
+ObjectSender::send_node(ClientInterface* client, const NodeImpl* node, bool recursive)
+{
+ PluginImpl* const plugin = node->plugin_impl();
+
+ assert(node->path().length() > 0);
+
+ if (plugin->type() == Plugin::Patch) {
+ send_patch(client, (PatchImpl*)node, recursive);
+ return;
+ }
+
+ if (plugin->uri().length() == 0) {
+ cerr << "Node " << node->path() << " plugin has no URI! Not sending." << endl;
+ return;
+ }
+
+ client->bundle_begin();
+
+ client->new_node(node->path(), node->plugin()->uri());
+ client->set_property(node->path(), "ingen:polyphonic", node->polyphonic());
+
+ // Send variables
+ const GraphObjectImpl::Variables& data = node->variables();
+ for (GraphObjectImpl::Variables::const_iterator j = data.begin(); j != data.end(); ++j)
+ client->set_variable(node->path(), (*j).first, (*j).second);
+
+ // Send properties
+ const GraphObjectImpl::Properties& prop = node->properties();
+ for (GraphObjectImpl::Properties::const_iterator j = prop.begin(); j != prop.end(); ++j)
+ client->set_property(node->path(), (*j).first, (*j).second);
+
+ client->bundle_end();
+
+ if (recursive) {
+ // Send ports
+ for (size_t j=0; j < node->num_ports(); ++j)
+ send_port(client, node->port_impl(j));
+ }
+}
+
+
+void
+ObjectSender::send_port(ClientInterface* client, const PortImpl* port)
+{
+ assert(port);
+
+ client->bundle_begin();
+
+ client->new_port(port->path(), port->index(), port->type().uri(), port->is_output());
+ client->set_property(port->path(), "ingen:polyphonic", port->polyphonic());
+
+ // Send variable
+ const GraphObjectImpl::Variables& data = port->variables();
+ for (GraphObjectImpl::Variables::const_iterator j = data.begin(); j != data.end(); ++j)
+ client->set_variable(port->path(), (*j).first, (*j).second);
+
+ // Send properties
+ const GraphObjectImpl::Properties& prop = port->properties();
+ for (GraphObjectImpl::Properties::const_iterator j = prop.begin(); j != prop.end(); ++j)
+ client->set_property(port->path(), (*j).first, (*j).second);
+
+ // Send control value
+ if (port->type() == DataType::CONTROL) {
+ const Sample value = dynamic_cast<const AudioBuffer*>(port->buffer(0))->value_at(0);
+ //cerr << port->path() << " sending default value " << default_value << endl;
+ client->set_port_value(port->path(), value);
+ }
+
+ client->bundle_end();
+}
+
+
+} // namespace Ingen
+