1*28e138c6SAndroid Build Coastguard Worker /* Copyright (C) 2006-2008 CSIRO, Jean-Marc Valin, Xiph.Org Foundation
2*28e138c6SAndroid Build Coastguard Worker
3*28e138c6SAndroid Build Coastguard Worker File: scal.c
4*28e138c6SAndroid Build Coastguard Worker Shaped comb-allpass filter for channel decorrelation
5*28e138c6SAndroid Build Coastguard Worker
6*28e138c6SAndroid Build Coastguard Worker Redistribution and use in source and binary forms, with or without
7*28e138c6SAndroid Build Coastguard Worker modification, are permitted provided that the following conditions are
8*28e138c6SAndroid Build Coastguard Worker met:
9*28e138c6SAndroid Build Coastguard Worker
10*28e138c6SAndroid Build Coastguard Worker 1. Redistributions of source code must retain the above copyright notice,
11*28e138c6SAndroid Build Coastguard Worker this list of conditions and the following disclaimer.
12*28e138c6SAndroid Build Coastguard Worker
13*28e138c6SAndroid Build Coastguard Worker 2. Redistributions in binary form must reproduce the above copyright
14*28e138c6SAndroid Build Coastguard Worker notice, this list of conditions and the following disclaimer in the
15*28e138c6SAndroid Build Coastguard Worker documentation and/or other materials provided with the distribution.
16*28e138c6SAndroid Build Coastguard Worker
17*28e138c6SAndroid Build Coastguard Worker 3. The name of the author may not be used to endorse or promote products
18*28e138c6SAndroid Build Coastguard Worker derived from this software without specific prior written permission.
19*28e138c6SAndroid Build Coastguard Worker
20*28e138c6SAndroid Build Coastguard Worker THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
21*28e138c6SAndroid Build Coastguard Worker IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
22*28e138c6SAndroid Build Coastguard Worker OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
23*28e138c6SAndroid Build Coastguard Worker DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
24*28e138c6SAndroid Build Coastguard Worker INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
25*28e138c6SAndroid Build Coastguard Worker (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
26*28e138c6SAndroid Build Coastguard Worker SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27*28e138c6SAndroid Build Coastguard Worker HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
28*28e138c6SAndroid Build Coastguard Worker STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
29*28e138c6SAndroid Build Coastguard Worker ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30*28e138c6SAndroid Build Coastguard Worker POSSIBILITY OF SUCH DAMAGE.
31*28e138c6SAndroid Build Coastguard Worker */
32*28e138c6SAndroid Build Coastguard Worker
33*28e138c6SAndroid Build Coastguard Worker /*
34*28e138c6SAndroid Build Coastguard Worker The algorithm implemented here is described in:
35*28e138c6SAndroid Build Coastguard Worker
36*28e138c6SAndroid Build Coastguard Worker * J.-M. Valin, Perceptually-Motivated Nonlinear Channel Decorrelation For
37*28e138c6SAndroid Build Coastguard Worker Stereo Acoustic Echo Cancellation, Accepted for Joint Workshop on
38*28e138c6SAndroid Build Coastguard Worker Handsfree Speech Communication and Microphone Arrays (HSCMA), 2008.
39*28e138c6SAndroid Build Coastguard Worker http://people.xiph.org/~jm/papers/valin_hscma2008.pdf
40*28e138c6SAndroid Build Coastguard Worker
41*28e138c6SAndroid Build Coastguard Worker */
42*28e138c6SAndroid Build Coastguard Worker
43*28e138c6SAndroid Build Coastguard Worker #ifdef HAVE_CONFIG_H
44*28e138c6SAndroid Build Coastguard Worker #include "config.h"
45*28e138c6SAndroid Build Coastguard Worker #endif
46*28e138c6SAndroid Build Coastguard Worker
47*28e138c6SAndroid Build Coastguard Worker #include "speex/speex_echo.h"
48*28e138c6SAndroid Build Coastguard Worker #include "vorbis_psy.h"
49*28e138c6SAndroid Build Coastguard Worker #include "arch.h"
50*28e138c6SAndroid Build Coastguard Worker #include "os_support.h"
51*28e138c6SAndroid Build Coastguard Worker #include "smallft.h"
52*28e138c6SAndroid Build Coastguard Worker #include <math.h>
53*28e138c6SAndroid Build Coastguard Worker #include <stdlib.h>
54*28e138c6SAndroid Build Coastguard Worker
55*28e138c6SAndroid Build Coastguard Worker #ifndef M_PI
56*28e138c6SAndroid Build Coastguard Worker #define M_PI 3.14159265358979323846 /* pi */
57*28e138c6SAndroid Build Coastguard Worker #endif
58*28e138c6SAndroid Build Coastguard Worker
59*28e138c6SAndroid Build Coastguard Worker #define ALLPASS_ORDER 20
60*28e138c6SAndroid Build Coastguard Worker
61*28e138c6SAndroid Build Coastguard Worker struct SpeexDecorrState_ {
62*28e138c6SAndroid Build Coastguard Worker int rate;
63*28e138c6SAndroid Build Coastguard Worker int channels;
64*28e138c6SAndroid Build Coastguard Worker int frame_size;
65*28e138c6SAndroid Build Coastguard Worker #ifdef VORBIS_PSYCHO
66*28e138c6SAndroid Build Coastguard Worker VorbisPsy *psy;
67*28e138c6SAndroid Build Coastguard Worker struct drft_lookup lookup;
68*28e138c6SAndroid Build Coastguard Worker float *wola_mem;
69*28e138c6SAndroid Build Coastguard Worker float *curve;
70*28e138c6SAndroid Build Coastguard Worker #endif
71*28e138c6SAndroid Build Coastguard Worker float *vorbis_win;
72*28e138c6SAndroid Build Coastguard Worker int seed;
73*28e138c6SAndroid Build Coastguard Worker float *y;
74*28e138c6SAndroid Build Coastguard Worker
75*28e138c6SAndroid Build Coastguard Worker /* Per-channel stuff */
76*28e138c6SAndroid Build Coastguard Worker float *buff;
77*28e138c6SAndroid Build Coastguard Worker float (*ring)[ALLPASS_ORDER];
78*28e138c6SAndroid Build Coastguard Worker int *ringID;
79*28e138c6SAndroid Build Coastguard Worker int *order;
80*28e138c6SAndroid Build Coastguard Worker float *alpha;
81*28e138c6SAndroid Build Coastguard Worker };
82*28e138c6SAndroid Build Coastguard Worker
83*28e138c6SAndroid Build Coastguard Worker
84*28e138c6SAndroid Build Coastguard Worker
speex_decorrelate_new(int rate,int channels,int frame_size)85*28e138c6SAndroid Build Coastguard Worker EXPORT SpeexDecorrState *speex_decorrelate_new(int rate, int channels, int frame_size)
86*28e138c6SAndroid Build Coastguard Worker {
87*28e138c6SAndroid Build Coastguard Worker int i, ch;
88*28e138c6SAndroid Build Coastguard Worker SpeexDecorrState *st = speex_alloc(sizeof(SpeexDecorrState));
89*28e138c6SAndroid Build Coastguard Worker st->rate = rate;
90*28e138c6SAndroid Build Coastguard Worker st->channels = channels;
91*28e138c6SAndroid Build Coastguard Worker st->frame_size = frame_size;
92*28e138c6SAndroid Build Coastguard Worker #ifdef VORBIS_PSYCHO
93*28e138c6SAndroid Build Coastguard Worker st->psy = vorbis_psy_init(rate, 2*frame_size);
94*28e138c6SAndroid Build Coastguard Worker spx_drft_init(&st->lookup, 2*frame_size);
95*28e138c6SAndroid Build Coastguard Worker st->wola_mem = speex_alloc(frame_size*sizeof(float));
96*28e138c6SAndroid Build Coastguard Worker st->curve = speex_alloc(frame_size*sizeof(float));
97*28e138c6SAndroid Build Coastguard Worker #endif
98*28e138c6SAndroid Build Coastguard Worker st->y = speex_alloc(frame_size*sizeof(float));
99*28e138c6SAndroid Build Coastguard Worker
100*28e138c6SAndroid Build Coastguard Worker st->buff = speex_alloc(channels*2*frame_size*sizeof(float));
101*28e138c6SAndroid Build Coastguard Worker st->ringID = speex_alloc(channels*sizeof(int));
102*28e138c6SAndroid Build Coastguard Worker st->order = speex_alloc(channels*sizeof(int));
103*28e138c6SAndroid Build Coastguard Worker st->alpha = speex_alloc(channels*sizeof(float));
104*28e138c6SAndroid Build Coastguard Worker st->ring = speex_alloc(channels*ALLPASS_ORDER*sizeof(float));
105*28e138c6SAndroid Build Coastguard Worker
106*28e138c6SAndroid Build Coastguard Worker /*FIXME: The +20 is there only as a kludge for ALL_PASS_OLA*/
107*28e138c6SAndroid Build Coastguard Worker st->vorbis_win = speex_alloc((2*frame_size+20)*sizeof(float));
108*28e138c6SAndroid Build Coastguard Worker for (i=0;i<2*frame_size;i++)
109*28e138c6SAndroid Build Coastguard Worker st->vorbis_win[i] = sin(.5*M_PI* sin(M_PI*i/(2*frame_size))*sin(M_PI*i/(2*frame_size)) );
110*28e138c6SAndroid Build Coastguard Worker st->seed = rand();
111*28e138c6SAndroid Build Coastguard Worker
112*28e138c6SAndroid Build Coastguard Worker for (ch=0;ch<channels;ch++)
113*28e138c6SAndroid Build Coastguard Worker {
114*28e138c6SAndroid Build Coastguard Worker for (i=0;i<ALLPASS_ORDER;i++)
115*28e138c6SAndroid Build Coastguard Worker st->ring[ch][i] = 0;
116*28e138c6SAndroid Build Coastguard Worker st->ringID[ch] = 0;
117*28e138c6SAndroid Build Coastguard Worker st->alpha[ch] = 0;
118*28e138c6SAndroid Build Coastguard Worker st->order[ch] = 10;
119*28e138c6SAndroid Build Coastguard Worker }
120*28e138c6SAndroid Build Coastguard Worker return st;
121*28e138c6SAndroid Build Coastguard Worker }
122*28e138c6SAndroid Build Coastguard Worker
uni_rand(int * seed)123*28e138c6SAndroid Build Coastguard Worker static float uni_rand(int *seed)
124*28e138c6SAndroid Build Coastguard Worker {
125*28e138c6SAndroid Build Coastguard Worker const unsigned int jflone = 0x3f800000;
126*28e138c6SAndroid Build Coastguard Worker const unsigned int jflmsk = 0x007fffff;
127*28e138c6SAndroid Build Coastguard Worker union {int i; float f;} ran;
128*28e138c6SAndroid Build Coastguard Worker *seed = 1664525 * *seed + 1013904223;
129*28e138c6SAndroid Build Coastguard Worker ran.i = jflone | (jflmsk & *seed);
130*28e138c6SAndroid Build Coastguard Worker ran.f -= 1.5;
131*28e138c6SAndroid Build Coastguard Worker return 2*ran.f;
132*28e138c6SAndroid Build Coastguard Worker }
133*28e138c6SAndroid Build Coastguard Worker
irand(int * seed)134*28e138c6SAndroid Build Coastguard Worker static unsigned int irand(int *seed)
135*28e138c6SAndroid Build Coastguard Worker {
136*28e138c6SAndroid Build Coastguard Worker *seed = 1664525 * *seed + 1013904223;
137*28e138c6SAndroid Build Coastguard Worker return ((unsigned int)*seed)>>16;
138*28e138c6SAndroid Build Coastguard Worker }
139*28e138c6SAndroid Build Coastguard Worker
140*28e138c6SAndroid Build Coastguard Worker
speex_decorrelate(SpeexDecorrState * st,const spx_int16_t * in,spx_int16_t * out,int strength)141*28e138c6SAndroid Build Coastguard Worker EXPORT void speex_decorrelate(SpeexDecorrState *st, const spx_int16_t *in, spx_int16_t *out, int strength)
142*28e138c6SAndroid Build Coastguard Worker {
143*28e138c6SAndroid Build Coastguard Worker int ch;
144*28e138c6SAndroid Build Coastguard Worker float amount;
145*28e138c6SAndroid Build Coastguard Worker
146*28e138c6SAndroid Build Coastguard Worker if (strength<0)
147*28e138c6SAndroid Build Coastguard Worker strength = 0;
148*28e138c6SAndroid Build Coastguard Worker if (strength>100)
149*28e138c6SAndroid Build Coastguard Worker strength = 100;
150*28e138c6SAndroid Build Coastguard Worker
151*28e138c6SAndroid Build Coastguard Worker amount = .01*strength;
152*28e138c6SAndroid Build Coastguard Worker for (ch=0;ch<st->channels;ch++)
153*28e138c6SAndroid Build Coastguard Worker {
154*28e138c6SAndroid Build Coastguard Worker int i;
155*28e138c6SAndroid Build Coastguard Worker int N=2*st->frame_size;
156*28e138c6SAndroid Build Coastguard Worker float beta, beta2;
157*28e138c6SAndroid Build Coastguard Worker float *x;
158*28e138c6SAndroid Build Coastguard Worker float max_alpha = 0;
159*28e138c6SAndroid Build Coastguard Worker
160*28e138c6SAndroid Build Coastguard Worker float *buff;
161*28e138c6SAndroid Build Coastguard Worker float *ring;
162*28e138c6SAndroid Build Coastguard Worker int ringID;
163*28e138c6SAndroid Build Coastguard Worker int order;
164*28e138c6SAndroid Build Coastguard Worker float alpha;
165*28e138c6SAndroid Build Coastguard Worker
166*28e138c6SAndroid Build Coastguard Worker buff = st->buff+ch*2*st->frame_size;
167*28e138c6SAndroid Build Coastguard Worker ring = st->ring[ch];
168*28e138c6SAndroid Build Coastguard Worker ringID = st->ringID[ch];
169*28e138c6SAndroid Build Coastguard Worker order = st->order[ch];
170*28e138c6SAndroid Build Coastguard Worker alpha = st->alpha[ch];
171*28e138c6SAndroid Build Coastguard Worker
172*28e138c6SAndroid Build Coastguard Worker for (i=0;i<st->frame_size;i++)
173*28e138c6SAndroid Build Coastguard Worker buff[i] = buff[i+st->frame_size];
174*28e138c6SAndroid Build Coastguard Worker for (i=0;i<st->frame_size;i++)
175*28e138c6SAndroid Build Coastguard Worker buff[i+st->frame_size] = in[i*st->channels+ch];
176*28e138c6SAndroid Build Coastguard Worker
177*28e138c6SAndroid Build Coastguard Worker x = buff+st->frame_size;
178*28e138c6SAndroid Build Coastguard Worker
179*28e138c6SAndroid Build Coastguard Worker if (amount>1)
180*28e138c6SAndroid Build Coastguard Worker beta = 1-sqrt(.4*amount);
181*28e138c6SAndroid Build Coastguard Worker else
182*28e138c6SAndroid Build Coastguard Worker beta = 1-0.63246*amount;
183*28e138c6SAndroid Build Coastguard Worker if (beta<0)
184*28e138c6SAndroid Build Coastguard Worker beta = 0;
185*28e138c6SAndroid Build Coastguard Worker
186*28e138c6SAndroid Build Coastguard Worker beta2 = beta;
187*28e138c6SAndroid Build Coastguard Worker for (i=0;i<st->frame_size;i++)
188*28e138c6SAndroid Build Coastguard Worker {
189*28e138c6SAndroid Build Coastguard Worker st->y[i] = alpha*(x[i-ALLPASS_ORDER+order]-beta*x[i-ALLPASS_ORDER+order-1])*st->vorbis_win[st->frame_size+i+order]
190*28e138c6SAndroid Build Coastguard Worker + x[i-ALLPASS_ORDER]*st->vorbis_win[st->frame_size+i]
191*28e138c6SAndroid Build Coastguard Worker - alpha*(ring[ringID]
192*28e138c6SAndroid Build Coastguard Worker - beta*ring[ringID+1>=order?0:ringID+1]);
193*28e138c6SAndroid Build Coastguard Worker ring[ringID++]=st->y[i];
194*28e138c6SAndroid Build Coastguard Worker st->y[i] *= st->vorbis_win[st->frame_size+i];
195*28e138c6SAndroid Build Coastguard Worker if (ringID>=order)
196*28e138c6SAndroid Build Coastguard Worker ringID=0;
197*28e138c6SAndroid Build Coastguard Worker }
198*28e138c6SAndroid Build Coastguard Worker order = order+(irand(&st->seed)%3)-1;
199*28e138c6SAndroid Build Coastguard Worker if (order < 5)
200*28e138c6SAndroid Build Coastguard Worker order = 5;
201*28e138c6SAndroid Build Coastguard Worker if (order > 10)
202*28e138c6SAndroid Build Coastguard Worker order = 10;
203*28e138c6SAndroid Build Coastguard Worker /*order = 5+(irand(&st->seed)%6);*/
204*28e138c6SAndroid Build Coastguard Worker max_alpha = pow(.96+.04*(amount-1),order);
205*28e138c6SAndroid Build Coastguard Worker if (max_alpha > .98/(1.+beta2))
206*28e138c6SAndroid Build Coastguard Worker max_alpha = .98/(1.+beta2);
207*28e138c6SAndroid Build Coastguard Worker
208*28e138c6SAndroid Build Coastguard Worker alpha = alpha + .4*uni_rand(&st->seed);
209*28e138c6SAndroid Build Coastguard Worker if (alpha > max_alpha)
210*28e138c6SAndroid Build Coastguard Worker alpha = max_alpha;
211*28e138c6SAndroid Build Coastguard Worker if (alpha < -max_alpha)
212*28e138c6SAndroid Build Coastguard Worker alpha = -max_alpha;
213*28e138c6SAndroid Build Coastguard Worker for (i=0;i<ALLPASS_ORDER;i++)
214*28e138c6SAndroid Build Coastguard Worker ring[i] = 0;
215*28e138c6SAndroid Build Coastguard Worker ringID = 0;
216*28e138c6SAndroid Build Coastguard Worker for (i=0;i<st->frame_size;i++)
217*28e138c6SAndroid Build Coastguard Worker {
218*28e138c6SAndroid Build Coastguard Worker float tmp = alpha*(x[i-ALLPASS_ORDER+order]-beta*x[i-ALLPASS_ORDER+order-1])*st->vorbis_win[i+order]
219*28e138c6SAndroid Build Coastguard Worker + x[i-ALLPASS_ORDER]*st->vorbis_win[i]
220*28e138c6SAndroid Build Coastguard Worker - alpha*(ring[ringID]
221*28e138c6SAndroid Build Coastguard Worker - beta*ring[ringID+1>=order?0:ringID+1]);
222*28e138c6SAndroid Build Coastguard Worker ring[ringID++]=tmp;
223*28e138c6SAndroid Build Coastguard Worker tmp *= st->vorbis_win[i];
224*28e138c6SAndroid Build Coastguard Worker if (ringID>=order)
225*28e138c6SAndroid Build Coastguard Worker ringID=0;
226*28e138c6SAndroid Build Coastguard Worker st->y[i] += tmp;
227*28e138c6SAndroid Build Coastguard Worker }
228*28e138c6SAndroid Build Coastguard Worker
229*28e138c6SAndroid Build Coastguard Worker #ifdef VORBIS_PSYCHO
230*28e138c6SAndroid Build Coastguard Worker float frame[N];
231*28e138c6SAndroid Build Coastguard Worker float scale = 1./N;
232*28e138c6SAndroid Build Coastguard Worker for (i=0;i<2*st->frame_size;i++)
233*28e138c6SAndroid Build Coastguard Worker frame[i] = buff[i];
234*28e138c6SAndroid Build Coastguard Worker //float coef = .5*0.78130;
235*28e138c6SAndroid Build Coastguard Worker float coef = M_PI*0.075063 * 0.93763 * amount * .8 * 0.707;
236*28e138c6SAndroid Build Coastguard Worker compute_curve(st->psy, buff, st->curve);
237*28e138c6SAndroid Build Coastguard Worker for (i=1;i<st->frame_size;i++)
238*28e138c6SAndroid Build Coastguard Worker {
239*28e138c6SAndroid Build Coastguard Worker float x1,x2;
240*28e138c6SAndroid Build Coastguard Worker float gain;
241*28e138c6SAndroid Build Coastguard Worker do {
242*28e138c6SAndroid Build Coastguard Worker x1 = uni_rand(&st->seed);
243*28e138c6SAndroid Build Coastguard Worker x2 = uni_rand(&st->seed);
244*28e138c6SAndroid Build Coastguard Worker } while (x1*x1+x2*x2 > 1.);
245*28e138c6SAndroid Build Coastguard Worker gain = coef*sqrt(.1+st->curve[i]);
246*28e138c6SAndroid Build Coastguard Worker frame[2*i-1] = gain*x1;
247*28e138c6SAndroid Build Coastguard Worker frame[2*i] = gain*x2;
248*28e138c6SAndroid Build Coastguard Worker }
249*28e138c6SAndroid Build Coastguard Worker frame[0] = coef*uni_rand(&st->seed)*sqrt(.1+st->curve[0]);
250*28e138c6SAndroid Build Coastguard Worker frame[2*st->frame_size-1] = coef*uni_rand(&st->seed)*sqrt(.1+st->curve[st->frame_size-1]);
251*28e138c6SAndroid Build Coastguard Worker spx_drft_backward(&st->lookup,frame);
252*28e138c6SAndroid Build Coastguard Worker for (i=0;i<2*st->frame_size;i++)
253*28e138c6SAndroid Build Coastguard Worker frame[i] *= st->vorbis_win[i];
254*28e138c6SAndroid Build Coastguard Worker #endif
255*28e138c6SAndroid Build Coastguard Worker
256*28e138c6SAndroid Build Coastguard Worker for (i=0;i<st->frame_size;i++)
257*28e138c6SAndroid Build Coastguard Worker {
258*28e138c6SAndroid Build Coastguard Worker #ifdef VORBIS_PSYCHO
259*28e138c6SAndroid Build Coastguard Worker float tmp = st->y[i] + frame[i] + st->wola_mem[i];
260*28e138c6SAndroid Build Coastguard Worker st->wola_mem[i] = frame[i+st->frame_size];
261*28e138c6SAndroid Build Coastguard Worker #else
262*28e138c6SAndroid Build Coastguard Worker float tmp = st->y[i];
263*28e138c6SAndroid Build Coastguard Worker #endif
264*28e138c6SAndroid Build Coastguard Worker if (tmp>32767)
265*28e138c6SAndroid Build Coastguard Worker tmp = 32767;
266*28e138c6SAndroid Build Coastguard Worker if (tmp < -32767)
267*28e138c6SAndroid Build Coastguard Worker tmp = -32767;
268*28e138c6SAndroid Build Coastguard Worker out[i*st->channels+ch] = tmp;
269*28e138c6SAndroid Build Coastguard Worker }
270*28e138c6SAndroid Build Coastguard Worker
271*28e138c6SAndroid Build Coastguard Worker st->ringID[ch] = ringID;
272*28e138c6SAndroid Build Coastguard Worker st->order[ch] = order;
273*28e138c6SAndroid Build Coastguard Worker st->alpha[ch] = alpha;
274*28e138c6SAndroid Build Coastguard Worker
275*28e138c6SAndroid Build Coastguard Worker }
276*28e138c6SAndroid Build Coastguard Worker }
277*28e138c6SAndroid Build Coastguard Worker
speex_decorrelate_destroy(SpeexDecorrState * st)278*28e138c6SAndroid Build Coastguard Worker EXPORT void speex_decorrelate_destroy(SpeexDecorrState *st)
279*28e138c6SAndroid Build Coastguard Worker {
280*28e138c6SAndroid Build Coastguard Worker #ifdef VORBIS_PSYCHO
281*28e138c6SAndroid Build Coastguard Worker vorbis_psy_destroy(st->psy);
282*28e138c6SAndroid Build Coastguard Worker speex_free(st->wola_mem);
283*28e138c6SAndroid Build Coastguard Worker speex_free(st->curve);
284*28e138c6SAndroid Build Coastguard Worker #endif
285*28e138c6SAndroid Build Coastguard Worker speex_free(st->buff);
286*28e138c6SAndroid Build Coastguard Worker speex_free(st->ring);
287*28e138c6SAndroid Build Coastguard Worker speex_free(st->ringID);
288*28e138c6SAndroid Build Coastguard Worker speex_free(st->alpha);
289*28e138c6SAndroid Build Coastguard Worker speex_free(st->vorbis_win);
290*28e138c6SAndroid Build Coastguard Worker speex_free(st->order);
291*28e138c6SAndroid Build Coastguard Worker speex_free(st->y);
292*28e138c6SAndroid Build Coastguard Worker speex_free(st);
293*28e138c6SAndroid Build Coastguard Worker }
294