12c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*
22c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Copyright (C) 2004-2010 NXP Software
32c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Copyright (C) 2010 The Android Open Source Project
42c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *
52c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Licensed under the Apache License, Version 2.0 (the "License");
62c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * you may not use this file except in compliance with the License.
72c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * You may obtain a copy of the License at
82c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *
92c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *      http://www.apache.org/licenses/LICENSE-2.0
102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *
112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Unless required by applicable law or agreed to in writing, software
122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * distributed under the License is distributed on an "AS IS" BASIS,
132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * See the License for the specific language governing permissions and
152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * limitations under the License.
162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */
172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#ifndef __LVC_MIXER_H__
192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#define __LVC_MIXER_H__
202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#ifdef __cplusplus
232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentextern "C" {
242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#endif /* __cplusplus */
252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include "LVM_Types.h"
282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/**********************************************************************************
302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent   INSTANCE MEMORY TYPE DEFINITION
312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent***********************************************************************************/
322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* LVMixer3_st structure stores Instance parameters for one audio stream */
342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurenttypedef struct
352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{
362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT32       PrivateParams[4];   /* Private Instance params for Audio Stream */
372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT16       CallbackSet;        /* Boolean.  Should be set by calling application each time the target value is updated */
382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT16       CallbackParam;      /* Parameter that will be used in the calback function */
392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    void            *pCallbackHandle;   /* Pointer to the instance of the callback function */
402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    void            *pGeneralPurpose;   /* Pointer for general purpose usage */
412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_Callback    pCallBack;          /* Pointer to the callback function */
422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent} LVMixer3_st;
432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurenttypedef struct
452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{
462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVMixer3_st     MixerStream[1];    /* Instance Params for one Audio Stream */
472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent} LVMixer3_1St_st;
482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurenttypedef struct
502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{
512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVMixer3_st     MixerStream[2];    /* Instance Params for two Audio Streams */
522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent} LVMixer3_2St_st;
532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurenttypedef struct
552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{
562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVMixer3_st     MixerStream[3];    /* Instance Params for three Audio Streams */
572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent} LVMixer3_3St_st;
582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/**********************************************************************************
602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent   FUNCTION PROTOTYPES (HIGH LEVEL FUNCTIONS)
612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent***********************************************************************************/
622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* Function names should be unique within first 16 characters  */
642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#define    LVMixer3_MixSoft_1St_D16C31_SAT   LVMixer3_1St_D16C31_SAT_MixSoft
652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#define    LVMixer3_MixInSoft_D16C31_SAT     LVMixer3_D16C31_SAT_MixInSoft
662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#define    LVMixer3_MixSoft_2St_D16C31_SAT   LVMixer3_2St_D16C31_SAT_MixSoft
672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#define    LVMixer3_MixSoft_3St_D16C31_SAT   LVMixer3_3St_D16C31_SAT_MixSoft
682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*** General functions ************************************************************/
712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/**********************************************************************************/
732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* This time constant calculation function assumes the mixer will be called with  */
742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* large block sizes. When the block size is small, especially if less than 4,    */
752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* then the calculation will give an incorrect value for alpha, see the mixer     */
762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* documentation for further details.                                             */
772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* ********************************************************************************/
782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid LVC_Mixer_SetTarget( LVMixer3_st *pStream,
792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                LVM_INT32           TargetGain);
802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
812c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVM_INT32 LVC_Mixer_GetTarget( LVMixer3_st *pStream);
822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
832c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVM_INT32 LVC_Mixer_GetCurrent( LVMixer3_st *pStream);
842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid LVC_Mixer_Init( LVMixer3_st *pStream,
862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                LVM_INT32           TargetGain,
872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                LVM_INT32           CurrentGain);
882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid LVC_Mixer_SetTimeConstant( LVMixer3_st *pStream,
902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                LVM_INT32           Tc_millisec,
912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                LVM_Fs_en           Fs,
922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                LVM_INT16           NumChannels);
932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid LVC_Mixer_VarSlope_SetTimeConstant( LVMixer3_st *pStream,
952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                        LVM_INT32           Tc_millisec,
962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                        LVM_Fs_en           Fs,
972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                        LVM_INT16           NumChannels);
982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*** 16 bit functions *************************************************************/
1002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid LVC_MixSoft_1St_D16C31_SAT( LVMixer3_1St_st *pInstance,
1022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                  const LVM_INT16           *src,
1032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                        LVM_INT16           *dst,
1042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                        LVM_INT16           n);
1052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid LVC_MixInSoft_D16C31_SAT( LVMixer3_1St_st *pInstance,
1072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                        LVM_INT16           *src,
1082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                        LVM_INT16           *dst,
1092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                        LVM_INT16           n);
1102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid LVC_MixSoft_2St_D16C31_SAT( LVMixer3_2St_st *pInstance,
1122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                const LVM_INT16             *src1,
1132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                      LVM_INT16             *src2,
1142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                      LVM_INT16             *dst,  /* dst cannot be equal to src2 */
1152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                      LVM_INT16             n);
1162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/**********************************************************************************/
1182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* For applying different gains to Left and right chennals                        */
1192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* MixerStream[0] applies to Left channel                                         */
1202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* MixerStream[1] applies to Right channel                                        */
1212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* Gain values should not be more that 1.0                                        */
1222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/**********************************************************************************/
1232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid LVC_MixSoft_1St_2i_D16C31_SAT( LVMixer3_2St_st         *pInstance,
1242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                const   LVM_INT16           *src,
1252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                        LVM_INT16           *dst,   /* dst can be equal to src */
1262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                        LVM_INT16           n);     /* Number of stereo samples */
1272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#ifdef __cplusplus
1302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
1312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#endif /* __cplusplus */
1322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/**********************************************************************************/
1342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#endif //#ifndef __LVC_MIXER_H__
1362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
137