diff options
author | David Robillard <d@drobilla.net> | 2011-02-22 07:57:57 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2011-02-22 07:57:57 +0000 |
commit | 0963d40dec95931690ed05585443807cae3d630e (patch) | |
tree | 3d1f8d27c71afb11eb3a1f77ac2c747cdddcf92d /src/client | |
parent | 9a1bee9a46afb11c7c0ec4c70d12d986a81d6021 (diff) | |
download | ingen-0963d40dec95931690ed05585443807cae3d630e.tar.gz ingen-0963d40dec95931690ed05585443807cae3d630e.tar.bz2 ingen-0963d40dec95931690ed05585443807cae3d630e.zip |
Implement LV2 plugin UIs via Suil.
git-svn-id: http://svn.drobilla.net/lad/trunk/ingen@3011 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src/client')
-rw-r--r-- | src/client/PluginModel.cpp | 21 | ||||
-rw-r--r-- | src/client/PluginUI.cpp | 79 | ||||
-rw-r--r-- | src/client/PluginUI.hpp | 4 | ||||
-rw-r--r-- | src/client/wscript | 2 |
4 files changed, 50 insertions, 56 deletions
diff --git a/src/client/PluginModel.cpp b/src/client/PluginModel.cpp index 5d35902b..220da5a4 100644 --- a/src/client/PluginModel.cpp +++ b/src/client/PluginModel.cpp @@ -18,13 +18,17 @@ #include <sstream> #include <ctype.h> #include <boost/optional.hpp> + #include "raul/Path.hpp" #include "raul/Atom.hpp" -#include "ingen-config.h" -#include "shared/LV2URIMap.hpp" -#include "PluginModel.hpp" +#include "slv2/ui.h" + #include "PatchModel.hpp" +#include "PluginModel.hpp" #include "PluginUI.hpp" +#include "shared/LV2URIMap.hpp" + +#include "ingen-config.h" using namespace std; using namespace Raul; @@ -191,17 +195,8 @@ PluginModel::port_human_name(uint32_t index) const bool PluginModel::has_ui() const { - SLV2Value gtk_gui_uri = slv2_value_new_uri(_slv2_world, - "http://lv2plug.in/ns/extensions/ui#GtkUI"); - SLV2UIs uis = slv2_plugin_get_uis(_slv2_plugin); - - if (slv2_values_size(uis) > 0) - for (unsigned i=0; i < slv2_uis_size(uis); ++i) - if (slv2_ui_is_a(slv2_uis_get_at(uis, i), gtk_gui_uri)) - return true; - - return false; + return (slv2_values_size(uis) > 0); } diff --git a/src/client/PluginUI.cpp b/src/client/PluginUI.cpp index 18ff52a1..29ecfa74 100644 --- a/src/client/PluginUI.cpp +++ b/src/client/PluginUI.cpp @@ -21,6 +21,8 @@ #include "lv2/lv2plug.in/ns/ext/event/event.h" #include "lv2/lv2plug.in/ns/ext/event/event-helpers.h" +#include "slv2/ui.h" + #include "shared/LV2Atom.hpp" #include "shared/LV2URIMap.hpp" @@ -109,9 +111,7 @@ PluginUI::PluginUI(Ingen::Shared::World* world, PluginUI::~PluginUI() { - if (_instance) { - slv2_ui_instance_free(_instance); - } + suil_instance_free(_instance); } @@ -120,48 +120,52 @@ PluginUI::create(Ingen::Shared::World* world, SharedPtr<NodeModel> node, SLV2Plugin plugin) { - SharedPtr<PluginUI> ret; - - SLV2Value gtk_gui_uri = slv2_value_new_uri( - world->slv2_world(), - "http://lv2plug.in/ns/extensions/ui#GtkUI"); - - SLV2UIs uis = slv2_plugin_get_uis(plugin); - SLV2UI ui = NULL; - - if (slv2_values_size(uis) > 0) { - for (unsigned i=0; i < slv2_uis_size(uis); ++i) { - SLV2UI this_ui = slv2_uis_get_at(uis, i); - if (slv2_ui_is_a(this_ui, gtk_gui_uri)) { - ui = this_ui; - break; - } + SharedPtr<PluginUI> ret(new PluginUI(world, node)); + ret->_features = world->lv2_features()->lv2_features(world, node.get()); + + // Build Suil UI set for this plugin + const char* const plugin_uri = slv2_value_as_uri(slv2_plugin_get_uri(plugin)); + SLV2UIs slv2_uis = slv2_plugin_get_uis(plugin); + SuilUIs suil_uis = suil_uis_new(plugin_uri); + for (unsigned i = 0; i < slv2_uis_size(slv2_uis); ++i) { + SLV2UI ui = slv2_uis_get_at(slv2_uis, i); + SLV2Values classes = slv2_ui_get_classes(ui); + SLV2Value type = slv2_values_get_at(classes, 0); // FIXME? + if (!suil_ui_type_supported(slv2_value_as_uri(type))) { + warn << "Unsupported LV2 UI type " << slv2_value_as_uri(type) << endl; + continue; } + + suil_uis_add(suil_uis, + slv2_value_as_uri(slv2_ui_get_uri(ui)), + slv2_value_as_uri(type), + slv2_uri_to_path(slv2_value_as_uri(slv2_ui_get_bundle_uri(ui))), + slv2_uri_to_path(slv2_value_as_uri(slv2_ui_get_binary_uri(ui)))); } - if (ui) { - info << "Found GTK Plugin UI: " << slv2_ui_get_uri(ui) << endl; - ret = SharedPtr<PluginUI>(new PluginUI(world, node)); - ret->_features = world->lv2_features()->lv2_features(world, node.get()); - SLV2UIInstance inst = slv2_ui_instantiate( - plugin, ui, lv2_ui_write, ret.get(), ret->_features->array()); - - if (inst) { - ret->_instance = inst; - } else { - error << "Failed to instantiate Plugin UI" << endl; - ret = SharedPtr<PluginUI>(); - } + // Attempt to instantiate a UI + SuilInstance instance = suil_instance_new( + suil_uis, + "http://lv2plug.in/ns/extensions/ui#GtkUI", + NULL, + lv2_ui_write, + ret.get(), + ret->_features->array()); + + if (instance) { + ret->_instance = instance; + } else { + error << "Failed to instantiate LV2 UI" << endl; + ret.reset(); } - slv2_value_free(gtk_gui_uri); return ret; } LV2UI_Widget PluginUI::get_widget() { - return (LV2UI_Widget*)slv2_ui_instance_get_widget(_instance); + return (LV2UI_Widget*)suil_instance_get_widget(_instance); } void @@ -170,12 +174,7 @@ PluginUI::port_event(uint32_t port_index, uint32_t format, const void* buffer) { - const LV2UI_Descriptor* ui_desc = slv2_ui_instance_get_descriptor(_instance); - LV2UI_Handle ui = slv2_ui_instance_get_handle(_instance); - - if (ui_desc->port_event) { - ui_desc->port_event(ui, port_index, buffer_size, 0, buffer); - } + suil_instance_port_event(_instance, port_index, buffer_size, format, buffer); } } // namespace Client diff --git a/src/client/PluginUI.hpp b/src/client/PluginUI.hpp index bf60dcfa..ae1cd12e 100644 --- a/src/client/PluginUI.hpp +++ b/src/client/PluginUI.hpp @@ -20,7 +20,7 @@ #include "raul/SharedPtr.hpp" #include "slv2/slv2.h" -#include "slv2/ui.h" +#include "suil/suil.h" #include "LV2Features.hpp" @@ -60,7 +60,7 @@ private: Ingen::Shared::World* _world; SharedPtr<NodeModel> _node; - SLV2UIInstance _instance; + SuilInstance _instance; SharedPtr<Shared::LV2Features::FeatureArray> _features; }; diff --git a/src/client/wscript b/src/client/wscript index 8a4540d0..38c0a598 100644 --- a/src/client/wscript +++ b/src/client/wscript @@ -36,5 +36,5 @@ def build(bld): obj.target = 'ingen_client' obj.install_path = '${LIBDIR}' obj.use = 'libingen_shared' - autowaf.use_lib(bld, obj, 'GLIBMM LV2CORE SLV2 RAUL SORD SOUP SIGCPP LIBLO SOUP') + autowaf.use_lib(bld, obj, 'GLIBMM LV2CORE SLV2 SUIL RAUL SORD SOUP SIGCPP LIBLO SOUP') |