From 22f9b193006de486a569d67f11c82fd12d790181 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Fri, 1 Nov 2013 21:55:48 +0000 Subject: Implement LV2 UI port_index, subscribe, and unsubscribe features. git-svn-id: http://svn.drobilla.net/lad/trunk/ingen@5169 a436a847-0d15-0410-975c-d299462d15a1 --- src/client/PluginUI.cpp | 84 ++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 72 insertions(+), 12 deletions(-) (limited to 'src/client') diff --git a/src/client/PluginUI.cpp b/src/client/PluginUI.cpp index b24332d6..9bfe69fc 100644 --- a/src/client/PluginUI.cpp +++ b/src/client/PluginUI.cpp @@ -30,6 +30,18 @@ namespace Client { SuilHost* PluginUI::ui_host = NULL; +static SPtr +get_port(PluginUI* ui, uint32_t port_index) +{ + if (port_index >= ui->block()->ports().size()) { + ui->world()->log().error( + fmt("%1% UI tried to access invalid port %2%\n") + % ui->block()->plugin()->uri().c_str() % port_index); + return SPtr(); + } + return ui->block()->ports()[port_index]; +} + static void lv2_ui_write(SuilController controller, uint32_t port_index, @@ -37,20 +49,13 @@ lv2_ui_write(SuilController controller, uint32_t format, const void* buffer) { - PluginUI* const ui = (PluginUI*)controller; - - const BlockModel::Ports& ports = ui->block()->ports(); - if (port_index >= ports.size()) { - ui->world()->log().error( - fmt("%1% UI tried to write to invalid port %2%\n") - % ui->block()->plugin()->uri().c_str() % port_index); + PluginUI* const ui = (PluginUI*)controller; + const URIs& uris = ui->world()->uris(); + SPtr port = get_port(ui, port_index); + if (!port) { return; } - SPtr port = ports[port_index]; - - const URIs& uris = ui->world()->uris(); - // float (special case, always 0) if (format == 0) { if (buffer_size != 4) { @@ -85,6 +90,60 @@ lv2_ui_write(SuilController controller, } } +static uint32_t +lv2_ui_port_index(SuilController controller, const char* port_symbol) +{ + PluginUI* const ui = (PluginUI*)controller; + + const BlockModel::Ports& ports = ui->block()->ports(); + for (uint32_t i = 0; i < ports.size(); ++i) { + if (ports[i]->symbol() == port_symbol) { + return i; + } + } + return LV2UI_INVALID_PORT_INDEX; +} + +static uint32_t +lv2_ui_subscribe(SuilController controller, + uint32_t port_index, + uint32_t protocol, + const LV2_Feature* const* features) +{ + PluginUI* const ui = (PluginUI*)controller; + SPtr port = get_port(ui, port_index); + if (!port) { + return 1; + } + + ui->world()->interface()->set_property( + ui->block()->ports()[port_index]->uri(), + ui->world()->uris().ingen_broadcast, + ui->world()->forge().make(true)); + + return 0; +} + +static uint32_t +lv2_ui_unsubscribe(SuilController controller, + uint32_t port_index, + uint32_t protocol, + const LV2_Feature* const* features) +{ + PluginUI* const ui = (PluginUI*)controller; + SPtr port = get_port(ui, port_index); + if (!port) { + return 1; + } + + ui->world()->interface()->set_property( + ui->block()->ports()[port_index]->uri(), + ui->world()->uris().ingen_broadcast, + ui->world()->forge().make(false)); + + return 0; +} + PluginUI::PluginUI(Ingen::World* world, SPtr block, const LilvNode* ui_node) @@ -107,7 +166,8 @@ PluginUI::create(Ingen::World* world, const LilvPlugin* plugin) { if (!PluginUI::ui_host) { - PluginUI::ui_host = suil_host_new(lv2_ui_write, NULL, NULL, NULL); + PluginUI::ui_host = suil_host_new( + lv2_ui_write, lv2_ui_port_index, lv2_ui_subscribe, lv2_ui_unsubscribe); } static const char* gtk_ui_uri = LV2_UI__GtkUI; -- cgit v1.2.1