From 161d33090fdf8db67aa8c3a84b2cea01d8b9ac9e Mon Sep 17 00:00:00 2001 From: David Robillard Date: Tue, 20 May 2008 03:55:46 +0000 Subject: Write individual events from UIs over OSC instead of entire event buffer. git-svn-id: http://svn.drobilla.net/lad/ingen@1221 a436a847-0d15-0410-975c-d299462d15a1 --- src/libs/client/PluginUI.cpp | 37 ++++++++++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 9 deletions(-) (limited to 'src/libs/client') diff --git a/src/libs/client/PluginUI.cpp b/src/libs/client/PluginUI.cpp index 9dcbfcba..c7c3ffc5 100644 --- a/src/libs/client/PluginUI.cpp +++ b/src/libs/client/PluginUI.cpp @@ -16,6 +16,7 @@ */ #include +#include "lv2ext/lv2_event_helpers.h" #include "shared/LV2URIMap.hpp" #include "PluginUI.hpp" #include "NodeModel.hpp" @@ -35,10 +36,8 @@ lv2_ui_write(LV2UI_Controller controller, uint32_t format, const void* buffer) { -#if 0 - cerr << "********* LV2 UI WRITE (FORMAT " << format << "):" << endl; - /*lv2_osc_message_print((const LV2Message*)buffer);*/ - + /* + cerr << "lv2_ui_write (format " << format << "):" << endl; fprintf(stderr, "RAW:\n"); for (uint32_t i=0; i < buffer_size; ++i) { unsigned char byte = ((unsigned char*)buffer)[i]; @@ -48,7 +47,7 @@ lv2_ui_write(LV2UI_Controller controller, fprintf(stderr, "%2X ", ((unsigned char*)buffer)[i]); } fprintf(stderr, "\n"); -#endif + */ PluginUI* ui = (PluginUI*)controller; @@ -57,15 +56,35 @@ lv2_ui_write(LV2UI_Controller controller, LV2URIMap* map = (LV2URIMap*)ui->world()->lv2_features->feature(LV2_URI_MAP_URI); assert(map); - if (format == 0) { // float (special case) + // float (special case, always 0) + if (format == 0) { assert(buffer_size == 4); if (*(float*)buffer == port->value().get_float()) return; // do nothing (handle stupid plugin UIs that feed back) + + ui->world()->engine->set_port_value_immediate(port->path(), + port->type().uri(), + buffer_size, buffer); + + // FIXME: assumes event + } else { + LV2_Event_Buffer* buf = (LV2_Event_Buffer*)buffer; + LV2_Event_Iterator iter; + uint8_t* data; + lv2_event_begin(&iter, buf); + while (lv2_event_is_valid(&iter)) { + LV2_Event* const ev = lv2_event_get(&iter, &data); + + // FIXME: bundle multiple events + ui->world()->engine->set_port_value_immediate(port->path(), + port->type().uri(), + ev->size, data); + + lv2_event_increment(&iter); + } } - ui->world()->engine->set_port_value_immediate(port->path(), - port->type().uri(), - buffer_size, buffer); + } -- cgit v1.2.1