diff options
author | David Robillard <d@drobilla.net> | 2012-05-09 16:38:49 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2012-05-09 16:38:49 +0000 |
commit | ffdf4624323af943a2f3f7241fa87d97afc50460 (patch) | |
tree | e6faffb9d979cba055bde24d1957420abdea851a /src/osc | |
parent | 6932da9169a38a5a8eafc63357b9ede00cb46117 (diff) | |
download | ingen-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.cpp | 277 | ||||
-rw-r--r-- | src/osc/OSCClientReceiver.hpp | 87 | ||||
-rw-r--r-- | src/osc/OSCClientSender.cpp | 228 | ||||
-rw-r--r-- | src/osc/OSCClientSender.hpp | 105 | ||||
-rw-r--r-- | src/osc/OSCEngineReceiver.cpp | 587 | ||||
-rw-r--r-- | src/osc/OSCEngineReceiver.hpp | 119 | ||||
-rw-r--r-- | src/osc/OSCEngineSender.cpp | 240 | ||||
-rw-r--r-- | src/osc/OSCEngineSender.hpp | 115 | ||||
-rw-r--r-- | src/osc/OSCSender.cpp | 110 | ||||
-rw-r--r-- | src/osc/OSCSender.hpp | 51 | ||||
-rw-r--r-- | src/osc/ingen_osc_client.cpp | 54 | ||||
-rw-r--r-- | src/osc/ingen_osc_server.cpp | 52 | ||||
-rw-r--r-- | src/osc/macros.h | 31 | ||||
-rw-r--r-- | src/osc/wscript | 28 |
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') |