summaryrefslogtreecommitdiffstats
path: root/src/osc
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2012-05-09 16:38:49 +0000
committerDavid Robillard <d@drobilla.net>2012-05-09 16:38:49 +0000
commitffdf4624323af943a2f3f7241fa87d97afc50460 (patch)
treee6faffb9d979cba055bde24d1957420abdea851a /src/osc
parent6932da9169a38a5a8eafc63357b9ede00cb46117 (diff)
downloadingen-ffdf4624323af943a2f3f7241fa87d97afc50460.tar.gz
ingen-ffdf4624323af943a2f3f7241fa87d97afc50460.tar.bz2
ingen-ffdf4624323af943a2f3f7241fa87d97afc50460.zip
Remove old HTTP and OSC stuff.
git-svn-id: http://svn.drobilla.net/lad/trunk/ingen@4329 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src/osc')
-rw-r--r--src/osc/OSCClientReceiver.cpp277
-rw-r--r--src/osc/OSCClientReceiver.hpp87
-rw-r--r--src/osc/OSCClientSender.cpp228
-rw-r--r--src/osc/OSCClientSender.hpp105
-rw-r--r--src/osc/OSCEngineReceiver.cpp587
-rw-r--r--src/osc/OSCEngineReceiver.hpp119
-rw-r--r--src/osc/OSCEngineSender.cpp240
-rw-r--r--src/osc/OSCEngineSender.hpp115
-rw-r--r--src/osc/OSCSender.cpp110
-rw-r--r--src/osc/OSCSender.hpp51
-rw-r--r--src/osc/ingen_osc_client.cpp54
-rw-r--r--src/osc/ingen_osc_server.cpp52
-rw-r--r--src/osc/macros.h31
-rw-r--r--src/osc/wscript28
14 files changed, 0 insertions, 2084 deletions
diff --git a/src/osc/OSCClientReceiver.cpp b/src/osc/OSCClientReceiver.cpp
deleted file mode 100644
index 7cba4c40..00000000
--- a/src/osc/OSCClientReceiver.cpp
+++ /dev/null
@@ -1,277 +0,0 @@
-/*
- This file is part of Ingen.
- Copyright 2007-2012 David Robillard <http://drobilla.net/>
-
- Ingen is free software: you can redistribute it and/or modify it under the
- terms of the GNU Affero General Public License as published by the Free
- Software Foundation, either version 3 of the License, or 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 Affero General Public License for details.
-
- You should have received a copy of the GNU Affero General Public License
- along with Ingen. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <assert.h>
-#include <stdio.h>
-#include <string.h>
-
-#include "raul/log.hpp"
-#include "raul/AtomLiblo.hpp"
-#include "raul/Path.hpp"
-
-#include "ingen_config.h"
-#include "OSCClientReceiver.hpp"
-
-#define LOG(s) s << "[OSCClientReceiver] "
-
-using namespace std;
-using namespace Raul;
-
-namespace Ingen {
-namespace Client {
-
-OSCClientReceiver::OSCClientReceiver(int listen_port,
- SharedPtr<ClientInterface> target)
- : _target(target)
- , _st(NULL)
- , _listen_port(listen_port)
-{
-#ifdef RAUL_LOG_DEBUG
- start(true);
-#else
- start(false); // true = dump, false = shutup
-#endif
-}
-
-OSCClientReceiver::~OSCClientReceiver()
-{
- stop();
-}
-
-void
-OSCClientReceiver::start(bool dump_osc)
-{
- if (_st != NULL)
- return;
-
- // Attempt preferred port
- if (_listen_port != 0) {
- char port_str[8];
- snprintf(port_str, sizeof(port_str), "%d", _listen_port);
- _st = lo_server_thread_new(port_str, lo_error_cb);
- }
-
- // Find a free port
- if (!_st) {
- _st = lo_server_thread_new(NULL, lo_error_cb);
- _listen_port = lo_server_thread_get_port(_st);
- }
-
- if (_st == NULL) {
- LOG(error) << "Could not start OSC listener. Aborting." << endl;
- exit(EXIT_FAILURE);
- } else {
- LOG(info) << "Started OSC listener on port " << lo_server_thread_get_port(_st) << endl;
- }
-
- // Print all incoming messages
- if (dump_osc)
- lo_server_thread_add_method(_st, NULL, NULL, generic_cb, NULL);
-
- setup_callbacks();
-
- // Display any uncaught messages to the console
- //lo_server_thread_add_method(_st, NULL, NULL, unknown_cb, NULL);
-
- lo_server_thread_start(_st);
-}
-
-void
-OSCClientReceiver::stop()
-{
- if (_st != NULL) {
- //unregister_client();
- lo_server_thread_free(_st);
- _st = NULL;
- }
-}
-
-int
-OSCClientReceiver::generic_cb(const char* path, const char* types, lo_arg** argv, int argc, void* data, void* user_data)
-{
- printf("[OSCClientReceiver] %s (%s)\t", path, types);
-
- for (int i=0; i < argc; ++i) {
- lo_arg_pp(lo_type(types[i]), argv[i]);
- printf("\t");
- }
- printf("\n");
-
- return 1; // not handled
-}
-
-void
-OSCClientReceiver::lo_error_cb(int num, const char* msg, const char* path)
-{
- LOG(error) << "Got error from server: " << msg << endl;
-}
-
-int
-OSCClientReceiver::unknown_cb(const char* path, const char* types, lo_arg** argv, int argc, void* data, void* user_data)
-{
- std::string msg = "Received unknown OSC message: ";
- msg += path;
-
- LOG(error) << msg << endl;
-
- return 0;
-}
-
-void
-OSCClientReceiver::setup_callbacks()
-{
- if (!_target)
- return;
-
- lo_server_thread_add_method(_st, "/response", "ii", response_cb, this);
- lo_server_thread_add_method(_st, "/plugin", "sss", plugin_cb, this);
- lo_server_thread_add_method(_st, "/put", NULL, put_cb, this);
- lo_server_thread_add_method(_st, "/delta_begin", NULL, delta_begin_cb, this);
- lo_server_thread_add_method(_st, "/delta_remove", NULL, delta_remove_cb, this);
- lo_server_thread_add_method(_st, "/delta_add", NULL, delta_add_cb, this);
- lo_server_thread_add_method(_st, "/delta_end", NULL, delta_end_cb, this);
- lo_server_thread_add_method(_st, "/move", "ss", move_cb, this);
- lo_server_thread_add_method(_st, "/delete", "s", del_cb, this);
- lo_server_thread_add_method(_st, "/connect", "ss", connection_cb, this);
- lo_server_thread_add_method(_st, "/disconnect", "ss", disconnection_cb, this);
- lo_server_thread_add_method(_st, "/set_property", NULL, set_property_cb, this);
-}
-
-/** Catches errors that aren't a direct result of a client request.
- */
-int
-OSCClientReceiver::_error_cb(const char* path, const char* types, lo_arg** argv, int argc, lo_message msg)
-{
- _target->error((char*)argv[0]);
- return 0;
-}
-
-int
-OSCClientReceiver::_del_cb(const char* path, const char* types, lo_arg** argv, int argc, lo_message msg)
-{
- _target->del((const char*)&argv[0]->s);
- return 0;
-}
-
-int
-OSCClientReceiver::_put_cb(const char* path, const char* types, lo_arg** argv, int argc, lo_message msg)
-{
- const char* obj_path = &argv[0]->s;
- const char* ctx = &argv[1]->s;
- Resource::Properties prop;
- for (int i = 2; i < argc-1; i += 2)
- prop.insert(make_pair(&argv[i]->s,
- AtomLiblo::lo_arg_to_atom(types[i+1], argv[i+1])));
- _target->put(obj_path, prop, Resource::uri_to_graph(ctx));
- return 0;
-}
-
-int
-OSCClientReceiver::_delta_begin_cb(const char* path, const char* types, lo_arg** argv, int argc, lo_message msg)
-{
- const char* obj_path = &argv[0]->s;
- assert(_delta_remove.empty());
- assert(_delta_add.empty());
- _delta_uri = obj_path;
- return 0;
-}
-
-int
-OSCClientReceiver::_delta_remove_cb(const char* path, const char* types, lo_arg** argv, int argc, lo_message msg)
-{
- _delta_remove.insert(make_pair(&argv[0]->s,
- AtomLiblo::lo_arg_to_atom(types[1], argv[1])));
- return 0;
-}
-
-int
-OSCClientReceiver::_delta_add_cb(const char* path, const char* types, lo_arg** argv, int argc, lo_message msg)
-{
- _delta_add.insert(make_pair(&argv[0]->s,
- AtomLiblo::lo_arg_to_atom(types[1], argv[1])));
- return 0;
-}
-
-int
-OSCClientReceiver::_delta_end_cb(const char* path, const char* types, lo_arg** argv, int argc, lo_message msg)
-{
- _target->delta(_delta_uri, _delta_remove, _delta_add);
- _delta_uri = Raul::URI();
- _delta_remove.clear();
- _delta_add.clear();
- return 0;
-}
-
-int
-OSCClientReceiver::_move_cb(const char* path, const char* types, lo_arg** argv, int argc, lo_message msg)
-{
- const char* old_path = &argv[1]->s;
- const char* new_path = &argv[2]->s;
-
- _target->move(old_path, new_path);
- return 0;
-}
-
-int
-OSCClientReceiver::_connection_cb(const char* path, const char* types, lo_arg** argv, int argc, lo_message msg)
-{
- const char* const src_port_path = &argv[0]->s;
- const char* const dst_port_path = &argv[1]->s;
-
- _target->connect(src_port_path, dst_port_path);
-
- return 0;
-}
-
-int
-OSCClientReceiver::_disconnection_cb(const char* path, const char* types, lo_arg** argv, int argc, lo_message msg)
-{
- const char* src_uri = &argv[0]->s;
- const char* dst_uri = &argv[1]->s;
-
- _target->disconnect(src_uri, dst_uri);
-
- return 0;
-}
-
-/** Notification of a new or updated property.
- */
-int
-OSCClientReceiver::_set_property_cb(const char* path, const char* types, lo_arg** argv, int argc, lo_message msg)
-{
- if (argc != 3 || types[0] != 's' || types[1] != 's')
- return 1;
-
- const char* obj_uri = &argv[0]->s;
- const char* key = &argv[1]->s;
-
- Atom value = AtomLiblo::lo_arg_to_atom(types[2], argv[2]);
-
- _target->set_property(obj_uri, key, value);
-
- return 0;
-}
-
-int
-OSCClientReceiver::_response_cb(const char* path, const char* types, lo_arg** argv, int argc, lo_message msg)
-{
- assert(!strcmp(types, "ii"));
- _target->response(argv[0]->i, (Status)argv[1]->i);
- return 0;
-}
-
-} // namespace Client
-} // namespace Ingen
diff --git a/src/osc/OSCClientReceiver.hpp b/src/osc/OSCClientReceiver.hpp
deleted file mode 100644
index 62d02e3d..00000000
--- a/src/osc/OSCClientReceiver.hpp
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- This file is part of Ingen.
- Copyright 2007-2012 David Robillard <http://drobilla.net/>
-
- Ingen is free software: you can redistribute it and/or modify it under the
- terms of the GNU Affero General Public License as published by the Free
- Software Foundation, either version 3 of the License, or 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 Affero General Public License for details.
-
- You should have received a copy of the GNU Affero General Public License
- along with Ingen. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef INGEN_CLIENT_OSCCLIENTRECEIVER_HPP
-#define INGEN_CLIENT_OSCCLIENTRECEIVER_HPP
-
-#include <cstdlib>
-
-#include <boost/utility.hpp>
-#include <lo/lo.h>
-
-#include "ingen/Interface.hpp"
-#include "raul/Deletable.hpp"
-#include "raul/SharedPtr.hpp"
-
-#include "macros.h"
-
-namespace Ingen {
-namespace Client {
-
-/** Client-side receiver for OSC messages from the engine.
- *
- * \ingroup IngenClient
- */
-class OSCClientReceiver : public boost::noncopyable, public Raul::Deletable
-{
-public:
- OSCClientReceiver(int listen_port, SharedPtr<ClientInterface> target);
- ~OSCClientReceiver();
-
- std::string uri() const { return lo_server_thread_get_url(_st); }
-
- void start(bool dump_osc);
- void stop();
-
- int listen_port() { return _listen_port; }
- std::string listen_url() { return lo_server_thread_get_url(_st); }
-
-private:
- void setup_callbacks();
-
- static void lo_error_cb(int num, const char* msg, const char* path);
-
- static int generic_cb(const char* path, const char* types, lo_arg** argv, int argc, void* data, void* user_data);
- static int unknown_cb(const char* path, const char* types, lo_arg** argv, int argc, void* data, void* osc_receiver);
-
- SharedPtr<ClientInterface> _target;
- lo_server_thread _st;
- Raul::URI _delta_uri;
- Resource::Properties _delta_remove;
- Resource::Properties _delta_add;
- int _listen_port;
-
- LO_HANDLER(OSCClientReceiver, error);
- LO_HANDLER(OSCClientReceiver, response);
- LO_HANDLER(OSCClientReceiver, plugin);
- LO_HANDLER(OSCClientReceiver, plugin_list_end);
- LO_HANDLER(OSCClientReceiver, new_patch);
- LO_HANDLER(OSCClientReceiver, del);
- LO_HANDLER(OSCClientReceiver, move);
- LO_HANDLER(OSCClientReceiver, connection);
- LO_HANDLER(OSCClientReceiver, disconnection);
- LO_HANDLER(OSCClientReceiver, put);
- LO_HANDLER(OSCClientReceiver, delta_begin);
- LO_HANDLER(OSCClientReceiver, delta_remove);
- LO_HANDLER(OSCClientReceiver, delta_add);
- LO_HANDLER(OSCClientReceiver, delta_end);
- LO_HANDLER(OSCClientReceiver, set_property);
-};
-
-} // namespace Client
-} // namespace Ingen
-
-#endif // INGEN_CLIENT_OSCCLIENTRECEIVER_HPP
diff --git a/src/osc/OSCClientSender.cpp b/src/osc/OSCClientSender.cpp
deleted file mode 100644
index b8d086ee..00000000
--- a/src/osc/OSCClientSender.cpp
+++ /dev/null
@@ -1,228 +0,0 @@
-/*
- This file is part of Ingen.
- Copyright 2007-2012 David Robillard <http://drobilla.net/>
-
- Ingen is free software: you can redistribute it and/or modify it under the
- terms of the GNU Affero General Public License as published by the Free
- Software Foundation, either version 3 of the License, or 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 Affero General Public License for details.
-
- You should have received a copy of the GNU Affero General Public License
- along with Ingen. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <cassert>
-#include <string>
-
-#include "raul/log.hpp"
-#include "raul/AtomLiblo.hpp"
-#include "raul/Path.hpp"
-
-#include "ingen/Interface.hpp"
-
-#include "OSCClientSender.hpp"
-
-using namespace std;
-using namespace Raul;
-
-namespace Ingen {
-namespace Server {
-
-/** @page client_osc_namespace Client OSC Namespace Documentation
- *
- * <p>These are the commands the client recognizes. All monitoring of
- * changes in the engine happens via these commands.</p>
- */
-
-/** @page client_osc_namespace
- * <h2>/response</h2>
- * @arg @p response-id :: Integer
- * @arg @p status :: Integer
- *
- * @par
- * Response to some command.
- */
-void
-OSCClientSender::response(int32_t id, Status status)
-{
- if (!_enabled)
- return;
-
- if (lo_send(_address, "/response", "ii", id, status, LO_ARGS_END) < 0) {
- Raul::error << "Unable to send response " << id << "! ("
- << lo_address_errstr(_address) << ")" << endl;
- }
-}
-
-/** @page client_osc_namespace
- * <h2>/error</h2>
- * @arg @p message :: String
- *
- * @par
- * Notification that an error has occurred. This is for notification of errors
- * that aren't a direct response to a user command, i.e. "unexpected" errors.
- */
-void
-OSCClientSender::error(const std::string& msg)
-{
- send("/error", "s", msg.c_str(), LO_ARGS_END);
-}
-
-/** @page client_osc_namespace
- * <h2>/put</h2>
- * @arg @p path :: String
- * @arg @p predicate :: URI String
- * @arg @p value
- * @arg @p ...
- *
- * @par
- * PUT a set of properties to a path.
- */
-void
-OSCClientSender::put(const Raul::URI& path,
- const Resource::Properties& properties,
- Resource::Graph ctx)
-{
- typedef Resource::Properties::const_iterator iterator;
- lo_message m = lo_message_new();
- lo_message_add_string(m, path.c_str());
- lo_message_add_string(m, Resource::graph_to_uri(ctx).c_str());
- for (iterator i = properties.begin(); i != properties.end(); ++i) {
- lo_message_add_string(m, i->first.c_str());
- Raul::AtomLiblo::lo_message_add_atom(m, i->second);
- }
- send_message("/put", m);
-}
-
-void
-OSCClientSender::delta(const Raul::URI& path,
- const Resource::Properties& remove,
- const Resource::Properties& add)
-{
- typedef Resource::Properties::const_iterator iterator;
-
- const bool bundle = !_bundle;
- if (bundle)
- bundle_begin();
-
- send("/delta_begin", "s", path.c_str(), LO_ARGS_END);
-
- for (iterator i = remove.begin(); i != remove.end(); ++i) {
- lo_message m = lo_message_new();
- lo_message_add_string(m, i->first.c_str());
- Raul::AtomLiblo::lo_message_add_atom(m, i->second);
- send_message("/delta_remove", m);
- }
-
- for (iterator i = add.begin(); i != add.end(); ++i) {
- lo_message m = lo_message_new();
- lo_message_add_string(m, i->first.c_str());
- Raul::AtomLiblo::lo_message_add_atom(m, i->second);
- send_message("/delta_add", m);
- }
-
- send("/delta_end", "", LO_ARGS_END);
-
- if (bundle)
- bundle_end();
-}
-
-/** @page client_osc_namespace
- * <h2>/move</h2>
- * @arg @p old-path :: String
- * @arg @p new-path :: String
- *
- * @par
- * MOVE an object to a new path.
- * The new path will have the same parent as the old path.
- */
-void
-OSCClientSender::move(const Path& old_path, const Path& new_path)
-{
- send("/move", "ss", old_path.c_str(), new_path.c_str(), LO_ARGS_END);
-}
-
-/** @page client_osc_namespace
- * <h2>/delete</h2>
- * @arg @p path :: String
- *
- * @par
- * DELETE an object.
- */
-void
-OSCClientSender::del(const URI& uri)
-{
- send("/delete", "s", uri.c_str(), LO_ARGS_END);
-}
-
-/** @page client_osc_namespace
- * <h2>/connect</h2>
- * @arg @p src-path :: String
- * @arg @p dst-path :: String
- *
- * @par
- * Notification a new connection has been made.
- */
-void
-OSCClientSender::connect(const Path& src_port_path,
- const Path& dst_port_path)
-{
- send("/connect", "ss", src_port_path.c_str(), dst_port_path.c_str(), LO_ARGS_END);
-}
-
-/** @page client_osc_namespace
- * <h2>/disconnect</h2>
- * @arg @p src-path :: String
- * @arg @p dst-path :: String
- *
- * @par
- * Notification a connection has been unmade.
- */
-void
-OSCClientSender::disconnect(const URI& src,
- const URI& dst)
-{
- send("/disconnect", "ss", src.c_str(), dst.c_str(), LO_ARGS_END);
-}
-
-/** @page client_osc_namespace
- * <h2>/disconnect_all</h2>
- * @arg @p parent-patch-path :: String
- * @arg @p path :: String
- *
- * @par
- * Notification all connections to an object have been disconnected.
- */
-void
-OSCClientSender::disconnect_all(const Raul::Path& parent_patch_path,
- const Raul::Path& path)
-{
- send("/disconnect_all", "ss", parent_patch_path.c_str(), path.c_str(), LO_ARGS_END);
-}
-
-/** @page client_osc_namespace
- * <h2>/set_property</h2>
- * @arg @p path :: String
- * @arg @p key :: URI String
- * @arg @p value
- *
- * @par
- * Notification of a property.
- */
-void
-OSCClientSender::set_property(const URI& path,
- const URI& key,
- const Atom& value)
-{
- lo_message m = lo_message_new();
- lo_message_add_string(m, path.c_str());
- lo_message_add_string(m, key.c_str());
- AtomLiblo::lo_message_add_atom(m, value);
- send_message("/set_property", m);
-}
-
-} // namespace Server
-} // namespace Ingen
diff --git a/src/osc/OSCClientSender.hpp b/src/osc/OSCClientSender.hpp
deleted file mode 100644
index 68c706e4..00000000
--- a/src/osc/OSCClientSender.hpp
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- This file is part of Ingen.
- Copyright 2007-2012 David Robillard <http://drobilla.net/>
-
- Ingen is free software: you can redistribute it and/or modify it under the
- terms of the GNU Affero General Public License as published by the Free
- Software Foundation, either version 3 of the License, or 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 Affero General Public License for details.
-
- You should have received a copy of the GNU Affero General Public License
- along with Ingen. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef INGEN_ENGINE_OSCCLIENTSENDER_HPP
-#define INGEN_ENGINE_OSCCLIENTSENDER_HPP
-
-#include <cassert>
-#include <string>
-
-#include <lo/lo.h>
-
-#include "ingen/Interface.hpp"
-#include "ingen/GraphObject.hpp"
-
-#include "OSCSender.hpp"
-
-namespace Ingen {
-
-class ServerInterface;
-
-namespace Server {
-
-/** Implements ClientInterface for OSC clients (sends OSC messages).
- *
- * \ingroup engine
- */
-class OSCClientSender : public ClientInterface,
- public Ingen::Shared::OSCSender
-{
-public:
- explicit OSCClientSender(const Raul::URI& url,
- size_t max_packet_size)
- : Shared::OSCSender(max_packet_size)
- , _url(url)
- {
- _address = lo_address_new_from_url(url.c_str());
- }
-
- virtual ~OSCClientSender()
- { lo_address_free(_address); }
-
- bool enabled() const { return _enabled; }
-
- void enable() { _enabled = true; }
- void disable() { _enabled = false; }
-
- void bundle_begin() { OSCSender::bundle_begin(); }
- void bundle_end() { OSCSender::bundle_end(); }
-
- Raul::URI uri() const { return _url; }
-
- /* *** ClientInterface Implementation Below *** */
-
- void response(int32_t id, Status status);
-
- void error(const std::string& msg);
-
- virtual void put(const Raul::URI& path,
- const Resource::Properties& properties,
- Resource::Graph ctx=Resource::DEFAULT);
-
- virtual void delta(const Raul::URI& path,
- const Resource::Properties& remove,
- const Resource::Properties& add);
-
- virtual void del(const Raul::URI& uri);
-
- virtual void move(const Raul::Path& old_path,
- const Raul::Path& new_path);
-
- virtual void connect(const Raul::Path& src_port_path,
- const Raul::Path& dst_port_path);
-
- virtual void disconnect(const Raul::URI& src,
- const Raul::URI& dst);
-
- virtual void disconnect_all(const Raul::Path& parent_patch_path,
- const Raul::Path& path);
-
- virtual void set_property(const Raul::URI& subject,
- const Raul::URI& predicate,
- const Raul::Atom& value);
-
-private:
- Raul::URI _url;
-};
-
-} // namespace Server
-} // namespace Ingen
-
-#endif // INGEN_ENGINE_OSCCLIENTSENDER_HPP
-
diff --git a/src/osc/OSCEngineReceiver.cpp b/src/osc/OSCEngineReceiver.cpp
deleted file mode 100644
index e529ac24..00000000
--- a/src/osc/OSCEngineReceiver.cpp
+++ /dev/null
@@ -1,587 +0,0 @@
-/*
- This file is part of Ingen.
- Copyright 2007-2012 David Robillard <http://drobilla.net/>
-
- Ingen is free software: you can redistribute it and/or modify it under the
- terms of the GNU Affero General Public License as published by the Free
- Software Foundation, either version 3 of the License, or 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 Affero General Public License for details.
-
- You should have received a copy of the GNU Affero General Public License
- along with Ingen. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <stdlib.h>
-#include <stdio.h>
-
-#include <string>
-
-#include <lo/lo.h>
-
-#include "raul/AtomLiblo.hpp"
-#include "raul/Path.hpp"
-#include "raul/SharedPtr.hpp"
-#include "raul/log.hpp"
-
-#include "ingen_config.h"
-#include "ingen/Interface.hpp"
-
-#include "../server/ClientBroadcaster.hpp"
-#include "../server/Engine.hpp"
-
-#include "OSCClientSender.hpp"
-#include "OSCEngineReceiver.hpp"
-
-#define LOG(s) s << "[OSCEngineReceiver] "
-
-using namespace std;
-using namespace Raul;
-
-namespace Ingen {
-namespace Server {
-
-/** @page engine_osc_namespace Server OSC Namespace Documentation
- *
- * <p>These are the commands the engine recognizes. A client can control every
- * aspect of the engine entirely with these commands.</p>
- *
- * <p>All commands on this page are in the "control band". If a client needs to
- * know about the state of the engine, it must listen to the "notification band".
- * See the "Client OSC Namespace Documentation" for details.</p>
- */
-
-OSCEngineReceiver::OSCEngineReceiver(Engine& engine,
- SharedPtr<ServerInterface> interface,
- uint16_t port)
- : _engine(engine)
- , _interface(interface)
- , _server(NULL)
-{
- _receive_thread = new ReceiveThread(*this);
-
- char port_str[6];
- snprintf(port_str, sizeof(port_str), "%u", port);
-
- _server = lo_server_new(port_str, error_cb);
-
- if (_server == NULL) {
- LOG(error) << "Could not start OSC server. Aborting." << endl;
- exit(EXIT_FAILURE);
- } else {
- char* lo_url = lo_server_get_url(_server);
- LOG(info) << "Started OSC server at " << lo_url << endl;
- free(lo_url);
- }
-
-#ifdef RAUL_LOG_DEBUG
- lo_server_add_method(_server, NULL, NULL, generic_cb, NULL);
-#endif
-
- // Set response address for this message.
- // It's important this is first and returns nonzero.
- lo_server_add_method(_server, NULL, NULL, set_response_address_cb, this);
-
-#ifdef LIBLO_BUNDLES
- lo_server_add_bundle_handlers(_server, bundle_start_cb, bundle_end_cb, this);
-#endif
-
- // Commands
- lo_server_add_method(_server, "/ping", "i", ping_cb, this);
- lo_server_add_method(_server, "/ping_queued", "i", ping_slow_cb, this);
- lo_server_add_method(_server, "/register_client", "i", register_client_cb, this);
- lo_server_add_method(_server, "/unregister_client", "i", unregister_client_cb, this);
- lo_server_add_method(_server, "/put", NULL, put_cb, this);
- lo_server_add_method(_server, "/delta_begin", NULL, delta_begin_cb, this);
- lo_server_add_method(_server, "/delta_remove", NULL, delta_remove_cb, this);
- lo_server_add_method(_server, "/delta_add", NULL, delta_add_cb, this);
- lo_server_add_method(_server, "/delta_end", NULL, delta_end_cb, this);
- lo_server_add_method(_server, "/move", "iss", move_cb, this);
- lo_server_add_method(_server, "/delete", "is", del_cb, this);
- lo_server_add_method(_server, "/connect", "iss", connect_cb, this);
- lo_server_add_method(_server, "/disconnect", "iss", disconnect_cb, this);
- lo_server_add_method(_server, "/disconnect_all", "iss", disconnect_all_cb, this);
- lo_server_add_method(_server, "/note_on", "isii", note_on_cb, this);
- lo_server_add_method(_server, "/note_off", "isi", note_off_cb, this);
- lo_server_add_method(_server, "/all_notes_off", "isi", all_notes_off_cb, this);
- lo_server_add_method(_server, "/learn", "is", learn_cb, this);
- lo_server_add_method(_server, "/set_property", NULL, set_property_cb, this);
-
- // Queries
- lo_server_add_method(_server, "/get", "is", get_cb, this);
-
- lo_server_add_method(_server, NULL, NULL, unknown_cb, NULL);
-
- _receive_thread->set_name("OSCEngineReceiver Listener");
- _receive_thread->start();
- _receive_thread->set_scheduling(SCHED_FIFO, 5);
-}
-
-OSCEngineReceiver::~OSCEngineReceiver()
-{
- _receive_thread->stop();
- delete _receive_thread;
-
- if (_server != NULL) {
- lo_server_free(_server);
- _server = NULL;
- }
-}
-
-/** Override the semaphore driven _run method of ServerInterfaceImpl
- * to wait on OSC messages and prepare them right away in the same thread.
- */
-void
-OSCEngineReceiver::ReceiveThread::_run()
-{
- /* get a timestamp here and stamp all the events with the same time so
- * they all get executed in the same cycle */
-
- while (true) {
- // Wait on a message and enqueue it
- lo_server_recv(_receiver._server);
-
- // Enqueue every other message that is here "now"
- // (would this provide truly atomic bundles?)
- while (lo_server_recv_noblock(_receiver._server, 0) > 0) {}
- }
-}
-
-/** Create a new request for this message, if necessary.
- *
- * This is based on the fact that the current request is stored in a ref
- * counted pointer, and events just take a reference to that. Thus, events
- * may delete their request if we've since switched to a new one, or the
- * same one can stay around and serve a series of events.
- * Hooray for reference counting.
- *
- * If this message came from the same source as the last message, no allocation
- * of requests or lo_addresses or any of it needs to be done. Unfortunately
- * the only way to check is by comparing URLs, because liblo addresses suck.
- * Lack of a fast liblo address comparison really sucks here, in any case.
- */
-int
-OSCEngineReceiver::set_response_address_cb(const char* path, const char* types, lo_arg** argv, int argc, lo_message msg, void* user_data)
-{
- OSCEngineReceiver* const me = reinterpret_cast<OSCEngineReceiver*>(user_data);
-
- if (argc < 1 || types[0] != 'i') // Not a valid Ingen message
- return 0; // Save liblo the trouble
-
- const int32_t id = argv[0]->i;
-
- const lo_address addr = lo_message_get_source(msg);
- char* const url = lo_address_get_url(addr);
-
- if (id != -1) {
- // TODO: Cache client
- ClientInterface* client = me->_engine.broadcaster()->client(url);
- me->_interface->set_response_id(id);
- } else {
- me->_interface->disable_responses();
- }
-
- free(url);
-
- // If this returns 0 no OSC commands will work
- return 1;
-}
-
-#ifdef LIBLO_BUNDLES
-int
-OSCEngineReceiver::_bundle_start_cb(lo_timetag time)
-{
- info << "BUNDLE START" << endl;
- return 0;
-}
-
-int
-OSCEngineReceiver::_bundle_end_cb()
-{
- info << "BUNDLE END" << endl;
- return 0;
-}
-#endif
-
-void
-OSCEngineReceiver::error_cb(int num, const char* msg, const char* path)
-{
- error << "liblo server error" << num;
- if (path) {
- error << " for path `" << path << "'";
- }
- error << " (" << msg << ")" << endl;
-}
-
-/** @page engine_osc_namespace
- * <h2>/ping</h2>
- * @arg @p response-id :: Integer
- */
-int
-OSCEngineReceiver::_ping_cb(const char* path, const char* types, lo_arg** argv, int argc, lo_message msg)
-{
- const lo_address addr = lo_message_get_source(msg);
- if (lo_send(addr, "/ok", "i", argv[0]->i) < 0)
- warn << "Unable to send response (" << lo_address_errstr(addr) << ")" << endl;
- return 0;
-}
-
-/** @page engine_osc_namespace
- * <h2>/ping_queued</h2>
- * @arg @p response-id :: Integer
- *
- * @par
- * Reply to sender with a successful response after going through the
- * event queue. This is useful for checking if the engine is actually active,
- * or for sending after several events as a sentinel and wait on it's response,
- * to know when all previous events have finished processing.
- */
-int
-OSCEngineReceiver::_ping_slow_cb(const char* path, const char* types, lo_arg** argv, int argc, lo_message msg)
-{
- _interface->ping();
- return 0;
-}
-
-/** @page engine_osc_namespace
- * <h2>/register_client</h2>
- * @arg @p response-id :: Integer
- *
- * @par
- * Register a new client with the engine. The incoming address will be
- * used for the new registered client.
- */
-int
-OSCEngineReceiver::_register_client_cb(const char* path, const char* types, lo_arg** argv, int argc, lo_message msg)
-{
- lo_address addr = lo_message_get_source(msg);
-
- char* const url = lo_address_get_url(addr);
- ClientInterface* client = new OSCClientSender(
- (const char*)url,
- _engine.world()->conf()->option("packet-size").get_int32());
- _interface->register_client(client);
- free(url);
-
- return 0;
-}
-
-/** @page engine_osc_namespace
- * <h2>/unregister_client</h2>
- * @arg @p response-id :: Integer
- *
- * @par
- * Unregister a client.
- */
-int
-OSCEngineReceiver::_unregister_client_cb(const char* path, const char* types, lo_arg** argv, int argc, lo_message msg)
-{
- lo_address addr = lo_message_get_source(msg);
-
- char* url = lo_address_get_url(addr);
- _interface->unregister_client(url);
- free(url);
-
- return 0;
-}
-
-/** @page engine_osc_namespace
- * <h2>/get</h2>
- * @arg @p response-id :: Integer
- * @arg @p uri :: URI String
- *
- * @par
- * Request all properties of an object.
- */
-int
-OSCEngineReceiver::_get_cb(const char* path, const char* types, lo_arg** argv, int argc, lo_message msg)
-{
- _interface->get(&argv[1]->s);
- return 0;
-}
-
-/** @page engine_osc_namespace
- * <h2>/put</h2>
- * @arg @p response-id :: Integer
- * @arg @p path :: String
- * @arg @p context :: URI String
- * @arg @p predicate :: URI String
- * @arg @p value
- * @arg @p ...
- *
- * @par
- * PUT a set of properties to a path.
- */
-int
-OSCEngineReceiver::_put_cb(const char* path, const char* types, lo_arg** argv, int argc, lo_message msg)
-{
- const char* obj_path = &argv[1]->s;
- const char* ctx = &argv[2]->s;
- Resource::Properties prop;
- for (int i = 3; i < argc-1; i += 2)
- prop.insert(
- make_pair(&argv[i]->s,
- AtomLiblo::lo_arg_to_atom(_engine.world()->forge(), types[i+1], argv[i+1])));
- _interface->put(obj_path, prop, Resource::uri_to_graph(ctx));
- return 0;
-}
-
-int
-OSCEngineReceiver::_delta_begin_cb(const char* path, const char* types, lo_arg** argv, int argc, lo_message msg)
-{
- const char* obj_path = &argv[1]->s;
- assert(_delta_remove.empty());
- assert(_delta_add.empty());
- _delta_uri = obj_path;
- return 0;
-}
-
-int
-OSCEngineReceiver::_delta_remove_cb(const char* path, const char* types, lo_arg** argv, int argc, lo_message msg)
-{
- _delta_remove.insert(
- make_pair(&argv[1]->s,
- AtomLiblo::lo_arg_to_atom(_engine.world()->forge(), types[2], argv[2])));
- return 0;
-}
-
-int
-OSCEngineReceiver::_delta_add_cb(const char* path, const char* types, lo_arg** argv, int argc, lo_message msg)
-{
- _delta_add.insert(
- make_pair(&argv[1]->s,
- AtomLiblo::lo_arg_to_atom(_engine.world()->forge(), types[2], argv[2])));
- return 0;
-}
-
-int
-OSCEngineReceiver::_delta_end_cb(const char* path, const char* types, lo_arg** argv, int argc, lo_message msg)
-{
- _interface->delta(_delta_uri, _delta_remove, _delta_add);
- _delta_uri = Raul::URI();
- _delta_remove.clear();
- _delta_add.clear();
- return 0;
-}
-
-/** @page engine_osc_namespace
- * <h2>/move</h2>
- * @arg @p response-id :: Integer
- * @arg @p old-path :: String
- * @arg @p new-path :: String
- *
- * @par
- * MOVE an object to a new path.
- */
-int
-OSCEngineReceiver::_move_cb(const char* path, const char* types, lo_arg** argv, int argc, lo_message msg)
-{
- const char* old_path = &argv[1]->s;
- const char* new_path = &argv[2]->s;
-
- _interface->move(old_path, new_path);
- return 0;
-}
-
-/** @page engine_osc_namespace
- * <h2>/delete</h2>
- * @arg @p response-id :: Integer
- * @arg @p path :: String
- *
- * @par
- * DELETE an object.
- */
-int
-OSCEngineReceiver::_del_cb(const char* path, const char* types, lo_arg** argv, int argc, lo_message msg)
-{
- const char* uri = &argv[1]->s;
-
- _interface->del(uri);
- return 0;
-}
-
-/** @page engine_osc_namespace
- * <h2>/connect</h2>
- * @arg @p response-id :: Integer
- * @arg @p src-port-path :: String
- * @arg @p dst-port-path :: String
- *
- * @par
- * Connect two ports (which must be in the same patch).
- */
-int
-OSCEngineReceiver::_connect_cb(const char* path, const char* types, lo_arg** argv, int argc, lo_message msg)
-{
- const char* src_port_path = &argv[1]->s;
- const char* dst_port_path = &argv[2]->s;
-
- _interface->connect(src_port_path, dst_port_path);
- return 0;
-}
-
-/** @page engine_osc_namespace
- * <h2>/disconnect</h2>
- * @arg @p response-id :: Integer
- * @arg @p src-port-path :: String
- * @arg @p dst-port-path :: String
- *
- * @par
- * Disconnect two ports.
- */
-int
-OSCEngineReceiver::_disconnect_cb(const char* path, const char* types, lo_arg** argv, int argc, lo_message msg)
-{
- const char* src_port_path = &argv[1]->s;
- const char* dst_port_path = &argv[2]->s;
-
- _interface->disconnect(src_port_path, dst_port_path);
- return 0;
-}
-
-/** @page engine_osc_namespace
- * <h2>/disconnect_all</h2>
- * @arg @p response-id :: Integer
- * @arg @p patch-path :: String
- * @arg @p object-path :: String
- *
- * @par
- * Disconnect all connections to/from a node/port.
- */
-int
-OSCEngineReceiver::_disconnect_all_cb(const char* path, const char* types, lo_arg** argv, int argc, lo_message msg)
-{
- const char* patch_path = &argv[1]->s;
- const char* object_path = &argv[2]->s;
-
- _interface->disconnect_all(patch_path, object_path);
- return 0;
-}
-
-/** @page engine_osc_namespace
- * <h2>/note_on</h2>
- * @arg @p response-id :: Integer
- * @arg @p node-path :: String
- * @arg @p note-num (int)
- * @arg @p velocity (int)
- *
- * @par
- * Trigger a note-on, just as if it came from MIDI.
- */
-int
-OSCEngineReceiver::_note_on_cb(const char* path, const char* types, lo_arg** argv, int argc, lo_message msg)
-{
- /*
- const char* node_path = &argv[1]->s;
- const uint8_t note_num = argv[2]->i;
- const uint8_t velocity = argv[3]->i;
- */
- warn << "TODO: OSC note on" << endl;
- //note_on(node_path, note_num, velocity);
- return 0;
-}
-
-/** @page engine_osc_namespace
- * <h2>/note_off</h2>
- * @arg @p response-id :: Integer
- * @arg @p node-path :: String
- * @arg @p note-num :: Integer
- *
- * @par
- * Trigger a note-off, just as if it came from MIDI.
- */
-int
-OSCEngineReceiver::_note_off_cb(const char* path, const char* types, lo_arg** argv, int argc, lo_message msg)
-{
- /*
- const char* patch_path = &argv[1]->s;
- const uint8_t note_num = argv[2]->i;
- */
- warn << "TODO: OSC note off" << endl;
- //note_off(patch_path, note_num);
- return 0;
-}
-
-/** @page engine_osc_namespace
- * <h2>/all_notes_off</h2>
- * @arg @p response-id :: Integer
- * @arg @p patch-path :: String
- *
- * @par
- * Trigger a note-off for all voices, just as if it came from MIDI.
- */
-int
-OSCEngineReceiver::_all_notes_off_cb(const char* path, const char* types, lo_arg** argv, int argc, lo_message msg)
-{
- /*
-
- const char* patch_path = &argv[1]->s;
- */
- warn << "TODO: OSC all notes off" << endl;
- //all_notes_off(patch_path);
- return 0;
-}
-
-/** @page engine_osc_namespace
- * <h2>/set_property</h2>
- * @arg @p response-id :: Integer
- * @arg @p uri :: URI String
- * @arg @p key :: URI String
- * @arg @p value :: String
- *
- * @par
- * Set a property on a graph object.
- */
-int
-OSCEngineReceiver::_set_property_cb(const char* path, const char* types, lo_arg** argv, int argc, lo_message msg)
-{
- if (argc != 4 || types[0] != 'i' || types[1] != 's' || types[2] != 's')
- return 1;
-
- const char* object_path = &argv[1]->s;
- const char* key = &argv[2]->s;
-
- Raul::Atom value = Raul::AtomLiblo::lo_arg_to_atom(_engine.world()->forge(), types[3], argv[3]);
-
- _interface->set_property(object_path, key, value);
- return 0;
-}
-
-// Static Callbacks //
-
-// Display incoming OSC messages (for debugging purposes)
-int
-OSCEngineReceiver::generic_cb(const char* path, const char* types, lo_arg** argv, int argc, lo_message msg, void* user_data)
-{
- printf("[OSCEngineReceiver] %s (%s)\t", path, types);
-
- for (int i=0; i < argc; ++i) {
- lo_arg_pp(lo_type(types[i]), argv[i]);
- printf("\t");
- }
- printf("\n");
-
- return 1; // not handled
-}
-
-int
-OSCEngineReceiver::unknown_cb(const char* path, const char* types, lo_arg** argv, int argc, lo_message msg, void* user_data)
-{
- const lo_address addr = lo_message_get_source(msg);
- char* const url = lo_address_get_url(addr);
-
- warn << "Unknown OSC command " << path << " (" << types << ") "
- << "received from " << url << endl;
-
- string error_msg = "Unknown command: ";
- error_msg.append(path).append(" ").append(types);
-
- lo_send(addr, "/error", "s", error_msg.c_str(), LO_ARGS_END);
- free(url);
-
- return 0;
-}
-
-} // namespace Server
-} // namespace Ingen
diff --git a/src/osc/OSCEngineReceiver.hpp b/src/osc/OSCEngineReceiver.hpp
deleted file mode 100644
index 5e83fe16..00000000
--- a/src/osc/OSCEngineReceiver.hpp
+++ /dev/null
@@ -1,119 +0,0 @@
-/*
- This file is part of Ingen.
- Copyright 2007-2012 David Robillard <http://drobilla.net/>
-
- Ingen is free software: you can redistribute it and/or modify it under the
- terms of the GNU Affero General Public License as published by the Free
- Software Foundation, either version 3 of the License, or 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 Affero General Public License for details.
-
- You should have received a copy of the GNU Affero General Public License
- along with Ingen. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef INGEN_ENGINE_OSCENGINERECEIVER_HPP
-#define INGEN_ENGINE_OSCENGINERECEIVER_HPP
-
-#include <stdint.h>
-
-#include <lo/lo.h>
-
-#include "raul/Thread.hpp"
-#include "raul/URI.hpp"
-
-#include "ingen/Resource.hpp"
-
-#include "ingen_config.h"
-#include "macros.h"
-
-namespace Ingen {
-
-class ServerInterface;
-
-namespace Server {
-
-class Engine;
-
-/* FIXME: Make this receive and preprocess in the same thread? */
-
-/** Receive OSC messages and call interface functions.
- *
- * \ingroup engine
- */
-class OSCEngineReceiver
-{
-public:
- OSCEngineReceiver(Engine& engine,
- SharedPtr<ServerInterface> interface,
- uint16_t port);
-
- ~OSCEngineReceiver();
-
-private:
- struct ReceiveThread : public Raul::Thread {
- explicit ReceiveThread(OSCEngineReceiver& receiver) : _receiver(receiver) {}
- virtual void _run();
- private:
- OSCEngineReceiver& _receiver;
- };
-
- friend struct ReceiveThread;
-
- ReceiveThread* _receive_thread;
-
- Raul::URI _delta_uri;
- Resource::Properties _delta_remove;
- Resource::Properties _delta_add;
-
-#ifdef LIBLO_BUNDLES
- static int bundle_start_cb(lo_timetag time, void* myself) {
- return ((OSCEngineReceiver*)myself)->_bundle_start_cb(time);
- }
- static int bundle_end_cb(void* myself) {
- return ((OSCEngineReceiver*)myself)->_bundle_end_cb();
- }
-
- int _bundle_start_cb(lo_timetag time);
- int _bundle_end_cb();
-#endif
-
- static void error_cb(int num, const char* msg, const char* path);
- static int set_response_address_cb(LO_HANDLER_ARGS, void* myself);
- static int generic_cb(LO_HANDLER_ARGS, void* myself);
- static int unknown_cb(LO_HANDLER_ARGS, void* myself);
-
- LO_HANDLER(OSCEngineReceiver, quit);
- LO_HANDLER(OSCEngineReceiver, ping);
- LO_HANDLER(OSCEngineReceiver, ping_slow);
- LO_HANDLER(OSCEngineReceiver, register_client);
- LO_HANDLER(OSCEngineReceiver, unregister_client);
- LO_HANDLER(OSCEngineReceiver, get);
- LO_HANDLER(OSCEngineReceiver, put);
- LO_HANDLER(OSCEngineReceiver, delta_begin);
- LO_HANDLER(OSCEngineReceiver, delta_remove);
- LO_HANDLER(OSCEngineReceiver, delta_add);
- LO_HANDLER(OSCEngineReceiver, delta_end);
- LO_HANDLER(OSCEngineReceiver, move);
- LO_HANDLER(OSCEngineReceiver, del);
- LO_HANDLER(OSCEngineReceiver, connect);
- LO_HANDLER(OSCEngineReceiver, disconnect);
- LO_HANDLER(OSCEngineReceiver, disconnect_all);
- LO_HANDLER(OSCEngineReceiver, note_on);
- LO_HANDLER(OSCEngineReceiver, note_off);
- LO_HANDLER(OSCEngineReceiver, all_notes_off);
- LO_HANDLER(OSCEngineReceiver, learn);
- LO_HANDLER(OSCEngineReceiver, set_property);
- LO_HANDLER(OSCEngineReceiver, property_set);
-
- Engine& _engine;
- SharedPtr<ServerInterface> _interface;
- lo_server _server;
-};
-
-} // namespace Server
-} // namespace Ingen
-
-#endif // INGEN_ENGINE_OSCENGINERECEIVER_HPP
diff --git a/src/osc/OSCEngineSender.cpp b/src/osc/OSCEngineSender.cpp
deleted file mode 100644
index e7ec9dd9..00000000
--- a/src/osc/OSCEngineSender.cpp
+++ /dev/null
@@ -1,240 +0,0 @@
-/*
- This file is part of Ingen.
- Copyright 2007-2012 David Robillard <http://drobilla.net/>
-
- Ingen is free software: you can redistribute it and/or modify it under the
- terms of the GNU Affero General Public License as published by the Free
- Software Foundation, either version 3 of the License, or 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 Affero General Public License for details.
-
- You should have received a copy of the GNU Affero General Public License
- along with Ingen. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include "raul/log.hpp"
-#include "raul/AtomLiblo.hpp"
-#include "raul/Path.hpp"
-
-#include "ingen/Patch.hpp"
-#include "ingen/Port.hpp"
-#include "ingen/Plugin.hpp"
-
-#include "OSCEngineSender.hpp"
-
-#define LOG(s) s << "[OSCEngineSender] "
-
-using namespace std;
-using namespace Raul;
-
-namespace Ingen {
-namespace Client {
-
-/** Note the sending port is implicitly set by liblo, lo_send by default sends
- * from the most recently created server, so create the OSC listener before
- * this to have it all happen on the same port. Yeah, this is a big magic :/
- */
-OSCEngineSender::OSCEngineSender(const URI& engine_url,
- size_t max_packet_size,
- SharedPtr<Raul::Deletable> receiver)
- : Shared::OSCSender(max_packet_size)
- , _receiver(receiver)
- , _engine_url(engine_url)
- , _id(0)
-{
- _address = lo_address_new_from_url(engine_url.c_str());
-}
-
-OSCEngineSender::~OSCEngineSender()
-{
- lo_address_free(_address);
-}
-
-/** Attempt to connect to the engine (by pinging it).
- *
- * This doesn't register a client (or otherwise affect the client/engine state).
- * To check for success wait for the ping response with id @a ping_id (using the
- * relevant OSCClientReceiver).
- *
- * Passing a client_port of 0 will automatically choose a free port. If the
- * @a block parameter is true, this function will not return until a connection
- * has successfully been made.
- */
-void
-OSCEngineSender::attach(int32_t ping_id, bool block)
-{
- if (!_address)
- _address = lo_address_new_from_url(_engine_url.c_str());
-
- if (_address == NULL) {
- LOG(error) << "Unable to connect to " << _engine_url << endl;
- exit(EXIT_FAILURE);
- }
-
- LOG(info) << "Attempting to contact engine at " << _engine_url << " ..." << endl;
-
- _id = ping_id;
- this->ping();
-}
-
-/* *** ServerInterface implementation below here *** */
-
-/** Register with the engine via OSC.
- *
- * Note that this does not actually use 'client', since the engine creates
- * it's own key for OSC clients (namely the incoming URL), for NAT
- * traversal. It is a parameter to remain compatible with ServerInterface.
- */
-void
-OSCEngineSender::register_client(ClientInterface* client)
-{
- send("/register_client", "i", next_id(), LO_ARGS_END);
-}
-
-void
-OSCEngineSender::unregister_client(const URI& uri)
-{
- send("/unregister_client", "i", next_id(), LO_ARGS_END);
-}
-
-// Object commands
-
-void
-OSCEngineSender::put(const Raul::URI& path,
- const Resource::Properties& properties,
- Resource::Graph ctx)
-{
- typedef Resource::Properties::const_iterator iterator;
- lo_message m = lo_message_new();
- lo_message_add_int32(m, next_id());
- lo_message_add_string(m, path.c_str());
- lo_message_add_string(m, Resource::graph_to_uri(ctx).c_str());
- for (iterator i = properties.begin(); i != properties.end(); ++i) {
- lo_message_add_string(m, i->first.c_str());
- Raul::AtomLiblo::lo_message_add_atom(m, i->second);
- }
- send_message("/put", m);
-}
-
-void
-OSCEngineSender::delta(const Raul::URI& path,
- const Resource::Properties& remove,
- const Resource::Properties& add)
-{
- typedef Resource::Properties::const_iterator iterator;
-
- const bool bundle = !_bundle;
- if (bundle)
- bundle_begin();
-
- const int32_t id = next_id();
- send("/delta_begin", "is", id, path.c_str(), LO_ARGS_END);
-
- for (iterator i = remove.begin(); i != remove.end(); ++i) {
- lo_message m = lo_message_new();
- lo_message_add_string(m, i->first.c_str());
- Raul::AtomLiblo::lo_message_add_atom(m, i->second);
- send_message("/delta_remove", m);
- }
-
- for (iterator i = add.begin(); i != add.end(); ++i) {
- lo_message m = lo_message_new();
- lo_message_add_string(m, i->first.c_str());
- Raul::AtomLiblo::lo_message_add_atom(m, i->second);
- send_message("/delta_add", m);
- }
-
- send("/delta_end", "i", id, LO_ARGS_END);
-
- if (bundle)
- bundle_end();
-}
-
-void
-OSCEngineSender::move(const Path& old_path,
- const Path& new_path)
-{
- send("/move", "iss",
- next_id(),
- old_path.c_str(),
- new_path.c_str(),
- LO_ARGS_END);
-}
-
-void
-OSCEngineSender::del(const URI& uri)
-{
- send("/delete", "is",
- next_id(),
- uri.c_str(),
- LO_ARGS_END);
-}
-
-void
-OSCEngineSender::connect(const Path& src_port_path,
- const Path& dst_port_path)
-{
- send("/connect", "iss",
- next_id(),
- src_port_path.c_str(),
- dst_port_path.c_str(),
- LO_ARGS_END);
-}
-
-void
-OSCEngineSender::disconnect(const URI& src,
- const URI& dst)
-{
- send("/disconnect", "iss",
- next_id(),
- src.c_str(),
- dst.c_str(),
- LO_ARGS_END);
-}
-
-void
-OSCEngineSender::disconnect_all(const Path& parent_patch_path,
- const Path& path)
-{
- send("/disconnect_all", "iss",
- next_id(),
- parent_patch_path.c_str(),
- path.c_str(),
- LO_ARGS_END);
-}
-
-void
-OSCEngineSender::set_property(const URI& subject,
- const URI& predicate,
- const Atom& value)
-{
- lo_message m = lo_message_new();
- lo_message_add_int32(m, next_id());
- lo_message_add_string(m, subject.c_str());
- lo_message_add_string(m, predicate.c_str());
- Raul::AtomLiblo::lo_message_add_atom(m, value);
- send_message("/set_property", m);
-}
-
-// Requests //
-
-void
-OSCEngineSender::ping()
-{
- send("/ping", "i", next_id(), LO_ARGS_END);
-}
-
-void
-OSCEngineSender::get(const URI& uri)
-{
- send("/get", "is",
- next_id(),
- uri.c_str(),
- LO_ARGS_END);
-}
-
-} // namespace Client
-} // namespace Ingen
-
diff --git a/src/osc/OSCEngineSender.hpp b/src/osc/OSCEngineSender.hpp
deleted file mode 100644
index 9c1ef2f1..00000000
--- a/src/osc/OSCEngineSender.hpp
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- This file is part of Ingen.
- Copyright 2007-2012 David Robillard <http://drobilla.net/>
-
- Ingen is free software: you can redistribute it and/or modify it under the
- terms of the GNU Affero General Public License as published by the Free
- Software Foundation, either version 3 of the License, or 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 Affero General Public License for details.
-
- You should have received a copy of the GNU Affero General Public License
- along with Ingen. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef INGEN_CLIENT_OSCENGINESENDER_HPP
-#define INGEN_CLIENT_OSCENGINESENDER_HPP
-
-#include <stddef.h>
-
-#include <string>
-
-#include <lo/lo.h>
-
-#include "raul/Deletable.hpp"
-
-#include "ingen/Interface.hpp"
-
-#include "OSCSender.hpp"
-
-namespace Ingen {
-
-namespace Client {
-
-/* OSC (via liblo) interface to the engine.
- *
- * Clients can use this opaquely as an Interface* to control the engine
- * over OSC (whether over a network or not, etc).
- *
- * \ingroup IngenClient
- */
-class OSCEngineSender : public Interface, public Shared::OSCSender {
-public:
- OSCEngineSender(const Raul::URI& engine_url,
- size_t max_packet_size,
- SharedPtr<Raul::Deletable> receiver);
-
- ~OSCEngineSender();
-
- Raul::URI uri() const { return _engine_url; }
-
- inline int32_t next_id() { return (_id == -1) ? -1 : _id++; }
-
- void set_response_id(int32_t id) { _id = id; }
-
- void attach(int32_t ping_id, bool block);
-
- /* *** ServerInterface implementation below here *** */
-
- void enable() { _enabled = true; }
- void disable() { _enabled = false; }
-
- void bundle_begin() { OSCSender::bundle_begin(); }
- void bundle_end() { OSCSender::bundle_end(); }
-
- // Client registration
- void register_client(ClientInterface* client);
- void unregister_client(const Raul::URI& uri);
-
- // Object commands
-
- virtual void put(const Raul::URI& path,
- const Resource::Properties& properties,
- Resource::Graph ctx=Resource::DEFAULT);
-
- virtual void delta(const Raul::URI& path,
- const Resource::Properties& remove,
- const Resource::Properties& add);
-
- virtual void del(const Raul::URI& uri);
-
- virtual void move(const Raul::Path& old_path,
- const Raul::Path& new_path);
-
- virtual void connect(const Raul::Path& src_port_path,
- const Raul::Path& dst_port_path);
-
- virtual void disconnect(const Raul::URI& src,
- const Raul::URI& dst);
-
- virtual void disconnect_all(const Raul::Path& parent_patch_path,
- const Raul::Path& path);
-
- virtual void set_property(const Raul::URI& subject_path,
- const Raul::URI& predicate,
- const Raul::Atom& value);
-
- // Requests //
- void ping();
- void get(const Raul::URI& uri);
-
-protected:
- SharedPtr<Raul::Deletable> _receiver;
-
- const Raul::URI _engine_url;
- int _client_port;
- int32_t _id;
-};
-
-} // namespace Client
-} // namespace Ingen
-
-#endif // INGEN_CLIENT_OSCENGINESENDER_HPP
-
diff --git a/src/osc/OSCSender.cpp b/src/osc/OSCSender.cpp
deleted file mode 100644
index f48d6a3e..00000000
--- a/src/osc/OSCSender.cpp
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- This file is part of Ingen.
- Copyright 2007-2012 David Robillard <http://drobilla.net/>
-
- Ingen is free software: you can redistribute it and/or modify it under the
- terms of the GNU Affero General Public License as published by the Free
- Software Foundation, either version 3 of the License, or 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 Affero General Public License for details.
-
- You should have received a copy of the GNU Affero General Public License
- along with Ingen. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include <assert.h>
-#include <unistd.h>
-#include <stdarg.h>
-
-#include "raul/log.hpp"
-
-#include "OSCSender.hpp"
-#include "ingen_config.h"
-
-using namespace std;
-using namespace Raul;
-
-namespace Ingen {
-namespace Shared {
-
-OSCSender::OSCSender(size_t max_packet_size)
- : _bundle(NULL)
- , _address(NULL)
- , _max_packet_size(max_packet_size)
- , _enabled(true)
-{
-}
-
-void
-OSCSender::bundle_begin()
-{
- assert(!_bundle);
- lo_timetag t;
- lo_timetag_now(&t);
- _bundle = lo_bundle_new(t);
-}
-
-void
-OSCSender::bundle_end()
-{
- assert(_bundle);
- lo_send_bundle(_address, _bundle);
- lo_bundle_free_messages(_bundle);
- _bundle = NULL;
-}
-
-int
-OSCSender::send(const char *path, const char *types, ...)
-{
- if (!_enabled)
- return 0;
-
-#ifdef RAUL_LOG_DEBUG
- info << "[OSCSender] " << path << " (" << types << ")" << endl;
-#endif
-
- va_list args;
- va_start(args, types);
-
- lo_message msg = lo_message_new();
- int ret = lo_message_add_varargs(msg, types, args);
-
- if (!ret)
- send_message(path, msg);
- else
- lo_message_free(msg);
-
- va_end(args);
-
- return ret;
-}
-
-void
-OSCSender::send_message(const char* path, lo_message msg)
-{
- if (!_enabled) {
- lo_message_free(msg);
- return;
- }
-
- if (_bundle) {
- if (lo_bundle_length(_bundle) + lo_message_length(msg, path) > _max_packet_size) {
- warn << "Maximum bundle size reached, bundle split" << endl;
- lo_send_bundle(_address, _bundle);
- lo_bundle_free_messages(_bundle);
- lo_timetag t;
- lo_timetag_now(&t);
- _bundle = lo_bundle_new(t);
- }
- lo_bundle_add_message(_bundle, path, msg);
-
- } else {
- lo_send_message(_address, path, msg);
- lo_message_free(msg);
- }
-}
-
-} // namespace Shared
-} // namespace Ingen
diff --git a/src/osc/OSCSender.hpp b/src/osc/OSCSender.hpp
deleted file mode 100644
index 22a720c2..00000000
--- a/src/osc/OSCSender.hpp
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- This file is part of Ingen.
- Copyright 2007-2012 David Robillard <http://drobilla.net/>
-
- Ingen is free software: you can redistribute it and/or modify it under the
- terms of the GNU Affero General Public License as published by the Free
- Software Foundation, either version 3 of the License, or 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 Affero General Public License for details.
-
- You should have received a copy of the GNU Affero General Public License
- along with Ingen. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef INGEN_SHARED_OSCSENDER_HPP
-#define INGEN_SHARED_OSCSENDER_HPP
-
-#include <stddef.h>
-
-#include <lo/lo.h>
-
-namespace Ingen {
-namespace Shared {
-
-class OSCSender {
-public:
- explicit OSCSender(size_t max_packet_size);
- virtual ~OSCSender() {}
-
- lo_address address() const { return _address; }
-
- void bundle_begin();
- void bundle_end();
-
-protected:
- int send(const char *path, const char *types, ...);
- void send_message(const char* path, lo_message m);
-
- lo_bundle _bundle;
- lo_address _address;
- size_t _max_packet_size;
- bool _enabled;
-};
-
-} // namespace Shared
-} // namespace Ingen
-
-#endif // INGEN_SHARED_OSCSENDER_HPP
-
diff --git a/src/osc/ingen_osc_client.cpp b/src/osc/ingen_osc_client.cpp
deleted file mode 100644
index 102e9be0..00000000
--- a/src/osc/ingen_osc_client.cpp
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- This file is part of Ingen.
- Copyright 2007-2012 David Robillard <http://drobilla.net/>
-
- Ingen is free software: you can redistribute it and/or modify it under the
- terms of the GNU Affero General Public License as published by the Free
- Software Foundation, either version 3 of the License, or 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 Affero General Public License for details.
-
- You should have received a copy of the GNU Affero General Public License
- along with Ingen. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include "ingen/shared/Module.hpp"
-#include "ingen/shared/World.hpp"
-
-#include "OSCClientReceiver.hpp"
-#include "OSCEngineSender.hpp"
-
-using namespace std;
-using namespace Ingen;
-
-SharedPtr<Ingen::ServerInterface>
-new_osc_interface(Ingen::Shared::World* world,
- const std::string& url,
- SharedPtr<ClientInterface> respond_to)
-{
- SharedPtr<Client::OSCClientReceiver> receiver(
- new Client::OSCClientReceiver(16181, respond_to));
- Client::OSCEngineSender* oes = new Client::OSCEngineSender(
- url, world->conf()->option("packet-size").get_int32(), receiver);
- oes->attach(rand(), true);
- return SharedPtr<ServerInterface>(oes);
-}
-
-struct IngenOSCClientModule : public Ingen::Shared::Module {
- void load(Ingen::Shared::World* world) {
- world->add_interface_factory("osc.udp", &new_osc_interface);
- world->add_interface_factory("osc.tcp", &new_osc_interface);
- }
-};
-
-extern "C" {
-
-Ingen::Shared::Module*
-ingen_module_load()
-{
- return new IngenOSCClientModule();
-}
-
-} // extern "C"
diff --git a/src/osc/ingen_osc_server.cpp b/src/osc/ingen_osc_server.cpp
deleted file mode 100644
index d4934efd..00000000
--- a/src/osc/ingen_osc_server.cpp
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- This file is part of Ingen.
- Copyright 2007-2012 David Robillard <http://drobilla.net/>
-
- Ingen is free software: you can redistribute it and/or modify it under the
- terms of the GNU Affero General Public License as published by the Free
- Software Foundation, either version 3 of the License, or 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 Affero General Public License for details.
-
- You should have received a copy of the GNU Affero General Public License
- along with Ingen. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include "ingen/shared/Module.hpp"
-#include "ingen/shared/World.hpp"
-
-#include "../server/Engine.hpp"
-#include "../server/ServerInterfaceImpl.hpp"
-
-#include "OSCEngineReceiver.hpp"
-
-using namespace std;
-using namespace Ingen;
-
-struct IngenOSCServerModule : public Ingen::Shared::Module {
- void load(Ingen::Shared::World* world) {
- Server::Engine* engine = (Server::Engine*)world->local_engine().get();
- SharedPtr<Server::ServerInterfaceImpl> interface(
- new Server::ServerInterfaceImpl(*engine));
- receiver = SharedPtr<Server::OSCEngineReceiver>(
- new Server::OSCEngineReceiver(
- *engine,
- interface,
- world->conf()->option("engine-port").get_int32()));
- engine->add_event_source(interface);
- }
-
- SharedPtr<Server::OSCEngineReceiver> receiver;
-};
-
-extern "C" {
-
-Ingen::Shared::Module*
-ingen_module_load()
-{
- return new IngenOSCServerModule();
-}
-
-} // extern "C"
diff --git a/src/osc/macros.h b/src/osc/macros.h
deleted file mode 100644
index c4c74995..00000000
--- a/src/osc/macros.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- This file is part of Ingen.
- Copyright 2007-2012 David Robillard <http://drobilla.net/>
-
- Ingen is free software: you can redistribute it and/or modify it under the
- terms of the GNU Affero General Public License as published by the Free
- Software Foundation, either version 3 of the License, or 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 Affero General Public License for details.
-
- You should have received a copy of the GNU Affero General Public License
- along with Ingen. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef INGEN_OSC_MACROS_H
-#define INGEN_OSC_MACROS_H
-
-/* Some boilerplate killing macros... */
-#define LO_HANDLER_ARGS const char* path, const char* types, lo_arg** argv, int argc, lo_message msg
-
-/* Defines a static handler to be passed to lo_add_method, which is a trivial
- * wrapper around a non-static method that does the real work. Makes a whoole
- * lot of ugly boiler plate go away */
-#define LO_HANDLER(ObjType, name) \
-int _##name##_cb (LO_HANDLER_ARGS);\
-inline static int name##_cb(LO_HANDLER_ARGS, void* myself)\
-{ return ((ObjType*)myself)->_##name##_cb(path, types, argv, argc, msg); }
-
-#endif // INGEN_OSC_MACROS_H
diff --git a/src/osc/wscript b/src/osc/wscript
deleted file mode 100644
index ae0d6245..00000000
--- a/src/osc/wscript
+++ /dev/null
@@ -1,28 +0,0 @@
-#!/usr/bin/env python
-from waflib.extras import autowaf as autowaf
-
-def build(bld):
- if bld.is_defined('HAVE_LIBLO'):
- obj = bld(features = 'cxx cxxshlib',
- source = '''OSCClientSender.cpp
- OSCEngineReceiver.cpp
- OSCSender.cpp
- ingen_osc_server.cpp''',
- includes = ['.', '../..'],
- name = 'libingen_osc_server',
- target = 'ingen_osc_server',
- install_path = '${LIBDIR}',
- use = 'libingen_server')
- autowaf.use_lib(bld, obj, 'RAUL LIBLO')
-
- obj = bld(features = 'cxx cxxshlib',
- source = '''OSCClientReceiver.cpp
- OSCEngineSender.cpp
- OSCSender.cpp
- ingen_osc_client.cpp''',
- includes = ['.', '../..'],
- name = 'libingen_osc_client',
- target = 'ingen_osc_client',
- install_path = '${LIBDIR}',
- use = 'libingen_client')
- autowaf.use_lib(bld, obj, 'RAUL LIBLO')