Little spectrum analyzer app got dropped during the CVS->SVN transition.
[xiph/unicode.git] / postfish / compandpanel.c
blob8fbc5cbc735d21be0f49bb3add1479cef4b59614
1 /*
3 * postfish
4 *
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)
10 * any later version.
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.
24 #include "postfish.h"
25 #include <gtk/gtk.h>
26 #include <gdk/gdkkeysyms.h>
27 #include "readout.h"
28 #include "multibar.h"
29 #include "mainpanel.h"
30 #include "subpanel.h"
31 #include "feedback.h"
32 #include "multicompand.h"
33 #include "compandpanel.h"
34 #include "config.h"
36 typedef struct {
37 GtkWidget *label;
38 GtkWidget *slider;
39 GtkWidget *readouto;
40 GtkWidget *readoutu;
41 struct multi_panel_state *mp;
42 int number;
43 } cbar;
45 typedef struct{
46 Multibar *s;
47 Readout *r;
48 sig_atomic_t *v;
49 } callback_arg_rv;
51 typedef struct{
52 Multibar *s;
53 Readout *r0;
54 Readout *r1;
55 sig_atomic_t *v0;
56 sig_atomic_t *v1;
57 } callback_arg_rv2;
59 typedef struct{
60 struct multi_panel_state *mp;
61 int val;
62 } callback_arg_mi;
64 typedef struct multi_panel_state{
65 subpanel_generic *panel;
67 GtkWidget *over_rms;
68 GtkWidget *over_peak;
69 GtkWidget *over_softknee;
71 GtkWidget *under_rms;
72 GtkWidget *under_peak;
73 GtkWidget *under_softknee;
75 GtkWidget *base_rms;
76 GtkWidget *base_peak;
78 GtkWidget *octave[3];
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;
95 int bank_active;
96 int inactive_updatep;
97 int updating_av_slider;
98 multicompand_settings *ms;
99 cbar bars[multicomp_freqs_max+1];
101 } multi_panel_state;
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){
108 int i;
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){
137 int i;
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){
149 int i;
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);
160 if(s->over_mode)
161 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(p->over_peak),1);
162 else
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);
177 if(s->under_mode)
178 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(p->under_peak),1);
179 else
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);
194 if(s->base_mode)
195 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(p->base_peak),1);
196 else
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){
210 case 0:
211 static_octave(0,&p->octave_full);
212 break;
213 case 1:
214 static_octave(0,&p->octave_half);
215 break;
216 case 2:
217 static_octave(0,&p->octave_two);
218 break;
222 void compandpanel_state_from_config(int bank){
223 int i;
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;
232 char buffer[80];
233 float val=1./multibar_get_value(MULTIBAR(w),0);
235 if(val==1.){
236 sprintf(buffer," off");
237 }else if(val>=10){
238 sprintf(buffer,"%4.1f:1",val);
239 }else if(val>=1){
240 sprintf(buffer,"%4.2f:1",val);
241 }else if(val>.10001){
242 sprintf(buffer,"1:%4.2f",1./val);
243 }else{
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);
257 char buffer[80];
259 if(attack<10){
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.);
267 }else{
268 sprintf(buffer,"%4.1fs",attack/1000.);
270 readout_set(ca->r0,buffer);
272 if(decay<10){
273 sprintf(buffer,"%4.2fms",decay);
274 }else if(decay<100){
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.);
280 }else{
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;
291 char buffer[80];
292 Readout *r=ca->r;
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;
305 float acc=0;
306 int i;
308 for(i=0;i<multicomp_freqs[bank_active];i++){
309 if(x==1)
310 acc+=rint(bc[bank_active].static_o[i]);
311 else
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;
321 cbar *bars=mp->bars;
322 int bank_active=mp->bank_active;
324 int i;
325 int o,u;
326 int ud,od;
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){
363 char buffer[80];
364 cbar *b=(cbar *)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;
370 int o,u;
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){
384 float oav=0,uav=0;
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;
399 int i;
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];
423 break;
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];
432 break;
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];
440 break;
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];
467 break;
471 static void propogate_bank_changes_full(multicompand_settings *ms,int from_bank){
472 switch(from_bank){
473 case 0:
474 propogate_bank_changes(ms,0,1);
475 propogate_bank_changes(ms,0,2);
476 break;
477 case 1:
478 propogate_bank_changes(ms,1,0);
479 propogate_bank_changes(ms,1,2);
480 break;
481 case 2:
482 propogate_bank_changes(ms,2,0);
483 propogate_bank_changes(ms,2,1);
484 break;
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){
497 int bank_active;
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;
524 }else{
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;
540 *var=0;
543 static void mode_peak(GtkButton *b,gpointer in){
544 sig_atomic_t *var=(sig_atomic_t *)in;
545 *var=1;
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;
551 *var=mode;
554 static multi_panel_state *compandpanel_create(postfish_mainpanel *mp,
555 subpanel_generic *panel,
556 multicompand_settings *ms){
557 int i;
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,
561 -30,-20,-10,0};
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;
574 ps->bank_active=2;
575 ps->ms=ms;
576 ps->panel=panel;
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");
607 GtkWidget *octave_b=
608 gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(octave_a),
609 "full-octave");
610 GtkWidget *octave_c=
611 gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(octave_b),
612 "half-octave");
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,
645 GTK_EXPAND,0,0,0);
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),
688 "peak");
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),
790 "peak");
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),
893 "peak");
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;
970 ps->bars[i].mp=ps;
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,
982 GTK_FILL,0,10,0);
983 gtk_table_attach(GTK_TABLE(slidertable),ps->bars[i].readoutu,1,2,i+1,i+2,
984 0,0,0,0);
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,
988 0,0,0,0);
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,
1004 GTK_FILL,0,0,0);
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);
1016 return ps;
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,
1027 0,1);
1029 master_panel=compandpanel_create(mp,panel,&multi_master_set);
1032 void compandpanel_create_channel(postfish_mainpanel *mp,
1033 GtkWidget **windowbutton,
1034 GtkWidget **activebutton){
1035 int i;
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;
1042 char buffer[80];
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,
1048 buffer,NULL,
1049 i,1);
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){
1060 int i,j,k,bands;
1061 if(!peakfeed){
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++){
1084 rms[k]=-150;
1085 peak[k]=-150;
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){
1099 int i,j;
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));