From a6fb6a0289ea47692d87f3e0200532a426f8e60d Mon Sep 17 00:00:00 2001 From: David Robillard Date: Mon, 28 Jul 2008 21:56:03 +0000 Subject: Simply global memory management crap by using shared_ptr in the World struct (it's not C anyway, might as well). Properly support LV2 events from plugin UIs over OSC and directly (w/ monolithic UI/engine). Fix crashes on node destruction with monolithic UI/engine. Resolves ticket #177. git-svn-id: http://svn.drobilla.net/lad/ingen@1293 a436a847-0d15-0410-975c-d299462d15a1 --- src/libs/client/OSCEngineSender.cpp | 59 +++++++++++++++++++++++++++++-------- 1 file changed, 47 insertions(+), 12 deletions(-) (limited to 'src/libs/client/OSCEngineSender.cpp') diff --git a/src/libs/client/OSCEngineSender.cpp b/src/libs/client/OSCEngineSender.cpp index 20070ff9..48fee877 100644 --- a/src/libs/client/OSCEngineSender.cpp +++ b/src/libs/client/OSCEngineSender.cpp @@ -124,6 +124,28 @@ OSCEngineSender::unregister_client(const string& uri) } +// Bundles + +void +OSCEngineSender::bundle_begin() +{ + //cerr << "BUNDLE {" << endl; + /*assert(!_bundle); + _bundle = lo_bundle_new(LO_TT_IMMEDIATE);*/ +} + + +void +OSCEngineSender::bundle_end() +{ + //cerr << "} BUNDLE" << endl; + /*assert(_bundle); + lo_send_bundle(_address, _bundle); + lo_bundle_free(_bundle); + _bundle = NULL;*/ +} + + // Engine commands void @@ -358,19 +380,23 @@ OSCEngineSender::set_port_value(const string& port_path, const void* data) { assert(_engine_addr); - if (type_uri == "ingen:control") { + if (type_uri == "ingen:Float") { assert(data_size == 4); lo_send(_engine_addr, "/ingen/set_port_value", "isf", next_id(), port_path.c_str(), *(float*)data); - } else { + } else if (type_uri == "lv2_midi:MidiEvent") { lo_blob b = lo_blob_new(data_size, (void*)data); - lo_send(_engine_addr, "/ingen/set_port_value", "isb", + lo_send(_engine_addr, "/ingen/set_port_value", "issb", next_id(), port_path.c_str(), + type_uri.c_str(), b); lo_blob_free(b); + // FIXME: support atomic bundles of events here + } else { + cerr << "ERROR: Unknown value type '" << type_uri << "', ignoring" << endl; } } @@ -383,19 +409,22 @@ OSCEngineSender::set_port_value(const string& port_path, const void* data) { assert(_engine_addr); - if (type_uri == "ingen:control") { + if (type_uri == "ingen:Float") { assert(data_size == 4); lo_send(_engine_addr, "/ingen/set_port_value", "isf", next_id(), port_path.c_str(), *(float*)data); - } else { + } else if (type_uri == "lv2_midi:MidiEvent") { lo_blob b = lo_blob_new(data_size, (void*)data); - lo_send(_engine_addr, "/ingen/set_port_value", "isb", + lo_send(_engine_addr, "/ingen/set_port_value", "issb", next_id(), port_path.c_str(), + type_uri.c_str(), b); lo_blob_free(b); + } else { + cerr << "ERROR: Unknown value type '" << type_uri << "', ignoring" << endl; } } @@ -408,19 +437,22 @@ OSCEngineSender::set_port_value_immediate(const string& port_path, { assert(_engine_addr); - if (type_uri == "ingen:control") { + if (type_uri == "ingen:Float") { assert(data_size == 4); lo_send(_engine_addr, "/ingen/set_port_value_immediate", "isf", next_id(), port_path.c_str(), *(float*)data); - } else { + } else if (type_uri == "lv2_midi:MidiEvent") { lo_blob b = lo_blob_new(data_size, (void*)data); - lo_send(_engine_addr, "/ingen/set_port_value_immediate", "isb", + lo_send(_engine_addr, "/ingen/set_port_value_immediate", "issb", next_id(), port_path.c_str(), + type_uri.c_str(), b); lo_blob_free(b); + } else { + cerr << "ERROR: Unknown value type '" << type_uri << "', ignoring" << endl; } } @@ -434,21 +466,24 @@ OSCEngineSender::set_port_value_immediate(const string& port_path, { assert(_engine_addr); - if (type_uri == "ingen:control") { + if (type_uri == "ingen:Float") { assert(data_size == 4); lo_send(_engine_addr, "/ingen/set_port_value_immediate", "isif", next_id(), port_path.c_str(), voice, *(float*)data); - } else { + } else if (type_uri == "lv2_midi:MidiEvent") { lo_blob b = lo_blob_new(data_size, (void*)data); - lo_send(_engine_addr, "/ingen/set_port_value_immediate", "isib", + lo_send(_engine_addr, "/ingen/set_port_value_immediate", "isisb", next_id(), port_path.c_str(), voice, + type_uri.c_str(), b); lo_blob_free(b); + } else { + cerr << "ERROR: Unknown value type '" << type_uri << "', ignoring" << endl; } } -- cgit v1.2.1