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/*    Header file for the application layer interface of Dynamic Bass Enhancement       */
21/*  module.                                                                             */
22/*                                                                                      */
23/*  This files includes all definitions, types, structures and function                 */
24/*  prototypes required by the calling layer. All other types, structures and           */
25/*  functions are private.                                                              */
26/*                                                                                      */
27/****************************************************************************************/
28/*                                                                                      */
29/*    Note: 1                                                                           */
30/*    =======                                                                           */
31/*    The algorithm can execute either with separate input and output buffers or with   */
32/*    a common buffer, i.e. the data is processed in-place.                             */
33/*                                                                                      */
34/****************************************************************************************/
35/*                                                                                      */
36/*    Note: 2                                                                           */
37/*    =======                                                                           */
38/*    The Dynamic Bass Enhancement algorithm always processes data as stereo input. Mono*/
39/*  format data is not supported. The data is interleaved as follows:                   */
40/*                                                                                      */
41/*              Byte Offset         Stereo Input         Mono-In-Stereo Input           */
42/*              ===========         ============         ====================           */
43/*                  0               Left Sample #1          Mono Sample #1              */
44/*                  2               Right Sample #1         Mono Sample #1              */
45/*                  4               Left Sample #2          Mono Sample #2              */
46/*                  6               Right Sample #2         Mono Sample #2              */
47/*                  .                      .                     .                      */
48/*                  .                      .                     .                      */
49/*                                                                                      */
50/*  Mono format data is not supported, the calling routine must convert a Mono stream   */
51/*    in to Mono-In-Stereo format.                                                      */
52/*                                                                                      */
53/****************************************************************************************/
54
55#ifndef __LVDBE_H__
56#define __LVDBE_H__
57
58#ifdef __cplusplus
59extern "C" {
60#endif /* __cplusplus */
61
62
63/****************************************************************************************/
64/*                                                                                      */
65/*    Includes                                                                          */
66/*                                                                                      */
67/****************************************************************************************/
68
69#include "LVM_Types.h"
70
71
72/****************************************************************************************/
73/*                                                                                      */
74/*    Definitions                                                                       */
75/*                                                                                      */
76/****************************************************************************************/
77
78/* Memory table*/
79#define LVDBE_NR_MEMORY_REGIONS        4                            /* Number of memory regions */
80
81/* Bass Enhancement effect level */
82#define LVDBE_EFFECT_03DB            3                              /* Effect defines for backwards compatibility */
83#define LVDBE_EFFECT_06DB            6
84#define LVDBE_EFFECT_09DB            9
85#define LVDBE_EFFECT_12DB            12
86#define LVDBE_EFFECT_15DB            15
87
88
89/****************************************************************************************/
90/*                                                                                      */
91/*    Types                                                                             */
92/*                                                                                      */
93/****************************************************************************************/
94
95/* Instance handle */
96typedef void    *LVDBE_Handle_t;
97
98
99/* Operating modes */
100typedef enum
101{
102    LVDBE_OFF      = 0,
103    LVDBE_ON       = 1,
104    LVDBE_MODE_MAX = LVM_MAXINT_32
105} LVDBE_Mode_en;
106
107
108/* High pass filter */
109typedef enum
110{
111    LVDBE_HPF_OFF = 0,
112    LVDBE_HPF_ON  = 1,
113    LVDBE_HPF_MAX = LVM_MAXINT_32
114} LVDBE_FilterSelect_en;
115
116
117/* Volume control */
118typedef enum
119{
120    LVDBE_VOLUME_OFF = 0,
121    LVDBE_VOLUME_ON  = 1,
122    LVDBE_VOLUME_MAX = LVM_MAXINT_32
123} LVDBE_Volume_en;
124
125
126/* Memory Types */
127typedef enum
128{
129    LVDBE_PERSISTENT      = 0,
130    LVDBE_PERSISTENT_DATA = 1,
131    LVDBE_PERSISTENT_COEF = 2,
132    LVDBE_SCRATCH         = 3,
133    LVDBE_MEMORY_MAX      = LVM_MAXINT_32
134
135} LVDBE_MemoryTypes_en;
136
137
138/* Function return status */
139typedef enum
140{
141    LVDBE_SUCCESS        = 0,                        /* Successful return from a routine */
142    LVDBE_ALIGNMENTERROR = 1,                        /* Memory alignment error */
143    LVDBE_NULLADDRESS    = 2,                        /* NULL allocation address */
144    LVDBE_TOOMANYSAMPLES = 3,                        /* Maximum block size exceeded */
145    LVDBE_SIZEERROR      = 4,                        /* Incorrect structure size */
146    LVDBE_STATUS_MAX     = LVM_MAXINT_32
147} LVDBE_ReturnStatus_en;
148
149
150/****************************************************************************************/
151/*                                                                                      */
152/*    Linked enumerated type and capability definitions                                 */
153/*                                                                                      */
154/*  The capability definitions are used to define the required capabilities at          */
155/*  initialisation, these are added together to give the capability word. The           */
156/*  enumerated type is used to select the mode through a control function at run time.  */
157/*                                                                                      */
158/*  The capability definition is related to the enumerated type value by the equation:  */
159/*                                                                                      */
160/*          Capability_value = 2^Enumerated_value                                       */
161/*                                                                                      */
162/*  For example, a module could be configurd at initialisation to support two sample    */
163/*  rates only by calling the init function with the value:                             */
164/*      Capabilities.SampleRate = LVDBE_CAP_32000 + LVCS_DBE_44100;                     */
165/*                                                                                      */
166/*  and at run time it would be passed the value LVDBE_FS_32000 through the control     */
167/*  function to select operation at 32kHz                                               */
168/*                                                                                      */
169/****************************************************************************************/
170
171/*
172 * Bass Enhancement centre frequency
173 */
174#define LVDBE_CAP_CENTRE_55Hz       1
175#define LVDBE_CAP_CENTRE_66Hz       2
176#define LVDBE_CAP_CENTRE_78Hz       4
177#define LVDBE_CAP_CENTRE_90Hz       8
178
179typedef enum
180{
181    LVDBE_CENTRE_55HZ = 0,
182    LVDBE_CENTRE_66HZ = 1,
183    LVDBE_CENTRE_78HZ = 2,
184    LVDBE_CENTRE_90HZ = 3,
185    LVDBE_CENTRE_MAX  = LVM_MAXINT_32
186} LVDBE_CentreFreq_en;
187
188
189/*
190 * Supported sample rates in samples per second
191 */
192#define LVDBE_CAP_FS_8000                1
193#define LVDBE_CAP_FS_11025               2
194#define LVDBE_CAP_FS_12000               4
195#define LVDBE_CAP_FS_16000               8
196#define LVDBE_CAP_FS_22050               16
197#define LVDBE_CAP_FS_24000               32
198#define LVDBE_CAP_FS_32000               64
199#define LVDBE_CAP_FS_44100               128
200#define LVDBE_CAP_FS_48000               256
201
202typedef enum
203{
204    LVDBE_FS_8000  = 0,
205    LVDBE_FS_11025 = 1,
206    LVDBE_FS_12000 = 2,
207    LVDBE_FS_16000 = 3,
208    LVDBE_FS_22050 = 4,
209    LVDBE_FS_24000 = 5,
210    LVDBE_FS_32000 = 6,
211    LVDBE_FS_44100 = 7,
212    LVDBE_FS_48000 = 8,
213    LVDBE_FS_MAX   = LVM_MAXINT_32
214} LVDBE_Fs_en;
215
216
217/****************************************************************************************/
218/*                                                                                      */
219/*    Structures                                                                        */
220/*                                                                                      */
221/****************************************************************************************/
222
223/* Memory region definition */
224typedef struct
225{
226    LVM_UINT32                Size;                        /* Region size in bytes */
227    LVM_UINT16                Alignment;                  /* Region alignment in bytes */
228    LVDBE_MemoryTypes_en      Type;                       /* Region type */
229    void                      *pBaseAddress;              /* Pointer to the region base address */
230} LVDBE_MemoryRegion_t;
231
232
233/* Memory table containing the region definitions */
234typedef struct
235{
236    LVDBE_MemoryRegion_t    Region[LVDBE_NR_MEMORY_REGIONS];  /* One definition for each region */
237} LVDBE_MemTab_t;
238
239
240/* Parameter structure */
241typedef struct
242{
243    LVDBE_Mode_en           OperatingMode;
244    LVDBE_Fs_en             SampleRate;
245    LVM_INT16               EffectLevel;
246    LVDBE_CentreFreq_en     CentreFrequency;
247    LVDBE_FilterSelect_en   HPFSelect;
248    LVDBE_Volume_en         VolumeControl;
249    LVM_INT16               VolumedB;
250    LVM_INT16               HeadroomdB;
251
252} LVDBE_Params_t;
253
254
255/* Capability structure */
256typedef struct
257{
258      LVM_UINT16              SampleRate;               /* Sampling rate capabilities */
259      LVM_UINT16              CentreFrequency;          /* Centre frequency capabilities */
260      LVM_UINT16              MaxBlockSize;             /* Maximum block size in sample pairs */
261} LVDBE_Capabilities_t;
262
263
264/****************************************************************************************/
265/*                                                                                      */
266/*    Function Prototypes                                                               */
267/*                                                                                      */
268/****************************************************************************************/
269
270/****************************************************************************************/
271/*                                                                                      */
272/* FUNCTION:                 LVDBE_Memory                                               */
273/*                                                                                      */
274/* DESCRIPTION:                                                                         */
275/*    This function is used for memory allocation and free. It can be called in         */
276/*    two ways:                                                                         */
277/*                                                                                      */
278/*        hInstance = NULL                Returns the memory requirements               */
279/*        hInstance = Instance handle        Returns the memory requirements and        */
280/*                                        allocated base addresses for the instance     */
281/*                                                                                      */
282/*    When this function is called for memory allocation (hInstance=NULL) the memory    */
283/*  base address pointers are NULL on return.                                           */
284/*                                                                                      */
285/*    When the function is called for free (hInstance = Instance Handle) the memory     */
286/*  table returns the allocated memory and base addresses used during initialisation.   */
287/*                                                                                      */
288/* PARAMETERS:                                                                          */
289/*  hInstance                Instance Handle                                            */
290/*  pMemoryTable             Pointer to an empty memory definition table                */
291/*    pCapabilities            Pointer to the default capabilites                       */
292/*                                                                                      */
293/* RETURNS:                                                                             */
294/*  LVDBE_SUCCESS            Succeeded                                                  */
295/*                                                                                      */
296/* NOTES:                                                                               */
297/*    1.    This function may be interrupted by the LVDBE_Process function              */
298/*                                                                                      */
299/****************************************************************************************/
300
301LVDBE_ReturnStatus_en LVDBE_Memory(LVDBE_Handle_t           hInstance,
302                                   LVDBE_MemTab_t           *pMemoryTable,
303                                   LVDBE_Capabilities_t     *pCapabilities);
304
305
306/****************************************************************************************/
307/*                                                                                      */
308/* FUNCTION:                 LVDBE_Init                                                 */
309/*                                                                                      */
310/* DESCRIPTION:                                                                         */
311/*    Create and initialisation function for the Bass Enhancement module                */
312/*                                                                                      */
313/*    This function can be used to create an algorithm instance by calling with         */
314/*    hInstance set to NULL. In this case the algorithm returns the new instance        */
315/*    handle.                                                                           */
316/*                                                                                      */
317/*    This function can be used to force a full re-initialisation of the algorithm      */
318/*    by calling with hInstance = Instance Handle. In this case the memory table        */
319/*    should be correct for the instance, this can be ensured by calling the function   */
320/*    LVDBE_Memory before calling this function.                                        */
321/*                                                                                      */
322/* PARAMETERS:                                                                          */
323/*  hInstance                  Instance handle                                          */
324/*  pMemoryTable             Pointer to the memory definition table                     */
325/*  pCapabilities            Pointer to the initialisation capabilities                 */
326/*                                                                                      */
327/* RETURNS:                                                                             */
328/*  LVDBE_SUCCESS                Initialisation succeeded                               */
329/*  LVDBE_ALIGNMENTERROR        Instance or scratch memory on incorrect alignment       */
330/*    LVDBE_NULLADDRESS            One or more memory has a NULL pointer                */
331/*                                                                                      */
332/* NOTES:                                                                               */
333/*  1.     The instance handle is the pointer to the base address of the first memory   */
334/*        region.                                                                       */
335/*    2.    This function must not be interrupted by the LVDBE_Process function         */
336/*                                                                                      */
337/****************************************************************************************/
338
339LVDBE_ReturnStatus_en LVDBE_Init(LVDBE_Handle_t             *phInstance,
340                                   LVDBE_MemTab_t           *pMemoryTable,
341                                   LVDBE_Capabilities_t     *pCapabilities);
342
343
344/****************************************************************************************/
345/*                                                                                      */
346/* FUNCTION:                  LVDBE_GetParameters                                       */
347/*                                                                                      */
348/* DESCRIPTION:                                                                         */
349/*    Request the Bass Enhancement parameters. The current parameter set is returned    */
350/*    via the parameter pointer.                                                        */
351/*                                                                                      */
352/* PARAMETERS:                                                                          */
353/*  hInstance                   Instance handle                                         */
354/*  pParams                  Pointer to an empty parameter structure                    */
355/*                                                                                      */
356/* RETURNS:                                                                             */
357/*  LVDBE_SUCCESS             Always succeeds                                           */
358/*                                                                                      */
359/* NOTES:                                                                               */
360/*  1.    This function may be interrupted by the LVDBE_Process function                */
361/*                                                                                      */
362/****************************************************************************************/
363
364LVDBE_ReturnStatus_en LVDBE_GetParameters(LVDBE_Handle_t        hInstance,
365                                            LVDBE_Params_t      *pParams);
366
367
368/****************************************************************************************/
369/*                                                                                      */
370/* FUNCTION:                  LVDBE_GetCapabilities                                     */
371/*                                                                                      */
372/* DESCRIPTION:                                                                         */
373/*    Request the Dynamic Bass Enhancement capabilities. The initial capabilities are   */
374/*  returned via the pointer.                                                           */
375/*                                                                                      */
376/* PARAMETERS:                                                                          */
377/*  hInstance                   Instance handle                                         */
378/*  pCapabilities              Pointer to an empty capabilitiy structure                */
379/*                                                                                      */
380/* RETURNS:                                                                             */
381/*  LVDBE_Success             Always succeeds                                           */
382/*                                                                                      */
383/* NOTES:                                                                               */
384/*  1.    This function may be interrupted by the LVDBE_Process function                */
385/*                                                                                      */
386/****************************************************************************************/
387
388LVDBE_ReturnStatus_en LVDBE_GetCapabilities(LVDBE_Handle_t            hInstance,
389                                              LVDBE_Capabilities_t    *pCapabilities);
390
391
392/****************************************************************************************/
393/*                                                                                      */
394/* FUNCTION:                LVDBE_Control                                               */
395/*                                                                                      */
396/* DESCRIPTION:                                                                         */
397/*  Sets or changes the Bass Enhancement parameters. Changing the parameters while the  */
398/*  module is processing signals may have the following side effects:                   */
399/*                                                                                      */
400/*  General parameters:                                                                 */
401/*  ===================                                                                 */
402/*  OperatingMode:      Changing the mode of operation may cause a change in volume     */
403/*                      level.                                                          */
404/*                                                                                      */
405/*  SampleRate:         Changing the sample rate may cause pops and clicks.             */
406/*                                                                                      */
407/*  EffectLevel:        Changing the effect level setting will have no side effects     */
408/*                                                                                      */
409/*  CentreFrequency:    Changing the centre frequency may cause pops and clicks         */
410/*                                                                                      */
411/*  HPFSelect:          Selecting/de-selecting the high pass filter may cause pops and  */
412/*                      clicks                                                          */
413/*                                                                                      */
414/*  VolumedB            Changing the volume setting will have no side effects           */
415/*                                                                                      */
416/*                                                                                      */
417/* PARAMETERS:                                                                          */
418/*  hInstance               Instance handle                                             */
419/*  pParams                 Pointer to a parameter structure                            */
420/*                                                                                      */
421/* RETURNS:                                                                             */
422/*  LVDBE_SUCCESS           Always succeeds                                             */
423/*                                                                                      */
424/* NOTES:                                                                               */
425/*  1.  This function must not be interrupted by the LVDBE_Process function             */
426/*                                                                                      */
427/****************************************************************************************/
428
429LVDBE_ReturnStatus_en LVDBE_Control(LVDBE_Handle_t      hInstance,
430                                      LVDBE_Params_t    *pParams);
431
432
433/****************************************************************************************/
434/*                                                                                      */
435/* FUNCTION:                 LVDBE_Process                                              */
436/*                                                                                      */
437/* DESCRIPTION:                                                                         */
438/*  Process function for the Bass Enhancement module.                                   */
439/*                                                                                      */
440/* PARAMETERS:                                                                          */
441/*  hInstance                Instance handle                                            */
442/*  pInData                  Pointer to the input data                                  */
443/*  pOutData                 Pointer to the output data                                 */
444/*  NumSamples              Number of samples in the input buffer                       */
445/*                                                                                      */
446/* RETURNS:                                                                             */
447/*  LVDBE_SUCCESS             Succeeded                                                 */
448/*    LVDBE_TOOMANYSAMPLES    NumSamples was larger than the maximum block size         */
449/*                                                                                      */
450/* NOTES:                                                                               */
451/*                                                                                      */
452/****************************************************************************************/
453
454LVDBE_ReturnStatus_en LVDBE_Process(LVDBE_Handle_t          hInstance,
455                                       const LVM_INT16      *pInData,
456                                       LVM_INT16            *pOutData,
457                                       LVM_UINT16           NumSamples);
458
459
460#ifdef __cplusplus
461}
462#endif /* __cplusplus */
463
464#endif /* __LVDBE_H__ */
465