#ifndef __PLUGINLV2UI_H__
#define __PLUGINLV2UI_H__
-#ifdef HAVE_LV2UI
-
#include "forkbase.h"
#include "pluginlv2.h"
#include "pluginlv2client.h"
#include "pluginlv2gui.inc"
#include "pluginlv2ui.inc"
+//=== lv2_external_ui.h
+#define LV2_EXTERNAL_UI_URI "http://lv2plug.in/ns/extensions/ui#external"
+#define LV2_EXTERNAL_UI_URI__KX__Host "http://kxstudio.sf.net/ns/lv2ext/external-ui#Host"
+
+typedef struct _lv2_external_ui lv2_external_ui;
+struct _lv2_external_ui {
+ void (*run)(lv2_external_ui *ui);
+ void (*show)(lv2_external_ui *ui);
+ void (*hide)(lv2_external_ui *ui);
+ void *self;
+};
+
+typedef struct _lv2_external_ui_host lv2_external_ui_host;
+struct _lv2_external_ui_host {
+ void (*ui_closed)(void* controller);
+ const char *plugin_human_id;
+};
+
+#define LV2_EXTERNAL_UI_RUN(ptr) (ptr)->run(ptr)
+#define LV2_EXTERNAL_UI_SHOW(ptr) (ptr)->show(ptr)
+#define LV2_EXTERNAL_UI_HIDE(ptr) (ptr)->hide(ptr)
+//===
+
typedef struct _GtkWidget GtkWidget;
+#define UPDATE_HOST 1
+#define UPDATE_PORTS 2
+
class PluginLV2UI : public PluginLV2
{
public:
const LilvNode *lilv_type;
LV2_Extension_Data_Feature *ext_data;
- PluginLV2UriTable uri_table;
- LV2_URI_Map_Feature *uri_map;
- LV2_URID_Map map;
- LV2_URID_Unmap unmap;
+ lv2_external_ui_host extui_host;
+ const char *wgt_type;
+ const char *gtk_type;
+ const char *ui_type;
char title[BCSTRLEN];
PluginLV2ClientConfig config;
- uint32_t host_updates, updates;
- int host_hidden, hidden;
int done, running;
- const char *gtk_type;
- GtkWidget *top_level;
+ int hidden, updates;
- void reset_gui();
- int init_ui(const char *path, int sample_rate);
void start();
void stop();
- int update_lv2(float *vals, int force);
- int redraw;
+ int update_lv2_input(float *vals, int force);
+ void update_lv2_output();
+ virtual int send_host(int64_t token, const void *data, int bytes) = 0;
+ virtual int child_iteration(int64_t usec) { return -1; }
+ void run_lilv(int samples);
void update_value(int idx, uint32_t bfrsz, uint32_t typ, const void *bfr);
void update_control(int idx, uint32_t bfrsz, uint32_t typ, const void *bfr);
static void write_from_ui(void *the, uint32_t idx,
static const char *uri_table_unmap(LV2_URID_Map_Handle handle, LV2_URID urid);
void lv2ui_instantiate(void *parent);
bool lv2ui_resizable();
+ void update_host();
+};
+
+class PluginLV2GUI
+{
+public:
+ PluginLV2GUI(PluginLV2ChildUI *child_ui);
+ virtual ~PluginLV2GUI();
+ virtual void reset_gui() = 0;
+ virtual void start_gui() = 0;
+ virtual int handle_child() = 0;
+
+ PluginLV2ChildUI *child_ui;
+ void *top_level;
+};
+
+class PluginLV2ChildGtkUI : public PluginLV2GUI
+{
+public:
+ PluginLV2ChildGtkUI(PluginLV2ChildUI *child_ui);
+ ~PluginLV2ChildGtkUI();
+
+ void reset_gui();
void start_gui();
- int run_ui(PluginLV2ChildUI *child=0);
- void run_buffer(int shmid);
- void host_update(PluginLV2ChildUI *child);
- int run(int ac, char **av);
+ int handle_child();
+};
+
+class PluginLV2ChildWgtUI : public PluginLV2GUI
+{
+public:
+ PluginLV2ChildWgtUI(PluginLV2ChildUI *child_ui);
+ ~PluginLV2ChildWgtUI();
+
+ void reset_gui();
+ void start_gui();
+ int handle_child();
};
class PluginLV2ChildUI : public ForkChild, public PluginLV2UI
public:
PluginLV2ChildUI();
~PluginLV2ChildUI();
- void run();
+ int init_ui(const char *path, int sample_rate, int bfrsz);
+ void reset_gui();
+ void start_gui();
int handle_child();
+
+ int is_forked() { return ppid; }
+ int send_host(int64_t token, const void *data, int bytes);
+ int child_iteration(int64_t usec);
+ void run();
int run(int ac, char **av);
+ int run_ui();
+ void run_buffer(int shmid);
+
+ int ac;
+ char **av;
+ PluginLV2GUI *gui;
};
-#endif
+
#endif