add lv2ui support
[goodguy/history.git] / cinelerra-5.1 / cinelerra / lv2ui.C
1 #include <stdio.h>
2
3 #include <gtk/gtk.h>
4 #include <gdk/gdk.h>
5
6 #include "bcsignals.h"
7 #include "pluginlv2client.h"
8 #include "pluginlv2gui.h"
9
10 static void lilv_destroy(GtkWidget* widget, gpointer data)
11 {
12         PluginLV2GUI *the = (PluginLV2GUI*)data;
13         the->done = 1;
14 }
15
16 void PluginLV2GUI::start()
17 {
18         GtkWidget *window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
19         g_signal_connect(window, "destroy", G_CALLBACK(lilv_destroy), this);
20         gtk_window_set_title(GTK_WINDOW(window), title);
21
22         GtkWidget *vbox = gtk_vbox_new(FALSE, 0);
23         gtk_window_set_role(GTK_WINDOW(window), "plugin_ui");
24         gtk_container_add(GTK_CONTAINER(window), vbox);
25
26         GtkWidget *alignment = gtk_alignment_new(0.5, 0.5, 1.0, 1.0);
27         gtk_box_pack_start(GTK_BOX(vbox), alignment, TRUE, TRUE, 0);
28         gtk_widget_show(alignment);
29         lv2ui_instantiate(alignment);
30         GtkWidget* widget = (GtkWidget*)suil_instance_get_widget(sinst);
31         gtk_container_add(GTK_CONTAINER(alignment), widget);
32         gtk_window_set_resizable(GTK_WINDOW(window), lv2ui_resizable());
33         gtk_widget_show_all(vbox);
34         gtk_widget_grab_focus(widget);
35
36         gtk_window_present(GTK_WINDOW(window));
37         running = -1;
38 }
39
40 void PluginLV2GUI::stop()
41 {
42         running = 0;
43 }
44
45 void PluginLV2GUI::host_update(PluginLV2ChildGUI *child)
46 {
47 //printf("update\n");
48         last = updates;
49         if( !child ) return;
50 // ignore reset update
51         if( child->lv2_gui->running < 0 ) { child->lv2_gui->running = 1;  return; }
52         child->send_parent(LV2_UPDATE, config.ctls, sizeof(float)*config.nb_ports);
53 }
54
55 void PluginLV2GUI::run_gui(PluginLV2ChildGUI *child)
56 {
57         while( !done ) {
58                 if( gtk_events_pending() ) {
59                         gtk_main_iteration();
60                         continue;
61                 }
62                 if( running && updates != last )
63                         host_update(child);
64                 if( redraw ) {
65                         redraw = 0;
66                         update_lv2(config.ctls, 1);
67                 }
68                 if( !child ) usleep(10000);
69                 else if( child->child_iteration() < 0 )
70                         done = 1;
71         }
72 }
73
74 int PluginLV2ChildGUI::handle_child()
75 {
76         if( !lv2_gui ) return 0;
77
78         switch( child_token ) {
79         case LV2_OPEN: {
80                 char *path = (char *)child_data;
81                 if( lv2_gui->init_gui(path) ) exit(1);
82                 break; }
83         case LV2_LOAD: {
84                 lv2_gui->update_lv2((float*)child_data, 1);
85                 break; }
86         case LV2_UPDATE: {
87                 lv2_gui->update_lv2((float*)child_data, 0);
88                 break; }
89         case LV2_START: {
90                 lv2_gui->start();
91                 break; }
92         case LV2_SET: {
93                 if( !lv2_gui ) break;
94                 control_t *bfr = (control_t *)child_data;
95                 lv2_gui->config.ctls[bfr->idx] = bfr->value;
96                 lv2_gui->redraw = 1;
97                 break; }
98         case EXIT_CODE:
99                 return -1;
100         default:
101                 return 0;
102         }
103         return 1;
104 }
105
106 int PluginLV2GUI::run(int ac, char **av)
107 {
108         if( ac < 3 ) {
109                 if( init_gui(av[1]) ) {
110                         fprintf(stderr," init_ui failed\n");
111                         return 1;
112                 }
113                 start();
114                 run_gui();
115                 stop();
116         }
117         else {
118                 PluginLV2ChildGUI child;
119                 child.lv2_gui = this;
120                 child.child_fd = atoi(av[1]);
121                 child.parent_fd = atoi(av[2]);
122                 run_gui(&child);
123                 stop();
124                 child.lv2_gui = 0;
125         }
126         return 0;
127 }
128
129 int main(int ac, char **av)
130 {
131         BC_Signals signals;
132         if( getenv("BC_TRAP_LV2_SEGV") ) {
133                 signals.initialize("/tmp/lv2ui_%d.dmp");
134                 BC_Signals::set_catch_segv(1);
135         }
136         gtk_set_locale();
137         gtk_init(&ac, &av);
138 // to grab this task in the debugger
139 //static int zbug = 1;  volatile int bug = zbug;
140 //while( bug ) usleep(10000);
141         return PluginLV2GUI().run(ac, av);
142 }
143