5 * Copyright (C) 2002-2005 Monty
7 * Postfish 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, or (at your option)
12 * Postfish 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.
17 * You should have received a copy of the GNU General Public License
18 * along with Postfish; see the file COPYING. If not, write to the
19 * Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
26 #include <gdk/gdkkeysyms.h>
29 #include "mainpanel.h"
32 #include "multicompand.h"
33 #include "compandpanel.h"
41 struct multi_panel_state
*mp
;
60 struct multi_panel_state
*mp
;
64 typedef struct multi_panel_state
{
65 subpanel_generic
*panel
;
69 GtkWidget
*over_softknee
;
72 GtkWidget
*under_peak
;
73 GtkWidget
*under_softknee
;
80 callback_arg_rv over_compand
;
81 callback_arg_rv under_compand
;
82 callback_arg_rv base_compand
;
84 callback_arg_rv over_lookahead
;
85 callback_arg_rv under_lookahead
;
87 callback_arg_rv2 over_timing
;
88 callback_arg_rv2 under_timing
;
89 callback_arg_rv2 base_timing
;
91 callback_arg_mi octave_full
;
92 callback_arg_mi octave_half
;
93 callback_arg_mi octave_two
;
97 int updating_av_slider
;
98 multicompand_settings
*ms
;
99 cbar bars
[multicomp_freqs_max
+1];
103 static multi_panel_state
*master_panel
;
104 static multi_panel_state
**channel_panel
;
107 static void compandpanel_state_to_config_helper(int bank
,multicompand_settings
*s
,int A
){
109 config_set_integer("multicompand_active",bank
,A
,0,0,0,s
->panel_active
);
110 config_set_integer("multicompand_freqbank",bank
,A
,0,0,0,s
->active_bank
);
111 for(i
=0;i
<multicomp_banks
;i
++){
112 config_set_vector("multicompand_under_thresh",bank
,A
,i
,0,multicomp_freqs_max
,s
->bc
[i
].static_u
);
113 config_set_vector("multicompand_over_thresh",bank
,A
,i
,0,multicomp_freqs_max
,s
->bc
[i
].static_o
);
116 config_set_integer("multicompand_over_set",bank
,A
,0,0,0,s
->over_mode
);
117 config_set_integer("multicompand_over_set",bank
,A
,0,0,1,s
->over_softknee
);
118 config_set_integer("multicompand_over_set",bank
,A
,0,0,2,s
->over_ratio
);
119 config_set_integer("multicompand_over_set",bank
,A
,0,0,3,s
->over_attack
);
120 config_set_integer("multicompand_over_set",bank
,A
,0,0,4,s
->over_decay
);
121 config_set_integer("multicompand_over_set",bank
,A
,0,0,5,s
->over_lookahead
);
123 config_set_integer("multicompand_under_set",bank
,A
,0,0,0,s
->under_mode
);
124 config_set_integer("multicompand_under_set",bank
,A
,0,0,1,s
->under_softknee
);
125 config_set_integer("multicompand_under_set",bank
,A
,0,0,2,s
->under_ratio
);
126 config_set_integer("multicompand_under_set",bank
,A
,0,0,3,s
->under_attack
);
127 config_set_integer("multicompand_under_set",bank
,A
,0,0,4,s
->under_decay
);
128 config_set_integer("multicompand_under_set",bank
,A
,0,0,5,s
->under_lookahead
);
130 config_set_integer("multicompand_base_set",bank
,A
,0,0,0,s
->base_mode
);
131 config_set_integer("multicompand_base_set",bank
,A
,0,0,2,s
->base_ratio
);
132 config_set_integer("multicompand_base_set",bank
,A
,0,0,3,s
->base_attack
);
133 config_set_integer("multicompand_base_set",bank
,A
,0,0,4,s
->base_decay
);
136 void compandpanel_state_to_config(int bank
){
138 compandpanel_state_to_config_helper(bank
,&multi_master_set
,0);
139 for(i
=0;i
<input_ch
;i
++)
140 compandpanel_state_to_config_helper(bank
,multi_channel_set
+i
,i
+1);
143 static void static_octave(GtkWidget
*w
,gpointer in
);
144 static void propogate_bank_changes_full(multicompand_settings
*ms
,int from_bank
);
146 static void compandpanel_state_from_config_helper(int bank
,multicompand_settings
*s
,
147 multi_panel_state
*p
,int A
){
150 config_get_sigat("multicompand_active",bank
,A
,0,0,0,&s
->panel_active
);
151 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(p
->panel
->subpanel_activebutton
[0]),s
->panel_active
);
153 config_get_sigat("multicompand_freqbank",bank
,A
,0,0,0,&s
->active_bank
);
154 for(i
=0;i
<multicomp_banks
;i
++){
155 config_get_vector("multicompand_under_thresh",bank
,A
,i
,0,multicomp_freqs_max
,s
->bc
[i
].static_u
);
156 config_get_vector("multicompand_over_thresh",bank
,A
,i
,0,multicomp_freqs_max
,s
->bc
[i
].static_o
);
159 config_get_sigat("multicompand_over_set",bank
,A
,0,0,0,&s
->over_mode
);
161 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(p
->over_peak
),1);
163 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(p
->over_rms
),1);
165 config_get_sigat("multicompand_over_set",bank
,A
,0,0,1,&s
->over_softknee
);
166 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(p
->over_softknee
),s
->over_softknee
);
167 config_get_sigat("multicompand_over_set",bank
,A
,0,0,2,&s
->over_ratio
);
168 multibar_thumb_set(p
->over_compand
.s
,1000./s
->over_ratio
,0);
169 config_get_sigat("multicompand_over_set",bank
,A
,0,0,3,&s
->over_attack
);
170 multibar_thumb_set(p
->over_timing
.s
,s
->over_attack
*.1,0);
171 config_get_sigat("multicompand_over_set",bank
,A
,0,0,4,&s
->over_decay
);
172 multibar_thumb_set(p
->over_timing
.s
,s
->over_decay
*.1,1);
173 config_get_sigat("multicompand_over_set",bank
,A
,0,0,5,&s
->over_lookahead
);
174 multibar_thumb_set(p
->over_lookahead
.s
,s
->over_lookahead
*.1,0);
176 config_get_sigat("multicompand_under_set",bank
,A
,0,0,0,&s
->under_mode
);
178 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(p
->under_peak
),1);
180 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(p
->under_rms
),1);
182 config_get_sigat("multicompand_under_set",bank
,A
,0,0,1,&s
->under_softknee
);
183 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(p
->under_softknee
),s
->under_softknee
);
184 config_get_sigat("multicompand_under_set",bank
,A
,0,0,2,&s
->under_ratio
);
185 multibar_thumb_set(p
->under_compand
.s
,1000./s
->under_ratio
,0);
186 config_get_sigat("multicompand_under_set",bank
,A
,0,0,3,&s
->under_attack
);
187 multibar_thumb_set(p
->under_timing
.s
,s
->under_attack
*.1,0);
188 config_get_sigat("multicompand_under_set",bank
,A
,0,0,4,&s
->under_decay
);
189 multibar_thumb_set(p
->under_timing
.s
,s
->under_decay
*.1,1);
190 config_get_sigat("multicompand_under_set",bank
,A
,0,0,5,&s
->under_lookahead
);
191 multibar_thumb_set(p
->under_lookahead
.s
,s
->under_lookahead
*.1,0);
193 config_get_sigat("multicompand_base_set",bank
,A
,0,0,0,&s
->base_mode
);
195 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(p
->base_peak
),1);
197 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(p
->base_rms
),1);
198 config_get_sigat("multicompand_base_set",bank
,A
,0,0,2,&s
->base_ratio
);
199 multibar_thumb_set(p
->base_compand
.s
,1000./s
->base_ratio
,0);
200 config_get_sigat("multicompand_base_set",bank
,A
,0,0,3,&s
->base_attack
);
201 multibar_thumb_set(p
->base_timing
.s
,s
->base_attack
*.1,0);
202 config_get_sigat("multicompand_base_set",bank
,A
,0,0,4,&s
->base_decay
);
203 multibar_thumb_set(p
->base_timing
.s
,s
->base_decay
*.1,1);
205 propogate_bank_changes_full(s
,s
->active_bank
);
206 /* setting the active bank also redisplays all the sliders */
207 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(p
->octave
[s
->active_bank
]),1);
208 /* safe to call blindly; if the above already triggered the work, this is a no op */
209 switch(s
->active_bank
){
211 static_octave(0,&p
->octave_full
);
214 static_octave(0,&p
->octave_half
);
217 static_octave(0,&p
->octave_two
);
222 void compandpanel_state_from_config(int bank
){
224 compandpanel_state_from_config_helper(bank
,&multi_master_set
,master_panel
,0);
225 for(i
=0;i
<input_ch
;i
++)
226 compandpanel_state_from_config_helper(bank
,multi_channel_set
+i
,channel_panel
[i
],i
+1);
230 static void compand_change(GtkWidget
*w
,gpointer in
){
231 callback_arg_rv
*ca
=(callback_arg_rv
*)in
;
233 float val
=1./multibar_get_value(MULTIBAR(w
),0);
236 sprintf(buffer
," off");
238 sprintf(buffer
,"%4.1f:1",val
);
240 sprintf(buffer
,"%4.2f:1",val
);
241 }else if(val
>.10001){
242 sprintf(buffer
,"1:%4.2f",1./val
);
244 sprintf(buffer
,"1:%4.1f",1./val
);
247 readout_set(ca
->r
,buffer
);
249 *ca
->v
=rint(val
*1000.);
252 static void timing_change(GtkWidget
*w
,gpointer in
){
253 callback_arg_rv2
*ca
=(callback_arg_rv2
*)in
;
255 float attack
=multibar_get_value(MULTIBAR(w
),0);
256 float decay
=multibar_get_value(MULTIBAR(w
),1);
260 sprintf(buffer
,"%4.2fms",attack
);
261 }else if(attack
<100){
262 sprintf(buffer
,"%4.1fms",attack
);
263 }else if (attack
<1000){
264 sprintf(buffer
,"%4.0fms",attack
);
265 }else if (attack
<10000){
266 sprintf(buffer
,"%4.2fs",attack
/1000.);
268 sprintf(buffer
,"%4.1fs",attack
/1000.);
270 readout_set(ca
->r0
,buffer
);
273 sprintf(buffer
,"%4.2fms",decay
);
275 sprintf(buffer
,"%4.1fms",decay
);
276 }else if (decay
<1000){
277 sprintf(buffer
,"%4.0fms",decay
);
278 }else if (decay
<10000){
279 sprintf(buffer
,"%4.2fs",decay
/1000.);
281 sprintf(buffer
,"%4.1fs",decay
/1000.);
283 readout_set(ca
->r1
,buffer
);
285 *ca
->v0
=rint(attack
*10.);
286 *ca
->v1
=rint(decay
*10.);
289 static void lookahead_change(GtkWidget
*w
,gpointer in
){
290 callback_arg_rv
*ca
=(callback_arg_rv
*)in
;
293 float val
=multibar_get_value(MULTIBAR(w
),0);
295 sprintf(buffer
,"%3.0f%%",val
);
296 readout_set(r
,buffer
);
298 *ca
->v
=rint(val
*10.);
301 static int determine_average(multi_panel_state
*mp
,int x
){
302 multicompand_settings
*ms
=mp
->ms
;
303 banked_multicompand_settings
*bc
=ms
->bc
;
304 int bank_active
=mp
->bank_active
;
308 for(i
=0;i
<multicomp_freqs
[bank_active
];i
++){
310 acc
+=rint(bc
[bank_active
].static_o
[i
]);
312 acc
+=rint(bc
[bank_active
].static_u
[i
]);
314 return rint(acc
/multicomp_freqs
[bank_active
]);
317 static void average_change(GtkWidget
*w
,gpointer in
){
318 multi_panel_state
*mp
=(multi_panel_state
*)in
;
319 if(!mp
->updating_av_slider
){
320 cbar
*b
=mp
->bars
+multicomp_freqs_max
;
322 int bank_active
=mp
->bank_active
;
328 u
=rint(multibar_get_value(MULTIBAR(b
->slider
),0));
329 o
=rint(multibar_get_value(MULTIBAR(b
->slider
),1));
331 ud
= u
-determine_average(mp
,0);
332 od
= o
-determine_average(mp
,1);
334 mp
->updating_av_slider
=1;
336 if(od
<0 && ud
<0)ud
=0;
337 if(od
>0 && ud
>0)od
=0;
339 if(multibar_thumb_focus(MULTIBAR(w
))==1){
340 /* update o sliders */
341 for(i
=0;i
<multicomp_freqs
[bank_active
];i
++){
342 float val
=multibar_get_value(MULTIBAR(bars
[i
].slider
),1);
343 multibar_thumb_set(MULTIBAR(bars
[i
].slider
),val
+od
,1);
345 /* update u average (might have pushed it via its sliders) */
346 u
= determine_average(mp
,0);
347 multibar_thumb_set(MULTIBAR(bars
[multicomp_freqs_max
].slider
),u
,0);
348 }else if(multibar_thumb_focus(MULTIBAR(w
))==0){
349 /* update u sliders */
350 for(i
=0;i
<multicomp_freqs
[bank_active
];i
++){
351 float val
=multibar_get_value(MULTIBAR(bars
[i
].slider
),0);
352 multibar_thumb_set(MULTIBAR(bars
[i
].slider
),val
+ud
,0);
354 /* update o average (might have pushed it via its sliders) */
355 o
= determine_average(mp
,1);
356 multibar_thumb_set(MULTIBAR(bars
[multicomp_freqs_max
].slider
),o
,1);
358 mp
->updating_av_slider
=0;
362 static void slider_change(GtkWidget
*w
,gpointer in
){
365 multi_panel_state
*mp
=b
->mp
;
366 multicompand_settings
*ms
=mp
->ms
;
367 banked_multicompand_settings
*bc
=ms
->bc
;
368 int bank_active
=mp
->bank_active
;
372 u
=multibar_get_value(MULTIBAR(b
->slider
),0);
373 sprintf(buffer
,"%+4ddB",u
);
374 readout_set(READOUT(b
->readoutu
),buffer
);
375 bc
[bank_active
].static_u
[b
->number
]=u
;
377 o
=multibar_get_value(MULTIBAR(b
->slider
),1);
378 sprintf(buffer
,"%+4ddB",o
);
379 readout_set(READOUT(b
->readouto
),buffer
);
380 bc
[bank_active
].static_o
[b
->number
]=o
;
382 /* update average slider */
383 if(!mp
->updating_av_slider
&& mp
->bars
[multicomp_freqs_max
].slider
){
385 mp
->updating_av_slider
=1;
387 /* compute the current average */
388 uav
= determine_average(mp
,0);
389 oav
= determine_average(mp
,1);
391 multibar_thumb_set(MULTIBAR(mp
->bars
[multicomp_freqs_max
].slider
),uav
,0);
392 multibar_thumb_set(MULTIBAR(mp
->bars
[multicomp_freqs_max
].slider
),oav
,1);
393 mp
->updating_av_slider
=0;
397 static void propogate_bank_changes(multicompand_settings
*ms
,int bank_active
, int to_bank
){
398 banked_multicompand_settings
*bc
=ms
->bc
;
401 /* propogate changes from current bank to new bank */
402 switch(bank_active
*10+to_bank
){
403 case 1: /* full octave to half octave */
404 case 20: /* two octave to full octave */
406 for(i
=0;i
<multicomp_freqs
[bank_active
];i
++){
407 float u0d
=bc
[bank_active
].static_u
[i
]-bc
[to_bank
].static_u
[i
*2];
408 float u2d
=(i
+1<multicomp_freqs
[bank_active
] ?
409 bc
[bank_active
].static_u
[i
+1]-bc
[to_bank
].static_u
[i
*2+2] : u0d
);
411 float o0d
=bc
[bank_active
].static_o
[i
]-bc
[to_bank
].static_o
[i
*2];
412 float o2d
=(i
+1<multicomp_freqs
[bank_active
] ?
413 bc
[bank_active
].static_o
[i
+1]-bc
[to_bank
].static_o
[i
*2+2] : o0d
);
415 bc
[to_bank
].static_u
[i
*2+1] += (u0d
+u2d
)/2;
416 bc
[to_bank
].static_o
[i
*2+1] += (o0d
+o2d
)/2;
419 for(i
=0;i
<multicomp_freqs
[bank_active
];i
++){
420 bc
[to_bank
].static_u
[i
*2]=bc
[bank_active
].static_u
[i
];
421 bc
[to_bank
].static_o
[i
*2]=bc
[bank_active
].static_o
[i
];
425 case 2: /* full octave to two octave */
426 case 10: /* half octave to full octave */
428 for(i
=0;i
<multicomp_freqs
[to_bank
];i
++){
429 bc
[to_bank
].static_u
[i
]=bc
[bank_active
].static_u
[i
*2];
430 bc
[to_bank
].static_o
[i
]=bc
[bank_active
].static_o
[i
*2];
434 case 12: /* half octave to two octave */
436 for(i
=0;i
<multicomp_freqs
[to_bank
];i
++){
437 bc
[to_bank
].static_u
[i
]=bc
[bank_active
].static_u
[i
*4];
438 bc
[to_bank
].static_o
[i
]=bc
[bank_active
].static_o
[i
*4];
442 case 21: /* two octave to half octave */
444 for(i
=0;i
<multicomp_freqs
[bank_active
];i
++){
445 float u0d
=bc
[bank_active
].static_u
[i
]-bc
[to_bank
].static_u
[i
*4];
446 float u2d
=(i
+1<multicomp_freqs
[bank_active
] ?
447 bc
[bank_active
].static_u
[i
+1]-bc
[to_bank
].static_u
[i
*4+4] : u0d
);
449 float o0d
=bc
[bank_active
].static_o
[i
]-bc
[to_bank
].static_o
[i
*4];
450 float o2d
=(i
+1<multicomp_freqs
[bank_active
] ?
451 bc
[bank_active
].static_o
[i
+1]-bc
[to_bank
].static_o
[i
*4+4] : o0d
);
453 bc
[to_bank
].static_u
[i
*4+1] += (u0d
*3+u2d
)/4;
454 bc
[to_bank
].static_o
[i
*4+1] += (o0d
*3+o2d
)/4;
456 bc
[to_bank
].static_u
[i
*4+2] += (u0d
+u2d
)/2;
457 bc
[to_bank
].static_o
[i
*4+2] += (o0d
+o2d
)/2;
459 bc
[to_bank
].static_u
[i
*4+3] += (u0d
+u2d
*3)/4;
460 bc
[to_bank
].static_o
[i
*4+3] += (o0d
+o2d
*3)/4;
463 for(i
=0;i
<multicomp_freqs
[bank_active
];i
++){
464 bc
[to_bank
].static_u
[i
*4]=bc
[bank_active
].static_u
[i
];
465 bc
[to_bank
].static_o
[i
*4]=bc
[bank_active
].static_o
[i
];
471 static void propogate_bank_changes_full(multicompand_settings
*ms
,int from_bank
){
474 propogate_bank_changes(ms
,0,1);
475 propogate_bank_changes(ms
,0,2);
478 propogate_bank_changes(ms
,1,0);
479 propogate_bank_changes(ms
,1,2);
482 propogate_bank_changes(ms
,2,0);
483 propogate_bank_changes(ms
,2,1);
488 static void static_octave(GtkWidget
*w
,gpointer in
){
489 callback_arg_mi
*ca
=(callback_arg_mi
*)in
;
490 multi_panel_state
*mp
=ca
->mp
;
491 multicompand_settings
*ms
=mp
->ms
;
492 banked_multicompand_settings
*bc
=ms
->bc
;
493 int octave
=ca
->val
,i
;
495 if(!w
|| gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w
))){
496 if(mp
->bank_active
!=octave
|| w
==NULL
){
498 propogate_bank_changes(ms
,mp
->bank_active
,octave
);
500 bank_active
=mp
->bank_active
=octave
;
502 /* map, unmap, relabel */
503 for(i
=0;i
<multicomp_freqs_max
;i
++){
504 if(i
<multicomp_freqs
[bank_active
]){
505 gtk_label_set_text(GTK_LABEL(mp
->bars
[i
].label
),
506 multicomp_freq_labels
[bank_active
][i
]);
507 gtk_widget_show(mp
->bars
[i
].label
);
508 gtk_widget_show(mp
->bars
[i
].slider
);
509 gtk_widget_show(mp
->bars
[i
].readouto
);
510 gtk_widget_show(mp
->bars
[i
].readoutu
);
512 mp
->inactive_updatep
=0;
515 float o
=bc
[bank_active
].static_o
[i
];
516 float u
=bc
[bank_active
].static_u
[i
];
518 multibar_thumb_set(MULTIBAR(mp
->bars
[i
].slider
),u
,0);
519 multibar_thumb_set(MULTIBAR(mp
->bars
[i
].slider
),o
,1);
522 mp
->inactive_updatep
=1;
525 gtk_widget_hide(mp
->bars
[i
].label
);
526 gtk_widget_hide(mp
->bars
[i
].slider
);
527 gtk_widget_hide(mp
->bars
[i
].readouto
);
528 gtk_widget_hide(mp
->bars
[i
].readoutu
);
532 ms
->active_bank
=bank_active
;
538 static void mode_rms(GtkButton
*b
,gpointer in
){
539 sig_atomic_t *var
=(sig_atomic_t *)in
;
543 static void mode_peak(GtkButton
*b
,gpointer in
){
544 sig_atomic_t *var
=(sig_atomic_t *)in
;
548 static void mode_knee(GtkToggleButton
*b
,gpointer in
){
549 int mode
=gtk_toggle_button_get_active(b
);
550 sig_atomic_t *var
=(sig_atomic_t *)in
;
554 static multi_panel_state
*compandpanel_create(postfish_mainpanel
*mp
,
555 subpanel_generic
*panel
,
556 multicompand_settings
*ms
){
558 char *labels
[15]={"","130","120","110","100","90","80","70",
559 "60","50","40","30","20","10","0"};
560 float levels
[15]={-140,-130,-120,-110,-100,-90,-80,-70,-60,-50,-40,
563 float compand_levels
[9]={.1,.25,.5,.6667,1,1.5,2,4,10};
564 char *compand_labels
[89]={"","4:1","2:1","1:1.5","1:1","1:1.5","1:2","1:4","1:10"};
566 float timing_levels
[6]={.5,1,10,100,1000,10000};
567 char *timing_labels
[6]={"","1ms","10ms","100ms","1s","10s"};
569 float per_levels
[9]={0,12.5,25,37.5,50,62.5,75,87.5,100};
570 char *per_labels
[9]={"0%","","25%","","50%","","75%","","100%"};
572 multi_panel_state
*ps
=calloc(1,sizeof(*ps
));
573 ps
->inactive_updatep
=1;
578 GtkWidget
*hbox
=gtk_hbox_new(0,0);
579 GtkWidget
*sliderbox
=gtk_vbox_new(0,0);
580 GtkWidget
*sliderframe
=gtk_frame_new(NULL
);
581 GtkWidget
*staticbox
=gtk_vbox_new(0,0);
582 GtkWidget
*slidertable
=gtk_table_new(multicomp_freqs_max
+2,4,0);
584 GtkWidget
*overlabel
=gtk_label_new("Over threshold compand ");
585 GtkWidget
*overtable
=gtk_table_new(6,4,0);
587 GtkWidget
*underlabel
=gtk_label_new("Under threshold compand ");
588 GtkWidget
*undertable
=gtk_table_new(5,4,0);
590 GtkWidget
*baselabel
=gtk_label_new("Global compand ");
591 GtkWidget
*basetable
=gtk_table_new(3,4,0);
594 gtk_widget_set_name(overlabel
,"framelabel");
595 gtk_widget_set_name(underlabel
,"framelabel");
596 gtk_widget_set_name(baselabel
,"framelabel");
598 gtk_misc_set_alignment(GTK_MISC(overlabel
),0,.5);
599 gtk_misc_set_alignment(GTK_MISC(underlabel
),0,.5);
600 gtk_misc_set_alignment(GTK_MISC(baselabel
),0,.5);
605 GtkWidget
*octave_box
=gtk_hbox_new(0,0);
606 GtkWidget
*octave_a
=gtk_radio_button_new_with_label(NULL
,"two-octave");
608 gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(octave_a
),
611 gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(octave_b
),
613 GtkWidget
*label2
=gtk_label_new("under");
614 GtkWidget
*label3
=gtk_label_new("over");
616 gtk_misc_set_alignment(GTK_MISC(label2
),.5,1.);
617 gtk_misc_set_alignment(GTK_MISC(label3
),.5,1.);
618 gtk_widget_set_name(label2
,"scalemarker");
619 gtk_widget_set_name(label3
,"scalemarker");
622 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(octave_b
),0);
624 ps
->octave_full
.mp
=ps
;
625 ps
->octave_full
.val
=0;
626 ps
->octave_half
.mp
=ps
;
627 ps
->octave_half
.val
=1;
628 ps
->octave_two
.mp
=ps
;
629 ps
->octave_two
.val
=2;
631 g_signal_connect (G_OBJECT (octave_a
), "clicked",
632 G_CALLBACK (static_octave
), &ps
->octave_two
);
633 g_signal_connect (G_OBJECT (octave_b
), "clicked",
634 G_CALLBACK (static_octave
), &ps
->octave_full
);
635 g_signal_connect (G_OBJECT (octave_c
), "clicked",
636 G_CALLBACK (static_octave
), &ps
->octave_half
);
638 gtk_table_attach(GTK_TABLE(slidertable
),label2
,1,2,0,1,GTK_FILL
,GTK_FILL
|GTK_EXPAND
,2,0);
639 gtk_table_attach(GTK_TABLE(slidertable
),label3
,3,4,0,1,GTK_FILL
,GTK_FILL
|GTK_EXPAND
,2,0);
641 gtk_box_pack_start(GTK_BOX(octave_box
),octave_a
,0,1,3);
642 gtk_box_pack_start(GTK_BOX(octave_box
),octave_b
,0,1,3);
643 gtk_box_pack_start(GTK_BOX(octave_box
),octave_c
,0,1,3);
644 gtk_table_attach(GTK_TABLE(slidertable
),octave_box
,2,3,0,1,
647 gtk_box_pack_start(GTK_BOX(sliderbox
),sliderframe
,0,0,0);
648 gtk_container_add(GTK_CONTAINER(sliderframe
),slidertable
);
650 gtk_frame_set_shadow_type(GTK_FRAME(sliderframe
),GTK_SHADOW_NONE
);
652 gtk_container_set_border_width(GTK_CONTAINER(sliderframe
),4);
654 ps
->octave
[0]=octave_b
;
655 ps
->octave
[1]=octave_c
;
656 ps
->octave
[2]=octave_a
;
660 gtk_box_pack_start(GTK_BOX(panel
->subpanel_box
),hbox
,0,0,0);
661 gtk_box_pack_start(GTK_BOX(hbox
),sliderbox
,0,0,0);
662 gtk_box_pack_start(GTK_BOX(hbox
),staticbox
,0,0,0);
665 GtkWidget
*hs1
=gtk_hseparator_new();
666 GtkWidget
*hs2
=gtk_hseparator_new();
667 GtkWidget
*hs3
=gtk_hseparator_new();
669 gtk_box_pack_start(GTK_BOX(staticbox
),overtable
,0,0,10);
670 gtk_box_pack_start(GTK_BOX(staticbox
),hs1
,0,0,0);
671 gtk_box_pack_start(GTK_BOX(staticbox
),undertable
,0,0,10);
672 gtk_box_pack_start(GTK_BOX(staticbox
),hs2
,0,0,0);
673 gtk_box_pack_start(GTK_BOX(staticbox
),basetable
,0,0,10);
674 gtk_box_pack_start(GTK_BOX(staticbox
),hs3
,0,0,0);
676 gtk_container_set_border_width(GTK_CONTAINER(overtable
),5);
677 gtk_container_set_border_width(GTK_CONTAINER(undertable
),5);
678 gtk_container_set_border_width(GTK_CONTAINER(basetable
),5);
682 /* under compand: mode and knee */
684 GtkWidget
*envelopebox
=gtk_hbox_new(0,0);
685 GtkWidget
*rms_button
=gtk_radio_button_new_with_label(NULL
,"RMS");
686 GtkWidget
*peak_button
=
687 gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(rms_button
),
689 GtkWidget
*knee_button
=gtk_check_button_new_with_label("soft knee");
691 gtk_box_pack_start(GTK_BOX(envelopebox
),underlabel
,0,0,0);
692 gtk_box_pack_end(GTK_BOX(envelopebox
),peak_button
,0,0,5);
693 gtk_box_pack_end(GTK_BOX(envelopebox
),rms_button
,0,0,5);
694 gtk_box_pack_end(GTK_BOX(envelopebox
),knee_button
,0,0,5);
696 g_signal_connect (G_OBJECT (knee_button
), "clicked",
697 G_CALLBACK (mode_knee
), &ps
->ms
->under_softknee
);
698 g_signal_connect (G_OBJECT (rms_button
), "clicked",
699 G_CALLBACK (mode_rms
), &ps
->ms
->under_mode
);
700 g_signal_connect (G_OBJECT (peak_button
), "clicked",
701 G_CALLBACK (mode_peak
), &ps
->ms
->under_mode
);
702 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(rms_button
),1);
703 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(knee_button
),1);
704 gtk_table_attach(GTK_TABLE(undertable
),envelopebox
,0,4,0,1,GTK_FILL
,0,0,0);
705 ps
->under_rms
=rms_button
;
706 ps
->under_peak
=peak_button
;
707 ps
->under_softknee
=knee_button
;
710 /* under compand: ratio */
713 GtkWidget
*label
=gtk_label_new("compand ratio:");
714 GtkWidget
*readout
=readout_new("1.55:1");
715 GtkWidget
*slider
=multibar_slider_new(9,compand_labels
,compand_levels
,1);
717 ps
->under_compand
.s
=MULTIBAR(slider
);
718 ps
->under_compand
.r
=READOUT(readout
);
719 ps
->under_compand
.v
=&ps
->ms
->under_ratio
;
721 multibar_callback(MULTIBAR(slider
),compand_change
,&ps
->under_compand
);
722 multibar_thumb_set(MULTIBAR(slider
),1.,0);
724 gtk_misc_set_alignment(GTK_MISC(label
),1.,.5);
726 gtk_table_set_row_spacing(GTK_TABLE(undertable
),0,4);
727 gtk_table_attach(GTK_TABLE(undertable
),label
,0,1,1,2,GTK_FILL
,0,2,0);
728 gtk_table_attach(GTK_TABLE(undertable
),slider
,1,3,1,2,GTK_FILL
|GTK_EXPAND
,GTK_FILL
|GTK_EXPAND
,2,0);
729 gtk_table_attach(GTK_TABLE(undertable
),readout
,3,4,1,2,GTK_FILL
,0,0,0);
733 /* under compand: timing */
736 GtkWidget
*label
=gtk_label_new("attack/decay:");
737 GtkWidget
*readout0
=readout_new(" 100ms");
738 GtkWidget
*readout1
=readout_new(" 100ms");
739 GtkWidget
*slider
=multibar_slider_new(6,timing_labels
,timing_levels
,2);
741 ps
->under_timing
.s
=MULTIBAR(slider
);
742 ps
->under_timing
.r0
=READOUT(readout0
);
743 ps
->under_timing
.r1
=READOUT(readout1
);
744 ps
->under_timing
.v0
=&ps
->ms
->under_attack
;
745 ps
->under_timing
.v1
=&ps
->ms
->under_decay
;
747 multibar_callback(MULTIBAR(slider
),timing_change
,&ps
->under_timing
);
748 multibar_thumb_set(MULTIBAR(slider
),1,0);
749 multibar_thumb_set(MULTIBAR(slider
),100,1);
751 gtk_misc_set_alignment(GTK_MISC(label
),1,.5);
753 gtk_table_set_row_spacing(GTK_TABLE(undertable
),2,4);
754 gtk_table_attach(GTK_TABLE(undertable
),label
,0,1,4,5,GTK_FILL
,0,2,0);
755 gtk_table_attach(GTK_TABLE(undertable
),slider
,1,2,4,5,GTK_FILL
|GTK_EXPAND
,GTK_FILL
|GTK_EXPAND
,2,0);
756 gtk_table_attach(GTK_TABLE(undertable
),readout0
,2,3,4,5,GTK_FILL
,0,0,0);
757 gtk_table_attach(GTK_TABLE(undertable
),readout1
,3,4,4,5,GTK_FILL
,0,0,0);
761 /* under compand: lookahead */
764 GtkWidget
*label
=gtk_label_new("lookahead:");
765 GtkWidget
*readout
=readout_new("100%");
766 GtkWidget
*slider
=multibar_slider_new(9,per_labels
,per_levels
,1);
768 ps
->under_lookahead
.s
=MULTIBAR(slider
);
769 ps
->under_lookahead
.r
=READOUT(readout
);
770 ps
->under_lookahead
.v
=&ps
->ms
->under_lookahead
;
772 multibar_callback(MULTIBAR(slider
),lookahead_change
,&ps
->under_lookahead
);
773 multibar_thumb_set(MULTIBAR(slider
),100.,0);
774 multibar_thumb_increment(MULTIBAR(slider
),1.,10.);
776 gtk_misc_set_alignment(GTK_MISC(label
),1,.5);
778 gtk_table_set_row_spacing(GTK_TABLE(undertable
),3,4);
779 gtk_table_attach(GTK_TABLE(undertable
),label
,0,1,3,4,GTK_FILL
,0,2,0);
780 gtk_table_attach(GTK_TABLE(undertable
),slider
,1,3,3,4,GTK_FILL
|GTK_EXPAND
,GTK_FILL
|GTK_EXPAND
,2,0);
781 gtk_table_attach(GTK_TABLE(undertable
),readout
,3,4,3,4,GTK_FILL
,0,0,0);
784 /* over compand: mode and knee */
786 GtkWidget
*envelopebox
=gtk_hbox_new(0,0);
787 GtkWidget
*rms_button
=gtk_radio_button_new_with_label(NULL
,"RMS");
788 GtkWidget
*peak_button
=
789 gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(rms_button
),
791 GtkWidget
*knee_button
=gtk_check_button_new_with_label("soft knee");
793 gtk_box_pack_start(GTK_BOX(envelopebox
),overlabel
,0,0,0);
794 gtk_box_pack_end(GTK_BOX(envelopebox
),peak_button
,0,0,5);
795 gtk_box_pack_end(GTK_BOX(envelopebox
),rms_button
,0,0,5);
796 gtk_box_pack_end(GTK_BOX(envelopebox
),knee_button
,0,0,5);
798 g_signal_connect (G_OBJECT (knee_button
), "clicked",
799 G_CALLBACK (mode_knee
), &ps
->ms
->over_softknee
);
800 g_signal_connect (G_OBJECT (rms_button
), "clicked",
801 G_CALLBACK (mode_rms
), &ps
->ms
->over_mode
);
802 g_signal_connect (G_OBJECT (peak_button
), "clicked",
803 G_CALLBACK (mode_peak
), &ps
->ms
->over_mode
);
804 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(rms_button
),1);
805 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(knee_button
),1);
806 gtk_table_attach(GTK_TABLE(overtable
),envelopebox
,0,4,0,1,GTK_FILL
,0,0,0);
807 ps
->over_rms
=rms_button
;
808 ps
->over_peak
=peak_button
;
809 ps
->over_softknee
=knee_button
;
812 /* over compand: ratio */
815 GtkWidget
*label
=gtk_label_new("compand ratio:");
816 GtkWidget
*readout
=readout_new("1.55:1");
817 GtkWidget
*slider
=multibar_slider_new(9,compand_labels
,compand_levels
,1);
819 ps
->over_compand
.s
=MULTIBAR(slider
);
820 ps
->over_compand
.r
=READOUT(readout
);
821 ps
->over_compand
.v
=&ps
->ms
->over_ratio
;
823 multibar_callback(MULTIBAR(slider
),compand_change
,&ps
->over_compand
);
824 multibar_thumb_set(MULTIBAR(slider
),1.,0);
826 gtk_misc_set_alignment(GTK_MISC(label
),1.,.5);
828 gtk_table_set_row_spacing(GTK_TABLE(overtable
),0,4);
829 gtk_table_attach(GTK_TABLE(overtable
),label
,0,1,1,2,GTK_FILL
,0,2,0);
830 gtk_table_attach(GTK_TABLE(overtable
),slider
,1,3,1,2,GTK_FILL
|GTK_EXPAND
,GTK_FILL
|GTK_EXPAND
,2,0);
831 gtk_table_attach(GTK_TABLE(overtable
),readout
,3,4,1,2,GTK_FILL
,0,0,0);
835 /* over compand: timing */
838 GtkWidget
*label
=gtk_label_new("attack/decay:");
839 GtkWidget
*readout0
=readout_new(" 100ms");
840 GtkWidget
*readout1
=readout_new(" 100ms");
841 GtkWidget
*slider
=multibar_slider_new(6,timing_labels
,timing_levels
,2);
843 ps
->over_timing
.s
=MULTIBAR(slider
);
844 ps
->over_timing
.r0
=READOUT(readout0
);
845 ps
->over_timing
.r1
=READOUT(readout1
);
846 ps
->over_timing
.v0
=&ps
->ms
->over_attack
;
847 ps
->over_timing
.v1
=&ps
->ms
->over_decay
;
849 multibar_callback(MULTIBAR(slider
),timing_change
,&ps
->over_timing
);
850 multibar_thumb_set(MULTIBAR(slider
),1,0);
851 multibar_thumb_set(MULTIBAR(slider
),100,1);
853 gtk_misc_set_alignment(GTK_MISC(label
),1,.5);
855 gtk_table_set_row_spacing(GTK_TABLE(overtable
),2,4);
856 gtk_table_attach(GTK_TABLE(overtable
),label
,0,1,5,6,GTK_FILL
,0,2,0);
857 gtk_table_attach(GTK_TABLE(overtable
),slider
,1,2,5,6,GTK_FILL
|GTK_EXPAND
,GTK_FILL
|GTK_EXPAND
,2,0);
858 gtk_table_attach(GTK_TABLE(overtable
),readout0
,2,3,5,6,GTK_FILL
,0,0,0);
859 gtk_table_attach(GTK_TABLE(overtable
),readout1
,3,4,5,6,GTK_FILL
,0,0,0);
863 /* over compand: lookahead */
866 GtkWidget
*label
=gtk_label_new("lookahead:");
867 GtkWidget
*readout
=readout_new("100%");
868 GtkWidget
*slider
=multibar_slider_new(9,per_labels
,per_levels
,1);
870 ps
->over_lookahead
.s
=MULTIBAR(slider
);
871 ps
->over_lookahead
.r
=READOUT(readout
);
872 ps
->over_lookahead
.v
=&ps
->ms
->over_lookahead
;
874 multibar_callback(MULTIBAR(slider
),lookahead_change
,&ps
->over_lookahead
);
875 multibar_thumb_set(MULTIBAR(slider
),100.,0);
876 multibar_thumb_increment(MULTIBAR(slider
),1.,10.);
878 gtk_misc_set_alignment(GTK_MISC(label
),1,.5);
880 gtk_table_set_row_spacing(GTK_TABLE(overtable
),3,4);
881 gtk_table_attach(GTK_TABLE(overtable
),label
,0,1,3,4,GTK_FILL
,0,2,0);
882 gtk_table_attach(GTK_TABLE(overtable
),slider
,1,3,3,4,GTK_FILL
|GTK_EXPAND
,GTK_FILL
|GTK_EXPAND
,2,0);
883 gtk_table_attach(GTK_TABLE(overtable
),readout
,3,4,3,4,GTK_FILL
,0,0,0);
887 /* base compand: mode */
889 GtkWidget
*envelopebox
=gtk_hbox_new(0,0);
890 GtkWidget
*rms_button
=gtk_radio_button_new_with_label(NULL
,"RMS");
891 GtkWidget
*peak_button
=
892 gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(rms_button
),
895 gtk_box_pack_start(GTK_BOX(envelopebox
),baselabel
,0,0,0);
896 gtk_box_pack_end(GTK_BOX(envelopebox
),peak_button
,0,0,5);
897 gtk_box_pack_end(GTK_BOX(envelopebox
),rms_button
,0,0,5);
899 g_signal_connect (G_OBJECT (rms_button
), "clicked",
900 G_CALLBACK (mode_rms
), &ps
->ms
->base_mode
);
901 g_signal_connect (G_OBJECT (peak_button
), "clicked",
902 G_CALLBACK (mode_peak
), &ps
->ms
->base_mode
);
903 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(rms_button
),1);
904 gtk_table_attach(GTK_TABLE(basetable
),envelopebox
,0,4,0,1,GTK_FILL
,0,0,0);
905 ps
->base_rms
=rms_button
;
906 ps
->base_peak
=peak_button
;
909 /* base compand: ratio */
912 GtkWidget
*label
=gtk_label_new("compand ratio:");
913 GtkWidget
*readout
=readout_new("1.55:1");
914 GtkWidget
*slider
=multibar_slider_new(9,compand_labels
,compand_levels
,1);
916 ps
->base_compand
.s
=MULTIBAR(slider
);
917 ps
->base_compand
.r
=READOUT(readout
);
918 ps
->base_compand
.v
=&ps
->ms
->base_ratio
;
920 multibar_callback(MULTIBAR(slider
),compand_change
,&ps
->base_compand
);
921 multibar_thumb_set(MULTIBAR(slider
),1.,0);
923 gtk_misc_set_alignment(GTK_MISC(label
),1.,.5);
925 gtk_table_set_row_spacing(GTK_TABLE(basetable
),0,4);
926 gtk_table_attach(GTK_TABLE(basetable
),label
,0,1,1,2,GTK_FILL
,0,2,0);
927 gtk_table_attach(GTK_TABLE(basetable
),slider
,1,3,1,2,GTK_FILL
|GTK_EXPAND
,GTK_FILL
|GTK_EXPAND
,2,0);
928 gtk_table_attach(GTK_TABLE(basetable
),readout
,3,4,1,2,GTK_FILL
,0,0,0);
932 /* base compand: timing */
935 GtkWidget
*label
=gtk_label_new("attack/decay:");
936 GtkWidget
*readout0
=readout_new(" 100ms");
937 GtkWidget
*readout1
=readout_new(" 100ms");
938 GtkWidget
*slider
=multibar_slider_new(6,timing_labels
,timing_levels
,2);
940 ps
->base_timing
.s
=MULTIBAR(slider
);
941 ps
->base_timing
.r0
=READOUT(readout0
);
942 ps
->base_timing
.r1
=READOUT(readout1
);
943 ps
->base_timing
.v0
=&ps
->ms
->base_attack
;
944 ps
->base_timing
.v1
=&ps
->ms
->base_decay
;
946 multibar_callback(MULTIBAR(slider
),timing_change
,&ps
->base_timing
);
947 multibar_thumb_set(MULTIBAR(slider
),1,0);
948 multibar_thumb_set(MULTIBAR(slider
),100,1);
950 gtk_misc_set_alignment(GTK_MISC(label
),1,.5);
952 gtk_table_set_row_spacing(GTK_TABLE(basetable
),2,4);
953 gtk_table_attach(GTK_TABLE(basetable
),label
,0,1,4,5,GTK_FILL
,0,2,0);
954 gtk_table_attach(GTK_TABLE(basetable
),slider
,1,2,4,5,GTK_FILL
|GTK_EXPAND
,GTK_FILL
|GTK_EXPAND
,2,0);
955 gtk_table_attach(GTK_TABLE(basetable
),readout0
,2,3,4,5,GTK_FILL
,0,0,0);
956 gtk_table_attach(GTK_TABLE(basetable
),readout1
,3,4,4,5,GTK_FILL
,0,0,0);
960 /* threshold controls */
962 for(i
=0;i
<multicomp_freqs_max
;i
++){
963 GtkWidget
*label
=gtk_label_new(NULL
);
964 gtk_widget_set_name(label
,"scalemarker");
966 ps
->bars
[i
].readoutu
=readout_new(" +0");
967 ps
->bars
[i
].readouto
=readout_new(" +0");
968 ps
->bars
[i
].slider
=multibar_new(15,labels
,levels
,2,HI_DECAY
|LO_DECAY
|LO_ATTACK
|PEAK_FOLLOW
);
969 ps
->bars
[i
].number
=i
;
971 ps
->bars
[i
].label
=label
;
973 multibar_callback(MULTIBAR(ps
->bars
[i
].slider
),slider_change
,ps
->bars
+i
);
974 multibar_thumb_set(MULTIBAR(ps
->bars
[i
].slider
),-140.,0);
975 multibar_thumb_set(MULTIBAR(ps
->bars
[i
].slider
),0.,1);
976 multibar_thumb_bounds(MULTIBAR(ps
->bars
[i
].slider
),-140,0);
977 multibar_thumb_increment(MULTIBAR(ps
->bars
[i
].slider
),1.,10.);
979 gtk_misc_set_alignment(GTK_MISC(label
),1,.5);
981 gtk_table_attach(GTK_TABLE(slidertable
),label
,0,1,i
+1,i
+2,
983 gtk_table_attach(GTK_TABLE(slidertable
),ps
->bars
[i
].readoutu
,1,2,i
+1,i
+2,
985 gtk_table_attach(GTK_TABLE(slidertable
),ps
->bars
[i
].slider
,2,3,i
+1,i
+2,
986 GTK_FILL
|GTK_EXPAND
,GTK_EXPAND
,0,0);
987 gtk_table_attach(GTK_TABLE(slidertable
),ps
->bars
[i
].readouto
,3,4,i
+1,i
+2,
991 /* "average" slider */
993 GtkWidget
*label
=gtk_label_new("average");
995 ps
->bars
[multicomp_freqs_max
].slider
=multibar_slider_new(15,labels
,levels
,2);
997 multibar_callback(MULTIBAR(ps
->bars
[multicomp_freqs_max
].slider
),average_change
,ps
);
999 multibar_thumb_set(MULTIBAR(ps
->bars
[multicomp_freqs_max
].slider
),-140.,0);
1000 multibar_thumb_set(MULTIBAR(ps
->bars
[multicomp_freqs_max
].slider
),0.,1);
1001 multibar_thumb_bounds(MULTIBAR(ps
->bars
[multicomp_freqs_max
].slider
),-140,0);
1003 gtk_table_attach(GTK_TABLE(slidertable
),label
,0,2,multicomp_freqs_max
+1,multicomp_freqs_max
+2,
1005 gtk_table_attach(GTK_TABLE(slidertable
),ps
->bars
[i
].slider
,2,3,multicomp_freqs_max
+1,multicomp_freqs_max
+2,
1006 GTK_FILL
|GTK_EXPAND
,GTK_EXPAND
,0,0);
1007 gtk_table_set_row_spacing(GTK_TABLE(slidertable
),multicomp_freqs_max
,10);
1011 subpanel_show_all_but_toplevel(panel
);
1013 /* Now unmap the sliders we don't want */
1014 static_octave(NULL
,&ps
->octave_full
);
1019 void compandpanel_create_master(postfish_mainpanel
*mp
,
1020 GtkWidget
*windowbutton
,
1021 GtkWidget
*activebutton
){
1022 char *shortcut
[]={" m "};
1023 subpanel_generic
*panel
=subpanel_create(mp
,windowbutton
,&activebutton
,
1024 &multi_master_set
.panel_active
,
1025 &multi_master_set
.panel_visible
,
1026 "_Multiband Compand (master)",shortcut
,
1029 master_panel
=compandpanel_create(mp
,panel
,&multi_master_set
);
1032 void compandpanel_create_channel(postfish_mainpanel
*mp
,
1033 GtkWidget
**windowbutton
,
1034 GtkWidget
**activebutton
){
1037 channel_panel
=calloc(input_ch
,sizeof(*channel_panel
));
1039 /* a panel for each channel */
1040 for(i
=0;i
<input_ch
;i
++){
1041 subpanel_generic
*panel
;
1044 sprintf(buffer
,"_Multiband Compand (channel %d)",i
+1);
1045 panel
=subpanel_create(mp
,windowbutton
[i
],activebutton
+i
,
1046 &multi_channel_set
[i
].panel_active
,
1047 &multi_channel_set
[i
].panel_visible
,
1051 channel_panel
[i
]=compandpanel_create(mp
,panel
,multi_channel_set
+i
);
1056 static float **peakfeed
=0;
1057 static float **rmsfeed
=0;
1059 void compandpanel_feedback(int displayit
){
1062 peakfeed
=malloc(sizeof(*peakfeed
)*multicomp_freqs_max
);
1063 rmsfeed
=malloc(sizeof(*rmsfeed
)*multicomp_freqs_max
);
1065 for(i
=0;i
<multicomp_freqs_max
;i
++){
1066 peakfeed
[i
]=malloc(sizeof(**peakfeed
)*max(input_ch
,OUTPUT_CHANNELS
));
1067 rmsfeed
[i
]=malloc(sizeof(**rmsfeed
)*max(input_ch
,OUTPUT_CHANNELS
));
1071 if(pull_multicompand_feedback_master(peakfeed
,rmsfeed
,&bands
)==1)
1072 for(i
=0;i
<bands
;i
++)
1073 multibar_set(MULTIBAR(master_panel
->bars
[i
].slider
),rmsfeed
[i
],peakfeed
[i
],
1074 OUTPUT_CHANNELS
,(displayit
&& multi_master_set
.panel_visible
));
1076 /* channel panels are a bit different; we want each in its native color */
1077 if(pull_multicompand_feedback_channel(peakfeed
,rmsfeed
,&bands
)==1){
1078 for(j
=0;j
<input_ch
;j
++){
1079 for(i
=0;i
<bands
;i
++){
1080 float rms
[input_ch
];
1081 float peak
[input_ch
];
1083 for(k
=0;k
<input_ch
;k
++){
1088 rms
[j
]=rmsfeed
[i
][j
];
1089 peak
[j
]=peakfeed
[i
][j
];
1091 multibar_set(MULTIBAR(channel_panel
[j
]->bars
[i
].slider
),rms
,peak
,
1092 input_ch
,(displayit
&& multi_channel_set
[j
].panel_visible
));
1098 void compandpanel_reset(void){
1100 for(i
=0;i
<multicomp_freqs_max
;i
++)
1101 multibar_reset(MULTIBAR(master_panel
->bars
[i
].slider
));
1103 for(i
=0;i
<multicomp_freqs_max
;i
++)
1104 for(j
=0;j
<input_ch
;j
++)
1105 multibar_reset(MULTIBAR(channel_panel
[j
]->bars
[i
].slider
));