summaryrefslogtreecommitdiffstats
path: root/src/libs/client/OSCEngineSender.cpp
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2008-07-28 21:56:03 +0000
committerDavid Robillard <d@drobilla.net>2008-07-28 21:56:03 +0000
commita6fb6a0289ea47692d87f3e0200532a426f8e60d (patch)
tree0e497255eb8a263ff9cca87b2ed125b71144cacb /src/libs/client/OSCEngineSender.cpp
parent8e2ba26101828dcf310e0a43ace7aa68dafd3b16 (diff)
downloadingen-a6fb6a0289ea47692d87f3e0200532a426f8e60d.tar.gz
ingen-a6fb6a0289ea47692d87f3e0200532a426f8e60d.tar.bz2
ingen-a6fb6a0289ea47692d87f3e0200532a426f8e60d.zip
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
Diffstat (limited to 'src/libs/client/OSCEngineSender.cpp')
-rw-r--r--src/libs/client/OSCEngineSender.cpp59
1 files changed, 47 insertions, 12 deletions
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;
}
}