/*
 * 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 private layer interface of concert sound.                   */
/*                                                                                  */
/*  This files includes all definitions, types, structures and function             */
/*  prototypes required by the execution layer.                                     */
/*                                                                                  */
/************************************************************************************/

#ifndef __LVCS_PRIVATE_H__
#define __LVCS_PRIVATE_H__

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */


/************************************************************************************/
/*                                                                                  */
/*  Includes                                                                        */
/*                                                                                  */
/************************************************************************************/

#include "LVCS.h"                               /* Calling or Application layer definitions */
#include "LVCS_StereoEnhancer.h"                /* Stereo enhancer module definitions */
#include "LVCS_ReverbGenerator.h"               /* Reverberation module definitions */
#include "LVCS_Equaliser.h"                     /* Equaliser module definitions */
#include "LVCS_BypassMix.h"                     /* Bypass Mixer module definitions */
#include "LVM_Timer.h"


/************************************************************************************/
/*                                                                                  */
/*  Defines                                                                         */
/*                                                                                  */
/************************************************************************************/

/* Configuration switch controls */
#define LVCS_STEREOENHANCESWITCH    0x0001      /* Stereo enhancement enable control */
#define LVCS_REVERBSWITCH           0x0002      /* Reverberation enable control */
#define LVCS_EQUALISERSWITCH        0x0004      /* Equaliser enable control */
#define LVCS_BYPASSMIXSWITCH        0x0008      /* Bypass mixer enable control */
#define LVCS_COMPGAINFRAME          64          /* Compressor gain update interval */

/* Memory */
#define LVCS_SCRATCHBUFFERS              6      /* Number of buffers required for inplace processing */
#ifdef SUPPORT_MC
/*
 * The Concert Surround module applies processing only on the first two
 * channels of a multichannel input. The data of first two channels is copied
 * from the multichannel input into scratch buffer. The buffers added here
 * are used for this purpose
 */
#define LVCS_MC_SCRATCHBUFFERS           2
#endif

/* General */
#define LVCS_INVALID                0xFFFF      /* Invalid init parameter */
#define LVCS_BYPASS_MIXER_TC        100         /* Bypass mixer time */

/* Access to external coefficients table */
#define LVCS_NR_OF_FS                    9
#define LVCS_NR_OF_CHAN_CFG              2


/************************************************************************************/
/*                                                                                  */
/*  Types                                                                           */
/*                                                                                  */
/************************************************************************************/

typedef LVM_UINT16  LVCS_Configuration_t;       /* Internal algorithm configuration */

typedef enum
{
    LVCS_HEADPHONE  = 0,
    LVCS_DEVICE_MAX = LVM_MAXENUM
} LVCS_OutputDevice_en;


/************************************************************************************/
/*                                                                                  */
/*  Structures                                                                      */
/*                                                                                  */
/************************************************************************************/

/* Volume correction structure */
typedef struct
{
#ifdef BUILD_FLOAT
    LVM_FLOAT   CompFull;                       /* Post CS compression 100% effect */
    LVM_FLOAT   CompMin;                        /* Post CS compression 0% effect */
    LVM_FLOAT   GainFull;                       /* CS gain correct 100% effect */
    LVM_FLOAT   GainMin;                        /* CS gain correct 0% effect */
#else
    LVM_INT16   CompFull;                       /* Post CS compression 100% effect */
    LVM_INT16   CompMin;                        /* Post CS compression 0% effect */
    LVM_INT16   GainFull;                       /* CS gain correct 100% effect */
    LVM_INT16   GainMin;                        /* CS gain correct 0% effect */
#endif
} LVCS_VolCorrect_t;

/* Instance structure */
typedef struct
{
    /* Public parameters */
    LVCS_MemTab_t           MemoryTable;        /* Instance memory allocation table */
    LVCS_Params_t           Params;             /* Instance parameters */
    LVCS_Capabilities_t     Capabilities;       /* Initialisation capabilities */

    /* Private parameters */
    LVCS_OutputDevice_en    OutputDevice;       /* Selected output device type */
    LVCS_VolCorrect_t       VolCorrect;         /* Volume correction settings */
#ifndef BUILD_FLOAT
    LVM_INT16               TransitionGain;     /* Transition gain */
    LVM_INT16               CompressGain;       /* Last used compressor gain*/
#else
    LVM_FLOAT               TransitionGain;     /* Transition gain */
    LVM_FLOAT               CompressGain;       /* Last used compressor gain*/
#endif

    /* Sub-block configurations */
    LVCS_StereoEnhancer_t   StereoEnhancer;     /* Stereo enhancer configuration */
    LVCS_ReverbGenerator_t  Reverberation;      /* Reverberation configuration */
    LVCS_Equaliser_t        Equaliser;          /* Equaliser configuration */
    LVCS_BypassMix_t        BypassMix;          /* Bypass mixer configuration */

    /* Bypass variable */
    LVM_INT16               MSTarget0;                          /* Mixer state control variable for smooth transtion */
    LVM_INT16               MSTarget1;                          /* Mixer state control variable for smooth transtion */
    LVM_INT16               bInOperatingModeTransition;         /* Operating mode transition flag */
    LVM_INT16               bTimerDone;                         /* Timer completion flag */
    LVM_Timer_Params_t      TimerParams;                        /* Timer parameters */
    LVM_Timer_Instance_t    TimerInstance;                      /* Timer instance */

} LVCS_Instance_t;

/* Coefficient Structure */
typedef struct
{
#ifdef BUILD_FLOAT
    Biquad_FLOAT_Instance_t       EqualiserBiquadInstance;
    Biquad_FLOAT_Instance_t       ReverbBiquadInstance;
    Biquad_FLOAT_Instance_t       SEBiquadInstanceMid;
    Biquad_FLOAT_Instance_t       SEBiquadInstanceSide;
#else
    Biquad_Instance_t       EqualiserBiquadInstance;
    Biquad_Instance_t       ReverbBiquadInstance;
    Biquad_Instance_t       SEBiquadInstanceMid;
    Biquad_Instance_t       SEBiquadInstanceSide;
#endif
} LVCS_Coefficient_t;

/* Data Structure */
typedef struct
{
#ifdef BUILD_FLOAT
    Biquad_2I_Order2_FLOAT_Taps_t EqualiserBiquadTaps;
    Biquad_2I_Order2_FLOAT_Taps_t ReverbBiquadTaps;
    Biquad_1I_Order1_FLOAT_Taps_t SEBiquadTapsMid;
    Biquad_1I_Order2_FLOAT_Taps_t SEBiquadTapsSide;
#else
    Biquad_2I_Order2_Taps_t EqualiserBiquadTaps;
    Biquad_2I_Order2_Taps_t ReverbBiquadTaps;
    Biquad_1I_Order1_Taps_t SEBiquadTapsMid;
    Biquad_1I_Order2_Taps_t SEBiquadTapsSide;
#endif
} LVCS_Data_t;

void LVCS_TimerCallBack (   void* hInstance,
                            void* pCallBackParams,
                            LVM_INT32 CallbackParam);


#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif      /* PRIVATE_H */


