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