Recognizes if input is ogg or not.
[xiph.git] / postfish / reverbpanel.c
blob80426aaa3537eecf8598891a00372da0d66ee956
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 "freeverb.h"
32 #include "reverbpanel.h"
33 #include "config.h"
35 typedef struct {
36 GtkWidget *s;
37 GtkWidget *r;
38 sig_atomic_t *val;
39 } slider_readout_pair;
41 typedef struct{
42 subpanel_generic *panel;
44 slider_readout_pair *roomsize;
45 slider_readout_pair *liveness;
46 slider_readout_pair *hfdamp;
47 slider_readout_pair *wet;
48 slider_readout_pair *width;
49 slider_readout_pair *delay;
51 } reverb_panel_state;
53 reverb_panel_state *master_panel;
54 reverb_panel_state **channel_panel;
56 static void reverbpanel_state_to_config_helper(int bank,reverb_settings *s,int A){
57 config_set_integer("reverb_active",bank,A,0,0,0,s->active);
59 config_set_integer("reverb_set",bank,A,0,0,3,s->roomsize);
60 config_set_integer("reverb_set",bank,A,0,0,4,s->liveness);
61 config_set_integer("reverb_set",bank,A,0,0,5,s->wet);
62 config_set_integer("reverb_set",bank,A,0,0,6,s->width);
63 config_set_integer("reverb_set",bank,A,0,0,7,s->delay);
64 config_set_integer("reverb_set",bank,A,0,0,8,s->hfdamp);
67 void reverbpanel_state_to_config(int bank){
68 int i;
69 reverbpanel_state_to_config_helper(bank,&reverb_masterset,0);
70 for(i=0;i<input_ch;i++)
71 reverbpanel_state_to_config_helper(bank,reverb_channelset+i,i+1);
74 static void reverbpanel_state_from_config_helper(int bank,reverb_settings *s,
75 reverb_panel_state *p,int A){
77 config_get_sigat("reverb_active",bank,A,0,0,0,&s->active);
78 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(p->panel->subpanel_activebutton[0]),s->active);
81 config_get_sigat("reverb_set",bank,A,0,0,3,&s->roomsize);
82 multibar_thumb_set(MULTIBAR(p->roomsize->s),s->roomsize,0);
84 config_get_sigat("reverb_set",bank,A,0,0,4,&s->liveness);
85 multibar_thumb_set(MULTIBAR(p->liveness->s),s->liveness,0);
87 config_get_sigat("reverb_set",bank,A,0,0,5,&s->wet);
88 multibar_thumb_set(MULTIBAR(p->wet->s),s->wet,0);
90 config_get_sigat("reverb_set",bank,A,0,0,6,&s->width);
91 multibar_thumb_set(MULTIBAR(p->width->s),s->width,0);
93 config_get_sigat("reverb_set",bank,A,0,0,7,&s->delay);
94 multibar_thumb_set(MULTIBAR(p->delay->s),s->delay,0);
96 config_get_sigat("reverb_set",bank,A,0,0,8,&s->hfdamp);
97 multibar_thumb_set(MULTIBAR(p->hfdamp->s),s->hfdamp,0);
101 void reverbpanel_state_from_config(int bank){
102 int i;
103 reverbpanel_state_from_config_helper(bank,&reverb_masterset,master_panel,0);
104 for(i=0;i<input_ch;i++)
105 reverbpanel_state_from_config_helper(bank,reverb_channelset+i,channel_panel[i],i+1);
108 static void slider_change(GtkWidget *w,gpointer in){
109 char buffer[80];
110 slider_readout_pair *p=(slider_readout_pair *)in;
111 float val=multibar_get_value(MULTIBAR(p->s),0);
113 sprintf(buffer,"%5.2f",val*.01);
114 readout_set(READOUT(p->r),buffer);
116 *p->val=rint(val);
119 static void slider_change_dB(GtkWidget *w,gpointer in){
120 char buffer[80];
121 slider_readout_pair *p=(slider_readout_pair *)in;
122 float val=multibar_get_value(MULTIBAR(p->s),0);
124 sprintf(buffer,"%+4.1f",val*.1);
125 readout_set(READOUT(p->r),buffer);
127 *p->val=rint(val);
130 static reverb_panel_state *reverbpanel_create_helper (postfish_mainpanel *mp,
131 subpanel_generic *panel,
132 reverb_settings *ps, int stereop){
134 char *labels[11]={"","1","2","3","4","5","6","7","8","9","10"};
135 float levels[11]={0,100,200,300,400,500,600,700,800,900,1000};
137 char *labelsdB[11]={"","-40","-20","-10","-3","0dB","+3","+10","+20","+40","+80"};
138 float levelsdB[11]={-800,-400,-200,-100,-30,0,30,100,200,400,800};
140 GtkWidget *table=gtk_table_new(7,3,0);
141 slider_readout_pair *p1=malloc(sizeof(*p1));
142 slider_readout_pair *p2=malloc(sizeof(*p2));
143 slider_readout_pair *p3=malloc(sizeof(*p3));
144 slider_readout_pair *p4=malloc(sizeof(*p4));
145 slider_readout_pair *p5=malloc(sizeof(*p5));
146 slider_readout_pair *p6=malloc(sizeof(*p6));
148 GtkWidget *l1=gtk_label_new("Room Size ");
149 GtkWidget *l2=gtk_label_new("Room Liveness ");
150 GtkWidget *l3=gtk_label_new("High Damping ");
151 GtkWidget *l4=gtk_label_new("Predelay ");
152 GtkWidget *l5=gtk_label_new("Stereo Width ");
153 GtkWidget *l6=gtk_label_new("Wet Level ");
155 reverb_panel_state *p=calloc(1,sizeof(*p));
156 p->panel=panel;
158 gtk_misc_set_alignment(GTK_MISC(l1),1,.5);
159 gtk_misc_set_alignment(GTK_MISC(l2),1,.5);
160 gtk_misc_set_alignment(GTK_MISC(l3),1,.5);
161 gtk_misc_set_alignment(GTK_MISC(l4),1,.5);
162 gtk_misc_set_alignment(GTK_MISC(l5),1,.5);
163 gtk_misc_set_alignment(GTK_MISC(l6),1,.5);
165 p->roomsize=p1;
166 p1->s=multibar_slider_new(11,labels,levels,1);
167 p1->r=readout_new(" 10.00 ");
168 p1->val=&ps->roomsize;
170 p->liveness=p2;
171 p2->s=multibar_slider_new(11,labels,levels,1);
172 p2->r=readout_new(" 10.00 ");
173 p2->val=&ps->liveness;
175 p->hfdamp=p3;
176 p3->s=multibar_slider_new(11,labels,levels,1);
177 p3->r=readout_new(" 10.00 ");
178 p3->val=&ps->hfdamp;
180 p->delay=p4;
181 p4->s=multibar_slider_new(11,labels,levels,1);
182 p4->r=readout_new(" 10.00 ");
183 p4->val=&ps->delay;
185 p->width=p5;
186 p5->s=multibar_slider_new(11,labels,levels,1);
187 p5->r=readout_new(" 10.00 ");
188 p5->val=&ps->width;
190 p->wet=p6;
191 p6->s=multibar_slider_new(11,labelsdB,levelsdB,1);
192 p6->r=readout_new("+10.0 dB");
193 p6->val=&ps->wet;
196 gtk_table_attach(GTK_TABLE(table),l1,0,1,0,1,
197 GTK_FILL,GTK_FILL|GTK_EXPAND,2,0);
198 gtk_table_attach(GTK_TABLE(table),p1->s,1,2,0,1,
199 GTK_FILL,GTK_FILL|GTK_EXPAND,2,0);
200 gtk_table_attach(GTK_TABLE(table),p1->r,2,3,0,1,
201 GTK_FILL,GTK_FILL|GTK_EXPAND,2,0);
203 gtk_table_attach(GTK_TABLE(table),l2,0,1,1,2,
204 GTK_FILL,GTK_FILL|GTK_EXPAND,2,0);
205 gtk_table_attach(GTK_TABLE(table),p2->s,1,2,1,2,
206 GTK_FILL,GTK_FILL|GTK_EXPAND,2,0);
207 gtk_table_attach(GTK_TABLE(table),p2->r,2,3,1,2,
208 GTK_FILL,GTK_FILL|GTK_EXPAND,2,0);
210 gtk_table_attach(GTK_TABLE(table),l3,0,1,2,3,
211 GTK_FILL,GTK_FILL|GTK_EXPAND,2,0);
212 gtk_table_attach(GTK_TABLE(table),p3->s,1,2,2,3,
213 GTK_FILL,GTK_FILL|GTK_EXPAND,2,0);
214 gtk_table_attach(GTK_TABLE(table),p3->r,2,3,2,3,
215 GTK_FILL,GTK_FILL|GTK_EXPAND,2,0);
217 gtk_table_attach(GTK_TABLE(table),l4,0,1,3,4,
218 GTK_FILL,GTK_FILL|GTK_EXPAND,2,0);
219 gtk_table_attach(GTK_TABLE(table),p4->s,1,2,3,4,
220 GTK_FILL,GTK_FILL|GTK_EXPAND,2,0);
221 gtk_table_attach(GTK_TABLE(table),p4->r,2,3,3,4,
222 GTK_FILL,GTK_FILL|GTK_EXPAND,2,0);
224 if(stereop){
225 gtk_table_attach(GTK_TABLE(table),l5,0,1,4,5,
226 GTK_FILL,GTK_FILL|GTK_EXPAND,2,0);
227 gtk_table_attach(GTK_TABLE(table),p5->s,1,2,4,5,
228 GTK_FILL,GTK_FILL|GTK_EXPAND,2,0);
229 gtk_table_attach(GTK_TABLE(table),p5->r,2,3,4,5,
230 GTK_FILL,GTK_FILL|GTK_EXPAND,2,0);
233 gtk_table_attach(GTK_TABLE(table),l6,0,1,6,7,
234 GTK_FILL,GTK_FILL|GTK_EXPAND,2,0);
235 gtk_table_attach(GTK_TABLE(table),p6->s,1,2,6,7,
236 GTK_FILL,GTK_FILL|GTK_EXPAND,2,0);
237 gtk_table_attach(GTK_TABLE(table),p6->r,2,3,6,7,
238 GTK_FILL,GTK_FILL|GTK_EXPAND,2,0);
240 gtk_container_add(GTK_CONTAINER(panel->subpanel_box),table);
242 multibar_callback(MULTIBAR(p1->s),slider_change,p1);
243 multibar_callback(MULTIBAR(p2->s),slider_change,p2);
244 multibar_callback(MULTIBAR(p3->s),slider_change,p3);
245 multibar_callback(MULTIBAR(p4->s),slider_change,p4);
246 multibar_callback(MULTIBAR(p5->s),slider_change,p5);
247 multibar_callback(MULTIBAR(p6->s),slider_change_dB,p6);
249 multibar_thumb_set(MULTIBAR(p1->s),5000,0);
250 multibar_thumb_set(MULTIBAR(p2->s),400,0);
251 multibar_thumb_set(MULTIBAR(p3->s),800,0);
252 multibar_thumb_set(MULTIBAR(p4->s),0,0);
253 multibar_thumb_set(MULTIBAR(p5->s),500,0);
254 multibar_thumb_set(MULTIBAR(p6->s),0,0);
256 multibar_thumb_increment(MULTIBAR(p1->s),1,10);
257 multibar_thumb_increment(MULTIBAR(p2->s),1,10);
258 multibar_thumb_increment(MULTIBAR(p3->s),1,10);
259 multibar_thumb_increment(MULTIBAR(p4->s),1,10);
260 multibar_thumb_increment(MULTIBAR(p5->s),1,10);
261 multibar_thumb_increment(MULTIBAR(p6->s),1,10);
263 subpanel_show_all_but_toplevel(panel);
264 return p;
267 void reverbpanel_create_master(postfish_mainpanel *mp,
268 GtkWidget *windowbutton,
269 GtkWidget *activebutton){
271 char *shortcut[]={" r "};
272 subpanel_generic *panel=subpanel_create(mp,windowbutton,&activebutton,
273 &reverb_masterset.active,
274 &reverb_masterset.visible,
275 "_Reverb (master)",shortcut,
276 0,1);
277 master_panel=reverbpanel_create_helper(mp,panel,&reverb_masterset,0);
280 void reverbpanel_create_channel(postfish_mainpanel *mp,
281 GtkWidget **windowbutton,
282 GtkWidget **activebutton){
283 int i;
284 /* a panel for each channel */
285 channel_panel=calloc(input_ch,sizeof(*channel_panel));
287 for(i=0;i<input_ch;i++){
288 subpanel_generic *panel;
289 char buffer[80];
291 sprintf(buffer,"_Reverb (channel %d)",i+1);
292 panel=subpanel_create(mp,windowbutton[i],activebutton+i,
293 &reverb_channelset[i].active,
294 &reverb_channelset[i].visible,
295 buffer,NULL,
296 i,1);
298 channel_panel[i]=reverbpanel_create_helper(mp,panel,reverb_channelset+i,1);