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 */
38 const 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 */
77 const 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 
142 const 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 */
264 const 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 
281 const 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 
346 const 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 /************************************************************************************/
387 const 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 
423 const 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 
439 const LVM_INT32   LVCS_SampleRateTable[9] = {8000,
440                                             11025,
441                                             12000,
442                                             16000,
443                                             22050,
444                                             24000,
445                                             32000,
446                                             44100,
447                                             48000};
448 
449