From 1d972d05c5e889e4358d18ec6ba0c8e2e11a64e4 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Sun, 25 Aug 2013 16:20:27 +0200 Subject: [PATCH] add LV2 support for kx:external-ui# the ABI of http://kxstudio.sf.net/ns/lv2ext/external-ui# is identical to http://lv2plug.in/ns/extensions/ui#external It just adds a distinction between #Host and #Widget for cosmetic reasons. Sadly some newer plugins are released with only support for kxstudio URI :( --- gtk2_ardour/lv2_external_ui.h | 2 ++ gtk2_ardour/lv2_plugin_ui.cc | 9 +++++++-- gtk2_ardour/lv2_plugin_ui.h | 1 + libs/ardour/lv2_plugin.cc | 11 +++++++++-- 4 files changed, 19 insertions(+), 4 deletions(-) diff --git a/gtk2_ardour/lv2_external_ui.h b/gtk2_ardour/lv2_external_ui.h index 19fa912f04..9f404e6d9a 100644 --- a/gtk2_ardour/lv2_external_ui.h +++ b/gtk2_ardour/lv2_external_ui.h @@ -37,6 +37,8 @@ /** UI extension suitable for out-of-process UIs */ #define LV2_EXTERNAL_UI_URI "http://lv2plug.in/ns/extensions/ui#external" +#define LV2_EXTERNAL_UI_KX__Host "http://kxstudio.sf.net/ns/lv2ext/external-ui#Host" + #ifdef __cplusplus extern "C" { #endif diff --git a/gtk2_ardour/lv2_plugin_ui.cc b/gtk2_ardour/lv2_plugin_ui.cc index 6f22ce5182..168f2d6798 100644 --- a/gtk2_ardour/lv2_plugin_ui.cc +++ b/gtk2_ardour/lv2_plugin_ui.cc @@ -171,6 +171,7 @@ LV2PluginUI::output_update() //cout << "output_update" << endl; if (_external_ui_ptr) { LV2_EXTERNAL_UI_RUN(_external_ui_ptr); + if (!_external_ui_ptr) return; // ui was closed here } /* FIXME only works with control output ports (which is all we support now anyway) */ @@ -222,12 +223,16 @@ LV2PluginUI::lv2ui_instantiate(const std::string& title) _external_ui_feature.URI = LV2_EXTERNAL_UI_URI; _external_ui_feature.data = &_external_ui_host; + _external_kxui_feature.URI = LV2_EXTERNAL_UI_KX__Host; + _external_kxui_feature.data = &_external_ui_host; + ++features_count; features = (LV2_Feature**)malloc( - sizeof(LV2_Feature*) * (features_count + 1)); - for (size_t i = 0; i < features_count - 1; ++i) { + sizeof(LV2_Feature*) * (features_count + 2)); + for (size_t i = 0; i < features_count - 2; ++i) { features[i] = features_src[i]; } + features[features_count - 2] = &_external_kxui_feature; features[features_count - 1] = &_external_ui_feature; features[features_count] = NULL; } else { diff --git a/gtk2_ardour/lv2_plugin_ui.h b/gtk2_ardour/lv2_plugin_ui.h index edb90cb154..40e3890e1c 100644 --- a/gtk2_ardour/lv2_plugin_ui.h +++ b/gtk2_ardour/lv2_plugin_ui.h @@ -78,6 +78,7 @@ class LV2PluginUI : public PlugUIBase, public Gtk::VBox std::vector _controllables; struct lv2_external_ui_host _external_ui_host; LV2_Feature _external_ui_feature; + LV2_Feature _external_kxui_feature; struct lv2_external_ui* _external_ui_ptr; LV2_Feature _parent_feature; Gtk::Window* _win_ptr; diff --git a/libs/ardour/lv2_plugin.cc b/libs/ardour/lv2_plugin.cc index 484965e8f4..c6e9b89e5b 100644 --- a/libs/ardour/lv2_plugin.cc +++ b/libs/ardour/lv2_plugin.cc @@ -142,6 +142,7 @@ public: LilvNode* time_Position; LilvNode* ui_GtkUI; LilvNode* ui_external; + LilvNode* ui_externalkx; private: bool _bundle_checked; @@ -561,11 +562,15 @@ LV2Plugin::init(const void* c_plugin, framecnt_t rate) if (!_impl->ui) { LILV_FOREACH(uis, i, uis) { const LilvUI* ui = lilv_uis_get(uis, i); - if (lilv_ui_is_a(ui, _world.ui_external)) { + if (lilv_ui_is_a(ui, _world.ui_externalkx)) { _impl->ui = ui; _impl->ui_type = _world.ui_external; break; } + if (lilv_ui_is_a(ui, _world.ui_external)) { + _impl->ui = ui; + _impl->ui_type = _world.ui_external; + } } } } @@ -613,7 +618,7 @@ LV2Plugin::is_external_ui() const if (!_impl->ui) { return false; } - return lilv_ui_is_a(_impl->ui, _world.ui_external); + return lilv_ui_is_a(_impl->ui, _world.ui_external) || lilv_ui_is_a(_impl->ui, _world.ui_externalkx); } bool @@ -1950,10 +1955,12 @@ LV2World::LV2World() time_Position = lilv_new_uri(world, LV2_TIME__Position); ui_GtkUI = lilv_new_uri(world, LV2_UI__GtkUI); ui_external = lilv_new_uri(world, "http://lv2plug.in/ns/extensions/ui#external"); + ui_externalkx = lilv_new_uri(world, "http://kxstudio.sf.net/ns/lv2ext/external-ui#Widget"); } LV2World::~LV2World() { + lilv_node_free(ui_externalkx); lilv_node_free(ui_external); lilv_node_free(ui_GtkUI); lilv_node_free(time_Position); -- 2.30.2