blob: db6aabe50c7a4e8d26627280c361d148e29bb123 [file] [log] [blame]
/*
* Copyright (C) 2004-2010 NXP Software
* Copyright (C) 2010 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/****************************************************************************************/
/* */
/* Header file for the application layer interface of the N-Band equaliser. */
/* */
/* This files includes all definitions, types, structures and function */
/* prototypes required by the calling layer. All other types, structures and */
/* functions are private. */
/* */
/****************************************************************************************/
/* */
/* Note: 1 */
/* ======= */
/* The algorithm can execute either with separate input and output buffers or with */
/* a common buffer, i.e. the data is processed in-place. */
/* */
/****************************************************************************************/
/* */
/* Note: 2 */
/* ======= */
/* Two data formats are support Stereo and Mono-In-Stereo. The data is interleaved as */
/* follows: */
/* Byte Offset Stereo Input Mono-In-Stereo Input */
/* =========== ============ ==================== */
/* 0 Left Sample #1 Mono Sample #1 */
/* 2 Right Sample #1 Mono Sample #1 */
/* 4 Left Sample #2 Mono Sample #2 */
/* 6 Right Sample #2 Mono Sample #2 */
/* . . . */
/* . . . */
/* */
/* Mono format data is not supported, the calling routine must convert a Mono stream */
/* in to Mono-In-Stereo format. */
/* */
/****************************************************************************************/
/* */
/* Note: 3 */
/* ======= */
/* The format of the data in the filter band definition structure is as follows: */
/* */
/* Gain is in integer dB, range -15dB to +15dB inclusive */
/* Frequency is the centre frequency in Hz, range DC to Nyquist */
/* QFactor is the Q multiplied by 100, range 0.25 (25) to 12 (1200) */
/* */
/* Example: */
/* Gain = 7 7dB gain */
/* Frequency = 2467 Centre frequency = 2.467kHz */
/* QFactor = 1089 Q = 10.89 */
/* */
/* The equaliser filters are passed as a pointer to and array of filter band */
/* definitions structures. There must be one filter definition for each band. */
/* */
/****************************************************************************************/
#ifndef __LVEQNB_H__
#define __LVEQNB_H__
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
/****************************************************************************************/
/* */
/* Includes */
/* */
/****************************************************************************************/
#include "LVM_Types.h"
#include "LVM_Common.h"
/****************************************************************************************/
/* */
/* Definitions */
/* */
/****************************************************************************************/
/* Memory table */
#define LVEQNB_MEMREGION_INSTANCE 0 /* Offset to the instance memory region */
#define LVEQNB_MEMREGION_PERSISTENT_DATA 1 /* Offset to persistent data memory region */
#define LVEQNB_MEMREGION_PERSISTENT_COEF 2 /* Offset to persistent coefficient region */
#define LVEQNB_MEMREGION_SCRATCH 3 /* Offset to data scratch memory region */
#define LVEQNB_NR_MEMORY_REGIONS 4 /* Number of memory regions */
/* Callback events */
#define LVEQNB_EVENT_NONE 0x0000 /* Not a valid event */
#define LVEQNB_EVENT_ALGOFF 0x0001 /* EQNB has completed switch off */
/****************************************************************************************/
/* */
/* Types */
/* */
/****************************************************************************************/
/* Instance handle */
typedef void *LVEQNB_Handle_t;
/* Operating modes */
typedef enum
{
LVEQNB_BYPASS = 0,
LVEQNB_ON = 1,
LVEQNB_MODE_MAX = LVM_MAXINT_32
} LVEQNB_Mode_en;
/* Filter mode control */
typedef enum
{
LVEQNB_FILTER_OFF = 0,
LVEQNB_FILTER_ON = 1,
LVEQNB_FILTER_DUMMY = LVM_MAXINT_32
} LVEQNB_FilterMode_en;
/* Memory Types */
typedef enum
{
LVEQNB_PERSISTENT = 0,
LVEQNB_PERSISTENT_DATA = 1,
LVEQNB_PERSISTENT_COEF = 2,
LVEQNB_SCRATCH = 3,
LVEQNB_MEMORY_MAX = LVM_MAXINT_32
} LVEQNB_MemoryTypes_en;
/* Function return status */
typedef enum
{
LVEQNB_SUCCESS = 0, /* Successful return from a routine */
LVEQNB_ALIGNMENTERROR = 1, /* Memory alignment error */
LVEQNB_NULLADDRESS = 2, /* NULL allocation address */
LVEQNB_TOOMANYSAMPLES = 3, /* Maximum block size exceeded */
LVEQNB_STATUS_MAX = LVM_MAXINT_32
} LVEQNB_ReturnStatus_en;
/****************************************************************************************/
/* */
/* Linked enumerated type and capability definitions */
/* */
/* The capability definitions are used to define the required capabilities at */
/* initialisation, these are added together to give the capability word. The */
/* enumerated type is used to select the mode through a control function at run time. */
/* */
/* The capability definition is related to the enumerated type value by the equation: */
/* */
/* Capability_value = 2^Enumerated_value */
/* */
/* For example, a module could be configurd at initialisation to support two sample */
/* rates only by calling the init function with the value: */
/* Capabilities.SampleRate = LVEQNB_CAP_32000 + LVEQNB_CAP_44100; */
/* */
/* and at run time it would be passed the value LVEQNB_FS_32000 through the control */
/* function to select operation at 32kHz */
/* */
/****************************************************************************************/
/*
* Supported source data formats
*/
#define LVEQNB_CAP_STEREO 1
#define LVEQNB_CAP_MONOINSTEREO 2
typedef enum
{
LVEQNB_STEREO = 0,
LVEQNB_MONOINSTEREO = 1,
LVEQNB_SOURCE_MAX = LVM_MAXINT_32
} LVEQNB_SourceFormat_en;
/*
* Supported sample rates in samples per second
*/
#define LVEQNB_CAP_FS_8000 1
#define LVEQNB_CAP_FS_11025 2
#define LVEQNB_CAP_FS_12000 4
#define LVEQNB_CAP_FS_16000 8
#define LVEQNB_CAP_FS_22050 16
#define LVEQNB_CAP_FS_24000 32
#define LVEQNB_CAP_FS_32000 64
#define LVEQNB_CAP_FS_44100 128
#define LVEQNB_CAP_FS_48000 256
typedef enum
{
LVEQNB_FS_8000 = 0,
LVEQNB_FS_11025 = 1,
LVEQNB_FS_12000 = 2,
LVEQNB_FS_16000 = 3,
LVEQNB_FS_22050 = 4,
LVEQNB_FS_24000 = 5,
LVEQNB_FS_32000 = 6,
LVEQNB_FS_44100 = 7,
LVEQNB_FS_48000 = 8,
LVEQNB_FS_MAX = LVM_MAXINT_32
} LVEQNB_Fs_en;
/****************************************************************************************/
/* */
/* Structures */
/* */
/****************************************************************************************/
/* Memory region definition */
typedef struct
{
LVM_UINT32 Size; /* Region size in bytes */
LVM_UINT16 Alignment; /* Region alignment in bytes */
LVEQNB_MemoryTypes_en Type; /* Region type */
void *pBaseAddress; /* Pointer to the region base address */
} LVEQNB_MemoryRegion_t;
/* Memory table containing the region definitions */
typedef struct
{
LVEQNB_MemoryRegion_t Region[LVEQNB_NR_MEMORY_REGIONS]; /* One definition for each region */
} LVEQNB_MemTab_t;
/* Equaliser band definition */
typedef struct
{
LVM_INT16 Gain; /* Band gain in dB */
LVM_UINT16 Frequency; /* Band centre frequency in Hz */
LVM_UINT16 QFactor; /* Band quality factor */
} LVEQNB_BandDef_t;
/* Parameter structure */
typedef struct
{
/* General parameters */
LVEQNB_Mode_en OperatingMode;
LVEQNB_Fs_en SampleRate;
LVEQNB_SourceFormat_en SourceFormat;
/* Equaliser parameters */
LVM_UINT16 NBands; /* Number of bands */
LVEQNB_BandDef_t *pBandDefinition; /* Pointer to equaliser definitions */
} LVEQNB_Params_t;
/* Capability structure */
typedef struct
{
/* General parameters */
LVM_UINT16 SampleRate;
LVM_UINT16 SourceFormat;
LVM_UINT16 MaxBlockSize;
LVM_UINT16 MaxBands;
/* Callback parameters */
LVM_Callback CallBack; /* Bundle callback */
void *pBundleInstance; /* Bundle instance handle */
} LVEQNB_Capabilities_t;
/****************************************************************************************/
/* */
/* Function Prototypes */
/* */
/****************************************************************************************/
/****************************************************************************************/
/* */
/* FUNCTION: LVEQNB_Memory */
/* */
/* DESCRIPTION: */
/* This function is used for memory allocation and free. It can be called in */
/* two ways: */
/* */
/* hInstance = NULL Returns the memory requirements */
/* hInstance = Instance handle Returns the memory requirements and */
/* allocated base addresses for the instance */
/* */
/* When this function is called for memory allocation (hInstance=NULL) the memory */
/* base address pointers are NULL on return. */
/* */
/* When the function is called for free (hInstance = Instance Handle) the memory */
/* table returns the allocated memory and base addresses used during initialisation. */
/* */
/* PARAMETERS: */
/* hInstance Instance Handle */
/* pMemoryTable Pointer to an empty memory definition table */
/* pCapabilities Pointer to the default capabilities */
/* */
/* RETURNS: */
/* LVEQNB_SUCCESS Succeeded */
/* LVEQNB_NULLADDRESS When any of pMemoryTable and pCapabilities is NULL address */
/* */
/* NOTES: */
/* 1. This function may be interrupted by the LVEQNB_Process function */
/* */
/****************************************************************************************/
LVEQNB_ReturnStatus_en LVEQNB_Memory(LVEQNB_Handle_t hInstance,
LVEQNB_MemTab_t *pMemoryTable,
LVEQNB_Capabilities_t *pCapabilities);
/****************************************************************************************/
/* */
/* FUNCTION: LVEQNB_Init */
/* */
/* DESCRIPTION: */
/* Create and initialisation function for the N-Band equalliser module */
/* */
/* This function can be used to create an algorithm instance by calling with */
/* hInstance set to NULL. In this case the algorithm returns the new instance */
/* handle. */
/* */
/* This function can be used to force a full re-initialisation of the algorithm */
/* by calling with hInstance = Instance Handle. In this case the memory table */
/* should be correct for the instance, this can be ensured by calling the function */
/* LVEQNB_Memory before calling this function. */
/* */
/* PARAMETERS: */
/* hInstance Instance handle */
/* pMemoryTable Pointer to the memory definition table */
/* pCapabilities Pointer to the initialisation capabilities */
/* */
/* RETURNS: */
/* LVEQNB_SUCCESS Initialisation succeeded */
/* LVEQNB_NULLADDRESS When pCapabilities or pMemoryTableis or phInstance are NULL */
/* LVEQNB_NULLADDRESS One or more of the memory regions has a NULL base address */
/* pointer for a memory region with a non-zero size. */
/* */
/* */
/* NOTES: */
/* 1. The instance handle is the pointer to the base address of the first memory */
/* region. */
/* 2. This function must not be interrupted by the LVEQNB_Process function */
/* */
/****************************************************************************************/
LVEQNB_ReturnStatus_en LVEQNB_Init(LVEQNB_Handle_t *phInstance,
LVEQNB_MemTab_t *pMemoryTable,
LVEQNB_Capabilities_t *pCapabilities);
/****************************************************************************************/
/* */
/* FUNCTION: LVEQNB_GetParameters */
/* */
/* DESCRIPTION: */
/* Request the equaliser module parameters. The current parameter set is returned */
/* via the parameter pointer. */
/* */
/* PARAMETERS: */
/* hInstance Instance handle */
/* pParams Pointer to an empty parameter structure */
/* */
/* RETURNS: */
/* LVEQNB_SUCCESS Succeeds */
/* LVEQNB_NULLADDRESS Instance or pParams is NULL pointer */
/* */
/* NOTES: */
/* 1. This function may be interrupted by the LVEQNB_Process function */
/* */
/****************************************************************************************/
LVEQNB_ReturnStatus_en LVEQNB_GetParameters(LVEQNB_Handle_t hInstance,
LVEQNB_Params_t *pParams);
/****************************************************************************************/
/* */
/* FUNCTION: LVEQNB_GetCapabilities */
/* */
/* DESCRIPTION: */
/* Request the equaliser module capabilities. The capabilities set is returned */
/* via the pointer. */
/* */
/* PARAMETERS: */
/* hInstance Instance handle */
/* pCapabilities Pointer to an empty capability structure */
/* */
/* RETURNS: */
/* LVEQNB_SUCCESS Succeeds */
/* LVEQNB_NULLADDRESS hInstance or pCapabilities is NULL */
/* */
/* NOTES: */
/* 1. This function may be interrupted by the LVEQNB_Process function */
/* */
/****************************************************************************************/
LVEQNB_ReturnStatus_en LVEQNB_GetCapabilities(LVEQNB_Handle_t hInstance,
LVEQNB_Capabilities_t *pCapabilities);
/****************************************************************************************/
/* */
/* FUNCTION: LVEQNB_Control */
/* */
/* DESCRIPTION: */
/* Sets or changes the equaliser module parameters. */
/* */
/* PARAMETERS: */
/* hInstance Instance handle */
/* pParams Pointer to a parameter structure */
/* */
/* RETURNS: */
/* LVEQNB_SUCCESS Succeeded */
/* LVEQNB_NULLADDRESS Instance or pParams is NULL pointer */
/* LVEQNB_NULLADDRESS NULL address for the equaliser filter definitions and the */
/* number of bands is non-zero */
/* */
/* NOTES: */
/* 1. This function may be interrupted by the LVEQNB_Process function */
/* */
/****************************************************************************************/
LVEQNB_ReturnStatus_en LVEQNB_Control(LVEQNB_Handle_t hInstance,
LVEQNB_Params_t *pParams);
/****************************************************************************************/
/* */
/* FUNCTION: LVEQNB_Process */
/* */
/* DESCRIPTION: */
/* Process function for the LifeVibes module. */
/* */
/* PARAMETERS: */
/* hInstance Instance handle */
/* pInData Pointer to the input data */
/* pOutData Pointer to the output data */
/* NumSamples Number of samples in the input buffer */
/* */
/* RETURNS: */
/* LVEQNB_SUCCESS Succeeded */
/* LVEQNB_NULLADDRESS When hInstance, pInData or pOutData are NULL */
/* LVEQNB_ALIGNMENTERROR When pInData or pOutData are not 32-bit aligned */
/* LVEQNB_TOOMANYSAMPLES NumSamples was larger than the maximum block size */
/* */
/* NOTES: */
/* */
/****************************************************************************************/
LVEQNB_ReturnStatus_en LVEQNB_Process(LVEQNB_Handle_t hInstance,
const LVM_INT16 *pInData,
LVM_INT16 *pOutData,
LVM_UINT16 NumSamples);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* __LVEQNB__ */