1 /*
2 
3     This LV2 extension provides compressor gui's
4 
5     (c) Fraser Stuart 2009
6 
7     This program is free software; you can redistribute it and/or modify
8     it under the terms of the GNU General Public License as published by
9     the Free Software Foundation; either version 2 of the License, or
10     (at your option) any later version.
11 
12     This program is distributed in the hope that it will be useful,
13     but WITHOUT ANY WARRANTY; without even the implied warranty of
14     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15     GNU General Public License for more details.
16 
17     You should have received a copy of the GNU General Public License
18     along with this program; if not, write to the Free Software
19     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 
21 */
22 
23 #include <stdlib.h>
24 #include <string.h>
25 #include <math.h>
26 #include <gtk/gtk.h>
27 #include <lv2.h>
28 #include "lv2_ui.h"
29 #include "widgets/widgets.h"
30 #include "widgets/display-Compressor.h"
31 #include "widgets/knob.h"
32 #include "widgets/lamp.h"
33 #include "widgets/meter-peak.h"
34 #include "widgets/switch-toggle.h"
35 #include "../plugin/inv_compressor.h"
36 #include "inv_compressor_gui.h"
37 
38 
39 static LV2UI_Descriptor *ICompGuiDescriptor = NULL;
40 
41 typedef struct {
42 	GtkWidget	*windowContainer;
43 	GtkWidget	*heading;
44 	GtkWidget	*toggleBypass;
45 	GtkWidget	*meterIn;
46 	GtkWidget	*meterGR;
47 	GtkWidget	*meterOut;
48 	GtkWidget	*display;
49 	GtkWidget	*knobRms;
50 	GtkWidget	*knobAttack;
51 	GtkWidget	*knobRelease;
52 	GtkWidget	*knobThreshold;
53 	GtkWidget	*knobRatio;
54 	GtkWidget	*knobGain;
55 	GtkWidget	*toggleNoClip;
56 	GtkWidget	*lampNoClip;
57 
58 	gint		InChannels;
59 	gint		GRChannels;
60 	gint		OutChannels;
61 	float 		bypass;
62 	float		rms;
63 	float		attack;
64 	float		release;
65 	float		threshold;
66 	float		ratio;
67 	float		gain;
68 	float 		noClip;
69 
70 	LV2UI_Write_Function 	write_function;
71 	LV2UI_Controller 	controller;
72 
73 } ICompGui;
74 
75 
76 
instantiateICompGui(const struct _LV2UI_Descriptor * descriptor,const char * plugin_uri,const char * bundle_path,LV2UI_Write_Function write_function,LV2UI_Controller controller,LV2UI_Widget * widget,const LV2_Feature * const * features)77 static LV2UI_Handle instantiateICompGui(const struct _LV2UI_Descriptor* descriptor, const char* plugin_uri, const char* bundle_path, LV2UI_Write_Function write_function, LV2UI_Controller controller, LV2UI_Widget* widget, const LV2_Feature* const* features)
78 {
79 	ICompGui *pluginGui = (ICompGui *)malloc(sizeof(ICompGui));
80 	if(pluginGui==NULL)
81 		return NULL;
82 
83 	pluginGui->write_function = write_function;
84 	pluginGui->controller = controller;
85 
86 	GtkBuilder      *builder;
87 	GtkWidget       *window;
88 	GtkWidget	*tempObject;
89 
90 	char 		*file;
91 
92 	GError *err = NULL;
93 
94 	gtk_init (NULL,NULL);
95 
96 	builder = gtk_builder_new ();
97 	file = g_strdup_printf("%s/gtk/inv_compressor_gui.xml",bundle_path);
98 	gtk_builder_add_from_file (builder, file, &err);
99 	free(file);
100 
101 	window = GTK_WIDGET (gtk_builder_get_object (builder, "comp_window"));
102 
103 	/* get pointers to some useful widgets from the design */
104 	pluginGui->windowContainer = GTK_WIDGET (gtk_builder_get_object (builder, "comp_container"));
105 	pluginGui->heading = GTK_WIDGET (gtk_builder_get_object (builder, "label_heading"));
106 
107 	/* add custom widgets */
108 	tempObject=GTK_WIDGET (gtk_builder_get_object (builder, "alignment_bypass_toggle"));
109 	pluginGui->toggleBypass = inv_switch_toggle_new ();
110 	gtk_container_add (GTK_CONTAINER (tempObject), pluginGui->toggleBypass);
111 
112 	tempObject=GTK_WIDGET (gtk_builder_get_object (builder, "alignment_meter_in"));
113 	pluginGui->meterIn = inv_meter_new ();
114 	gtk_container_add (GTK_CONTAINER (tempObject), pluginGui->meterIn);
115 
116 	tempObject=GTK_WIDGET (gtk_builder_get_object (builder, "alignment_meter_gr"));
117 	pluginGui->meterGR = inv_meter_new ();
118 	gtk_container_add (GTK_CONTAINER (tempObject), pluginGui->meterGR);
119 
120 	tempObject=GTK_WIDGET (gtk_builder_get_object (builder, "alignment_meter_out"));
121 	pluginGui->meterOut = inv_meter_new ();
122 	gtk_container_add (GTK_CONTAINER (tempObject), pluginGui->meterOut);
123 
124 	tempObject=GTK_WIDGET (gtk_builder_get_object (builder, "alignment_comp_display"));
125 	pluginGui->display = inv_display_comp_new ();
126 	gtk_container_add (GTK_CONTAINER (tempObject), pluginGui->display);
127 
128 	tempObject=GTK_WIDGET (gtk_builder_get_object (builder, "alignment_rms_knob"));
129 	pluginGui->knobRms = inv_knob_new ();
130 	gtk_container_add (GTK_CONTAINER (tempObject), pluginGui->knobRms);
131 
132 	tempObject=GTK_WIDGET (gtk_builder_get_object (builder, "alignment_attack_knob"));
133 	pluginGui->knobAttack = inv_knob_new ();
134 	gtk_container_add (GTK_CONTAINER (tempObject), pluginGui->knobAttack);
135 
136 	tempObject=GTK_WIDGET (gtk_builder_get_object (builder, "alignment_release_knob"));
137 	pluginGui->knobRelease = inv_knob_new ();
138 	gtk_container_add (GTK_CONTAINER (tempObject), pluginGui->knobRelease);
139 
140 	tempObject=GTK_WIDGET (gtk_builder_get_object (builder, "alignment_threshold_knob"));
141 	pluginGui->knobThreshold = inv_knob_new ();
142 	gtk_container_add (GTK_CONTAINER (tempObject), pluginGui->knobThreshold);
143 
144 	tempObject=GTK_WIDGET (gtk_builder_get_object (builder, "alignment_ratio_knob"));
145 	pluginGui->knobRatio = inv_knob_new ();
146 	gtk_container_add (GTK_CONTAINER (tempObject), pluginGui->knobRatio);
147 
148 	tempObject=GTK_WIDGET (gtk_builder_get_object (builder, "alignment_makeupgain_knob"));
149 	pluginGui->knobGain = inv_knob_new ();
150 	gtk_container_add (GTK_CONTAINER (tempObject), pluginGui->knobGain);
151 
152 	tempObject=GTK_WIDGET (gtk_builder_get_object (builder, "alignment_noclip_toggle"));
153 	pluginGui->toggleNoClip = inv_switch_toggle_new ();
154 	gtk_container_add (GTK_CONTAINER (tempObject), pluginGui->toggleNoClip);
155 
156 	tempObject=GTK_WIDGET (gtk_builder_get_object (builder, "alignment_noclip_lamp"));
157 	pluginGui->lampNoClip = inv_lamp_new ();
158 	gtk_container_add (GTK_CONTAINER (tempObject), pluginGui->lampNoClip);
159 
160 	/* customise for the plugin */
161 	if(!strcmp(plugin_uri,ICOMP_MONO_URI))
162 	{
163 		pluginGui->InChannels=1;
164 		pluginGui->OutChannels=1;
165 		gtk_label_set_markup (GTK_LABEL (pluginGui->heading), "<b>Invada Compressor (mono)</b>");
166 	}
167 	if(!strcmp(plugin_uri,ICOMP_STEREO_URI))
168 	{
169 		pluginGui->InChannels=2;
170 		pluginGui->OutChannels=2;
171 		gtk_label_set_markup (GTK_LABEL (pluginGui->heading), "<b>Invada Compressor (stereo)</b>");
172 	}
173 
174 	pluginGui->GRChannels	= 1;
175 	pluginGui->bypass	= 0.0;
176 	pluginGui->rms		= 0.5;
177 	pluginGui->attack	= 0.015;
178 	pluginGui->release	= 0.050;
179 	pluginGui->threshold	= 0.0;
180 	pluginGui->ratio	= 1.0;
181 	pluginGui->gain		= 0.0;
182 	pluginGui->noClip	= 0.0;
183 
184 	inv_switch_toggle_set_bypass( INV_SWITCH_TOGGLE (pluginGui->toggleBypass), INV_PLUGIN_ACTIVE);
185 	inv_switch_toggle_set_value( INV_SWITCH_TOGGLE (pluginGui->toggleBypass), INV_SWITCH_TOGGLE_OFF, 0.0);
186 	inv_switch_toggle_set_colour(INV_SWITCH_TOGGLE (pluginGui->toggleBypass), INV_SWITCH_TOGGLE_OFF, 0.0, 1.0, 0.0);
187 	inv_switch_toggle_set_text(  INV_SWITCH_TOGGLE (pluginGui->toggleBypass), INV_SWITCH_TOGGLE_OFF, "Active");
188 	inv_switch_toggle_set_value( INV_SWITCH_TOGGLE (pluginGui->toggleBypass), INV_SWITCH_TOGGLE_ON,  1.0);
189 	inv_switch_toggle_set_colour(INV_SWITCH_TOGGLE (pluginGui->toggleBypass), INV_SWITCH_TOGGLE_ON,  1.0, 0.0, 0.0);
190 	inv_switch_toggle_set_text(  INV_SWITCH_TOGGLE (pluginGui->toggleBypass), INV_SWITCH_TOGGLE_ON,  "Bypassed");
191 	inv_switch_toggle_set_state( INV_SWITCH_TOGGLE (pluginGui->toggleBypass), INV_SWITCH_TOGGLE_OFF);
192 	inv_switch_toggle_set_tooltip(INV_SWITCH_TOGGLE (pluginGui->toggleBypass), "<span size=\"8000\"><b>Description:</b> This switch bypasses the plugin.\n<b>Usage:</b> Click to toggle between values.</span>");
193 	g_signal_connect_after(G_OBJECT(pluginGui->toggleBypass),"button-release-event",G_CALLBACK(on_inv_comp_bypass_toggle_button_release),pluginGui);
194 
195 	inv_meter_set_bypass(INV_METER (pluginGui->meterIn),INV_PLUGIN_ACTIVE);
196 	inv_meter_set_mode(INV_METER (pluginGui->meterIn), INV_METER_DRAW_MODE_TOZERO);
197 	inv_meter_set_channels(INV_METER (pluginGui->meterIn), pluginGui->InChannels);
198 	inv_meter_set_LdB(INV_METER (pluginGui->meterIn),-90);
199 	inv_meter_set_RdB(INV_METER (pluginGui->meterIn),-90);
200 
201 	inv_meter_set_bypass(INV_METER (pluginGui->meterGR),INV_PLUGIN_ACTIVE);
202 	inv_meter_set_mode(INV_METER (pluginGui->meterGR), INV_METER_DRAW_MODE_FROMZERO);
203 	inv_meter_set_channels(INV_METER (pluginGui->meterGR), pluginGui->GRChannels);
204 	inv_meter_set_LdB(INV_METER (pluginGui->meterGR),0);
205 
206 	inv_meter_set_bypass(INV_METER (pluginGui->meterOut),INV_PLUGIN_ACTIVE);
207 	inv_meter_set_mode(INV_METER (pluginGui->meterOut), INV_METER_DRAW_MODE_TOZERO);
208 	inv_meter_set_channels(INV_METER (pluginGui->meterOut), pluginGui->OutChannels);
209 	inv_meter_set_LdB(INV_METER (pluginGui->meterOut),-90);
210 	inv_meter_set_RdB(INV_METER (pluginGui->meterOut),-90);
211 
212 	inv_display_comp_set_bypass(INV_DISPLAY_COMP (pluginGui->display), INV_PLUGIN_ACTIVE);
213 	inv_display_comp_set_rms(INV_DISPLAY_COMP (pluginGui->display), pluginGui->rms);
214 	inv_display_comp_set_attack(INV_DISPLAY_COMP (pluginGui->display), pluginGui->attack);
215 	inv_display_comp_set_release(INV_DISPLAY_COMP (pluginGui->display), pluginGui->release);
216 	inv_display_comp_set_threshold(INV_DISPLAY_COMP (pluginGui->display), pluginGui->threshold);
217 	inv_display_comp_set_ratio(INV_DISPLAY_COMP (pluginGui->display), pluginGui->ratio);
218 	inv_display_comp_set_gain(INV_DISPLAY_COMP (pluginGui->display), pluginGui->gain);
219 
220 	inv_knob_set_bypass(INV_KNOB (pluginGui->knobRms),   INV_PLUGIN_ACTIVE);
221 	inv_knob_set_size(INV_KNOB (pluginGui->knobRms), INV_KNOB_SIZE_MEDIUM);
222 	inv_knob_set_curve(INV_KNOB (pluginGui->knobRms), INV_KNOB_CURVE_LINEAR);
223 	inv_knob_set_markings(INV_KNOB (pluginGui->knobRms), INV_KNOB_MARKINGS_CUST10);
224 	inv_knob_set_units(INV_KNOB (pluginGui->knobRms), "");
225 	inv_knob_set_custom(INV_KNOB (pluginGui->knobRms), 0, "Peak");
226 	inv_knob_set_custom(INV_KNOB (pluginGui->knobRms), 1, "Fast RMS");
227 	inv_knob_set_custom(INV_KNOB (pluginGui->knobRms), 2, "RMS");
228 	inv_knob_set_min(INV_KNOB (pluginGui->knobRms), 0.0);
229 	inv_knob_set_max(INV_KNOB (pluginGui->knobRms), 1.0);
230 	inv_knob_set_value(INV_KNOB (pluginGui->knobRms), pluginGui->rms);
231 	inv_knob_set_tooltip(INV_KNOB (pluginGui->knobRms), "<span size=\"8000\"><b>Description:</b> This knob controls the smoothing on the input signal the compressor performs.\n<b>Usage:</b> Click and drag vertically to change value, hortizontally to change the sensitvity.</span>");
232 	g_signal_connect_after(G_OBJECT(pluginGui->knobRms),"motion-notify-event",G_CALLBACK(on_inv_comp_rms_knob_motion),pluginGui);
233 
234 	inv_knob_set_bypass(INV_KNOB (pluginGui->knobAttack),   INV_PLUGIN_ACTIVE);
235 	inv_knob_set_size(INV_KNOB (pluginGui->knobAttack), INV_KNOB_SIZE_MEDIUM);
236 	inv_knob_set_curve(INV_KNOB (pluginGui->knobAttack), INV_KNOB_CURVE_LOG);
237 	inv_knob_set_markings(INV_KNOB (pluginGui->knobAttack), INV_KNOB_MARKINGS_5);
238 	inv_knob_set_human(INV_KNOB (pluginGui->knobAttack));
239 	inv_knob_set_units(INV_KNOB (pluginGui->knobAttack), "s");
240 	inv_knob_set_min(INV_KNOB (pluginGui->knobAttack), 0.00001);
241 	inv_knob_set_max(INV_KNOB (pluginGui->knobAttack), 0.750);
242 	inv_knob_set_value(INV_KNOB (pluginGui->knobAttack), pluginGui->attack);
243 	inv_knob_set_tooltip(INV_KNOB (pluginGui->knobAttack), "<span size=\"8000\"><b>Description:</b> This knob sets the attack of the envelope which controls how well the compressor follows rising signals.\n<b>Usage:</b> Click and drag vertically to change value, hortizontally to change the sensitvity.</span>");
244 	g_signal_connect_after(G_OBJECT(pluginGui->knobAttack),"motion-notify-event",G_CALLBACK(on_inv_comp_attack_knob_motion),pluginGui);
245 
246 	inv_knob_set_bypass(INV_KNOB (pluginGui->knobRelease),   INV_PLUGIN_ACTIVE);
247 	inv_knob_set_size(INV_KNOB (pluginGui->knobRelease), INV_KNOB_SIZE_MEDIUM);
248 	inv_knob_set_curve(INV_KNOB (pluginGui->knobRelease), INV_KNOB_CURVE_LOG);
249 	inv_knob_set_markings(INV_KNOB (pluginGui->knobRelease), INV_KNOB_MARKINGS_5);
250 	inv_knob_set_human(INV_KNOB (pluginGui->knobRelease));
251 	inv_knob_set_units(INV_KNOB (pluginGui->knobRelease), "s");
252 	inv_knob_set_min(INV_KNOB (pluginGui->knobRelease), 0.001);
253 	inv_knob_set_max(INV_KNOB (pluginGui->knobRelease), 5.0);
254 	inv_knob_set_value(INV_KNOB (pluginGui->knobRelease), pluginGui->release);
255 	inv_knob_set_tooltip(INV_KNOB (pluginGui->knobRelease), "<span size=\"8000\"><b>Description:</b> This knob sets the release of the envelope which controls how well the compressor follows falling signals.\n<b>Usage:</b> Click and drag vertically to change value, hortizontally to change the sensitvity.</span>");
256 	g_signal_connect_after(G_OBJECT(pluginGui->knobRelease),"motion-notify-event",G_CALLBACK(on_inv_comp_release_knob_motion),pluginGui);
257 
258 	inv_knob_set_bypass(INV_KNOB (pluginGui->knobThreshold),   INV_PLUGIN_ACTIVE);
259 	inv_knob_set_size(INV_KNOB (pluginGui->knobThreshold), INV_KNOB_SIZE_MEDIUM);
260 	inv_knob_set_curve(INV_KNOB (pluginGui->knobThreshold), INV_KNOB_CURVE_LINEAR);
261 	inv_knob_set_markings(INV_KNOB (pluginGui->knobThreshold), INV_KNOB_MARKINGS_5);
262 	inv_knob_set_highlight(INV_KNOB (pluginGui->knobThreshold), INV_KNOB_HIGHLIGHT_L);
263 	inv_knob_set_units(INV_KNOB (pluginGui->knobThreshold), "dB");
264 	inv_knob_set_min(INV_KNOB (pluginGui->knobThreshold), -36.0);
265 	inv_knob_set_max(INV_KNOB (pluginGui->knobThreshold), 0.0);
266 	inv_knob_set_value(INV_KNOB (pluginGui->knobThreshold), pluginGui->threshold);
267 	inv_knob_set_tooltip(INV_KNOB (pluginGui->knobThreshold), "<span size=\"8000\"><b>Description:</b> This knob sets the threshold at which the compressor starts affecting the signal.\n<b>Usage:</b> Click and drag vertically to change value, hortizontally to change the sensitvity.</span>");
268 	g_signal_connect_after(G_OBJECT(pluginGui->knobThreshold),"motion-notify-event",G_CALLBACK(on_inv_comp_threshold_knob_motion),pluginGui);
269 
270 	inv_knob_set_bypass(INV_KNOB (pluginGui->knobRatio),   INV_PLUGIN_ACTIVE);
271 	inv_knob_set_size(INV_KNOB (pluginGui->knobRatio), INV_KNOB_SIZE_MEDIUM);
272 	inv_knob_set_curve(INV_KNOB (pluginGui->knobRatio), INV_KNOB_CURVE_LINEAR);
273 	inv_knob_set_markings(INV_KNOB (pluginGui->knobRatio), INV_KNOB_MARKINGS_5);
274 	inv_knob_set_highlight(INV_KNOB (pluginGui->knobRatio), INV_KNOB_HIGHLIGHT_L);
275 	inv_knob_set_units(INV_KNOB (pluginGui->knobRatio), ":1");
276 	inv_knob_set_min(INV_KNOB (pluginGui->knobRatio), 1.0);
277 	inv_knob_set_max(INV_KNOB (pluginGui->knobRatio), 20.0);
278 	inv_knob_set_value(INV_KNOB (pluginGui->knobRatio), pluginGui->ratio);
279 	inv_knob_set_tooltip(INV_KNOB (pluginGui->knobRatio), "<span size=\"8000\"><b>Description:</b> This knob sets the compression ratio for signals that have exceeded the threshold.\n<b>Usage:</b> Click and drag vertically to change value, hortizontally to change the sensitvity.</span>");
280 	g_signal_connect_after(G_OBJECT(pluginGui->knobRatio),"motion-notify-event",G_CALLBACK(on_inv_comp_ratio_knob_motion),pluginGui);
281 
282 	inv_knob_set_bypass(INV_KNOB (pluginGui->knobGain),   INV_PLUGIN_ACTIVE);
283 	inv_knob_set_size(INV_KNOB (pluginGui->knobGain), INV_KNOB_SIZE_MEDIUM);
284 	inv_knob_set_curve(INV_KNOB (pluginGui->knobGain), INV_KNOB_CURVE_LINEAR);
285 	inv_knob_set_markings(INV_KNOB (pluginGui->knobGain), INV_KNOB_MARKINGS_5);
286 	inv_knob_set_highlight(INV_KNOB (pluginGui->knobGain), INV_KNOB_HIGHLIGHT_L);
287 	inv_knob_set_units(INV_KNOB (pluginGui->knobGain), "dB");
288 	inv_knob_set_min(INV_KNOB (pluginGui->knobGain), -6.0);
289 	inv_knob_set_max(INV_KNOB (pluginGui->knobGain), 36.0);
290 	inv_knob_set_value(INV_KNOB (pluginGui->knobGain), pluginGui->gain);
291 	inv_knob_set_tooltip(INV_KNOB (pluginGui->knobGain), "<span size=\"8000\"><b>Description:</b> This knob sets the output or markup gain of the compressor.\n<b>Usage:</b> Click and drag vertically to change value, hortizontally to change the sensitvity.</span>");
292 	g_signal_connect_after(G_OBJECT(pluginGui->knobGain),"motion-notify-event",G_CALLBACK(on_inv_comp_gain_knob_motion),pluginGui);
293 
294 	inv_switch_toggle_set_bypass( INV_SWITCH_TOGGLE (pluginGui->toggleNoClip), INV_PLUGIN_ACTIVE);
295 	inv_switch_toggle_set_value( INV_SWITCH_TOGGLE (pluginGui->toggleNoClip), INV_SWITCH_TOGGLE_OFF, 0.0);
296 	inv_switch_toggle_set_colour(INV_SWITCH_TOGGLE (pluginGui->toggleNoClip), INV_SWITCH_TOGGLE_OFF, 0.0, 1.0, 0.0);
297 	inv_switch_toggle_set_text(  INV_SWITCH_TOGGLE (pluginGui->toggleNoClip), INV_SWITCH_TOGGLE_OFF, "Off");
298 	inv_switch_toggle_set_value( INV_SWITCH_TOGGLE (pluginGui->toggleNoClip), INV_SWITCH_TOGGLE_ON,  1.0);
299 	inv_switch_toggle_set_colour(INV_SWITCH_TOGGLE (pluginGui->toggleNoClip), INV_SWITCH_TOGGLE_ON,  0.0, 1.0, 0.0);
300 	inv_switch_toggle_set_text(  INV_SWITCH_TOGGLE (pluginGui->toggleNoClip), INV_SWITCH_TOGGLE_ON,  "Active");
301 	inv_switch_toggle_set_state( INV_SWITCH_TOGGLE (pluginGui->toggleNoClip), INV_SWITCH_TOGGLE_ON);
302 	inv_switch_toggle_set_tooltip(INV_SWITCH_TOGGLE (pluginGui->toggleNoClip), "<span size=\"8000\"><b>Description:</b> This switch activates soft-clipping on the output. The soft clipping function outputs a value between -3dB and 0dB for input values between -3dB and +infinity.\n<b>Usage:</b> Click to toggle between values.</span>");
303 	g_signal_connect_after(G_OBJECT(pluginGui->toggleNoClip),"button-release-event",G_CALLBACK(on_inv_comp_noClip_toggle_button_release),pluginGui);
304 
305 	inv_lamp_set_value(INV_LAMP (pluginGui->lampNoClip),0.0);
306 	inv_lamp_set_scale(INV_LAMP (pluginGui->lampNoClip),3.0);
307 	inv_lamp_set_tooltip(INV_LAMP (pluginGui->lampNoClip), "<span size=\"8000\">This glows when soft clipping is occurring.</span>");
308 
309 	/* strip the parent window from the design so the host can attach its own */
310 	gtk_widget_ref(pluginGui->windowContainer);
311 	gtk_container_remove(GTK_CONTAINER(window), pluginGui->windowContainer);
312 
313 	*widget = (LV2UI_Widget) pluginGui->windowContainer;
314 
315 	g_object_unref (G_OBJECT (builder));
316 
317 	/* return the instance */
318 	return pluginGui;
319 }
320 
321 
cleanupICompGui(LV2UI_Handle ui)322 static void cleanupICompGui(LV2UI_Handle ui)
323 {
324 	return;
325 }
326 
327 
port_eventICompGui(LV2UI_Handle ui,uint32_t port,uint32_t buffer_size,uint32_t format,const void * buffer)328 static void port_eventICompGui(LV2UI_Handle ui, uint32_t port, uint32_t buffer_size, uint32_t format, const void*  buffer)
329 {
330 	ICompGui *pluginGui = (ICompGui *)ui;
331 
332 	float value;
333 
334 	if(format==0)
335 	{
336 		value=* (float *) buffer;
337 		switch(port)
338 		{
339 			case ICOMP_BYPASS:
340 				pluginGui->bypass=value;
341 				if(value <= 0.0) {
342 					inv_switch_toggle_set_state(INV_SWITCH_TOGGLE (pluginGui->toggleBypass), INV_SWITCH_TOGGLE_OFF);
343 					inv_meter_set_bypass(         INV_METER         (pluginGui->meterIn),      INV_PLUGIN_ACTIVE);
344 					inv_meter_set_bypass(         INV_METER         (pluginGui->meterGR),      INV_PLUGIN_ACTIVE);
345 					inv_meter_set_bypass(         INV_METER         (pluginGui->meterOut),     INV_PLUGIN_ACTIVE);
346 					inv_display_comp_set_bypass(  INV_DISPLAY_COMP  (pluginGui->display),      INV_PLUGIN_ACTIVE);
347 					inv_knob_set_bypass(          INV_KNOB          (pluginGui->knobRms),      INV_PLUGIN_ACTIVE);
348 					inv_knob_set_bypass(          INV_KNOB          (pluginGui->knobAttack),   INV_PLUGIN_ACTIVE);
349 					inv_knob_set_bypass(          INV_KNOB          (pluginGui->knobRelease),  INV_PLUGIN_ACTIVE);
350 					inv_knob_set_bypass(          INV_KNOB          (pluginGui->knobThreshold),INV_PLUGIN_ACTIVE);
351 					inv_knob_set_bypass(          INV_KNOB          (pluginGui->knobRatio),    INV_PLUGIN_ACTIVE);
352 					inv_knob_set_bypass(          INV_KNOB          (pluginGui->knobGain),     INV_PLUGIN_ACTIVE);
353 					inv_switch_toggle_set_bypass( INV_SWITCH_TOGGLE (pluginGui->toggleNoClip), INV_PLUGIN_ACTIVE);
354 				} else {
355 					inv_switch_toggle_set_state(INV_SWITCH_TOGGLE (pluginGui->toggleBypass), INV_SWITCH_TOGGLE_ON);
356 					inv_meter_set_bypass(         INV_METER         (pluginGui->meterIn),      INV_PLUGIN_BYPASS);
357 					inv_meter_set_bypass(         INV_METER         (pluginGui->meterGR),      INV_PLUGIN_BYPASS);
358 					inv_meter_set_bypass(         INV_METER         (pluginGui->meterOut),     INV_PLUGIN_BYPASS);
359 					inv_display_comp_set_bypass(  INV_DISPLAY_COMP  (pluginGui->display),      INV_PLUGIN_BYPASS);
360 					inv_knob_set_bypass(          INV_KNOB          (pluginGui->knobRms),      INV_PLUGIN_BYPASS);
361 					inv_knob_set_bypass(          INV_KNOB          (pluginGui->knobAttack),   INV_PLUGIN_BYPASS);
362 					inv_knob_set_bypass(          INV_KNOB          (pluginGui->knobRelease),  INV_PLUGIN_BYPASS);
363 					inv_knob_set_bypass(          INV_KNOB          (pluginGui->knobThreshold),INV_PLUGIN_BYPASS);
364 					inv_knob_set_bypass(          INV_KNOB          (pluginGui->knobRatio),    INV_PLUGIN_BYPASS);
365 					inv_knob_set_bypass(          INV_KNOB          (pluginGui->knobGain),     INV_PLUGIN_BYPASS);
366 					inv_switch_toggle_set_bypass( INV_SWITCH_TOGGLE (pluginGui->toggleNoClip), INV_PLUGIN_BYPASS);
367 				}
368 				gtk_widget_queue_draw (pluginGui->windowContainer);
369 				break;
370 			case ICOMP_RMS:
371 				pluginGui->rms=value;
372 				inv_knob_set_value(INV_KNOB (pluginGui->knobRms), pluginGui->rms);
373 				inv_display_comp_set_rms(INV_DISPLAY_COMP (pluginGui->display), pluginGui->rms);
374 				break;
375 			case ICOMP_ATTACK:
376 				pluginGui->attack=value;
377 				inv_knob_set_value(INV_KNOB (pluginGui->knobAttack), pluginGui->attack);
378 				inv_display_comp_set_attack(INV_DISPLAY_COMP (pluginGui->display), pluginGui->attack);
379 				break;
380 			case ICOMP_RELEASE:
381 				pluginGui->release=value;
382 				inv_knob_set_value(INV_KNOB (pluginGui->knobRelease), pluginGui->release);
383 				inv_display_comp_set_release(INV_DISPLAY_COMP (pluginGui->display), pluginGui->release);
384 				break;
385 			case ICOMP_THRESH:
386 				pluginGui->threshold=value;
387 				inv_knob_set_value(INV_KNOB (pluginGui->knobThreshold), pluginGui->threshold);
388 				inv_display_comp_set_threshold(INV_DISPLAY_COMP (pluginGui->display), pluginGui->threshold);
389 				break;
390 			case ICOMP_RATIO:
391 				pluginGui->ratio=value;
392 				inv_knob_set_value(INV_KNOB (pluginGui->knobRatio), pluginGui->ratio);
393 				inv_display_comp_set_ratio(INV_DISPLAY_COMP (pluginGui->display), pluginGui->ratio);
394 				break;
395 			case ICOMP_GAIN:
396 				pluginGui->gain=value;
397 				inv_knob_set_value(INV_KNOB (pluginGui->knobGain), pluginGui->gain);
398 				inv_display_comp_set_gain(INV_DISPLAY_COMP (pluginGui->display), pluginGui->gain);
399 				break;
400 			case ICOMP_NOCLIP:
401 				pluginGui->noClip=value;
402 				if(value <= 0.0) {
403 					inv_switch_toggle_set_state(INV_SWITCH_TOGGLE (pluginGui->toggleNoClip), INV_SWITCH_TOGGLE_OFF);
404 				} else {
405 					inv_switch_toggle_set_state(INV_SWITCH_TOGGLE (pluginGui->toggleNoClip), INV_SWITCH_TOGGLE_ON);
406 				}
407 				break;
408 			case ICOMP_METER_GR:
409 				inv_meter_set_LdB(INV_METER (pluginGui->meterGR),value);
410 				break;
411 			case ICOMP_METER_INL:
412 				inv_meter_set_LdB(INV_METER (pluginGui->meterIn),value);
413 				break;
414 			case ICOMP_METER_INR:
415 				if(pluginGui->InChannels==2) inv_meter_set_RdB(INV_METER (pluginGui->meterIn),value);
416 				break;
417 			case ICOMP_METER_OUTL:
418 				inv_meter_set_LdB(INV_METER (pluginGui->meterOut),value);
419 				break;
420 			case ICOMP_METER_OUTR:
421 				if(pluginGui->OutChannels==2) inv_meter_set_RdB(INV_METER (pluginGui->meterOut),value);
422 				break;
423 			case ICOMP_METER_DRIVE:
424 				inv_lamp_set_value(INV_LAMP (pluginGui->lampNoClip),value);
425 				break;
426 		}
427 	}
428 }
429 
430 
init()431 static void init()
432 {
433 	ICompGuiDescriptor =
434 	 (LV2UI_Descriptor *)malloc(sizeof(LV2UI_Descriptor));
435 
436 	ICompGuiDescriptor->URI 		= ICOMP_GUI_URI;
437 	ICompGuiDescriptor->instantiate 	= instantiateICompGui;
438 	ICompGuiDescriptor->cleanup		= cleanupICompGui;
439 	ICompGuiDescriptor->port_event	= port_eventICompGui;
440 	ICompGuiDescriptor->extension_data 	= NULL;
441 
442 }
443 
444 
lv2ui_descriptor(uint32_t index)445 const LV2UI_Descriptor* lv2ui_descriptor(uint32_t index)
446 {
447 	if (!ICompGuiDescriptor) init();
448 
449 	switch (index) {
450 		case 0:
451 			return ICompGuiDescriptor;
452 	default:
453 		return NULL;
454 	}
455 }
456 
457 
458 /*****************************************************************************/
459 
460 static void
on_inv_comp_bypass_toggle_button_release(GtkWidget * widget,GdkEvent * event,gpointer data)461 on_inv_comp_bypass_toggle_button_release(GtkWidget *widget, GdkEvent *event, gpointer data)
462 {
463 
464 	ICompGui *pluginGui = (ICompGui *) data;
465 
466 	pluginGui->bypass=inv_switch_toggle_get_value(INV_SWITCH_TOGGLE (widget));
467 	(*pluginGui->write_function)(pluginGui->controller, ICOMP_BYPASS, 4, 0, &pluginGui->bypass);
468 	return;
469 }
470 
471 
on_inv_comp_rms_knob_motion(GtkWidget * widget,GdkEvent * event,gpointer data)472 static void on_inv_comp_rms_knob_motion(GtkWidget *widget, GdkEvent *event, gpointer data)
473 {
474 	ICompGui *pluginGui = (ICompGui *) data;
475 
476 	pluginGui->rms=inv_knob_get_value(INV_KNOB (widget));
477 	(*pluginGui->write_function)(pluginGui->controller, ICOMP_RMS, 4, 0, &pluginGui->rms);
478 	return;
479 }
480 
on_inv_comp_attack_knob_motion(GtkWidget * widget,GdkEvent * event,gpointer data)481 static void on_inv_comp_attack_knob_motion(GtkWidget *widget, GdkEvent *event, gpointer data)
482 {
483 	ICompGui *pluginGui = (ICompGui *) data;
484 
485 	pluginGui->attack=inv_knob_get_value(INV_KNOB (widget));
486 	(*pluginGui->write_function)(pluginGui->controller, ICOMP_ATTACK, 4, 0, &pluginGui->attack);
487 	return;
488 }
489 
on_inv_comp_release_knob_motion(GtkWidget * widget,GdkEvent * event,gpointer data)490 static void on_inv_comp_release_knob_motion(GtkWidget *widget, GdkEvent *event, gpointer data)
491 {
492 	ICompGui *pluginGui = (ICompGui *) data;
493 
494 	pluginGui->release=inv_knob_get_value(INV_KNOB (widget));
495 	(*pluginGui->write_function)(pluginGui->controller, ICOMP_RELEASE, 4, 0, &pluginGui->release);
496 	return;
497 }
498 
on_inv_comp_threshold_knob_motion(GtkWidget * widget,GdkEvent * event,gpointer data)499 static void on_inv_comp_threshold_knob_motion(GtkWidget *widget, GdkEvent *event, gpointer data)
500 {
501 	ICompGui *pluginGui = (ICompGui *) data;
502 
503 	pluginGui->threshold=inv_knob_get_value(INV_KNOB (widget));
504 	(*pluginGui->write_function)(pluginGui->controller, ICOMP_THRESH, 4, 0, &pluginGui->threshold);
505 	return;
506 }
507 
on_inv_comp_ratio_knob_motion(GtkWidget * widget,GdkEvent * event,gpointer data)508 static void on_inv_comp_ratio_knob_motion(GtkWidget *widget, GdkEvent *event, gpointer data)
509 {
510 	ICompGui *pluginGui = (ICompGui *) data;
511 
512 	pluginGui->ratio=inv_knob_get_value(INV_KNOB (widget));
513 	(*pluginGui->write_function)(pluginGui->controller, ICOMP_RATIO, 4, 0, &pluginGui->ratio);
514 	return;
515 }
516 
on_inv_comp_gain_knob_motion(GtkWidget * widget,GdkEvent * event,gpointer data)517 static void on_inv_comp_gain_knob_motion(GtkWidget *widget, GdkEvent *event, gpointer data)
518 {
519 
520 	ICompGui *pluginGui = (ICompGui *) data;
521 
522 	pluginGui->gain=inv_knob_get_value(INV_KNOB (widget));
523 	(*pluginGui->write_function)(pluginGui->controller, ICOMP_GAIN, 4, 0, &pluginGui->gain);
524 	return;
525 }
526 
on_inv_comp_noClip_toggle_button_release(GtkWidget * widget,GdkEvent * event,gpointer data)527 static void on_inv_comp_noClip_toggle_button_release(GtkWidget *widget, GdkEvent *event, gpointer data)
528 {
529 
530 	ICompGui *pluginGui = (ICompGui *) data;
531 
532 	pluginGui->noClip=inv_switch_toggle_get_value(INV_SWITCH_TOGGLE (widget));
533 	(*pluginGui->write_function)(pluginGui->controller, ICOMP_NOCLIP, 4, 0, &pluginGui->noClip);
534 	return;
535 }
536 
537