Commit a4611361 authored by Monty Montgomery's avatar Monty Montgomery

Per-channel version of Deverb filter now active



git-svn-id: https://svn.xiph.org/trunk/postfish@6586 0101bb08-14d6-0310-b084-bc0e0c8e3800
parent b9c4208c
......@@ -89,8 +89,8 @@ typedef struct multi_panel_state{
} multi_panel_state;
multi_panel_state *master_panel;
multi_panel_state **channel_panel;
static multi_panel_state *master_panel;
static multi_panel_state **channel_panel;
static void compand_change(GtkWidget *w,gpointer in){
callback_arg_rv *ca=(callback_arg_rv *)in;
......
......@@ -951,7 +951,7 @@ void mainpanel_create(postfish_mainpanel *panel,char **chlabels){
mainpanel_chentry(panel,channeltable,"_Declip ",1,1,0,clippanel_create);
mainpanel_chentry(panel,channeltable,"_Multicomp ",2,0,1,compandpanel_create_channel);
mainpanel_chentry(panel,channeltable,"_Onecomp ",3,0,1,0);
mainpanel_chentry(panel,channeltable,"De_verb ",4,1,0,0);
mainpanel_chentry(panel,channeltable,"De_verb ",4,1,0,suppresspanel_create_channel);
mainpanel_chentry(panel,channeltable,"_Reverb ",5,1,0,0);
mainpanel_chentry(panel,channeltable,"_EQ ",6,0,1,0);
......@@ -979,7 +979,7 @@ void mainpanel_create(postfish_mainpanel *panel,char **chlabels){
mainpanel_masterentry(panel,mastertable,"_Crossmix "," c ",GDK_c,0,0);
mainpanel_masterentry(panel,mastertable,"_Multicomp "," m ",GDK_m,1,compandpanel_create_master);
mainpanel_masterentry(panel,mastertable,"_Onecomp "," o ",GDK_o,2,singlepanel_create);
mainpanel_masterentry(panel,mastertable,"De_verb "," v ",GDK_v,3,suppresspanel_create);
mainpanel_masterentry(panel,mastertable,"De_verb "," v ",GDK_v,3,suppresspanel_create_master);
mainpanel_masterentry(panel,mastertable,"_Reverb "," r ",GDK_r,4,0);
mainpanel_masterentry(panel,mastertable,"_EQ "," e ",GDK_e,5,eqpanel_create);
mainpanel_masterentry(panel,mastertable,"_Limit "," l ",GDK_l,6,limitpanel_create);
......
......@@ -240,12 +240,14 @@ void *playback_thread(void *dummy){
result|=link->samples;
link=multicompand_read_channel(link);
result|=link->samples;
link=suppress_read_channel(link);
result|=link->samples;
link=multicompand_read_master(link);
result|=link->samples;
link=singlecomp_read(link);
result|=link->samples;
link=suppress_read(link);
link=suppress_read_master(link);
result|=link->samples;
link=eq_read(link);
result|=link->samples;
......
......@@ -47,7 +47,6 @@ extern int input_ch;
typedef struct {
subband_state ss;
subband_window sw;
iir_filter smooth;
iir_filter trigger;
......@@ -59,27 +58,32 @@ typedef struct {
} suppress_state;
sig_atomic_t suppress_visible;
sig_atomic_t suppress_active;
suppress_settings sset;
static suppress_state sss;
suppress_settings suppress_master_set;
suppress_settings suppress_channel_set;
static suppress_state master_state;
static suppress_state channel_state;
static subband_window sw;
void suppress_reset(){
int i,j;
subband_reset(&sss.ss);
subband_reset(&master_state.ss);
subband_reset(&channel_state.ss);
for(i=0;i<suppress_freqs;i++){
for(j=0;j<input_ch;j++){
memset(&sss.iirS[i][j],0,sizeof(iir_state));
memset(&sss.iirT[i][j],0,sizeof(iir_state));
memset(&sss.iirR[i][j],0,sizeof(iir_state));
memset(&master_state.iirS[i][j],0,sizeof(iir_state));
memset(&master_state.iirT[i][j],0,sizeof(iir_state));
memset(&master_state.iirR[i][j],0,sizeof(iir_state));
memset(&channel_state.iirS[i][j],0,sizeof(iir_state));
memset(&channel_state.iirT[i][j],0,sizeof(iir_state));
memset(&channel_state.iirR[i][j],0,sizeof(iir_state));
}
}
}
static void filter_set(float msec,
static void filter_set(subband_state *ss,
float msec,
iir_filter *filter,
int attackp,
int order){
......@@ -88,9 +92,9 @@ static void filter_set(float msec,
/* make sure the chosen frequency doesn't require a lookahead
greater than what's available */
if(impulse_freq4(input_size*2-sss.ss.qblocksize*3)*1.01>corner_freq &&
if(impulse_freq4(input_size*2-ss->qblocksize*3)*1.01>corner_freq &&
attackp)
corner_freq=impulse_freq4(input_size*2-sss.ss.qblocksize*3);
corner_freq=impulse_freq4(input_size*2-ss->qblocksize*3);
alpha=corner_freq/input_rate;
filter->g=mkbessel(alpha,order,filter->c);
......@@ -102,34 +106,43 @@ static void filter_set(float msec,
int suppress_load(void){
int i;
int qblocksize=input_size/16;
memset(&sss,0,sizeof(sss));
memset(&master_state,0,sizeof(master_state));
memset(&channel_state,0,sizeof(channel_state));
suppress_master_set.active=calloc(input_ch,sizeof(*suppress_master_set.active));
suppress_channel_set.active=calloc(input_ch,sizeof(*suppress_channel_set.active));
subband_load(&master_state.ss,suppress_freqs,qblocksize);
subband_load(&channel_state.ss,suppress_freqs,qblocksize);
subband_load(&sss.ss,suppress_freqs,qblocksize);
subband_load_freqs(&sss.ss,&sss.sw,suppress_freq_list,suppress_freqs);
subband_load_freqs(&master_state.ss,&sw,suppress_freq_list,suppress_freqs);
for(i=0;i<suppress_freqs;i++){
sss.iirS[i]=calloc(input_ch,sizeof(iir_state));
sss.iirT[i]=calloc(input_ch,sizeof(iir_state));
sss.iirR[i]=calloc(input_ch,sizeof(iir_state));
master_state.iirS[i]=calloc(input_ch,sizeof(iir_state));
master_state.iirT[i]=calloc(input_ch,sizeof(iir_state));
master_state.iirR[i]=calloc(input_ch,sizeof(iir_state));
channel_state.iirS[i]=calloc(input_ch,sizeof(iir_state));
channel_state.iirT[i]=calloc(input_ch,sizeof(iir_state));
channel_state.iirR[i]=calloc(input_ch,sizeof(iir_state));
}
return 0;
}
static void suppress_work(void *vs){
static void suppress_work_helper(void *vs, suppress_settings *sset){
suppress_state *sss=(suppress_state *)vs;
subband_state *ss=&sss->ss;
int i,j,k,l;
float smoothms=sset.smooth*.1;
float triggerms=sset.trigger*.1;
float releasems=sset.release*.1;
float smoothms=sset->smooth*.1;
float triggerms=sset->trigger*.1;
float releasems=sset->release*.1;
iir_filter *trigger=&sss->trigger;
iir_filter *smooth=&sss->smooth;
iir_filter *release=&sss->release;
int ahead;
if(smoothms!=smooth->ms)filter_set(smoothms,smooth,1,4);
if(triggerms!=trigger->ms)filter_set(triggerms,trigger,0,1);
if(releasems!=release->ms)filter_set(releasems,release,0,1);
if(smoothms!=smooth->ms)filter_set(ss,smoothms,smooth,1,4);
if(triggerms!=trigger->ms)filter_set(ss,triggerms,trigger,0,1);
if(releasems!=release->ms)filter_set(ss,releasems,release,0,1);
ahead=impulse_ahead4(smooth->alpha);
......@@ -137,7 +150,7 @@ static void suppress_work(void *vs){
int firstlink=0;
float fast[input_size];
float slow[input_size];
float multiplier = 1.-1000./sset.ratio[i];
float multiplier = 1.-1000./sset->ratio[i];
for(j=0;j<input_ch;j++){
int active=(ss->effect_active1[j] ||
......@@ -145,7 +158,7 @@ static void suppress_work(void *vs){
ss->effect_activeC[j]);
if(active){
if(sset.linkp){
if(sset->linkp){
if(!firstlink){
firstlink++;
memset(fast,0,sizeof(fast));
......@@ -167,7 +180,7 @@ static void suppress_work(void *vs){
}
if(sset.linkp==0 || firstlink==1){
if(sset->linkp==0 || firstlink==1){
compute_iir_symmetric4(fast, input_size, &sss->iirS[i][j],
smooth);
......@@ -186,7 +199,7 @@ static void suppress_work(void *vs){
fast[k]=fromdB_a((todB_a(slow+k)-todB_a(fast+k))*.5*multiplier);
//_analysis("adj",i,fast,input_size,1,offset);
if(sset.linkp && firstlink==1){
if(sset->linkp && firstlink==1){
for(l=0;l<input_ch;l++){
if(l!=j){
......@@ -217,19 +230,42 @@ static void suppress_work(void *vs){
}
}
time_linkage *suppress_read(time_linkage *in){
static void suppress_work_master(void *vs){
suppress_work_helper(vs,&suppress_master_set);
}
static void suppress_work_channel(void *vs){
suppress_work_helper(vs,&suppress_channel_set);
}
time_linkage *suppress_read_master(time_linkage *in){
int visible[input_ch];
int active[input_ch];
int active [input_ch];
subband_window *w[input_ch];
int i;
for(i=0;i<input_ch;i++){
visible[i]=0;
active[i]=suppress_active;
w[i]=&sss.sw;
active[i]=suppress_master_set.active[0];
w[i]=&sw;
}
return subband_read(in, &sss.ss, w, visible, active, suppress_work, &sss);
return subband_read(in, &master_state.ss, w, visible, active,
suppress_work_master, &master_state);
}
time_linkage *suppress_read_channel(time_linkage *in){
int visible[input_ch];
int active [input_ch];
subband_window *w[input_ch];
int i;
for(i=0;i<input_ch;i++){
visible[i]=0;
active[i]=suppress_channel_set.active[i];
w[i]=&sw;
}
return subband_read(in, &channel_state.ss, w, visible, active,
suppress_work_channel, &channel_state);
}
......@@ -38,9 +38,13 @@ typedef struct {
sig_atomic_t trigger;
sig_atomic_t release;
sig_atomic_t linkp;
sig_atomic_t *active;
sig_atomic_t panel_visible;
} suppress_settings;
extern void suppress_reset();
extern int suppress_load(void);
extern time_linkage *suppress_read(time_linkage *in);
extern time_linkage *suppress_read_master(time_linkage *in);
extern time_linkage *suppress_read_channel(time_linkage *in);
......@@ -32,25 +32,37 @@
#include "suppress.h"
#include "suppresspanel.h"
extern sig_atomic_t suppress_active;
extern sig_atomic_t suppress_visible;
extern int input_ch;
extern int input_size;
extern int input_rate;
extern suppress_settings sset;
extern suppress_settings suppress_master_set;
extern suppress_settings suppress_channel_set;
typedef struct {
GtkWidget *cslider;
Readout *readoutc;
struct suppress_panel_state *sp;
sig_atomic_t *v;
int number;
} tbar;
Readout *readoutsmooth;
Readout *readouttrigger;
Readout *readoutrelease;
typedef struct{
Readout *r0;
Readout *r1;
Readout *r2;
sig_atomic_t *v0;
sig_atomic_t *v1;
sig_atomic_t *v2;
} callback_arg_rv3;
static tbar bars[suppress_freqs+1];
typedef struct suppress_panel_state{
callback_arg_rv3 timing;
tbar bars[suppress_freqs+1];
} suppress_panel_state;
static suppress_panel_state *master_panel;
static suppress_panel_state *channel_panel;
static void compand_change(GtkWidget *w,gpointer in){
char buffer[80];
......@@ -64,11 +76,11 @@ static void compand_change(GtkWidget *w,gpointer in){
readout_set(bar->readoutc,buffer);
sset.ratio[bar->number]=1000./val;
*bar->v=1000./val;
}
static void timing_change(GtkWidget *w,gpointer in){
callback_arg_rv3 *ca=(callback_arg_rv3 *)in;
char buffer[80];
float smooth=multibar_get_value(MULTIBAR(w),0);
float trigger=multibar_get_value(MULTIBAR(w),1);
......@@ -83,7 +95,7 @@ static void timing_change(GtkWidget *w,gpointer in){
}else{
sprintf(buffer," %4.1fs",smooth/1000.);
}
readout_set(readoutsmooth,buffer);
readout_set(ca->r0,buffer);
if(trigger<100){
sprintf(buffer,"%4.1fms",trigger);
......@@ -94,7 +106,7 @@ static void timing_change(GtkWidget *w,gpointer in){
}else{
sprintf(buffer," %4.1fs",trigger/1000.);
}
readout_set(readouttrigger,buffer);
readout_set(ca->r1,buffer);
if(release<100){
sprintf(buffer,"%4.1fms",release);
......@@ -105,21 +117,21 @@ static void timing_change(GtkWidget *w,gpointer in){
}else{
sprintf(buffer," %4.1fs",release/1000.);
}
readout_set(readoutrelease,buffer);
readout_set(ca->r2,buffer);
sset.smooth=rint(smooth*10.);
sset.trigger=rint(trigger*10.);
sset.release=rint(release*10.);
*ca->v0=rint(smooth*10.);
*ca->v1=rint(trigger*10.);
*ca->v2=rint(release*10.);
}
static void suppress_link(GtkToggleButton *b,gpointer in){
int mode=gtk_toggle_button_get_active(b);
sset.linkp=mode;
*((sig_atomic_t *)in)=mode;
}
void suppresspanel_create(postfish_mainpanel *mp,
GtkWidget *windowbutton,
GtkWidget *activebutton){
static suppress_panel_state *suppresspanel_create_helper(postfish_mainpanel *mp,
subpanel_generic *panel,
suppress_settings *sset){
int i;
float compand_levels[5]={1,1.5,2,3,5};
char *compand_labels[4]={"1.5","2","3","5"};
......@@ -127,15 +139,6 @@ void suppresspanel_create(postfish_mainpanel *mp,
float timing_levels[5]={1, 10, 100, 1000, 10000};
char *timing_labels[4]={"10ms"," 100ms","1s","10s"};
char *shortcut[]={" v "};
subpanel_generic *panel=subpanel_create(mp,windowbutton,&activebutton,
&suppress_active,
&suppress_visible,
"De_verberation filter",shortcut,
0,1);
GtkWidget *table=gtk_table_new(suppress_freqs+4,5,0);
GtkWidget *timinglabel=gtk_label_new("suppressor filter timing");
GtkWidget *releaselabel=gtk_label_new("release");
......@@ -147,6 +150,8 @@ void suppresspanel_create(postfish_mainpanel *mp,
gtk_check_button_new_with_mnemonic("_link channels into single image");
GtkWidget *linkbox=gtk_hbox_new(0,0);
suppress_panel_state *ps=calloc(1,sizeof(suppress_panel_state));
gtk_container_add(GTK_CONTAINER(panel->subpanel_box),table);
gtk_box_pack_end(GTK_BOX(linkbox),linkbutton,0,0,0);
......@@ -189,18 +194,22 @@ void suppresspanel_create(postfish_mainpanel *mp,
gtk_widget_set_name(compandlabel,"framelabel");
g_signal_connect (G_OBJECT (linkbutton), "clicked",
G_CALLBACK (suppress_link), 0);
G_CALLBACK (suppress_link), &sset->linkp);
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(linkbutton),1);
/* timing controls */
{
GtkWidget *slider=multibar_slider_new(4,timing_labels,timing_levels,3);
readoutsmooth=READOUT(readout_new("10.0ms"));
readouttrigger=READOUT(readout_new("10.0ms"));
readoutrelease=READOUT(readout_new("10.0ms"));
multibar_callback(MULTIBAR(slider),timing_change,0);
ps->timing.r0=READOUT(readout_new("10.0ms"));
ps->timing.r1=READOUT(readout_new("10.0ms"));
ps->timing.r2=READOUT(readout_new("10.0ms"));
ps->timing.v0=&sset->smooth;
ps->timing.v1=&sset->trigger;
ps->timing.v2=&sset->release;
multibar_callback(MULTIBAR(slider),timing_change,&ps->timing);
multibar_thumb_set(MULTIBAR(slider),20,0);
multibar_thumb_set(MULTIBAR(slider),100,1);
......@@ -208,11 +217,11 @@ void suppresspanel_create(postfish_mainpanel *mp,
gtk_table_attach(GTK_TABLE(table),slider,1,2,1,2,
GTK_FILL|GTK_EXPAND,GTK_EXPAND,5,0);
gtk_table_attach(GTK_TABLE(table),GTK_WIDGET(readoutsmooth),2,3,1,2,
gtk_table_attach(GTK_TABLE(table),GTK_WIDGET(ps->timing.r0),2,3,1,2,
0,0,0,0);
gtk_table_attach(GTK_TABLE(table),GTK_WIDGET(readouttrigger),3,4,1,2,
gtk_table_attach(GTK_TABLE(table),GTK_WIDGET(ps->timing.r1),3,4,1,2,
0,0,0,0);
gtk_table_attach(GTK_TABLE(table),GTK_WIDGET(readoutrelease),4,5,1,2,
gtk_table_attach(GTK_TABLE(table),GTK_WIDGET(ps->timing.r2),4,5,1,2,
0,0,0,0);
}
......@@ -222,24 +231,54 @@ void suppresspanel_create(postfish_mainpanel *mp,
GtkWidget *label=gtk_label_new(suppress_freq_labels[i]);
gtk_widget_set_name(label,"scalemarker");
bars[i].readoutc=READOUT(readout_new("1.55:1"));
bars[i].cslider=multibar_slider_new(4,compand_labels,compand_levels,1);
bars[i].number=i;
multibar_callback(MULTIBAR(bars[i].cslider),compand_change,bars+i);
multibar_thumb_set(MULTIBAR(bars[i].cslider),1,0);
ps->bars[i].readoutc=READOUT(readout_new("1.55:1"));
ps->bars[i].cslider=multibar_slider_new(4,compand_labels,compand_levels,1);
ps->bars[i].sp=ps;
ps->bars[i].v=sset->ratio+i;
ps->bars[i].number=i;
multibar_callback(MULTIBAR(ps->bars[i].cslider),compand_change,ps->bars+i);
multibar_thumb_set(MULTIBAR(ps->bars[i].cslider),1,0);
gtk_misc_set_alignment(GTK_MISC(label),1,.5);
gtk_table_attach(GTK_TABLE(table),label,0,1,i+3,i+4,
GTK_FILL,0,0,0);
gtk_table_attach(GTK_TABLE(table),bars[i].cslider,1,4,i+3,i+4,
gtk_table_attach(GTK_TABLE(table),ps->bars[i].cslider,1,4,i+3,i+4,
GTK_FILL|GTK_EXPAND,GTK_EXPAND,5,0);
gtk_table_attach(GTK_TABLE(table),GTK_WIDGET(bars[i].readoutc),4,5,
gtk_table_attach(GTK_TABLE(table),GTK_WIDGET(ps->bars[i].readoutc),4,5,
i+3,i+4,0,0,0,0);
}
subpanel_show_all_but_toplevel(panel);
return ps;
}
void suppresspanel_create_master(postfish_mainpanel *mp,
GtkWidget *windowbutton,
GtkWidget *activebutton){
char *shortcut[]={" v "};
subpanel_generic *panel=subpanel_create(mp,windowbutton,&activebutton,
&suppress_master_set.active[0],
&suppress_master_set.panel_visible,
"De_verberation filter (master)",shortcut,
0,1);
master_panel=suppresspanel_create_helper(mp,panel,&suppress_master_set);
}
void suppresspanel_create_channel(postfish_mainpanel *mp,
GtkWidget **windowbutton,
GtkWidget **activebutton){
subpanel_generic *panel=subpanel_create(mp,windowbutton[0],activebutton,
suppress_channel_set.active,
&suppress_channel_set.panel_visible,
"De_verberation filter",0,
0,input_ch);
channel_panel=suppresspanel_create_helper(mp,panel,&suppress_channel_set);
}
......@@ -21,6 +21,10 @@
*
*/
extern void suppresspanel_create(postfish_mainpanel *mp,
GtkWidget *windowbutton,
GtkWidget *activebutton);
extern void suppresspanel_create_master(postfish_mainpanel *mp,
GtkWidget *windowbutton,
GtkWidget *activebutton);
extern void suppresspanel_create_channel(postfish_mainpanel *mp,
GtkWidget **windowbutton,
GtkWidget **activebutton);
#define VERSION "$Id$ "
/* DO NOT EDIT: Automated versioning hack [Fri Apr 23 17:45:27 EDT 2004] */
/* DO NOT EDIT: Automated versioning hack [Fri Apr 23 20:01:01 EDT 2004] */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment