annotate libao2/pl_eq.c @ 7615:c67328dd459a

Adding Support for non-reentrant audio filters
author anders
date Sun, 06 Oct 2002 11:26:14 +0000
parents a2173bfdc133
children 9fc45fe0d444
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6430
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
1 /*=============================================================================
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
2 //
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
3 // This software has been released under the terms of the GNU Public
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
4 // license. See http://www.gnu.org/copyleft/gpl.html for details.
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
5 //
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
6 // Copyright 2001 Anders Johansson ajh@atri.curtin.edu.au
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
7 //
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
8 //=============================================================================
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
9 */
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
10
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
11 /* Equalizer plugin, implementation of a 10 band time domain graphic
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
12 equalizer using IIR filters. The IIR filters are implemented using a
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
13 Direct Form II approach. But has been modified (b1 == 0 always) to
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
14 save computation.
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
15 */
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
16 #define PLUGIN
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
17
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
18 #include <stdio.h>
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
19 #include <stdlib.h>
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
20 #include <unistd.h>
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
21 #include <inttypes.h>
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
22 #include <math.h>
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
23
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
24 #include "audio_out.h"
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
25 #include "audio_plugin.h"
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
26 #include "audio_plugin_internal.h"
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
27 #include "afmt.h"
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
28 #include "eq.h"
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
29
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
30 static ao_info_t info =
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
31 {
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
32 "Equalizer audio plugin",
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
33 "eq",
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
34 "Anders",
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
35 ""
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
36 };
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
37
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
38 LIBAO_PLUGIN_EXTERN(eq)
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
39
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
40
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
41 #define CH 6 // Max number of channels
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
42 #define L 2 // Storage for filter taps
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
43 #define KM 10 // Max number of octaves
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
44
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
45 #define Q 1.2247 /* Q value for band-pass filters 1.2247=(3/2)^(1/2)
7507
a2173bfdc133 Correction of spelling errors and removal of old code
anders
parents: 6839
diff changeset
46 gives 4dB suppression @ Fc*2 and Fc/2 */
6430
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
47
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
48 // Center frequencies for band-pass filters
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
49 #define CF {31.25,62.5,125,250,500,1000,2000,4000,8000,16000}
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
50
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
51 // local data
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
52 typedef struct pl_eq_s
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
53 {
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
54 int16_t a[KM][L]; // A weights
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
55 int16_t b[KM][L]; // B weights
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
56 int16_t wq[CH][KM][L]; // Circular buffer for W data
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
57 int16_t g[CH][KM]; // Gain factor for each channel and band
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
58 int16_t K; // Number of used eq bands
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
59 int channels; // Number of channels
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
60 } pl_eq_t;
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
61
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
62 static pl_eq_t pl_eq;
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
63
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
64 // to set/get/query special features/parameters
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
65 static int control(int cmd,int arg){
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
66 switch(cmd){
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
67 case AOCONTROL_PLUGIN_SET_LEN:
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
68 return CONTROL_OK;
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
69 case AOCONTROL_PLUGIN_EQ_SET_GAIN:{
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
70 float gain = ((equalizer_t*)arg)->gain;
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
71 int ch =((equalizer_t*)arg)->channel;
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
72 int band =((equalizer_t*)arg)->band;
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
73 if(ch > CH || ch < 0 || band > KM || band < 0)
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
74 return CONTROL_ERROR;
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
75
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
76 pl_eq.g[ch][band]=(int16_t) 4096 * (pow(10.0,gain/20.0)-1.0);
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
77 return CONTROL_OK;
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
78 }
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
79 case AOCONTROL_PLUGIN_EQ_GET_GAIN:{
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
80 int ch =((equalizer_t*)arg)->channel;
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
81 int band =((equalizer_t*)arg)->band;
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
82 if(ch > CH || ch < 0 || band > KM || band < 0)
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
83 return CONTROL_ERROR;
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
84
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
85 ((equalizer_t*)arg)->gain = log10((float)pl_eq.g[ch][band]/4096.0+1) * 20.0;
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
86 return CONTROL_OK;
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
87 }
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
88 }
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
89 return CONTROL_UNKNOWN;
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
90 }
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
91
6439
edac9b35835d Fixed lround replacement, hopefully fast enough.
atmos4
parents: 6437
diff changeset
92 // return rounded 16bit int
edac9b35835d Fixed lround replacement, hopefully fast enough.
atmos4
parents: 6437
diff changeset
93 static inline int16_t lround16(double n){
edac9b35835d Fixed lround replacement, hopefully fast enough.
atmos4
parents: 6437
diff changeset
94 return (int16_t)((n)>=0.0?(n)+0.5:(n)-0.5);
edac9b35835d Fixed lround replacement, hopefully fast enough.
atmos4
parents: 6437
diff changeset
95 }
edac9b35835d Fixed lround replacement, hopefully fast enough.
atmos4
parents: 6437
diff changeset
96
6430
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
97 // 2nd order Band-pass Filter design
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
98 void bp2(int16_t* a, int16_t* b, float fc, float q){
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
99 double th=2*3.141592654*fc;
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
100 double C=(1 - tan(th*q/2))/(1 + tan(th*q/2));
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
101
6439
edac9b35835d Fixed lround replacement, hopefully fast enough.
atmos4
parents: 6437
diff changeset
102 a[0] = lround16( 16383.0 * (1 + C) * cos(th));
edac9b35835d Fixed lround replacement, hopefully fast enough.
atmos4
parents: 6437
diff changeset
103 a[1] = lround16(-16383.0 * C);
6430
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
104
6439
edac9b35835d Fixed lround replacement, hopefully fast enough.
atmos4
parents: 6437
diff changeset
105 b[0] = lround16(-16383.0 * (C - 1)/2);
edac9b35835d Fixed lround replacement, hopefully fast enough.
atmos4
parents: 6437
diff changeset
106 b[1] = lround16(-16383.0 * 1.0050);
6430
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
107 }
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
108
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
109 // empty buffers
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
110 static void reset(){
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
111 int k,l,c;
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
112 for(c=0;c<pl_eq.channels;c++)
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
113 for(k=0;k<pl_eq.K;k++)
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
114 for(l=0;l<L*2;l++)
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
115 pl_eq.wq[c][k][l]=0;
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
116 }
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
117
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
118 // open & setup audio device
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
119 // return: 1=success 0=fail
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
120 static int init(){
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
121 int c,k = 0;
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
122 float F[KM] = CF;
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
123
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
124 // Check input format
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
125 if(ao_plugin_data.format != AFMT_S16_LE){
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
126 fprintf(stderr,"[pl_eq] Input audio format not yet supported. \n");
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
127 return 0;
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
128 }
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
129
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
130 // Check number of channels
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
131 if(ao_plugin_data.channels>CH){
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
132 fprintf(stderr,"[pl_eq] Too many channels, max is 6.\n");
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
133 return 0;
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
134 }
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
135 pl_eq.channels=ao_plugin_data.channels;
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
136
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
137 // Calculate number of active filters
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
138 pl_eq.K=KM;
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
139 while(F[pl_eq.K-1] > (float)ao_plugin_data.rate/2)
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
140 pl_eq.K--;
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
141
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
142 // Generate filter taps
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
143 for(k=0;k<pl_eq.K;k++)
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
144 bp2(pl_eq.a[k],pl_eq.b[k],F[k]/((float)ao_plugin_data.rate),Q);
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
145
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
146 // Reset buffers
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
147 reset();
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
148
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
149 // Tell ao_plugin how much this plugin adds to the overall time delay
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
150 ao_plugin_data.delay_fix-=2/((float)pl_eq.channels*(float)ao_plugin_data.rate);
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
151 // Print some cool remark of what the plugin does
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
152 printf("[pl_eq] Equalizer in use.\n");
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
153 return 1;
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
154 }
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
155
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
156 // close plugin
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
157 static void uninit(){
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
158 }
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
159
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
160 // processes 'ao_plugin_data.len' bytes of 'data'
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
161 // called for every block of data
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
162 static int play(){
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
163 uint16_t ci = pl_eq.channels; // Index for channels
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
164 uint16_t nch = pl_eq.channels; // Number of channels
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
165
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
166 while(ci--){
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
167 int16_t* g = pl_eq.g[ci]; // Gain factor
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
168 int16_t* in = ((int16_t*)ao_plugin_data.data)+ci;
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
169 int16_t* out = ((int16_t*)ao_plugin_data.data)+ci;
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
170 int16_t* end = in+ao_plugin_data.len/2; // Block loop end
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
171
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
172 while(in < end){
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
173 register int16_t k = 0; // Frequency band index
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
174 register int32_t yt = 0; // Total output from filters
7507
a2173bfdc133 Correction of spelling errors and removal of old code
anders
parents: 6839
diff changeset
175 register int16_t x = *in; // Current input sample
6430
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
176 in+=nch;
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
177
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
178 // Run the filters
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
179 for(;k<pl_eq.K;k++){
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
180 // Pointer to circular buffer wq
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
181 register int16_t* wq = pl_eq.wq[ci][k];
6839
a94cde7ef947 fix (?) equalizer distortion problem
pontscho
parents: 6439
diff changeset
182 #if 0
6430
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
183 // Calculate output from AR part of current filter
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
184 register int32_t xt = (x*pl_eq.b[k][0]) >> 4;
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
185 register int32_t w = xt + wq[0]*pl_eq.a[k][0] + wq[1]*pl_eq.a[k][1];
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
186 // Calculate output form MA part of current filter
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
187 yt+=(((w + wq[1]*pl_eq.b[k][1]) >> 10)*g[k]) >> 12;
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
188 // Update circular buffer
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
189 wq[1] = wq[0]; wq[0] = w >> 14;
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
190 }
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
191
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
192 // Calculate output
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
193 *out=(int16_t)(yt+x);
6839
a94cde7ef947 fix (?) equalizer distortion problem
pontscho
parents: 6439
diff changeset
194 #else
a94cde7ef947 fix (?) equalizer distortion problem
pontscho
parents: 6439
diff changeset
195 // Calculate output from AR part of current filter
a94cde7ef947 fix (?) equalizer distortion problem
pontscho
parents: 6439
diff changeset
196 register int32_t xt = (x*pl_eq.b[k][0]) / 48;
a94cde7ef947 fix (?) equalizer distortion problem
pontscho
parents: 6439
diff changeset
197 register int32_t w = xt + wq[0]*pl_eq.a[k][0] + wq[1]*pl_eq.a[k][1];
a94cde7ef947 fix (?) equalizer distortion problem
pontscho
parents: 6439
diff changeset
198 // Calculate output form MA part of current filter
a94cde7ef947 fix (?) equalizer distortion problem
pontscho
parents: 6439
diff changeset
199 yt+=(((w + wq[1]*pl_eq.b[k][1]) >> 10)*g[k]) >> 12;
a94cde7ef947 fix (?) equalizer distortion problem
pontscho
parents: 6439
diff changeset
200 // Update circular buffer
a94cde7ef947 fix (?) equalizer distortion problem
pontscho
parents: 6439
diff changeset
201 wq[1] = wq[0]; wq[0] = w / 24576;
a94cde7ef947 fix (?) equalizer distortion problem
pontscho
parents: 6439
diff changeset
202 }
a94cde7ef947 fix (?) equalizer distortion problem
pontscho
parents: 6439
diff changeset
203
a94cde7ef947 fix (?) equalizer distortion problem
pontscho
parents: 6439
diff changeset
204 // Calculate output
a94cde7ef947 fix (?) equalizer distortion problem
pontscho
parents: 6439
diff changeset
205 *out=(int16_t)(yt * 0.25 + x * 0.5);
a94cde7ef947 fix (?) equalizer distortion problem
pontscho
parents: 6439
diff changeset
206 #endif
6430
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
207 out+=nch;
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
208 }
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
209 }
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
210 return 1;
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
211 }
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
212
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
213
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
214
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
215
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
216
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
217
97857ca97a8f Adding equalizer plugin
anders
parents:
diff changeset
218