diff options
author | David Robillard <d@drobilla.net> | 2008-11-13 22:05:26 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2008-11-13 22:05:26 +0000 |
commit | 427631a3f072274811c338100a0a658f025ddcd6 (patch) | |
tree | 871d572cf727e4c84f23ddbea61be1eafecb321d /gtk2_ardour/lv2_plugin_ui.cc | |
parent | 963a390bea8f52c1aadbebc4e9c7851642fdc06e (diff) |
Apply LV2 port notification fix (for GUI updating) from kfoltman.
git-svn-id: svn://localhost/ardour2/branches/2.0-ongoing@4156 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour/lv2_plugin_ui.cc')
-rw-r--r-- | gtk2_ardour/lv2_plugin_ui.cc | 49 |
1 files changed, 48 insertions, 1 deletions
diff --git a/gtk2_ardour/lv2_plugin_ui.cc b/gtk2_ardour/lv2_plugin_ui.cc index 2ca9166dea..07599a85bb 100644 --- a/gtk2_ardour/lv2_plugin_ui.cc +++ b/gtk2_ardour/lv2_plugin_ui.cc @@ -21,6 +21,7 @@ #include <ardour/insert.h> #include <ardour/lv2_plugin.h> +#include "ardour_ui.h" #include "lv2_plugin_ui.h" using namespace Gtk; @@ -51,6 +52,38 @@ LV2PluginUI::parameter_changed (uint32_t port_index, float val) } } +bool +LV2PluginUI::start_updating(GdkEventAny* event) +{ + if (!_output_ports.empty()) { + _screen_update_connection.disconnect(); + _screen_update_connection = ARDOUR_UI::instance()->RapidScreenUpdate.connect + (mem_fun(*this, &LV2PluginUI::output_update)); + } + return false; +} + +bool +LV2PluginUI::stop_updating(GdkEventAny* event) +{ + if (!_output_ports.empty()) { + _screen_update_connection.disconnect(); + } + return false; +} + +void +LV2PluginUI::output_update() +{ + /* FIXME only works with control output ports (which is all we support now anyway) */ + uint32_t nports = _output_ports.size(); + for (uint32_t i = 0; i < nports; ++i) { + uint32_t index = _output_ports[i]; + parameter_changed(index, _lv2->get_parameter(index)); + } + +} + LV2PluginUI::LV2PluginUI (boost::shared_ptr<PluginInsert> pi, boost::shared_ptr<LV2Plugin> lv2p) : PlugUIBase (pi) , _lv2(lv2p) @@ -59,12 +92,18 @@ LV2PluginUI::LV2PluginUI (boost::shared_ptr<PluginInsert> pi, boost::shared_ptr< _lv2->slv2_plugin(), _lv2->slv2_ui(), LV2PluginUI::lv2_ui_write, this, _lv2->features()); + uint32_t num_ports = slv2_plugin_get_num_ports(lv2p->slv2_plugin()); + for (uint32_t i = 0; i < num_ports; ++i) { + if (lv2p->parameter_is_output(i) && lv2p->parameter_is_control(i) && is_update_wanted(i)) { + _output_ports.push_back(i); + } + } + GtkWidget* c_widget = (GtkWidget*)slv2_ui_instance_get_widget(_inst); _gui_widget = Glib::wrap(c_widget); _gui_widget->show_all(); pack_start(*_gui_widget, true, true); - uint32_t num_ports = slv2_plugin_get_num_ports(lv2p->slv2_plugin()); _values = new float[num_ports]; for (uint32_t i = 0; i < num_ports; ++i) { bool ok; @@ -101,6 +140,8 @@ LV2PluginUI::package (Gtk::Window& win) { /* forward configure events to plugin window */ win.signal_configure_event().connect (mem_fun (*this, &LV2PluginUI::configure_handler)); + win.signal_map_event().connect (mem_fun (*this, &LV2PluginUI::start_updating)); + win.signal_unmap_event().connect (mem_fun (*this, &LV2PluginUI::stop_updating)); return 0; } @@ -111,3 +152,9 @@ LV2PluginUI::configure_handler (GdkEventConfigure* ev) return false; } +bool +LV2PluginUI::is_update_wanted(uint32_t index) +{ + /* FIXME this should check the port notification properties, which nobody sets now anyway :) */ + return true; +} |