summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2013-05-09 20:18:07 +0000
committerDavid Robillard <d@drobilla.net>2013-05-09 20:18:07 +0000
commit2ba8fe75d93a8a1591c53336933bf7f4285e31bc (patch)
treeaf26c0db111e0975b63e4292ad7ca964010aa519
parentc1cf4a0aaa5742441eb3b0052844e9b3415a641b (diff)
downloadsuil-2ba8fe75d93a8a1591c53336933bf7f4285e31bc.tar.gz
suil-2ba8fe75d93a8a1591c53336933bf7f4285e31bc.tar.bz2
suil-2ba8fe75d93a8a1591c53336933bf7f4285e31bc.zip
Communicate UI update rate to plugin and UI.
git-svn-id: http://svn.drobilla.net/lad/trunk/suil@5107 a436a847-0d15-0410-975c-d299462d15a1
-rw-r--r--src/x11_in_gtk2.c44
-rw-r--r--src/x11_in_qt4.cpp8
-rw-r--r--wscript8
3 files changed, 45 insertions, 15 deletions
diff --git a/src/x11_in_gtk2.c b/src/x11_in_gtk2.c
index e2d9cea..57a9194 100644
--- a/src/x11_in_gtk2.c
+++ b/src/x11_in_gtk2.c
@@ -21,6 +21,11 @@
#include "./suil_internal.h"
+#ifdef HAVE_LV2_1_4_3
+# include "lv2/lv2plug.in/ns/ext/options/options.h"
+# include "lv2/lv2plug.in/ns/ext/urid/urid.h"
+#endif
+
#define SUIL_TYPE_X11_WRAPPER (suil_x11_wrapper_get_type())
#define SUIL_X11_WRAPPER(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), SUIL_TYPE_X11_WRAPPER, SuilX11Wrapper))
@@ -32,9 +37,10 @@ struct _SuilX11Wrapper {
GtkPlug* plug;
SuilWrapper* wrapper;
SuilInstance* instance;
-#ifdef HAVE_LV2_1_4_1
+#ifdef HAVE_LV2_1_4_3
const LV2UI_Idle_Interface* idle_iface;
guint idle_id;
+ guint idle_ms;
#endif
};
@@ -51,7 +57,7 @@ on_plug_removed(GtkSocket* sock, gpointer data)
{
SuilX11Wrapper* const self = SUIL_X11_WRAPPER(sock);
-#ifdef HAVE_LV2_1_4_1
+#ifdef HAVE_LV2_1_4_3
if (self->idle_id) {
g_source_remove(self->idle_id);
self->idle_id = 0;
@@ -162,8 +168,9 @@ suil_x11_wrapper_init(SuilX11Wrapper* self)
self->plug = GTK_PLUG(gtk_plug_new(0));
self->wrapper = NULL;
self->instance = NULL;
-#ifdef HAVE_LV2_1_4_1
+#ifdef HAVE_LV2_1_4_3
self->idle_iface = NULL;
+ self->idle_ms = 1000 / 30; // 30 Hz default
#endif
}
@@ -174,7 +181,7 @@ wrapper_resize(LV2UI_Feature_Handle handle, int width, int height)
return 0;
}
-#ifdef HAVE_LV2_1_4_1
+#ifdef HAVE_LV2_1_4_3
static gboolean
suil_x11_wrapper_idle(void* data)
{
@@ -196,12 +203,13 @@ wrapper_wrap(SuilWrapper* wrapper,
wrap->wrapper = wrapper;
wrap->instance = instance;
-#ifdef HAVE_LV2_1_4_1
+#ifdef HAVE_LV2_1_4_3
const LV2UI_Idle_Interface* idle_iface = suil_instance_extension_data(
instance, LV2_UI__idleInterface);
if (idle_iface) {
wrap->idle_iface = idle_iface;
- wrap->idle_id = g_timeout_add(1000/30, suil_x11_wrapper_idle, wrap);
+ wrap->idle_id = g_timeout_add(
+ wrap->idle_ms, suil_x11_wrapper_idle, wrap);
}
#endif
@@ -250,8 +258,30 @@ suil_wrapper_new(SuilHost* host,
suil_add_feature(features, &n_features, LV2_UI__resize,
&wrapper->resize);
-#ifdef HAVE_LV2_1_4_1
+#ifdef HAVE_LV2_1_4_3
suil_add_feature(features, &n_features, LV2_UI__idleInterface, NULL);
+
+ // Scan for URID map and options
+ LV2_URID_Map* map = NULL;
+ LV2_Options_Option* options = NULL;
+ for (LV2_Feature** f = *features; *f && (!map || !options); ++f) {
+ if (!strcmp((*f)->URI, LV2_OPTIONS__options)) {
+ options = (*f)->data;
+ } else if (!strcmp((*f)->URI, LV2_URID__map)) {
+ map = (*f)->data;
+ }
+ }
+
+ if (map && options) {
+ // Set UI update rate if given
+ LV2_URID ui_updateRate = map->map(map->handle, LV2_UI__updateRate);
+ for (LV2_Options_Option* o = options; o->key; ++o) {
+ if (o->key == ui_updateRate) {
+ wrap->idle_ms = 1000.0f / *(float*)o->value;
+ break;
+ }
+ }
+ }
#endif
return wrapper;
diff --git a/src/x11_in_qt4.cpp b/src/x11_in_qt4.cpp
index bd079ab..33a2e18 100644
--- a/src/x11_in_qt4.cpp
+++ b/src/x11_in_qt4.cpp
@@ -21,7 +21,7 @@
#include "./suil_config.h"
#include "./suil_internal.h"
-#ifndef HAVE_LV2_1_4_1
+#ifndef HAVE_LV2_1_4_3
typedef struct _LV2UI_Idle_Interface LV2UI_Idle_Interface;
#endif
@@ -40,7 +40,7 @@ public:
, _ui_timer(0)
{}
-#ifdef HAVE_LV2_1_4_1
+#ifdef HAVE_LV2_1_4_3
void showEvent(QShowEvent* event) {
if (_idle_iface && _ui_timer == 0) {
_ui_timer = this->startTimer(30);
@@ -68,7 +68,7 @@ wrapper_wrap(SuilWrapper* wrapper,
SuilInstance* instance)
{
const LV2UI_Idle_Interface* idle_iface = NULL;
-#ifdef HAVE_LV2_1_4_1
+#ifdef HAVE_LV2_1_4_3
idle_iface = (const LV2UI_Idle_Interface*)suil_instance_extension_data(
instance, LV2_UI__idleInterface);
#endif
@@ -113,7 +113,7 @@ suil_wrapper_new(SuilHost* host,
suil_add_feature(features, &n_features, LV2_UI__resize,
&wrapper->resize);
-#ifdef HAVE_LV2_1_4_1
+#ifdef HAVE_LV2_1_4_3
suil_add_feature(features, &n_features, LV2_UI__idleInterface, NULL);
#endif
diff --git a/wscript b/wscript
index a08c892..a24805e 100644
--- a/wscript
+++ b/wscript
@@ -52,8 +52,8 @@ def configure(conf):
conf.env.NODELETE_FLAGS = ['-Wl,-z,nodelete']
autowaf.check_pkg(conf, 'lv2', atleast_version='1.0.0', uselib_store='LV2')
- autowaf.check_pkg(conf, 'lv2', atleast_version='1.4.1',
- uselib_store='LV2_1_4_1', mandatory=False)
+ autowaf.check_pkg(conf, 'lv2', atleast_version='1.4.3',
+ uselib_store='LV2_1_4_3', mandatory=False)
autowaf.check_pkg(conf, 'gtk+-2.0', uselib_store='GTK2',
atleast_version='2.18.0', mandatory=False)
@@ -186,7 +186,7 @@ def build(bld):
cflags = cflags,
lib = modlib,
linkflags = bld.env.NODELETE_FLAGS)
- autowaf.use_lib(bld, obj, 'GTK2 GTK2_X11 LV2 LV2_1_4_1')
+ autowaf.use_lib(bld, obj, 'GTK2 GTK2_X11 LV2 LV2_1_4_3')
if bld.is_defined('HAVE_GTK2') and sys.platform == 'win32':
obj = bld(features = 'cxx cxxshlib',
@@ -209,7 +209,7 @@ def build(bld):
install_path = module_dir,
cflags = cflags,
lib = modlib)
- autowaf.use_lib(bld, obj, 'QT4 LV2 LV2_1_4_1')
+ autowaf.use_lib(bld, obj, 'QT4 LV2 LV2_1_4_3')
# Documentation
autowaf.build_dox(bld, 'SUIL', SUIL_VERSION, top, out)