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/****************************************************************************************/
192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*    Includes                                                                          */
212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include "LVDBE.h"
252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include "LVDBE_Private.h"
262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION:                 LVDBE_Memory                                               */
302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION:                                                                         */
322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*    This function is used for memory allocation and free. It can be called in         */
332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*    two ways:                                                                         */
342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*        hInstance = NULL                Returns the memory requirements               */
362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*        hInstance = Instance handle        Returns the memory requirements and        */
372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                        allocated base addresses for the instance     */
382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*    When this function is called for memory allocation (hInstance=NULL) the memory    */
402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  base address pointers are NULL on return.                                           */
412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*    When the function is called for free (hInstance = Instance Handle) the memory     */
432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  table returns the allocated memory and base addresses used during initialisation.   */
442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS:                                                                          */
462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  hInstance                Instance Handle                                            */
472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  pMemoryTable             Pointer to an empty memory definition table                */
482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*    pCapabilities           Pointer to the instance capabilities                      */
492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* RETURNS:                                                                             */
512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  LVDBE_SUCCESS            Succeeded                                                  */
522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* NOTES:                                                                               */
542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*    1.    This function may be interrupted by the LVDBE_Process function              */
552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
582c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVDBE_ReturnStatus_en LVDBE_Memory(LVDBE_Handle_t            hInstance,
592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                   LVDBE_MemTab_t            *pMemoryTable,
602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                   LVDBE_Capabilities_t      *pCapabilities)
612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{
622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_UINT32          ScratchSize;
642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVDBE_Instance_t    *pInstance = (LVDBE_Instance_t *)hInstance;
652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Fill in the memory table
692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if (hInstance == LVM_NULL)
712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Instance memory
742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pMemoryTable->Region[LVDBE_MEMREGION_INSTANCE].Size         = sizeof(LVDBE_Instance_t);
762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pMemoryTable->Region[LVDBE_MEMREGION_INSTANCE].Alignment    = LVDBE_INSTANCE_ALIGN;
772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pMemoryTable->Region[LVDBE_MEMREGION_INSTANCE].Type         = LVDBE_PERSISTENT;
782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pMemoryTable->Region[LVDBE_MEMREGION_INSTANCE].pBaseAddress = LVM_NULL;
792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Data memory
822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pMemoryTable->Region[LVDBE_MEMREGION_PERSISTENT_DATA].Size         = sizeof(LVDBE_Data_t);
842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pMemoryTable->Region[LVDBE_MEMREGION_PERSISTENT_DATA].Alignment    = LVDBE_PERSISTENT_DATA_ALIGN;
852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pMemoryTable->Region[LVDBE_MEMREGION_PERSISTENT_DATA].Type         = LVDBE_PERSISTENT_DATA;
862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pMemoryTable->Region[LVDBE_MEMREGION_PERSISTENT_DATA].pBaseAddress = LVM_NULL;
872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Coef memory
902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pMemoryTable->Region[LVDBE_MEMREGION_PERSISTENT_COEF].Size         = sizeof(LVDBE_Coef_t);
922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pMemoryTable->Region[LVDBE_MEMREGION_PERSISTENT_COEF].Alignment    = LVDBE_PERSISTENT_COEF_ALIGN;
932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pMemoryTable->Region[LVDBE_MEMREGION_PERSISTENT_COEF].Type         = LVDBE_PERSISTENT_COEF;
942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pMemoryTable->Region[LVDBE_MEMREGION_PERSISTENT_COEF].pBaseAddress = LVM_NULL;
952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Scratch memory
982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        ScratchSize = (LVM_UINT32)(LVDBE_SCRATCHBUFFERS_INPLACE*sizeof(LVM_INT16)*pCapabilities->MaxBlockSize);
1002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pMemoryTable->Region[LVDBE_MEMREGION_SCRATCH].Size         = ScratchSize;
1012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pMemoryTable->Region[LVDBE_MEMREGION_SCRATCH].Alignment    = LVDBE_SCRATCH_ALIGN;
1022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pMemoryTable->Region[LVDBE_MEMREGION_SCRATCH].Type         = LVDBE_SCRATCH;
1032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pMemoryTable->Region[LVDBE_MEMREGION_SCRATCH].pBaseAddress = LVM_NULL;
1042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
1052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    else
1062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
1072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /* Read back memory allocation table */
1082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        *pMemoryTable = pInstance->MemoryTable;
1092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
1102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return(LVDBE_SUCCESS);
1122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
1132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
1162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
1172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION:                 LVDBE_Init                                                 */
1182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
1192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION:                                                                         */
1202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*    Create and initialisation function for the Dynamic Bass Enhancement module        */
1212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
1222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*    This function can be used to create an algorithm instance by calling with         */
1232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*    hInstance set to NULL. In this case the algorithm returns the new instance        */
1242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*    handle.                                                                           */
1252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
1262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*    This function can be used to force a full re-initialisation of the algorithm      */
1272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*    by calling with hInstance = Instance Handle. In this case the memory table        */
1282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*    should be correct for the instance, this can be ensured by calling the function   */
1292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*    DBE_Memory before calling this function.                                          */
1302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
1312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS:                                                                          */
1322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  hInstance                  Instance handle                                          */
1332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  pMemoryTable             Pointer to the memory definition table                     */
1342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  pCapabilities              Pointer to the instance capabilities                     */
1352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
1362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* RETURNS:                                                                             */
1372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  LVDBE_SUCCESS            Initialisation succeeded                                   */
1382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  LVDBE_ALIGNMENTERROR    Instance or scratch memory on incorrect alignment           */
1392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*    LVDBE_NULLADDRESS        Instance or scratch memory has a NULL pointer            */
1402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
1412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* NOTES:                                                                               */
1422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  1.     The instance handle is the pointer to the base address of the first memory   */
1432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*        region.                                                                       */
1442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*    2.    This function must not be interrupted by the LVDBE_Process function         */
1452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
1462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
1472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1482c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVDBE_ReturnStatus_en LVDBE_Init(LVDBE_Handle_t         *phInstance,
1492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                   LVDBE_MemTab_t       *pMemoryTable,
1502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                   LVDBE_Capabilities_t *pCapabilities)
1512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{
1522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVDBE_Instance_t      *pInstance;
1542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVMixer3_1St_st       *pMixer_Instance;
155c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    LVMixer3_2St_st       *pBypassMixer_Instance;
1562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT16             i;
1572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT32             MixGain;
1582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
1612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Set the instance handle if not already initialised
1622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
1632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if (*phInstance == LVM_NULL)
1642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
1652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        *phInstance = (LVDBE_Handle_t)pMemoryTable->Region[LVDBE_MEMREGION_INSTANCE].pBaseAddress;
1662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
1672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance =(LVDBE_Instance_t  *)*phInstance;
1682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
1712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Check the memory table for NULL pointers and incorrectly aligned data
1722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
1732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    for (i=0; i<LVDBE_NR_MEMORY_REGIONS; i++)
1742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
1752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if (pMemoryTable->Region[i].Size!=0)
1762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
1772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            if (pMemoryTable->Region[i].pBaseAddress==LVM_NULL)
1782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            {
1792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                return(LVDBE_NULLADDRESS);
1802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            }
181b302bd5d288be2d3363b80053ca2392560b00b25Ashok Bhat            if (((uintptr_t)pMemoryTable->Region[i].pBaseAddress % pMemoryTable->Region[i].Alignment)!=0){
1822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                return(LVDBE_ALIGNMENTERROR);
1832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            }
1842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
1852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
1862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
1892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Save the memory table in the instance structure
1902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
1912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->Capabilities = *pCapabilities;
1922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
1952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Save the memory table in the instance structure
1962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
1972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->MemoryTable = *pMemoryTable;
1982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
2012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Set the default instance parameters
2022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
2032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->Params.CentreFrequency   =    LVDBE_CENTRE_55HZ;
2042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->Params.EffectLevel       =    0;
2052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->Params.HeadroomdB        =    0;
2062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->Params.HPFSelect         =    LVDBE_HPF_OFF;
2072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->Params.OperatingMode     =    LVDBE_OFF;
2082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->Params.SampleRate        =    LVDBE_FS_8000;
2092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->Params.VolumeControl     =    LVDBE_VOLUME_OFF;
2102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->Params.VolumedB          =    0;
2112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
2142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Set pointer to data and coef memory
2152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
2162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->pData = pMemoryTable->Region[LVDBE_MEMREGION_PERSISTENT_DATA].pBaseAddress;
2172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->pCoef = pMemoryTable->Region[LVDBE_MEMREGION_PERSISTENT_COEF].pBaseAddress;
2182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
2212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Initialise the filters
2222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
223c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    LVDBE_SetFilters(pInstance,                 /* Set the filter taps and coefficients */
2242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                     &pInstance->Params);
2252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
2282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Initialise the AGC
2292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
2302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVDBE_SetAGC(pInstance,                                     /* Set the AGC gain */
2312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                 &pInstance->Params);
232c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    pInstance->pData->AGCInstance.AGC_Gain = pInstance->pData->AGCInstance.AGC_MaxGain;
233c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                                                /* Default to the bass boost setting */
2342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
23597bb6e89845cb6d85f4d34a4efcc1de2ce585336Marco Nelissen    // initialize the mixer with some fixes values since otherwise LVDBE_SetVolume ends up
23697bb6e89845cb6d85f4d34a4efcc1de2ce585336Marco Nelissen    // reading uninitialized data
23797bb6e89845cb6d85f4d34a4efcc1de2ce585336Marco Nelissen    pMixer_Instance = &pInstance->pData->BypassVolume;
23897bb6e89845cb6d85f4d34a4efcc1de2ce585336Marco Nelissen    LVC_Mixer_Init(&pMixer_Instance->MixerStream[0],0x00007FFF,0x00007FFF);
2392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
2412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Initialise the volume
2422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
2432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVDBE_SetVolume(pInstance,                                         /* Set the Volume */
2442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    &pInstance->Params);
2452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
246c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    pInstance->pData->AGCInstance.Volume = pInstance->pData->AGCInstance.Target;
247c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                                                /* Initialise as the target */
2482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    MixGain = LVC_Mixer_GetTarget(&pMixer_Instance->MixerStream[0]);
2502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVC_Mixer_Init(&pMixer_Instance->MixerStream[0],MixGain,MixGain);
2512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /* Configure the mixer process path */
2532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pMixer_Instance->MixerStream[0].CallbackParam = 0;
2542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pMixer_Instance->MixerStream[0].pCallbackHandle = LVM_NULL;
2552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pMixer_Instance->MixerStream[0].pCallBack = LVM_NULL;
2562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pMixer_Instance->MixerStream[0].CallbackSet = 0;
2572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
259c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * Initialise the clicks minimisation BypassMixer
2602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
261c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
262c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    pBypassMixer_Instance = &pInstance->pData->BypassMixer;
263c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
264c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    /*
265c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * Setup the mixer gain for the processed path
266c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     */
267c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    pBypassMixer_Instance->MixerStream[0].CallbackParam = 0;
268c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    pBypassMixer_Instance->MixerStream[0].pCallbackHandle = LVM_NULL;
269c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    pBypassMixer_Instance->MixerStream[0].pCallBack = LVM_NULL;
270c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    pBypassMixer_Instance->MixerStream[0].CallbackSet=0;
271c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    LVC_Mixer_Init(&pBypassMixer_Instance->MixerStream[0],0,0);
272c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    LVC_Mixer_SetTimeConstant(&pBypassMixer_Instance->MixerStream[0],
273c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        LVDBE_BYPASS_MIXER_TC,pInstance->Params.SampleRate,2);
274c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    /*
275c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * Setup the mixer gain for the unprocessed path
276c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     */
277c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    pBypassMixer_Instance->MixerStream[1].CallbackParam = 0;
278c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    pBypassMixer_Instance->MixerStream[1].pCallbackHandle = LVM_NULL;
279c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    pBypassMixer_Instance->MixerStream[1].pCallBack = LVM_NULL;
280c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    pBypassMixer_Instance->MixerStream[1].CallbackSet=0;
281c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    LVC_Mixer_Init(&pBypassMixer_Instance->MixerStream[1],0x00007FFF,0x00007FFF);
282c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    LVC_Mixer_SetTimeConstant(&pBypassMixer_Instance->MixerStream[1],
283c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        LVDBE_BYPASS_MIXER_TC,pInstance->Params.SampleRate,2);
2842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return(LVDBE_SUCCESS);
2862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
2872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
288