summaryrefslogtreecommitdiffstats
path: root/src/client
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2011-02-22 07:57:57 +0000
committerDavid Robillard <d@drobilla.net>2011-02-22 07:57:57 +0000
commit0963d40dec95931690ed05585443807cae3d630e (patch)
tree3d1f8d27c71afb11eb3a1f77ac2c747cdddcf92d /src/client
parent9a1bee9a46afb11c7c0ec4c70d12d986a81d6021 (diff)
downloadingen-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.cpp21
-rw-r--r--src/client/PluginUI.cpp79
-rw-r--r--src/client/PluginUI.hpp4
-rw-r--r--src/client/wscript2
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')