1/*
2 * Copyright (C) 2004-2010 NXP Software
3 * Copyright (C) 2010 The Android Open Source Project
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 *      http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18
19/************************************************************************************/
20/*                                                                                  */
21/*  Includes                                                                        */
22/*                                                                                  */
23/************************************************************************************/
24
25#include "LVCS_Private.h"
26#include "Filters.h"                            /* Filter definitions */
27#include "BIQUAD.h"                             /* Biquad definitions */
28#include "LVCS_Headphone_Coeffs.h"              /* Headphone coefficients */
29
30
31/************************************************************************************/
32/*                                                                                  */
33/*  Stereo Enhancer coefficient constant tables                                     */
34/*                                                                                  */
35/************************************************************************************/
36
37/* Coefficient table for the middle filter */
38const BiquadA01B1CoefsSP_t LVCS_SEMidCoefTable[] = {
39    {CS_MIDDLE_8000_A0,         /* 8kS/s coefficients */
40     CS_MIDDLE_8000_A1,
41     CS_MIDDLE_8000_B1,
42     (LVM_UINT16 )CS_MIDDLE_8000_SCALE},
43    {CS_MIDDLE_11025_A0,        /* 11kS/s coefficients */
44     CS_MIDDLE_11025_A1,
45     CS_MIDDLE_11025_B1,
46     (LVM_UINT16 )CS_MIDDLE_11025_SCALE},
47    {CS_MIDDLE_12000_A0,        /* 12kS/s coefficients */
48     CS_MIDDLE_12000_A1,
49     CS_MIDDLE_12000_B1,
50     (LVM_UINT16 )CS_MIDDLE_12000_SCALE},
51    {CS_MIDDLE_16000_A0,        /* 16kS/s coefficients */
52     CS_MIDDLE_16000_A1,
53     CS_MIDDLE_16000_B1,
54     (LVM_UINT16 )CS_MIDDLE_16000_SCALE},
55    {CS_MIDDLE_22050_A0,        /* 22kS/s coefficients */
56     CS_MIDDLE_22050_A1,
57     CS_MIDDLE_22050_B1,
58     (LVM_UINT16 )CS_MIDDLE_22050_SCALE},
59    {CS_MIDDLE_24000_A0,        /* 24kS/s coefficients */
60     CS_MIDDLE_24000_A1,
61     CS_MIDDLE_24000_B1,
62     (LVM_UINT16 )CS_MIDDLE_24000_SCALE},
63    {CS_MIDDLE_32000_A0,        /* 32kS/s coefficients */
64     CS_MIDDLE_32000_A1,
65     CS_MIDDLE_32000_B1,
66     (LVM_UINT16 )CS_MIDDLE_32000_SCALE},
67    {CS_MIDDLE_44100_A0,        /* 44kS/s coefficients */
68     CS_MIDDLE_44100_A1,
69     CS_MIDDLE_44100_B1,
70     (LVM_UINT16 )CS_MIDDLE_44100_SCALE},
71    {CS_MIDDLE_48000_A0,        /* 48kS/s coefficients */
72     CS_MIDDLE_48000_A1,
73     CS_MIDDLE_48000_B1,
74     (LVM_UINT16 )CS_MIDDLE_48000_SCALE}};
75
76/* Coefficient table for the side filter */
77const BiquadA012B12CoefsSP_t LVCS_SESideCoefTable[] = {
78    /* Headphone Side coefficients */
79    {CS_SIDE_8000_A0,           /* 8kS/s coefficients */
80     CS_SIDE_8000_A1,
81     CS_SIDE_8000_A2,
82     CS_SIDE_8000_B1,
83     CS_SIDE_8000_B2,
84     (LVM_UINT16 )CS_SIDE_8000_SCALE},
85    {CS_SIDE_11025_A0,          /* 11kS/s coefficients */
86     CS_SIDE_11025_A1,
87     CS_SIDE_11025_A2,
88     CS_SIDE_11025_B1,
89     CS_SIDE_11025_B2,
90     (LVM_UINT16 )CS_SIDE_11025_SCALE},
91    {CS_SIDE_12000_A0,          /* 12kS/s coefficients */
92     CS_SIDE_12000_A1,
93     CS_SIDE_12000_A2,
94     CS_SIDE_12000_B1,
95     CS_SIDE_12000_B2,
96     (LVM_UINT16 )CS_SIDE_12000_SCALE},
97    {CS_SIDE_16000_A0,          /* 16kS/s coefficients */
98     CS_SIDE_16000_A1,
99     CS_SIDE_16000_A2,
100     CS_SIDE_16000_B1,
101     CS_SIDE_16000_B2,
102     (LVM_UINT16 )CS_SIDE_16000_SCALE},
103    {CS_SIDE_22050_A0,          /* 22kS/s coefficients */
104     CS_SIDE_22050_A1,
105     CS_SIDE_22050_A2,
106     CS_SIDE_22050_B1,
107     CS_SIDE_22050_B2,
108     (LVM_UINT16 )CS_SIDE_22050_SCALE},
109    {CS_SIDE_24000_A0,          /* 24kS/s coefficients */
110     CS_SIDE_24000_A1,
111     CS_SIDE_24000_A2,
112     CS_SIDE_24000_B1,
113     CS_SIDE_24000_B2,
114     (LVM_UINT16 )CS_SIDE_24000_SCALE},
115    {CS_SIDE_32000_A0,          /* 32kS/s coefficients */
116     CS_SIDE_32000_A1,
117     CS_SIDE_32000_A2,
118     CS_SIDE_32000_B1,
119     CS_SIDE_32000_B2,
120     (LVM_UINT16 )CS_SIDE_32000_SCALE},
121    {CS_SIDE_44100_A0,          /* 44kS/s coefficients */
122     CS_SIDE_44100_A1,
123     CS_SIDE_44100_A2,
124     CS_SIDE_44100_B1,
125     CS_SIDE_44100_B2,
126     (LVM_UINT16 )CS_SIDE_44100_SCALE},
127    {CS_SIDE_48000_A0,          /* 48kS/s coefficients */
128     CS_SIDE_48000_A1,
129     CS_SIDE_48000_A2,
130     CS_SIDE_48000_B1,
131     CS_SIDE_48000_B2,
132     (LVM_UINT16 )CS_SIDE_48000_SCALE}
133};
134
135
136/************************************************************************************/
137/*                                                                                  */
138/*  Equaliser coefficient constant tables                                           */
139/*                                                                                  */
140/************************************************************************************/
141
142const BiquadA012B12CoefsSP_t LVCS_EqualiserCoefTable[] = {
143    /* Headphone coefficients */
144    {CS_EQUALISER_8000_A0,      /* 8kS/s coefficients */
145     CS_EQUALISER_8000_A1,
146     CS_EQUALISER_8000_A2,
147     CS_EQUALISER_8000_B1,
148     CS_EQUALISER_8000_B2,
149     (LVM_UINT16 )CS_EQUALISER_8000_SCALE},
150    {CS_EQUALISER_11025_A0,     /* 11kS/s coefficients */
151     CS_EQUALISER_11025_A1,
152     CS_EQUALISER_11025_A2,
153     CS_EQUALISER_11025_B1,
154     CS_EQUALISER_11025_B2,
155     (LVM_UINT16 )CS_EQUALISER_11025_SCALE},
156    {CS_EQUALISER_12000_A0,     /* 12kS/s coefficients */
157     CS_EQUALISER_12000_A1,
158     CS_EQUALISER_12000_A2,
159     CS_EQUALISER_12000_B1,
160     CS_EQUALISER_12000_B2,
161     (LVM_UINT16 )CS_EQUALISER_12000_SCALE},
162    {CS_EQUALISER_16000_A0,     /* 16kS/s coefficients */
163     CS_EQUALISER_16000_A1,
164     CS_EQUALISER_16000_A2,
165     CS_EQUALISER_16000_B1,
166     CS_EQUALISER_16000_B2,
167     (LVM_UINT16 )CS_EQUALISER_16000_SCALE},
168    {CS_EQUALISER_22050_A0,     /* 22kS/s coefficients */
169     CS_EQUALISER_22050_A1,
170     CS_EQUALISER_22050_A2,
171     CS_EQUALISER_22050_B1,
172     CS_EQUALISER_22050_B2,
173     (LVM_UINT16 )CS_EQUALISER_22050_SCALE},
174    {CS_EQUALISER_24000_A0,     /* 24kS/s coefficients */
175     CS_EQUALISER_24000_A1,
176     CS_EQUALISER_24000_A2,
177     CS_EQUALISER_24000_B1,
178     CS_EQUALISER_24000_B2,
179     (LVM_UINT16 )CS_EQUALISER_24000_SCALE},
180    {CS_EQUALISER_32000_A0,     /* 32kS/s coefficients */
181     CS_EQUALISER_32000_A1,
182     CS_EQUALISER_32000_A2,
183     CS_EQUALISER_32000_B1,
184     CS_EQUALISER_32000_B2,
185     (LVM_UINT16 )CS_EQUALISER_32000_SCALE},
186    {CS_EQUALISER_44100_A0,     /* 44kS/s coefficients */
187     CS_EQUALISER_44100_A1,
188     CS_EQUALISER_44100_A2,
189     CS_EQUALISER_44100_B1,
190     CS_EQUALISER_44100_B2,
191     (LVM_UINT16 )CS_EQUALISER_44100_SCALE},
192    {CS_EQUALISER_48000_A0,     /* 48kS/s coefficients */
193     CS_EQUALISER_48000_A1,
194     CS_EQUALISER_48000_A2,
195     CS_EQUALISER_48000_B1,
196     CS_EQUALISER_48000_B2,
197     (LVM_UINT16 )CS_EQUALISER_48000_SCALE},
198
199    /* Concert Sound EX Headphone coefficients */
200    {CSEX_EQUALISER_8000_A0,    /* 8kS/s coefficients */
201     CSEX_EQUALISER_8000_A1,
202     CSEX_EQUALISER_8000_A2,
203     CSEX_EQUALISER_8000_B1,
204     CSEX_EQUALISER_8000_B2,
205     (LVM_UINT16 )CSEX_EQUALISER_8000_SCALE},
206    {CSEX_EQUALISER_11025_A0,   /* 11kS/s coefficients */
207     CSEX_EQUALISER_11025_A1,
208     CSEX_EQUALISER_11025_A2,
209     CSEX_EQUALISER_11025_B1,
210     CSEX_EQUALISER_11025_B2,
211     (LVM_UINT16 )CSEX_EQUALISER_11025_SCALE},
212    {CSEX_EQUALISER_12000_A0,   /* 12kS/s coefficients */
213     CSEX_EQUALISER_12000_A1,
214     CSEX_EQUALISER_12000_A2,
215     CSEX_EQUALISER_12000_B1,
216     CSEX_EQUALISER_12000_B2,
217     (LVM_UINT16 )CSEX_EQUALISER_12000_SCALE},
218    {CSEX_EQUALISER_16000_A0,   /* 16kS/s coefficients */
219     CSEX_EQUALISER_16000_A1,
220     CSEX_EQUALISER_16000_A2,
221     CSEX_EQUALISER_16000_B1,
222     CSEX_EQUALISER_16000_B2,
223     (LVM_UINT16 )CSEX_EQUALISER_16000_SCALE},
224    {CSEX_EQUALISER_22050_A0,   /* 22kS/s coefficients */
225     CSEX_EQUALISER_22050_A1,
226     CSEX_EQUALISER_22050_A2,
227     CSEX_EQUALISER_22050_B1,
228     CSEX_EQUALISER_22050_B2,
229     (LVM_UINT16 )CSEX_EQUALISER_22050_SCALE},
230    {CSEX_EQUALISER_24000_A0,   /* 24kS/s coefficients */
231     CSEX_EQUALISER_24000_A1,
232     CSEX_EQUALISER_24000_A2,
233     CSEX_EQUALISER_24000_B1,
234     CSEX_EQUALISER_24000_B2,
235     (LVM_UINT16 )CSEX_EQUALISER_24000_SCALE},
236    {CSEX_EQUALISER_32000_A0,   /* 32kS/s coefficients */
237     CSEX_EQUALISER_32000_A1,
238     CSEX_EQUALISER_32000_A2,
239     CSEX_EQUALISER_32000_B1,
240     CSEX_EQUALISER_32000_B2,
241     (LVM_UINT16 )CSEX_EQUALISER_32000_SCALE},
242    {CSEX_EQUALISER_44100_A0,   /* 44kS/s coefficients */
243     CSEX_EQUALISER_44100_A1,
244     CSEX_EQUALISER_44100_A2,
245     CSEX_EQUALISER_44100_B1,
246     CSEX_EQUALISER_44100_B2,
247     (LVM_UINT16 )CSEX_EQUALISER_44100_SCALE},
248    {CSEX_EQUALISER_48000_A0,   /* 48kS/s coefficients */
249     CSEX_EQUALISER_48000_A1,
250     CSEX_EQUALISER_48000_A2,
251     CSEX_EQUALISER_48000_B1,
252     CSEX_EQUALISER_48000_B2,
253     (LVM_UINT16 )CSEX_EQUALISER_48000_SCALE}
254};
255
256
257/************************************************************************************/
258/*                                                                                  */
259/*  Reverb delay constant tables                                                    */
260/*                                                                                  */
261/************************************************************************************/
262
263/* Stereo delay table for Concert Sound */
264const LVM_UINT16    LVCS_StereoDelayCS[] = {
265    LVCS_STEREODELAY_CS_8KHZ,
266    LVCS_STEREODELAY_CS_11KHZ,
267    LVCS_STEREODELAY_CS_12KHZ,
268    LVCS_STEREODELAY_CS_16KHZ,
269    LVCS_STEREODELAY_CS_22KHZ,
270    LVCS_STEREODELAY_CS_24KHZ,
271    LVCS_STEREODELAY_CS_32KHZ,
272    LVCS_STEREODELAY_CS_44KHZ,
273    LVCS_STEREODELAY_CS_48KHZ};
274
275/************************************************************************************/
276/*                                                                                  */
277/*  Reverb coefficients constant table                                              */
278/*                                                                                  */
279/************************************************************************************/
280
281const BiquadA012B12CoefsSP_t LVCS_ReverbCoefTable[] = {
282    /* Headphone coefficients */
283    {CS_REVERB_8000_A0,             /* 8kS/s coefficients */
284     CS_REVERB_8000_A1,
285     CS_REVERB_8000_A2,
286     CS_REVERB_8000_B1,
287     CS_REVERB_8000_B2,
288     (LVM_UINT16 )CS_REVERB_8000_SCALE},
289    {CS_REVERB_11025_A0,            /* 11kS/s coefficients */
290     CS_REVERB_11025_A1,
291     CS_REVERB_11025_A2,
292     CS_REVERB_11025_B1,
293     CS_REVERB_11025_B2,
294     (LVM_UINT16 )CS_REVERB_11025_SCALE},
295    {CS_REVERB_12000_A0,            /* 12kS/s coefficients */
296     CS_REVERB_12000_A1,
297     CS_REVERB_12000_A2,
298     CS_REVERB_12000_B1,
299     CS_REVERB_12000_B2,
300     (LVM_UINT16 )CS_REVERB_12000_SCALE},
301    {CS_REVERB_16000_A0,            /* 16kS/s coefficients */
302     CS_REVERB_16000_A1,
303     CS_REVERB_16000_A2,
304     CS_REVERB_16000_B1,
305     CS_REVERB_16000_B2,
306     (LVM_UINT16 )CS_REVERB_16000_SCALE},
307    {CS_REVERB_22050_A0,            /* 22kS/s coefficients */
308     CS_REVERB_22050_A1,
309     CS_REVERB_22050_A2,
310     CS_REVERB_22050_B1,
311     CS_REVERB_22050_B2,
312     (LVM_UINT16 )CS_REVERB_22050_SCALE},
313    {CS_REVERB_24000_A0,            /* 24kS/s coefficients */
314     CS_REVERB_24000_A1,
315     CS_REVERB_24000_A2,
316     CS_REVERB_24000_B1,
317     CS_REVERB_24000_B2,
318     (LVM_UINT16 )CS_REVERB_24000_SCALE},
319    {CS_REVERB_32000_A0,            /* 32kS/s coefficients */
320     CS_REVERB_32000_A1,
321     CS_REVERB_32000_A2,
322     CS_REVERB_32000_B1,
323     CS_REVERB_32000_B2,
324     (LVM_UINT16 )CS_REVERB_32000_SCALE},
325    {CS_REVERB_44100_A0,            /* 44kS/s coefficients */
326     CS_REVERB_44100_A1,
327     CS_REVERB_44100_A2,
328     CS_REVERB_44100_B1,
329     CS_REVERB_44100_B2,
330     (LVM_UINT16 )CS_REVERB_44100_SCALE},
331    {CS_REVERB_48000_A0,            /* 48kS/s coefficients */
332     CS_REVERB_48000_A1,
333     CS_REVERB_48000_A2,
334     CS_REVERB_48000_B1,
335     CS_REVERB_48000_B2,
336     (LVM_UINT16 )CS_REVERB_48000_SCALE}
337};
338
339
340/************************************************************************************/
341/*                                                                                  */
342/*  Bypass mixer constant tables                                                    */
343/*                                                                                  */
344/************************************************************************************/
345
346const Gain_t LVCS_OutputGainTable[] = {
347    {LVCS_HEADPHONE_SHIFT,         /* Headphone, stereo mode */
348     LVCS_HEADPHONE_SHIFTLOSS,
349     LVCS_HEADPHONE_GAIN},
350    {LVCS_EX_HEADPHONE_SHIFT,      /* EX Headphone, stereo mode */
351     LVCS_EX_HEADPHONE_SHIFTLOSS,
352     LVCS_EX_HEADPHONE_GAIN},
353    {LVCS_HEADPHONE_SHIFT,         /* Headphone, mono mode */
354     LVCS_HEADPHONE_SHIFTLOSS,
355     LVCS_HEADPHONE_GAIN},
356    {LVCS_EX_HEADPHONE_SHIFT,      /* EX Headphone, mono mode */
357     LVCS_EX_HEADPHONE_SHIFTLOSS,
358     LVCS_EX_HEADPHONE_GAIN}
359};
360
361
362/************************************************************************************/
363/*                                                                                  */
364/*  Volume correction table                                                         */
365/*                                                                                  */
366/*  Coefficient order:                                                              */
367/*      Compression 100% effect                                                     */
368/*      Compression 0% effect                                                       */
369/*      Gain 100% effect                                                            */
370/*      Gain 0% effect                                                              */
371/*                                                                                  */
372/*  The Compression gain is represented by a Q1.15 number to give a range of 0dB    */
373/*  to +6dB, E.g.:                                                                  */
374/*          0       is 0dB compression (no effect)                                  */
375/*          5461    is 1dB compression gain                                         */
376/*          10923   is 2dB compression gain                                         */
377/*          32767   is 6dB compression gain                                         */
378/*                                                                                  */
379/*  The Gain is represented as a Q3.13 number to give a range of +8 to -infinity    */
380/*  E.g.:                                                                           */
381/*          0       is -infinity                                                    */
382/*          32767   is +18dB (x8) gain                                              */
383/*          4096    is 0dB gain                                                     */
384/*          1024    is -12dB gain                                                   */
385/*                                                                                  */
386/************************************************************************************/
387const LVCS_VolCorrect_t LVCS_VolCorrectTable[] = {
388    {14200,          /* Headphone, stereo mode */
389     0,
390     4096,
391     5786},
392    {14200,          /* EX Headphone, stereo mode */
393     0,
394     4096,
395     5786},
396    {32767,         /* Headphone, mono mode */
397     0,
398     4096,
399     5786},
400    {32767,         /* EX Headphone, mono mode */
401     0,
402     4096,
403     5786}
404};
405
406/************************************************************************************/
407/*                                                                                  */
408/*  Mixer time constants, 100ms                                                     */
409/*                                                                                  */
410/************************************************************************************/
411
412#define LVCS_VOL_TC_Fs8000      32580       /* Floating point value 0.994262695 */
413#define LVCS_VOL_TC_Fs11025     32632       /* Floating point value 0.995849609 */
414#define LVCS_VOL_TC_Fs12000     32643       /* Floating point value 0.996185303 */
415#define LVCS_VOL_TC_Fs16000     32674       /* Floating point value 0.997131348 */
416#define LVCS_VOL_TC_Fs22050     32700       /* Floating point value 0.997924805 */
417#define LVCS_VOL_TC_Fs24000     32705       /* Floating point value 0.998077393 */
418#define LVCS_VOL_TC_Fs32000     32721       /* Floating point value 0.998565674 */
419#define LVCS_VOL_TC_Fs44100     32734       /* Floating point value 0.998962402 */
420#define LVCS_VOL_TC_Fs48000     32737       /* Floating point value 0.999053955 */
421
422
423const LVM_INT16 LVCS_VolumeTCTable[9] = {LVCS_VOL_TC_Fs8000,
424                                        LVCS_VOL_TC_Fs11025,
425                                        LVCS_VOL_TC_Fs12000,
426                                        LVCS_VOL_TC_Fs16000,
427                                        LVCS_VOL_TC_Fs22050,
428                                        LVCS_VOL_TC_Fs24000,
429                                        LVCS_VOL_TC_Fs32000,
430                                        LVCS_VOL_TC_Fs44100,
431                                        LVCS_VOL_TC_Fs48000};
432
433/************************************************************************************/
434/*                                                                                  */
435/*  Sample rate table                                                               */
436/*                                                                                  */
437/************************************************************************************/
438
439const LVM_INT32   LVCS_SampleRateTable[9] = {8000,
440                                            11025,
441                                            12000,
442                                            16000,
443                                            22050,
444                                            24000,
445                                            32000,
446                                            44100,
447                                            48000};
448
449