diff options
Diffstat (limited to 'src/libs')
-rw-r--r-- | src/libs/client/DirectSigClientInterface.h | 38 | ||||
-rw-r--r-- | src/libs/client/Makefile.am | 2 | ||||
-rw-r--r-- | src/libs/client/ModelEngineInterface.h | 13 | ||||
-rw-r--r-- | src/libs/client/OSCClientReceiver.cpp | 11 | ||||
-rw-r--r-- | src/libs/client/OSCClientReceiver.h | 1 | ||||
-rw-r--r-- | src/libs/client/OSCEngineSender.cpp | 114 | ||||
-rw-r--r-- | src/libs/client/OSCEngineSender.h | 10 | ||||
-rw-r--r-- | src/libs/client/OSCModelEngineInterface.cpp | 366 | ||||
-rw-r--r-- | src/libs/client/OSCModelEngineInterface.h | 85 | ||||
-rw-r--r-- | src/libs/client/SigClientInterface.h | 59 | ||||
-rw-r--r-- | src/libs/client/Store.cpp | 27 | ||||
-rw-r--r-- | src/libs/client/Store.h | 12 | ||||
-rw-r--r-- | src/libs/client/ThreadedSigClientInterface.h | 100 | ||||
-rw-r--r-- | src/libs/engine/OSCClientSender.cpp | 9 | ||||
-rw-r--r-- | src/libs/engine/OSCClientSender.h | 2 | ||||
-rw-r--r-- | src/libs/engine/OSCResponder.cpp | 4 |
16 files changed, 221 insertions, 632 deletions
diff --git a/src/libs/client/DirectSigClientInterface.h b/src/libs/client/DirectSigClientInterface.h index d57771cd..fe131188 100644 --- a/src/libs/client/DirectSigClientInterface.h +++ b/src/libs/client/DirectSigClientInterface.h @@ -50,61 +50,61 @@ private: // ClientInterface function implementations to drive SigClientInterface signals virtual void bundle_begin() - { emit_bundle_begin(); } + { bundle_begin_sig.emit(); } virtual void bundle_end() - { emit_bundle_end(); } + { bundle_end_sig.emit(); } virtual void error(const string& msg) - { emit_error(msg); } + { error_sig.emit(msg); } virtual void num_plugins(uint32_t num) - { emit_num_plugins(num); } + { num_plugins_sig.emit(num); } virtual void new_plugin(const string& type, const string& uri, const string& name) - { emit_new_plugin(type, uri, name); } + { new_plugin_sig.emit(type, uri, name); } virtual void new_patch(const string& path, uint32_t poly) - { emit_new_patch(path, poly); } + { new_patch_sig.emit(path, poly); } virtual void new_node(const string& plugin_type, const string& plugin_uri, const string& node_path, bool is_polyphonic, uint32_t num_ports) - { emit_new_node(plugin_type, plugin_uri, node_path, is_polyphonic, num_ports); } + { new_node_sig.emit(plugin_type, plugin_uri, node_path, is_polyphonic, num_ports); } virtual void new_port(const string& path, const string& data_type, bool is_output) - { emit_new_port(path, data_type, is_output); } + { new_port_sig.emit(path, data_type, is_output); } virtual void patch_enabled(const string& path) - { emit_patch_enabled(path); } + { patch_enabled_sig.emit(path); } virtual void patch_disabled(const string& path) - { emit_patch_disabled(path); } + { patch_disabled_sig.emit(path); } virtual void patch_cleared(const string& path) - { emit_patch_cleared(path); } + { patch_cleared_sig.emit(path); } virtual void object_renamed(const string& old_path, const string& new_path) - { emit_object_renamed(old_path, new_path); } + { object_renamed_sig.emit(old_path, new_path); } virtual void object_destroyed(const string& path) - { emit_object_destroyed(path); } + { object_destroyed_sig.emit(path); } virtual void connection(const string& src_port_path, const string& dst_port_path) - { emit_connection(src_port_path, dst_port_path); } + { connection_sig.emit(src_port_path, dst_port_path); } virtual void disconnection(const string& src_port_path, const string& dst_port_path) - { emit_disconnection(src_port_path, dst_port_path); } + { disconnection_sig.emit(src_port_path, dst_port_path); } virtual void metadata_update(const string& subject_path, const string& predicate, const string& value) - { emit_metadata_update(subject_path, predicate, value); } + { metadata_update_sig.emit(subject_path, predicate, value); } virtual void control_change(const string& port_path, float value) - { emit_control_change(port_path, value); } + { control_change_sig.emit(port_path, value); } virtual void program_add(const string& node_path, uint32_t bank, uint32_t program, const string& program_name) - { emit_program_add(node_path, bank, program, program_name); } + { program_add_sig.emit(node_path, bank, program, program_name); } virtual void program_remove(const string& node_path, uint32_t bank, uint32_t program) - { emit_program_remove(node_path, bank, program); } + { program_remove_sig.emit(node_path, bank, program); } }; diff --git a/src/libs/client/Makefile.am b/src/libs/client/Makefile.am index f8a9a1cf..effa2759 100644 --- a/src/libs/client/Makefile.am +++ b/src/libs/client/Makefile.am @@ -10,7 +10,6 @@ libomclient_la_SOURCES = \ OSCEngineSender.h \ OSCEngineSender.cpp \ OSCModelEngineInterface.h \ - OSCModelEngineInterface.cpp \ OSCClientReceiver.h \ OSCClientReceiver.cpp \ SigClientInterface.h \ @@ -18,6 +17,7 @@ libomclient_la_SOURCES = \ ThreadedSigClientInterface.h \ ThreadedSigClientInterface.cpp \ ModelEngineInterface.h \ + ModelEngineInterface.cpp \ ModelClientInterface.h \ ModelClientInterface.cpp \ PresetModel.h \ diff --git a/src/libs/client/ModelEngineInterface.h b/src/libs/client/ModelEngineInterface.h index 42b95d00..29d82d8d 100644 --- a/src/libs/client/ModelEngineInterface.h +++ b/src/libs/client/ModelEngineInterface.h @@ -22,12 +22,13 @@ #include "interface/EngineInterface.h" using std::string; -/** \defgroup IngenClient Client Library - */ +class Path; +/** \defgroup IngenClient Client Library */ namespace Ingen { namespace Client { +class ObjectModel; class NodeModel; class PresetModel; class PatchModel; @@ -42,11 +43,11 @@ class ModelEngineInterface : public virtual Shared::EngineInterface public: virtual ~ModelEngineInterface() {} - virtual void create_patch_from_model(const PatchModel* pm) = 0; - virtual void create_node_from_model(const NodeModel* nm) = 0; + virtual void create_patch_from_model(const PatchModel* pm); + virtual void create_node_from_model(const NodeModel* nm); - virtual void set_all_metadata(const NodeModel* nm) = 0; - virtual void set_preset(const string& patch_path, const PresetModel* pm) = 0; + virtual void set_all_metadata(const ObjectModel* nm); + virtual void set_preset(const Path& patch_path, const PresetModel* pm); protected: ModelEngineInterface() {} diff --git a/src/libs/client/OSCClientReceiver.cpp b/src/libs/client/OSCClientReceiver.cpp index 56d8ea14..1d52caa3 100644 --- a/src/libs/client/OSCClientReceiver.cpp +++ b/src/libs/client/OSCClientReceiver.cpp @@ -141,6 +141,7 @@ OSCClientReceiver::unknown_cb(const char* path, const char* types, lo_arg** argv void OSCClientReceiver::setup_callbacks() { + lo_server_thread_add_method(_st, "/om/response", "iis", response_cb, this); lo_server_thread_add_method(_st, "/om/num_plugins", "i", num_plugins_cb, this); lo_server_thread_add_method(_st, "/om/plugin", "sss", plugin_cb, this); lo_server_thread_add_method(_st, "/om/new_patch", "si", new_patch_cb, this); @@ -358,6 +359,16 @@ OSCClientReceiver::m_control_change_cb(const char* path, const char* types, lo_a } +int +OSCClientReceiver::m_response_cb(const char* path, const char* types, lo_arg** argv, int argc, lo_message msg) +{ + assert(!strcmp(types, "iis")); + response(argv[0]->i, argv[1]->i, &argv[2]->s); + + return 0; +} + + /** Number of plugins in engine, should precede /om/plugin messages in response * to a /om/send_plugins */ diff --git a/src/libs/client/OSCClientReceiver.h b/src/libs/client/OSCClientReceiver.h index 60fa9495..2d957a6a 100644 --- a/src/libs/client/OSCClientReceiver.h +++ b/src/libs/client/OSCClientReceiver.h @@ -93,6 +93,7 @@ private: //int32_t _num_received_ports; LO_HANDLER(error); + LO_HANDLER(response); LO_HANDLER(num_plugins); LO_HANDLER(plugin); LO_HANDLER(plugin_list_end); diff --git a/src/libs/client/OSCEngineSender.cpp b/src/libs/client/OSCEngineSender.cpp index cc70dc8e..10d9ab2e 100644 --- a/src/libs/client/OSCEngineSender.cpp +++ b/src/libs/client/OSCEngineSender.cpp @@ -14,8 +14,10 @@ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ +#include <iostream> #include "OSCEngineSender.h" #include "interface/ClientKey.h" +using std::cout; using std::cerr; using std::endl; namespace Ingen { namespace Client { @@ -38,6 +40,62 @@ OSCEngineSender::~OSCEngineSender() } +/** 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) +{ + cerr << "FIXME: attach\n"; + //start_listen_thread(_client_port); + + /*if (engine_url == "") { + string local_url = m_osc_listener->listen_url().substr( + 0, m_osc_listener->listen_url().find_last_of(":")); + local_url.append(":16180"); + _engine_addr = lo_address_new_from_url(local_url.c_str()); + } else { + _engine_addr = lo_address_new_from_url(engine_url.c_str()); + } + */ + _engine_addr = lo_address_new_from_url(_engine_url.c_str()); + + if (_engine_addr == NULL) { + cerr << "Unable to connect, aborting." << endl; + exit(EXIT_FAILURE); + } + + cout << "[OSCEngineSender] Attempting to contact engine at " << _engine_url << " ..." << endl; + + _id = ping_id; + this->ping(); + + /*if (block) { + set_wait_response_id(request_id); + + while (1) { + if (m_response_semaphore.try_wait() != 0) { + cout << "."; + cout.flush(); + ping(request_id); + usleep(100000); + } else { + cout << " connected." << endl; + m_waiting_for_response = false; + break; + } + } + } + */ +} + /* *** EngineInterface implementation below here *** */ @@ -103,7 +161,7 @@ OSCEngineSender::quit() void OSCEngineSender::create_patch(const string& path, - uint32_t poly) + uint32_t poly) { assert(_engine_addr); lo_send(_engine_addr, "/om/synth/create_patch", "isi", @@ -115,8 +173,8 @@ OSCEngineSender::create_patch(const string& path, void OSCEngineSender::create_port(const string& path, - const string& data_type, - bool is_output) + const string& data_type, + bool is_output) { assert(_engine_addr); lo_send(_engine_addr, "/om/synth/create_port", "issi", @@ -129,9 +187,9 @@ OSCEngineSender::create_port(const string& path, void OSCEngineSender::create_node(const string& path, - const string& plugin_type, - const string& plugin_uri, - bool polyphonic) + const string& plugin_type, + const string& plugin_uri, + bool polyphonic) { assert(_engine_addr); lo_send(_engine_addr, "/om/synth/create_node", "isssi", @@ -143,9 +201,31 @@ OSCEngineSender::create_node(const string& path, } +/** Create a node using library name and plugin label (DEPRECATED). + * + * DO NOT USE THIS. + */ +void +OSCEngineSender::create_node(const string& path, + const string& plugin_type, + const string& library_name, + const string& plugin_label, + bool polyphonic) +{ + assert(_engine_addr); + lo_send(_engine_addr, "/om/synth/create_node", "issssi", + next_id(), + path.c_str(), + plugin_type.c_str(), + library_name.c_str(), + plugin_label.c_str(), + (polyphonic ? 1 : 0)); +} + + void OSCEngineSender::rename(const string& old_path, - const string& new_name) + const string& new_name) { assert(_engine_addr); lo_send(_engine_addr, "/om/synth/rename", "iss", @@ -197,7 +277,7 @@ OSCEngineSender::disable_patch(const string& patch_path) void OSCEngineSender::connect(const string& src_port_path, - const string& dst_port_path) + const string& dst_port_path) { assert(_engine_addr); lo_send(_engine_addr, "/om/synth/connect", "iss", @@ -209,7 +289,7 @@ OSCEngineSender::connect(const string& src_port_path, void OSCEngineSender::disconnect(const string& src_port_path, - const string& dst_port_path) + const string& dst_port_path) { assert(_engine_addr); lo_send(_engine_addr, "/om/synth/disconnect", "iss", @@ -231,7 +311,7 @@ OSCEngineSender::disconnect_all(const string& node_path) void OSCEngineSender::set_port_value(const string& port_path, - float val) + float val) { assert(_engine_addr); lo_send(_engine_addr, "/om/synth/set_port_value", "isf", @@ -243,8 +323,8 @@ OSCEngineSender::set_port_value(const string& port_path, void OSCEngineSender::set_port_value(const string& port_path, - uint32_t voice, - float val) + uint32_t voice, + float val) { assert(_engine_addr); lo_send(_engine_addr, "/om/synth/set_port_value", "isif", @@ -257,7 +337,7 @@ OSCEngineSender::set_port_value(const string& port_path, void OSCEngineSender::set_port_value_queued(const string& port_path, - float val) + float val) { assert(_engine_addr); lo_send(_engine_addr, "/om/synth/set_port_value_queued", "isf", @@ -269,8 +349,8 @@ OSCEngineSender::set_port_value_queued(const string& port_path, void OSCEngineSender::set_program(const string& node_path, - uint32_t bank, - uint32_t program) + uint32_t bank, + uint32_t program) { assert(_engine_addr); lo_send(_engine_addr, @@ -293,8 +373,8 @@ OSCEngineSender::midi_learn(const string& node_path) void OSCEngineSender::set_metadata(const string& obj_path, - const string& predicate, - const string& value) + const string& predicate, + const string& value) { assert(_engine_addr); lo_send(_engine_addr, "/om/metadata/set", "isss", diff --git a/src/libs/client/OSCEngineSender.h b/src/libs/client/OSCEngineSender.h index 91e2d559..3335a91f 100644 --- a/src/libs/client/OSCEngineSender.h +++ b/src/libs/client/OSCEngineSender.h @@ -47,11 +47,13 @@ public: string engine_url() { return _engine_url; } inline size_t next_id() - { if (_id != -1) { _id = (_id == -2) ? 0 : _id+1; } return _id; } + { int32_t ret = (_id == -1) ? -1 : _id++; return ret; } void enable_responses() { _id = 0; } void disable_responses() { _id = -1; } + void attach(int32_t ping_id, bool block); + /* *** EngineInterface implementation below here *** */ @@ -80,6 +82,12 @@ public: const string& plugin_type, const string& plugin_uri, bool polyphonic); + + void create_node(const string& path, + const string& plugin_type, + const string& library_name, + const string& plugin_label, + bool polyphonic); void rename(const string& old_path, const string& new_name); diff --git a/src/libs/client/OSCModelEngineInterface.cpp b/src/libs/client/OSCModelEngineInterface.cpp deleted file mode 100644 index 14f2fe3a..00000000 --- a/src/libs/client/OSCModelEngineInterface.cpp +++ /dev/null @@ -1,366 +0,0 @@ -/* This file is part of Ingen. Copyright (C) 2006 Dave Robillard. - * - * Ingen is free software; you can redistribute it and/or modify it under the - * terms of the GNU General Public License as published by the Free Software - * Foundation; either version 2 of the License, or (at your option) any later - * version. - * - * Ingen is distributed in the hope that it will be useful, but WITHOUT ANY - * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include "OSCModelEngineInterface.h" -#include <list> -#include <cassert> -#include <cstdlib> -#include <cstring> -#include <iostream> -#include <unistd.h> -#include "OSCClientReceiver.h" -#include "PatchModel.h" -#include "ConnectionModel.h" -#include "PresetModel.h" -#include "ControlModel.h" -#include "NodeModel.h" -#include "PluginModel.h" - -using std::cerr; using std::cout; using std::endl; - -namespace Ingen { -namespace Client { - - -/** Construct a OSCModelEngineInterface with a user-provided ModelClientInterface object for notification - * of engine events. - */ -OSCModelEngineInterface::OSCModelEngineInterface(const string& engine_url) -: OSCEngineSender(engine_url), - m_request_id(0), - m_is_attached(false), - m_is_registered(false) - /*m_blocking(false), - m_waiting_for_response(false), - m_wait_response_id(0), - m_response_received(false), - m_wait_response_was_affirmative(false), - m_response_semaphore(0)*/ -{ -} - - -OSCModelEngineInterface::~OSCModelEngineInterface() -{ - detach(); -} - - -/** Attempt to connect to the engine and notify it of our existance. - * - * 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 -OSCModelEngineInterface::attach(bool block) -{ - cerr << "FIXME: listen thread\n"; - //start_listen_thread(_client_port); - - /*if (engine_url == "") { - string local_url = m_osc_listener->listen_url().substr( - 0, m_osc_listener->listen_url().find_last_of(":")); - local_url.append(":16180"); - _engine_addr = lo_address_new_from_url(local_url.c_str()); - } else { - _engine_addr = lo_address_new_from_url(engine_url.c_str()); - } - */ - _engine_addr = lo_address_new_from_url(_engine_url.c_str()); - - if (_engine_addr == NULL) { - cerr << "Unable to connect, aborting." << endl; - exit(EXIT_FAILURE); - } - - char* lo_url = lo_address_get_url(_engine_addr); - cout << "[OSCModelEngineInterface] Attempting to contact engine at " << lo_url << " ..." << endl; - - this->ping(); - - m_is_attached = true; // FIXME - - /*if (block) { - set_wait_response_id(request_id); - - while (1) { - if (m_response_semaphore.try_wait() != 0) { - cout << "."; - cout.flush(); - ping(request_id); - usleep(100000); - } else { - cout << " connected." << endl; - m_waiting_for_response = false; - break; - } - } - } - */ - - free(lo_url); -} - -void -OSCModelEngineInterface::detach() -{ - m_is_attached = false; -} - -#if 0 -void -OSCModelEngineInterface::start_listen_thread(int client_port) -{ - if (m_st != NULL) - return; - - if (client_port == 0) { - m_st = lo_server_thread_new(NULL, error_cb); - } else { - char port_str[8]; - snprintf(port_str, 8, "%d", client_port); - m_st = lo_server_thread_new(port_str, error_cb); - } - - if (m_st == NULL) { - cerr << "[OSCModelEngineInterface] Could not start OSC listener. Aborting." << endl; - exit(EXIT_FAILURE); - } else { - cout << "[OSCModelEngineInterface] Started OSC listener on port " << lo_server_thread_get_port(m_st) << endl; - } - - lo_server_thread_add_method(m_st, NULL, NULL, generic_cb, NULL); - - lo_server_thread_add_method(m_st, "/om/response/ok", "i", om_response_ok_cb, this); - lo_server_thread_add_method(m_st, "/om/response/error", "is", om_response_error_cb, this); - - - m_osc_listener = new OSCListener(m_st, m_client_hooks); - m_osc_listener->setup_callbacks(); - - // Display any uncaught messages to the console - lo_server_thread_add_method(m_st, NULL, NULL, unknown_cb, NULL); - - lo_server_thread_start(m_st); -} -#endif - -///// OSC Commands ///// - - - -/** Load a node. - */ -void -OSCModelEngineInterface::create_node_from_model(const NodeModel* nm) -{ - assert(_engine_addr); - - // Load by URI - if (nm->plugin()->uri().length() > 0) { - lo_send(_engine_addr, "/om/synth/create_node", "isssi", next_id(), - nm->path().c_str(), - nm->plugin()->type_string(), - nm->plugin()->uri().c_str(), - (nm->polyphonic() ? 1 : 0)); - // Load by libname, label - } else { - //assert(nm->plugin()->lib_name().length() > 0); - assert(nm->plugin()->plug_label().length() > 0); - lo_send(_engine_addr, "/om/synth/create_node", "issssi", next_id(), - nm->path().c_str(), - nm->plugin()->type_string(), - nm->plugin()->lib_name().c_str(), - nm->plugin()->plug_label().c_str(), - (nm->polyphonic() ? 1 : 0)); - } -} - - -/** Create a patch. - */ -void -OSCModelEngineInterface::create_patch_from_model(const PatchModel* pm) -{ - assert(_engine_addr); - lo_send(_engine_addr, "/om/synth/create_patch", "isi", next_id(), pm->path().c_str(), pm->poly()); -} - - -/** Notify LASH restoring is finished */ -/* -void -OSCModelEngineInterface::lash_restore_finished() -{ - assert(_engine_addr != NULL); - int id = m_request_id++; - lo_send(_engine_addr, "/om/lash/restore_finished", "i", id); -} -*/ -#if 0 -/** Set/add a piece of metadata. - */ -void -OSCModelEngineInterface::set_metadata(const string& obj_path, - const string& key, const string& value) -{ - assert(_engine_addr != NULL); - int id = m_request_id++; - - // Deal with the "special" DSSI metadata strings - if (key.substr(0, 16) == "dssi-configure--") { - string path = "/dssi" + obj_path + "/configure"; - string dssi_key = key.substr(16); - lo_send(_engine_addr, path.c_str(), "ss", dssi_key.c_str(), value.c_str()); - } else if (key == "dssi-program") { - string path = "/dssi" + obj_path + "/program"; - string dssi_bank_str = value.substr(0, value.find("/")); - int dssi_bank = atoi(dssi_bank_str.c_str()); - string dssi_program_str = value.substr(value.find("/")+1); - int dssi_program = atoi(dssi_program_str.c_str()); - lo_send(_engine_addr, path.c_str(), "ii", dssi_bank, dssi_program); - } - - // Normal metadata - lo_send(_engine_addr, "/om/metadata/set", "isss", id, - obj_path.c_str(), key.c_str(), value.c_str()); -} -#endif - -/** Set all pieces of metadata in a NodeModel. - */ -void -OSCModelEngineInterface::set_all_metadata(const NodeModel* nm) -{ - assert(_engine_addr != NULL); - - for (map<string, string>::const_iterator i = nm->metadata().begin(); i != nm->metadata().end(); ++i) - set_metadata(nm->path(), (*i).first, (*i).second.c_str()); -} - - -/** Set a preset by setting all relevant controls for a patch. - */ -void -OSCModelEngineInterface::set_preset(const string& patch_path, const PresetModel* const pm) -{ - assert(patch_path.find("//") == string::npos); - for (list<ControlModel>::const_iterator i = pm->controls().begin(); i != pm->controls().end(); ++i) { - set_port_value_queued((*i).port_path(), (*i).value()); - usleep(1000); - } -} - - -///// Requests ///// - - -#if 0 -/** Sets the response ID to be waited for on the next call to wait_for_response() - */ - -void -OSCModelEngineInterface::set_wait_response_id(int id) -{ - assert(!m_waiting_for_response); - m_wait_response_id = id; - m_response_received = false; - m_waiting_for_response = true; -} - - -/** Waits for the response set by set_wait_response() from the server. - * - * Returns whether or not the response was positive (ie a success message) - * or negative (ie an error) - */ -bool -OSCModelEngineInterface::wait_for_response() -{ - cerr << "[OSCModelEngineInterface] Waiting for response " << m_wait_response_id << ": "; - bool ret = true; - - assert(m_waiting_for_response); - assert(!m_response_received); - - while (!m_response_received) - m_response_semaphore.wait(); - - cerr << " received." << endl; - - m_waiting_for_response = false; - ret = m_wait_response_was_affirmative; - - return ret; -} -#endif - -///// Static OSC callbacks ////// - - -//// End static callbacks, member callbacks below //// - -/* -int -OSCModelEngineInterface::m_om_response_ok_cb(const char* path, const char* types, lo_arg** argv, int argc, void* data) -{ - assert(argc == 1 && !strcmp(types, "i")); - - // FIXME - if (!m_is_attached) - m_is_attached = true; - - if (m_waiting_for_response) { - const int request_id = argv[0]->i; - - if (request_id == m_wait_response_id) { - m_response_received = true; - m_wait_response_was_affirmative = true; - m_response_semaphore.post(); - } - } - - return 0; -} - - -int -OSCModelEngineInterface::m_om_response_error_cb(const char* path, const char* types, lo_arg** argv, int argc, void* data) -{ - assert(argc == 2 && !strcmp(types, "is")); - - const int request_id = argv[0]->i; - const char* msg = &argv[1]->s; - - if (m_waiting_for_response) { - if (request_id == m_wait_response_id) { - m_response_received = true; - m_wait_response_was_affirmative = false; - m_response_semaphore.post(); - } - } - - cerr << "ERROR: " << msg << endl; - //if (m_client_hooks != NULL) - // m_client_hooks->error(msg); - - return 0; -} -*/ - -} // namespace Client -} // namespace Ingen diff --git a/src/libs/client/OSCModelEngineInterface.h b/src/libs/client/OSCModelEngineInterface.h index f600fb8f..1ca263fa 100644 --- a/src/libs/client/OSCModelEngineInterface.h +++ b/src/libs/client/OSCModelEngineInterface.h @@ -14,99 +14,28 @@ * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef OSCCONTROLLER_H -#define OSCCONTROLLER_H +#ifndef OSCMODELENGINEINTERFACE_H +#define OSCMODELENGINEINTERFACE_H #include <string> -#include <lo/lo.h> -#include "util/Semaphore.h" -#include "interface/EngineInterface.h" #include "OSCEngineSender.h" #include "ModelEngineInterface.h" -using std::string; -/** \defgroup IngenClient Client Library - */ +using std::string; +/** \defgroup IngenClient Client Library */ namespace Ingen { namespace Client { -class NodeModel; -class PresetModel; -class PatchModel; -class ModelClientInterface; - -/** Old model-based OSC engine command interface. - * - * This is an old class from before when the well-defined interfaces between - * engine and client were defined. I've wrapped it around OSCEngineSender - * so all the common functions are implemented there, and implemented the - * remaining functions using those, for compatibility. Hopefully something - * better gets figured out and this can go away completely, but for now this - * gets the existing clients working through EngineInterface in the easiest - * way possible. This class needs to die. - * - * \ingroup IngenClient - */ class OSCModelEngineInterface : public OSCEngineSender, public ModelEngineInterface { public: - //OSCModelEngineInterface(ModelClientInterface* const client_hooks, const string& engine_url); - OSCModelEngineInterface(const string& engine_url); - ~OSCModelEngineInterface(); - - void attach(bool block = true); - void detach(); - - bool is_attached() { return m_is_attached; } - - // FIXME: reimplement - void set_wait_response_id(int32_t id) {} - bool wait_for_response() { return false; } - int get_next_request_id() { return m_request_id++; } - - /* *** Model alternatives to EngineInterface functions below *** */ - - void create_patch_from_model(const PatchModel* pm); - void create_node_from_model(const NodeModel* nm); - - void set_all_metadata(const NodeModel* nm); - void set_preset(const string& patch_path, const PresetModel* const pm); - -protected: - void start_listen_thread(); - - int m_request_id; - - bool m_is_attached; - bool m_is_registered; - /* - bool m_blocking; - bool m_waiting_for_response; - int m_wait_response_id; - bool m_response_received; - bool m_wait_response_was_affirmative; - - Semaphore m_response_semaphore; - */ -private: - // Prevent copies - OSCModelEngineInterface(const OSCModelEngineInterface& copy); - OSCModelEngineInterface& operator=(const OSCModelEngineInterface& copy); + OSCModelEngineInterface(const string& engine_url) : OSCEngineSender(engine_url) {} }; -/* -inline int -OSCModelEngineInterface::om_response_ok_cb(const char* path, const char* types, lo_arg** argv, int argc, void* data, void* comm) { - return ((OSCModelEngineInterface*)comm)->m_om_response_ok_cb(path, types, argv, argc, data); -} -inline int -OSCModelEngineInterface::om_response_error_cb(const char* path, const char* types, lo_arg** argv, int argc, void* data, void* comm) { - return ((OSCModelEngineInterface*)comm)->m_om_response_error_cb(path, types, argv, argc, data); -} -*/ + } // namespace Client } // namespace Ingen -#endif // OSCCONTROLLER_H +#endif // OSCMODELENGINEINTERFACE_H diff --git a/src/libs/client/SigClientInterface.h b/src/libs/client/SigClientInterface.h index 6e14de8c..de76f9c1 100644 --- a/src/libs/client/SigClientInterface.h +++ b/src/libs/client/SigClientInterface.h @@ -39,6 +39,7 @@ public: // See the corresponding emitting functions below for parameter meanings + sigc::signal<void, int32_t,bool,const string&> response_sig; sigc::signal<void> bundle_begin_sig; sigc::signal<void> bundle_end_sig; sigc::signal<void, const string&> error_sig; @@ -59,64 +60,6 @@ public: sigc::signal<void, const string&, uint32_t, uint32_t, const string&> program_add_sig; sigc::signal<void, const string&, uint32_t, uint32_t> program_remove_sig; - - inline void emit_bundle_begin() - { bundle_begin_sig.emit(); } - - inline void emit_bundle_end() - { bundle_end_sig.emit(); } - - inline void emit_error(const string& msg) - { error_sig.emit(msg); } - - inline void emit_num_plugins(uint32_t num) - { num_plugins_sig.emit(num); } - - inline void emit_new_plugin(const string& type, const string& uri, const string& name) - { new_plugin_sig.emit(type, uri, name); } - - inline void emit_new_patch(const string& path, uint32_t poly) - { new_patch_sig.emit(path, poly); } - - inline void emit_new_node(const string& plugin_type, const string& plugin_uri, const string& node_path, bool is_polyphonic, uint32_t num_ports) - { new_node_sig.emit(plugin_type, plugin_uri, node_path, is_polyphonic, num_ports); } - - inline void emit_new_port(const string& path, const string& data_type, bool is_output) - { new_port_sig.emit(path, data_type, is_output); } - - inline void emit_patch_enabled(const string& path) - { patch_enabled_sig.emit(path); } - - inline void emit_patch_disabled(const string& path) - { patch_disabled_sig.emit(path); } - - inline void emit_patch_cleared(const string& path) - { patch_cleared_sig.emit(path); } - - inline void emit_object_renamed(const string& old_path, const string& new_path) - { object_renamed_sig.emit(old_path, new_path); } - - inline void emit_object_destroyed(const string& path) - { object_destroyed_sig.emit(path); } - - inline void emit_connection(const string& src_port_path, const string& dst_port_path) - { connection_sig.emit(src_port_path, dst_port_path); } - - inline void emit_disconnection(const string& src_port_path, const string& dst_port_path) - { disconnection_sig.emit(src_port_path, dst_port_path); } - - inline void emit_metadata_update(const string& subject_path, const string& predicate, const string& value) - { metadata_update_sig.emit(subject_path, predicate, value); } - - inline void emit_control_change(const string& port_path, float value) - { control_change_sig.emit(port_path, value); } - - inline void emit_program_add(const string& node_path, uint32_t bank, uint32_t program, const string& program_name) - { program_add_sig.emit(node_path, bank, program, program_name); } - - inline void emit_program_remove(const string& node_path, uint32_t bank, uint32_t program) - { program_remove_sig.emit(node_path, bank, program); } - protected: SigClientInterface() {} }; diff --git a/src/libs/client/Store.cpp b/src/libs/client/Store.cpp index 219ea13f..7fd011b7 100644 --- a/src/libs/client/Store.cpp +++ b/src/libs/client/Store.cpp @@ -27,24 +27,21 @@ namespace Ingen { namespace Client { -/// Singleton instance -Store* Store::_instance = 0; - -Store::Store(SigClientInterface& emitter) +Store::Store(CountedPtr<SigClientInterface> emitter) { //emitter.new_plugin_sig.connect(sigc::mem_fun(this, &Store::add_plugin)); - emitter.object_destroyed_sig.connect(sigc::mem_fun(this, &Store::destruction_event)); - emitter.new_plugin_sig.connect(sigc::mem_fun(this, &Store::new_plugin_event)); - emitter.new_patch_sig.connect(sigc::mem_fun(this, &Store::new_patch_event)); - emitter.new_node_sig.connect(sigc::mem_fun(this, &Store::new_node_event)); - emitter.new_port_sig.connect(sigc::mem_fun(this, &Store::new_port_event)); - emitter.patch_enabled_sig.connect(sigc::mem_fun(this, &Store::patch_enabled_event)); - emitter.patch_disabled_sig.connect(sigc::mem_fun(this, &Store::patch_disabled_event)); - emitter.connection_sig.connect(sigc::mem_fun(this, &Store::connection_event)); - emitter.disconnection_sig.connect(sigc::mem_fun(this, &Store::disconnection_event)); - emitter.metadata_update_sig.connect(sigc::mem_fun(this, &Store::metadata_update_event)); - emitter.control_change_sig.connect(sigc::mem_fun(this, &Store::control_change_event)); + emitter->object_destroyed_sig.connect(sigc::mem_fun(this, &Store::destruction_event)); + emitter->new_plugin_sig.connect(sigc::mem_fun(this, &Store::new_plugin_event)); + emitter->new_patch_sig.connect(sigc::mem_fun(this, &Store::new_patch_event)); + emitter->new_node_sig.connect(sigc::mem_fun(this, &Store::new_node_event)); + emitter->new_port_sig.connect(sigc::mem_fun(this, &Store::new_port_event)); + emitter->patch_enabled_sig.connect(sigc::mem_fun(this, &Store::patch_enabled_event)); + emitter->patch_disabled_sig.connect(sigc::mem_fun(this, &Store::patch_disabled_event)); + emitter->connection_sig.connect(sigc::mem_fun(this, &Store::connection_event)); + emitter->disconnection_sig.connect(sigc::mem_fun(this, &Store::disconnection_event)); + emitter->metadata_update_sig.connect(sigc::mem_fun(this, &Store::metadata_update_event)); + emitter->control_change_sig.connect(sigc::mem_fun(this, &Store::control_change_event)); } diff --git a/src/libs/client/Store.h b/src/libs/client/Store.h index cb6c3206..8407c9fb 100644 --- a/src/libs/client/Store.h +++ b/src/libs/client/Store.h @@ -35,12 +35,14 @@ class PatchModel; class NodeModel; class PortModel; -/** Singeton which holds all "Ingen Objects" for easy/fast lookup +/** Automatically manages models of objects in the engine. * * \ingroup IngenClient */ class Store : public sigc::trackable { // FIXME: is trackable necessary? public: + Store(CountedPtr<SigClientInterface> emitter); + CountedPtr<PluginModel> plugin(const string& uri); CountedPtr<ObjectModel> object(const string& path); /*CountedPtr<PatchModel> patch(const string& path); @@ -53,15 +55,7 @@ public: const map<string, CountedPtr<PluginModel> >& plugins() const { return m_plugins; } - static void instantiate(SigClientInterface& emitter) - { if (!_instance) _instance = new Store(emitter); } - - inline static Store& instance() { assert(_instance); return *_instance; } - private: - Store(SigClientInterface& emitter); - - static Store* _instance; void add_object(CountedPtr<ObjectModel> object); CountedPtr<ObjectModel> remove_object(const string& path); diff --git a/src/libs/client/ThreadedSigClientInterface.h b/src/libs/client/ThreadedSigClientInterface.h index 985b1f26..afc756c4 100644 --- a/src/libs/client/ThreadedSigClientInterface.h +++ b/src/libs/client/ThreadedSigClientInterface.h @@ -44,27 +44,23 @@ class ThreadedSigClientInterface : virtual public SigClientInterface public: ThreadedSigClientInterface(uint32_t queue_size) : _sigs(queue_size) - , error_slot(sigc::mem_fun((SigClientInterface*)this, &SigClientInterface::emit_error)) - //, new_plugin_slot(sigc::mem_fun((SigClientInterface*)this, &SigClientInterface::emit_new_plugin_model)) - //, new_patch_slot(sigc::mem_fun((SigClientInterface*)this, &SigClientInterface::emit_new_patch_model)) - //, new_node_slot(sigc::mem_fun((SigClientInterface*)this, &SigClientInterface::emit_new_node_model)) - //, new_port_slot(sigc::mem_fun((SigClientInterface*)this, &SigClientInterface::emit_new_port_model)) - //, connection_slot(sigc::mem_fun((SigClientInterface*)this, &SigClientInterface::emit_connection_model)) - , new_plugin_slot(sigc::mem_fun((SigClientInterface*)this, &SigClientInterface::emit_new_plugin)) - , new_patch_slot(sigc::mem_fun((SigClientInterface*)this, &SigClientInterface::emit_new_patch)) - , new_node_slot(sigc::mem_fun((SigClientInterface*)this, &SigClientInterface::emit_new_node)) - , new_port_slot(sigc::mem_fun((SigClientInterface*)this, &SigClientInterface::emit_new_port)) - , connection_slot(sigc::mem_fun((SigClientInterface*)this, &SigClientInterface::emit_connection)) - , patch_enabled_slot(sigc::mem_fun((SigClientInterface*)this, &SigClientInterface::emit_patch_enabled)) - , patch_disabled_slot(sigc::mem_fun((SigClientInterface*)this, &SigClientInterface::emit_patch_disabled)) - , patch_cleared_slot(sigc::mem_fun((SigClientInterface*)this, &SigClientInterface::emit_patch_cleared)) - , object_destroyed_slot(sigc::mem_fun((SigClientInterface*)this, &SigClientInterface::emit_object_destroyed)) - , object_renamed_slot(sigc::mem_fun((SigClientInterface*)this, &SigClientInterface::emit_object_renamed)) - , disconnection_slot(sigc::mem_fun((SigClientInterface*)this, &SigClientInterface::emit_disconnection)) - , metadata_update_slot(sigc::mem_fun((SigClientInterface*)this, &SigClientInterface::emit_metadata_update)) - , control_change_slot(sigc::mem_fun((SigClientInterface*)this, &SigClientInterface::emit_control_change)) - , program_add_slot(sigc::mem_fun((SigClientInterface*)this, &SigClientInterface::emit_program_add)) - , program_remove_slot(sigc::mem_fun((SigClientInterface*)this, &SigClientInterface::emit_program_remove)) + , response_slot(response_sig.make_slot()) + , error_slot(error_sig.make_slot()) + , new_plugin_slot(new_plugin_sig.make_slot()) + , new_patch_slot(new_patch_sig.make_slot()) + , new_node_slot(new_node_sig.make_slot()) + , new_port_slot(new_port_sig.make_slot()) + , connection_slot(connection_sig.make_slot()) + , patch_enabled_slot(patch_enabled_sig.make_slot()) + , patch_disabled_slot(patch_disabled_sig.make_slot()) + , patch_cleared_slot(patch_cleared_sig.make_slot()) + , object_destroyed_slot(object_destroyed_sig.make_slot()) + , object_renamed_slot(object_renamed_sig.make_slot()) + , disconnection_slot(disconnection_sig.make_slot()) + , metadata_update_slot(metadata_update_sig.make_slot()) + , control_change_slot(control_change_sig.make_slot()) + , program_add_slot(program_add_sig.make_slot()) + , program_remove_slot(program_remove_sig.make_slot()) {} @@ -74,24 +70,12 @@ public: void num_plugins(uint32_t num) { _num_plugins = num; } + void response(int32_t id, bool success, const string& msg) + { push_sig(sigc::bind(response_slot, id, success, msg)); } + void error(const string& msg) { push_sig(sigc::bind(error_slot, msg)); } - /* - void new_plugin_model(PluginModel* const pm) - { push_sig(sigc::bind(new_plugin_slot, pm)); } - - void new_patch_model(PatchModel* const pm) - { push_sig(sigc::bind(new_patch_slot, pm)); } - - void new_node_model(NodeModel* const nm) - { assert(nm); push_sig(sigc::bind(new_node_slot, nm)); } - - void new_port_model(PortModel* const pm) - { push_sig(sigc::bind(new_port_slot, pm)); } - void connection_model(ConnectionModel* const cm) - { push_sig(sigc::bind(connection_slot, cm)); } - */ void new_plugin(const string& type, const string& uri, const string& name) { push_sig(sigc::bind(new_plugin_slot, type, uri, name)); } @@ -146,30 +130,26 @@ private: Queue<Closure> _sigs; uint32_t _num_plugins; - sigc::slot<void> bundle_begin_slot; - sigc::slot<void> bundle_end_slot; - sigc::slot<void, uint32_t> num_plugins_slot; - sigc::slot<void, string> error_slot; - /*sigc::slot<void, PluginModel*> new_plugin_slot; - sigc::slot<void, PatchModel*> new_patch_slot; - sigc::slot<void, NodeModel*> new_node_slot; - sigc::slot<void, PortModel*> new_port_slot; - sigc::slot<void, ConnectionModel*> connection_slot; */ - sigc::slot<void, string, string, string> new_plugin_slot; - sigc::slot<void, string, uint32_t> new_patch_slot; - sigc::slot<void, string, string, string, bool, int> new_node_slot; - sigc::slot<void, string, string, bool> new_port_slot; - sigc::slot<void, string, string> connection_slot; - sigc::slot<void, string> patch_enabled_slot; - sigc::slot<void, string> patch_disabled_slot; - sigc::slot<void, string> patch_cleared_slot; - sigc::slot<void, string> object_destroyed_slot; - sigc::slot<void, string, string> object_renamed_slot; - sigc::slot<void, string, string> disconnection_slot; - sigc::slot<void, string, string, string> metadata_update_slot; - sigc::slot<void, string, float> control_change_slot; - sigc::slot<void, string, uint32_t, uint32_t, const string&> program_add_slot; - sigc::slot<void, string, uint32_t, uint32_t> program_remove_slot; + sigc::slot<void> bundle_begin_slot; + sigc::slot<void> bundle_end_slot; + sigc::slot<void, uint32_t> num_plugins_slot; + sigc::slot<void, int32_t, bool, string> response_slot; + sigc::slot<void, string> error_slot; + sigc::slot<void, string, string, string> new_plugin_slot; + sigc::slot<void, string, uint32_t> new_patch_slot; + sigc::slot<void, string, string, string, bool, int> new_node_slot; + sigc::slot<void, string, string, bool> new_port_slot; + sigc::slot<void, string, string> connection_slot; + sigc::slot<void, string> patch_enabled_slot; + sigc::slot<void, string> patch_disabled_slot; + sigc::slot<void, string> patch_cleared_slot; + sigc::slot<void, string> object_destroyed_slot; + sigc::slot<void, string, string> object_renamed_slot; + sigc::slot<void, string, string> disconnection_slot; + sigc::slot<void, string, string, string> metadata_update_slot; + sigc::slot<void, string, float> control_change_slot; + sigc::slot<void, string, uint32_t, uint32_t, string> program_add_slot; + sigc::slot<void, string, uint32_t, uint32_t> program_remove_slot; }; diff --git a/src/libs/engine/OSCClientSender.cpp b/src/libs/engine/OSCClientSender.cpp index d6f56e74..65fb89fe 100644 --- a/src/libs/engine/OSCClientSender.cpp +++ b/src/libs/engine/OSCClientSender.cpp @@ -78,6 +78,15 @@ namespace Ingen { */ +void +OSCClientSender::response(int32_t id, bool success, const string& msg) +{ + if (lo_send(_address, "/om/response", "iis", id, success ? 1 : 0, msg.c_str()) < 0) { + cerr << "Unable to send response " << id << "! (" + << lo_address_errstr(_address) << ")" << endl; + } +} + /** \page client_osc_namespace * \n diff --git a/src/libs/engine/OSCClientSender.h b/src/libs/engine/OSCClientSender.h index 1826a36d..8427c51a 100644 --- a/src/libs/engine/OSCClientSender.h +++ b/src/libs/engine/OSCClientSender.h @@ -62,6 +62,8 @@ public: void bundle_begin() {} void bundle_end() {} + void response(int32_t id, bool success, const string& msg); + void num_plugins(uint32_t num); void error(const string& msg); diff --git a/src/libs/engine/OSCResponder.cpp b/src/libs/engine/OSCResponder.cpp index d67342d6..50619089 100644 --- a/src/libs/engine/OSCResponder.cpp +++ b/src/libs/engine/OSCResponder.cpp @@ -56,7 +56,7 @@ OSCResponder::respond_ok() _addr = lo_address_new_from_url(_url); //cerr << "OK " << _id << endl; - if (lo_send(_addr, "/om/response/ok", "i", _id) < 0) { + if (lo_send(_addr, "/om/response", "iis", _id, 1, "") < 0) { cerr << "Unable to send response " << _id << "! (" << lo_address_errstr(_addr) << ")" << endl; } @@ -69,7 +69,7 @@ OSCResponder::respond_error(const string& msg) _addr = lo_address_new_from_url(_url); //cerr << "ERR " << _id << endl; - if (lo_send(_addr, "/om/response/error", "is",_id, msg.c_str()) < 0) { + if (lo_send(_addr, "/om/response", "iis",_id, 0, msg.c_str()) < 0) { cerr << "Unable to send response " << _id << "! (" << lo_address_errstr(_addr) << endl; } |