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 "LVM_Private.h"
252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include "LVM_Tables.h"
262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include "VectorArithmetic.h"
272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include "InstAlloc.h"
282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION:                LVM_GetMemoryTable                                          */
322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION:                                                                         */
342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  This function is used for memory allocation and free. It can be called in           */
352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  two ways:                                                                           */
362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*      hInstance = NULL                Returns the memory requirements                 */
382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*      hInstance = Instance handle     Returns the memory requirements and             */
392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                      allocated base addresses for the instance       */
402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  When this function is called for memory allocation (hInstance=NULL) the memory      */
422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  base address pointers are NULL on return.                                           */
432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  When the function is called for free (hInstance = Instance Handle) the memory       */
452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  table returns the allocated memory and base addresses used during initialisation.   */
462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS:                                                                          */
482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  hInstance               Instance Handle                                             */
492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  pMemoryTable            Pointer to an empty memory definition table                 */
502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  pCapabilities           Pointer to the default capabilities                         */
512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* RETURNS:                                                                             */
532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  LVM_SUCCESS             Succeeded                                                   */
542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  LVM_NULLADDRESS         When one of pMemoryTable or pInstParams is NULL             */
552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  LVM_OUTOFRANGE          When any of the Instance parameters are out of range        */
562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* NOTES:                                                                               */
582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  1.  This function may be interrupted by the LVM_Process function                    */
592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  2.  The scratch memory is the largest required by any of the sub-modules plus any   */
602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*      additional scratch requirements of the bundle                                   */
612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
642c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVM_ReturnStatus_en LVM_GetMemoryTable(LVM_Handle_t         hInstance,
652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                       LVM_MemTab_t         *pMemoryTable,
662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                       LVM_InstParams_t     *pInstParams)
672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{
682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_Instance_t      *pInstance = (LVM_Instance_t *)hInstance;
702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_UINT32          AlgScratchSize;
712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_UINT32          BundleScratchSize;
722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_UINT16          InternalBlockSize;
732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    INST_ALLOC          AllocMem[LVM_NR_MEMORY_REGIONS];
742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT16           i;
752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Check parameters
792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(pMemoryTable == LVM_NULL)
812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        return LVM_NULLADDRESS;
832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Return memory table if the instance has already been created
882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if (hInstance != LVM_NULL)
902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent       /* Read back memory allocation table */
922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        *pMemoryTable = pInstance->MemoryTable;
932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        return(LVM_SUCCESS);
942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(pInstParams == LVM_NULL)
972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        return LVM_NULLADDRESS;
992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
1002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
1022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     *  Power Spectrum Analyser
1032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
1042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(pInstParams->PSA_Included > LVM_PSA_ON)
1052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
1062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        return (LVM_OUTOFRANGE);
1072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
1082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
1102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Check the instance parameters
1112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
1122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if( (pInstParams->BufferMode != LVM_MANAGED_BUFFERS) && (pInstParams->BufferMode != LVM_UNMANAGED_BUFFERS) )
1132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
1142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        return (LVM_OUTOFRANGE);
1152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
1162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /* N-Band Equalizer */
1182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if( pInstParams->EQNB_NumBands > 32 )
1192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
1202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        return (LVM_OUTOFRANGE);
1212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
1222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(pInstParams->BufferMode == LVM_MANAGED_BUFFERS)
1242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
1252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if( (pInstParams->MaxBlockSize < LVM_MIN_MAXBLOCKSIZE ) || (pInstParams->MaxBlockSize > LVM_MANAGED_MAX_MAXBLOCKSIZE ) )
1262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
1272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            return (LVM_OUTOFRANGE);
1282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
1292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
1302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    else
1312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
1322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if( (pInstParams->MaxBlockSize < LVM_MIN_MAXBLOCKSIZE ) || (pInstParams->MaxBlockSize > LVM_UNMANAGED_MAX_MAXBLOCKSIZE) )
1332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
1342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            return (LVM_OUTOFRANGE);
1352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
1362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
1372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
1392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    * Initialise the AllocMem structures
1402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    */
1412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    for (i=0; i<LVM_NR_MEMORY_REGIONS; i++)
1422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
1432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        InstAlloc_Init(&AllocMem[i], LVM_NULL);
1442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
1452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    InternalBlockSize = (LVM_UINT16)((pInstParams->MaxBlockSize) & MIN_INTERNAL_BLOCKMASK); /* Force to a multiple of MIN_INTERNAL_BLOCKSIZE */
1462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if (InternalBlockSize < MIN_INTERNAL_BLOCKSIZE)
1482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
1492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        InternalBlockSize = MIN_INTERNAL_BLOCKSIZE;
1502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
1512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /* Maximum Internal Black Size should not be more than MAX_INTERNAL_BLOCKSIZE*/
1532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(InternalBlockSize > MAX_INTERNAL_BLOCKSIZE)
1542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
1552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        InternalBlockSize = MAX_INTERNAL_BLOCKSIZE;
1562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
1572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
1592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    * Bundle requirements
1602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    */
1612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_SLOW_DATA],
1622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        sizeof(LVM_Instance_t));
1632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
1662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Set the algorithm and bundle scratch requirements
1672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
1682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    AlgScratchSize    = 0;
1692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if (pInstParams->BufferMode == LVM_MANAGED_BUFFERS)
1702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
1712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        BundleScratchSize = 6 * (MIN_INTERNAL_BLOCKSIZE + InternalBlockSize) * sizeof(LVM_INT16);
1722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_TEMPORARY_FAST],        /* Scratch buffer */
1732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                            BundleScratchSize);
1742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_SLOW_DATA],
1752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                            sizeof(LVM_Buffer_t));
1762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
1772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
1792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Treble Enhancement requirements
1802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
1812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_FAST_DATA],
1822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        sizeof(LVM_TE_Data_t));
1832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_FAST_COEF],
1842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        sizeof(LVM_TE_Coefs_t));
1852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
1872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * N-Band Equalizer requirements
1882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
1892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_FAST_DATA],      /* Local storage */
1902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        (pInstParams->EQNB_NumBands * sizeof(LVM_EQNB_BandDef_t)));
1912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_FAST_DATA],      /* User storage */
1922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        (pInstParams->EQNB_NumBands * sizeof(LVM_EQNB_BandDef_t)));
1932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
1952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Concert Sound requirements
1962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
1972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
1982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVCS_MemTab_t           CS_MemTab;
1992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVCS_Capabilities_t     CS_Capabilities;
2002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
2022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Set the capabilities
2032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
2042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        CS_Capabilities.MaxBlockSize     = InternalBlockSize;
2052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
2072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Get the memory requirements
2082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
2092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVCS_Memory(LVM_NULL,
2102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    &CS_MemTab,
2112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    &CS_Capabilities);
2122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
2142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Update the memory allocation structures
2152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
2162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_FAST_DATA],
2172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                            CS_MemTab.Region[LVM_MEMREGION_PERSISTENT_FAST_DATA].Size);
2182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_FAST_COEF],
2192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                            CS_MemTab.Region[LVM_MEMREGION_PERSISTENT_FAST_COEF].Size);
2202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if (CS_MemTab.Region[LVM_MEMREGION_TEMPORARY_FAST].Size > AlgScratchSize) AlgScratchSize = CS_MemTab.Region[LVM_MEMREGION_TEMPORARY_FAST].Size;
2212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
2232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
2262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Dynamic Bass Enhancement requirements
2272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
2282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
2292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVDBE_MemTab_t          DBE_MemTab;
2302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVDBE_Capabilities_t    DBE_Capabilities;
2312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
2332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Set the capabilities
2342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
2352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        DBE_Capabilities.SampleRate      = LVDBE_CAP_FS_8000 | LVDBE_CAP_FS_11025 | LVDBE_CAP_FS_12000 | LVDBE_CAP_FS_16000 | LVDBE_CAP_FS_22050 | LVDBE_CAP_FS_24000 | LVDBE_CAP_FS_32000 | LVDBE_CAP_FS_44100 | LVDBE_CAP_FS_48000;
2362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        DBE_Capabilities.CentreFrequency = LVDBE_CAP_CENTRE_55Hz | LVDBE_CAP_CENTRE_55Hz | LVDBE_CAP_CENTRE_66Hz | LVDBE_CAP_CENTRE_78Hz | LVDBE_CAP_CENTRE_90Hz;
2372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        DBE_Capabilities.MaxBlockSize    = InternalBlockSize;
2382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
2402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Get the memory requirements
2412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
2422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVDBE_Memory(LVM_NULL,
2432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    &DBE_MemTab,
2442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    &DBE_Capabilities);
2462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
2472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Update the bundle table
2482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
2492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_FAST_DATA],
2502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                            DBE_MemTab.Region[LVM_MEMREGION_PERSISTENT_FAST_DATA].Size);
2512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_FAST_COEF],
2522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                            DBE_MemTab.Region[LVM_MEMREGION_PERSISTENT_FAST_COEF].Size);
2532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if (DBE_MemTab.Region[LVM_MEMREGION_TEMPORARY_FAST].Size > AlgScratchSize) AlgScratchSize = DBE_MemTab.Region[LVM_MEMREGION_TEMPORARY_FAST].Size;
2542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
2562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
2592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * N-Band equaliser requirements
2602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
2612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
2622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVEQNB_MemTab_t         EQNB_MemTab;            /* For N-Band Equaliser */
2632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVEQNB_Capabilities_t   EQNB_Capabilities;
2642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
2662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Set the capabilities
2672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
2682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        EQNB_Capabilities.SampleRate   = LVEQNB_CAP_FS_8000 | LVEQNB_CAP_FS_11025 | LVEQNB_CAP_FS_12000 | LVEQNB_CAP_FS_16000 | LVEQNB_CAP_FS_22050 | LVEQNB_CAP_FS_24000 | LVEQNB_CAP_FS_32000 | LVEQNB_CAP_FS_44100 | LVEQNB_CAP_FS_48000;
2692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        EQNB_Capabilities.SourceFormat = LVEQNB_CAP_STEREO | LVEQNB_CAP_MONOINSTEREO;
2702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        EQNB_Capabilities.MaxBlockSize = InternalBlockSize;
2712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        EQNB_Capabilities.MaxBands     = pInstParams->EQNB_NumBands;
2722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
2742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Get the memory requirements
2752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
2762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVEQNB_Memory(LVM_NULL,
2772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                      &EQNB_MemTab,
2782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                      &EQNB_Capabilities);
2792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
2812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Update the bundle table
2822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
2832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_FAST_DATA],
2842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                            EQNB_MemTab.Region[LVM_MEMREGION_PERSISTENT_FAST_DATA].Size);
2852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_FAST_COEF],
2862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                            EQNB_MemTab.Region[LVM_MEMREGION_PERSISTENT_FAST_COEF].Size);
2872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if (EQNB_MemTab.Region[LVM_MEMREGION_TEMPORARY_FAST].Size > AlgScratchSize) AlgScratchSize = EQNB_MemTab.Region[LVM_MEMREGION_TEMPORARY_FAST].Size;
2882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
2902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
2922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Headroom management memory allocation
2932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
2942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_FAST_DATA],
2952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                       (LVM_HEADROOM_MAX_NBANDS * sizeof(LVM_HeadroomBandDef_t)));
2962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_FAST_DATA],
2972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                       (LVM_HEADROOM_MAX_NBANDS * sizeof(LVM_HeadroomBandDef_t)));
2982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
3012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Spectrum Analyzer memory requirements
3022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
3032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
3042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pLVPSA_Handle_t     hPSAInst = LVM_NULL;
3052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVPSA_MemTab_t      PSA_MemTab;
3062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVPSA_InitParams_t  PSA_InitParams;
3072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVPSA_FilterParam_t FiltersParams[9];
3082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVPSA_RETURN        PSA_Status;
3092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if(pInstParams->PSA_Included == LVM_PSA_ON)
3112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
3122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            PSA_InitParams.SpectralDataBufferDuration   = (LVM_UINT16) 500;
3132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            PSA_InitParams.MaxInputBlockSize            = (LVM_UINT16) 1000;
3142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            PSA_InitParams.nBands                       = (LVM_UINT16) 9;
3152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            PSA_InitParams.pFiltersParams = &FiltersParams[0];
3172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            for(i = 0; i < PSA_InitParams.nBands; i++)
3182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            {
3192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                FiltersParams[i].CenterFrequency    = (LVM_UINT16) 1000;
3202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                FiltersParams[i].QFactor            = (LVM_UINT16) 25;
3212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                FiltersParams[i].PostGain           = (LVM_INT16)  0;
3222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            }
3232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            /*
3252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            * Get the memory requirements
3262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            */
3272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            PSA_Status = LVPSA_Memory (hPSAInst,
3282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                        &PSA_MemTab,
3292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                        &PSA_InitParams);
3302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            if (PSA_Status != LVPSA_OK)
3322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            {
3332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                return((LVM_ReturnStatus_en) LVM_ALGORITHMPSA);
3342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            }
3352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            /*
3372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            * Update the bundle table
3382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            */
3392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            /* Slow Data */
3402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_SLOW_DATA],
3412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                PSA_MemTab.Region[LVM_PERSISTENT_SLOW_DATA].Size);
3422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            /* Fast Data */
3442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_FAST_DATA],
3452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                PSA_MemTab.Region[LVM_PERSISTENT_FAST_DATA].Size);
3462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            /* Fast Coef */
3482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_FAST_COEF],
3492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                PSA_MemTab.Region[LVM_PERSISTENT_FAST_COEF].Size);
3502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            /* Fast Temporary */
3522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            InstAlloc_AddMember(&AllocMem[LVM_TEMPORARY_FAST],
3532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                MAX_INTERNAL_BLOCKSIZE * sizeof(LVM_INT16));
3542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            if (PSA_MemTab.Region[LVM_TEMPORARY_FAST].Size > AlgScratchSize)
3562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            {
3572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                AlgScratchSize = PSA_MemTab.Region[LVM_TEMPORARY_FAST].Size;
3582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            }
3592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
3602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
3612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
3632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Return the memory table
3642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
3652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pMemoryTable->Region[LVM_MEMREGION_PERSISTENT_SLOW_DATA].Size         = InstAlloc_GetTotal(&AllocMem[LVM_MEMREGION_PERSISTENT_SLOW_DATA]);
3662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pMemoryTable->Region[LVM_MEMREGION_PERSISTENT_SLOW_DATA].Type         = LVM_PERSISTENT_SLOW_DATA;
3672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pMemoryTable->Region[LVM_MEMREGION_PERSISTENT_SLOW_DATA].pBaseAddress = LVM_NULL;
3682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pMemoryTable->Region[LVM_MEMREGION_PERSISTENT_FAST_DATA].Size         = InstAlloc_GetTotal(&AllocMem[LVM_MEMREGION_PERSISTENT_FAST_DATA]);
3702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pMemoryTable->Region[LVM_MEMREGION_PERSISTENT_FAST_DATA].Type         = LVM_PERSISTENT_FAST_DATA;
3712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pMemoryTable->Region[LVM_MEMREGION_PERSISTENT_FAST_DATA].pBaseAddress = LVM_NULL;
3722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if (pMemoryTable->Region[LVM_MEMREGION_PERSISTENT_FAST_DATA].Size < 4)
3732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
3742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pMemoryTable->Region[LVM_MEMREGION_PERSISTENT_FAST_DATA].Size = 0;
3752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
3762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pMemoryTable->Region[LVM_MEMREGION_PERSISTENT_FAST_COEF].Size         = InstAlloc_GetTotal(&AllocMem[LVM_MEMREGION_PERSISTENT_FAST_COEF]);
3782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pMemoryTable->Region[LVM_MEMREGION_PERSISTENT_FAST_COEF].Type         = LVM_PERSISTENT_FAST_COEF;
3792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pMemoryTable->Region[LVM_MEMREGION_PERSISTENT_FAST_COEF].pBaseAddress = LVM_NULL;
3802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if (pMemoryTable->Region[LVM_MEMREGION_PERSISTENT_FAST_COEF].Size < 4)
3812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
3822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pMemoryTable->Region[LVM_MEMREGION_PERSISTENT_FAST_COEF].Size = 0;
3832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
3842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_TEMPORARY_FAST],
3862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        AlgScratchSize);
3872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pMemoryTable->Region[LVM_MEMREGION_TEMPORARY_FAST].Size             = InstAlloc_GetTotal(&AllocMem[LVM_MEMREGION_TEMPORARY_FAST]);
3882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pMemoryTable->Region[LVM_MEMREGION_TEMPORARY_FAST].Type             = LVM_TEMPORARY_FAST;
3892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pMemoryTable->Region[LVM_MEMREGION_TEMPORARY_FAST].pBaseAddress     = LVM_NULL;
3902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if (pMemoryTable->Region[LVM_MEMREGION_TEMPORARY_FAST].Size < 4)
3912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
3922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pMemoryTable->Region[LVM_MEMREGION_TEMPORARY_FAST].Size = 0;
3932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
3942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return(LVM_SUCCESS);
3962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
3982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
3992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
4012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
4022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION:                LVM_GetInstanceHandle                                       */
4032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
4042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION:                                                                         */
4052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  This function is used to create a bundle instance. It returns the created instance  */
4062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  handle through phInstance. All parameters are set to their default, inactive state. */
4072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
4082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS:                                                                          */
4092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  phInstance              pointer to the instance handle                              */
4102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  pMemoryTable            Pointer to the memory definition table                      */
4112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  pInstParams             Pointer to the initialisation capabilities                  */
4122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
4132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* RETURNS:                                                                             */
4142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  LVM_SUCCESS             Initialisation succeeded                                    */
4152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  LVM_OUTOFRANGE          When any of the Instance parameters are out of range        */
4162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  LVM_NULLADDRESS         When one of phInstance, pMemoryTable or pInstParams are NULL*/
4172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
4182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* NOTES:                                                                               */
4192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  1. This function must not be interrupted by the LVM_Process function                */
4202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
4212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
4222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4232c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVM_ReturnStatus_en LVM_GetInstanceHandle(LVM_Handle_t           *phInstance,
4242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                          LVM_MemTab_t           *pMemoryTable,
4252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                          LVM_InstParams_t       *pInstParams)
4262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{
4272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_ReturnStatus_en     Status = LVM_SUCCESS;
4292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_Instance_t          *pInstance;
4302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    INST_ALLOC              AllocMem[LVM_NR_MEMORY_REGIONS];
4312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT16               i;
4322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_UINT16              InternalBlockSize;
4332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT32               BundleScratchSize;
4342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
4372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Check valid points have been given
4382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
4392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if ((phInstance == LVM_NULL) || (pMemoryTable == LVM_NULL) || (pInstParams == LVM_NULL))
4402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
4412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        return (LVM_NULLADDRESS);
4422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
4432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
4452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Check the memory table for NULL pointers
4462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
4472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    for (i=0; i<LVM_NR_MEMORY_REGIONS; i++)
4482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
4492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if ((pMemoryTable->Region[i].Size != 0) &&
4502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            (pMemoryTable->Region[i].pBaseAddress==LVM_NULL))
4512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
4522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            return(LVM_NULLADDRESS);
4532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
4542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
4552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
4572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Check the instance parameters
4582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
4592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if( (pInstParams->BufferMode != LVM_MANAGED_BUFFERS) && (pInstParams->BufferMode != LVM_UNMANAGED_BUFFERS) )
4602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
4612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        return (LVM_OUTOFRANGE);
4622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
4632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if( pInstParams->EQNB_NumBands > 32 )
4652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
4662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        return (LVM_OUTOFRANGE);
4672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
4682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(pInstParams->BufferMode == LVM_MANAGED_BUFFERS)
4702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
4712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if( (pInstParams->MaxBlockSize < LVM_MIN_MAXBLOCKSIZE ) || (pInstParams->MaxBlockSize > LVM_MANAGED_MAX_MAXBLOCKSIZE ) )
4722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
4732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            return (LVM_OUTOFRANGE);
4742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
4752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
4762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    else
4772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
4782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if( (pInstParams->MaxBlockSize < LVM_MIN_MAXBLOCKSIZE ) || (pInstParams->MaxBlockSize > LVM_UNMANAGED_MAX_MAXBLOCKSIZE) )
4792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
4802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            return (LVM_OUTOFRANGE);
4812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
4822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
4832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(pInstParams->PSA_Included > LVM_PSA_ON)
4852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
4862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        return (LVM_OUTOFRANGE);
4872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
4882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
4902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Initialise the AllocMem structures
4912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
4922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    for (i=0; i<LVM_NR_MEMORY_REGIONS; i++)
4932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
4942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        InstAlloc_Init(&AllocMem[i],
4952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                       pMemoryTable->Region[i].pBaseAddress);
4962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
4972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
4992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
5002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Set the instance handle
5012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
5022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    *phInstance  = (LVM_Handle_t)InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_SLOW_DATA],
5032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                                     sizeof(LVM_Instance_t));
5042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance =(LVM_Instance_t  *)*phInstance;
5052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
5082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Save the memory table, parameters and capabilities
5092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
5102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->MemoryTable    = *pMemoryTable;
5112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->InstParams     = *pInstParams;
5122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
5152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Set the bundle scratch memory and initialse the buffer management
5162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
5172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    InternalBlockSize = (LVM_UINT16)((pInstParams->MaxBlockSize) & MIN_INTERNAL_BLOCKMASK); /* Force to a multiple of MIN_INTERNAL_BLOCKSIZE */
5182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if (InternalBlockSize < MIN_INTERNAL_BLOCKSIZE)
5192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
5202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        InternalBlockSize = MIN_INTERNAL_BLOCKSIZE;
5212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
5222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /* Maximum Internal Black Size should not be more than MAX_INTERNAL_BLOCKSIZE*/
5242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(InternalBlockSize > MAX_INTERNAL_BLOCKSIZE)
5252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
5262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        InternalBlockSize = MAX_INTERNAL_BLOCKSIZE;
5272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
5282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->InternalBlockSize = (LVM_INT16)InternalBlockSize;
5292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
5322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Common settings for managed and unmanaged buffers
5332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
5342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->SamplesToProcess = 0;                /* No samples left to process */
5352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if (pInstParams->BufferMode == LVM_MANAGED_BUFFERS)
5362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
5372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
5382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Managed buffers required
5392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
5402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->pBufferManagement = InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_SLOW_DATA],
5412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                                           sizeof(LVM_Buffer_t));
5422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        BundleScratchSize = (LVM_INT32)(6 * (MIN_INTERNAL_BLOCKSIZE + InternalBlockSize) * sizeof(LVM_INT16));
5432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->pBufferManagement->pScratch = InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_TEMPORARY_FAST],   /* Scratch 1 buffer */
5442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                                                     (LVM_UINT32)BundleScratchSize);
5452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LoadConst_16(0,                                                        /* Clear the input delay buffer */
5472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                     (LVM_INT16 *)&pInstance->pBufferManagement->InDelayBuffer,
5482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                     (LVM_INT16)(2 * MIN_INTERNAL_BLOCKSIZE));
5492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->pBufferManagement->InDelaySamples = MIN_INTERNAL_BLOCKSIZE; /* Set the number of delay samples */
5502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->pBufferManagement->OutDelaySamples = 0;                     /* No samples in the output buffer */
5512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->pBufferManagement->BufferState = LVM_FIRSTCALL;             /* Set the state ready for the first call */
5522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
5532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
5562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Set default parameters
5572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
5582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->Params.OperatingMode    = LVM_MODE_OFF;
5592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->Params.SampleRate       = LVM_FS_8000;
560f6c7a40f8cbbd2fa1a4131ef91b30cf7c5c2d0d7Eric Laurent    pInstance->Params.SourceFormat     = LVM_MONO;
5612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->Params.SpeakerType      = LVM_HEADPHONES;
5622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->Params.VC_EffectLevel   = 0;
5632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->Params.VC_Balance       = 0;
5642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
5662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Set callback
5672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
5682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->CallBack = LVM_AlgoCallBack;
5692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
5722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * DC removal filter
5732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
5742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    DC_2I_D16_TRC_WRA_01_Init(&pInstance->DC_RemovalInstance);
5752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
5782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Treble Enhancement
5792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
5802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->pTE_Taps  = (LVM_TE_Data_t *)InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_FAST_DATA],
5812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                                                sizeof(LVM_TE_Data_t));
5822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->pTE_State = (LVM_TE_Coefs_t *)InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_FAST_COEF],
5842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                                                 sizeof(LVM_TE_Coefs_t));
5852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->Params.TE_OperatingMode = LVM_TE_OFF;
5862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->Params.TE_EffectLevel   = 0;
5872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->TE_Active               = LVM_FALSE;
5882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
5912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Set the volume control and initialise Current to Target
5922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
5932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->VC_Volume.MixerStream[0].CallbackParam      = 0;
5942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->VC_Volume.MixerStream[0].CallbackSet        = 0;
5952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->VC_Volume.MixerStream[0].pCallbackHandle    = pInstance;
5962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->VC_Volume.MixerStream[0].pCallBack          = LVM_VCCallBack;
5972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
5982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /* In managed buffering, start with low signal level as delay in buffer management causes a click*/
5992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if (pInstParams->BufferMode == LVM_MANAGED_BUFFERS)
6002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
6012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVC_Mixer_Init(&pInstance->VC_Volume.MixerStream[0],0,0);
6022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
6032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    else
6042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
6052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVC_Mixer_Init(&pInstance->VC_Volume.MixerStream[0],LVM_MAXINT_16,LVM_MAXINT_16);
6062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
6072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVC_Mixer_SetTimeConstant(&pInstance->VC_Volume.MixerStream[0],0,LVM_FS_8000,2);
6092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->VC_VolumedB                  = 0;
6112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->VC_AVLFixedVolume            = 0;
6122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->VC_Active                    = LVM_FALSE;
6132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->VC_BalanceMix.MixerStream[0].CallbackParam      = 0;
6152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->VC_BalanceMix.MixerStream[0].CallbackSet        = 0;
6162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->VC_BalanceMix.MixerStream[0].pCallbackHandle    = pInstance;
6172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->VC_BalanceMix.MixerStream[0].pCallBack          = LVM_VCCallBack;
6182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVC_Mixer_Init(&pInstance->VC_BalanceMix.MixerStream[0],LVM_MAXINT_16,LVM_MAXINT_16);
6192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVC_Mixer_VarSlope_SetTimeConstant(&pInstance->VC_BalanceMix.MixerStream[0],LVM_VC_MIXER_TIME,LVM_FS_8000,2);
6202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->VC_BalanceMix.MixerStream[1].CallbackParam      = 0;
6222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->VC_BalanceMix.MixerStream[1].CallbackSet        = 0;
6232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->VC_BalanceMix.MixerStream[1].pCallbackHandle    = pInstance;
6242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->VC_BalanceMix.MixerStream[1].pCallBack          = LVM_VCCallBack;
6252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVC_Mixer_Init(&pInstance->VC_BalanceMix.MixerStream[1],LVM_MAXINT_16,LVM_MAXINT_16);
6262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVC_Mixer_VarSlope_SetTimeConstant(&pInstance->VC_BalanceMix.MixerStream[1],LVM_VC_MIXER_TIME,LVM_FS_8000,2);
6272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
6282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Set the default EQNB pre-gain and pointer to the band definitions
6292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
6302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->pEQNB_BandDefs = InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_FAST_DATA],
6312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                                    (pInstParams->EQNB_NumBands * sizeof(LVM_EQNB_BandDef_t)));
6322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->pEQNB_UserDefs = InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_FAST_DATA],
6332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                                   (pInstParams->EQNB_NumBands * sizeof(LVM_EQNB_BandDef_t)));
6342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
6372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Initialise the Concert Sound module
6382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
6392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
6402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVCS_Handle_t           hCSInstance;                /* Instance handle */
6412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVCS_MemTab_t           CS_MemTab;                  /* Memory table */
6422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVCS_Capabilities_t     CS_Capabilities;            /* Initial capabilities */
6432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVCS_ReturnStatus_en    LVCS_Status;                /* Function call status */
6442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
6462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Set default parameters
6472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
6482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->Params.VirtualizerReverbLevel    = 100;
6492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->Params.VirtualizerType           = LVM_CONCERTSOUND;
6502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->Params.VirtualizerOperatingMode  = LVM_MODE_OFF;
6512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->CS_Active                        = LVM_FALSE;
6522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
6542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Set the initialisation capabilities
6552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
6562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        CS_Capabilities.MaxBlockSize    = (LVM_UINT16)InternalBlockSize;
6572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        CS_Capabilities.CallBack = pInstance->CallBack;
6582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        CS_Capabilities.pBundleInstance = (void*)pInstance;
6592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
6622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Get the memory requirements and then set the address pointers, forcing alignment
6632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
6642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVCS_Status = LVCS_Memory(LVM_NULL,                /* Get the memory requirements */
6652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                  &CS_MemTab,
6662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                  &CS_Capabilities);
6672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        CS_MemTab.Region[LVCS_MEMREGION_PERSISTENT_SLOW_DATA].pBaseAddress = &pInstance->CS_Instance;
6682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        CS_MemTab.Region[LVCS_MEMREGION_PERSISTENT_FAST_DATA].pBaseAddress = (void *)InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_FAST_DATA],
6692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                                                                                         CS_MemTab.Region[LVCS_MEMREGION_PERSISTENT_FAST_DATA].Size);
6702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        CS_MemTab.Region[LVCS_MEMREGION_PERSISTENT_FAST_COEF].pBaseAddress = (void *)InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_FAST_COEF],
6712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                                                                                         CS_MemTab.Region[LVCS_MEMREGION_PERSISTENT_FAST_COEF].Size);
6722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        CS_MemTab.Region[LVCS_MEMREGION_TEMPORARY_FAST].pBaseAddress       = (void *)InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_TEMPORARY_FAST],
6732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                                                                                         0);
6742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
6762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Initialise the Concert Sound instance and save the instance handle
6772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
6782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        hCSInstance = LVM_NULL;                            /* Set to NULL to return handle */
6792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVCS_Status = LVCS_Init(&hCSInstance,              /* Initiailse */
6802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                &CS_MemTab,
6812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                &CS_Capabilities);
6822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if (LVCS_Status != LVCS_SUCCESS) return((LVM_ReturnStatus_en)LVCS_Status);
6832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->hCSInstance = hCSInstance;              /* Save the instance handle */
6842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
6862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
6882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Initialise the Bass Enhancement module
6892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
6902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
6912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVDBE_Handle_t          hDBEInstance;               /* Instance handle */
6922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVDBE_MemTab_t          DBE_MemTab;                 /* Memory table */
6932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVDBE_Capabilities_t    DBE_Capabilities;           /* Initial capabilities */
6942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVDBE_ReturnStatus_en   LVDBE_Status;               /* Function call status */
6952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
6972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
6982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Set the initialisation parameters
6992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
7002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->Params.BE_OperatingMode = LVM_BE_OFF;
7012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->Params.BE_CentreFreq    = LVM_BE_CENTRE_55Hz;
7022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->Params.BE_EffectLevel   = 0;
7032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->Params.BE_HPF           = LVM_BE_HPF_OFF;
7042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
7052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->DBE_Active              = LVM_FALSE;
7062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
7072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
7082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
7092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
7102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Set the initialisation capabilities
7112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
7122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        DBE_Capabilities.SampleRate      = LVDBE_CAP_FS_8000 | LVDBE_CAP_FS_11025 | LVDBE_CAP_FS_12000 | LVDBE_CAP_FS_16000 | LVDBE_CAP_FS_22050 | LVDBE_CAP_FS_24000 | LVDBE_CAP_FS_32000 | LVDBE_CAP_FS_44100 | LVDBE_CAP_FS_48000;
7132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        DBE_Capabilities.CentreFrequency = LVDBE_CAP_CENTRE_55Hz | LVDBE_CAP_CENTRE_55Hz | LVDBE_CAP_CENTRE_66Hz | LVDBE_CAP_CENTRE_78Hz | LVDBE_CAP_CENTRE_90Hz;
7142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        DBE_Capabilities.MaxBlockSize    = (LVM_UINT16)InternalBlockSize;
7152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
7162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
7172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
7182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Get the memory requirements and then set the address pointers
7192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
7202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVDBE_Status = LVDBE_Memory(LVM_NULL,               /* Get the memory requirements */
7212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    &DBE_MemTab,
7222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    &DBE_Capabilities);
7232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        DBE_MemTab.Region[LVDBE_MEMREGION_INSTANCE].pBaseAddress        = &pInstance->DBE_Instance;
7242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        DBE_MemTab.Region[LVDBE_MEMREGION_PERSISTENT_DATA].pBaseAddress = (void *)InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_FAST_DATA],
7252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                                                                                      DBE_MemTab.Region[LVDBE_MEMREGION_PERSISTENT_DATA].Size);
7262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        DBE_MemTab.Region[LVDBE_MEMREGION_PERSISTENT_COEF].pBaseAddress = (void *)InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_FAST_COEF],
7272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                                                                                      DBE_MemTab.Region[LVDBE_MEMREGION_PERSISTENT_COEF].Size);
7282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        DBE_MemTab.Region[LVDBE_MEMREGION_SCRATCH].pBaseAddress         = (void *)InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_TEMPORARY_FAST],
7292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                                                                                      0);
7302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
7312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
7322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
7332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Initialise the Dynamic Bass Enhancement instance and save the instance handle
7342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
7352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        hDBEInstance = LVM_NULL;                            /* Set to NULL to return handle */
7362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVDBE_Status = LVDBE_Init(&hDBEInstance,            /* Initiailse */
7372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                  &DBE_MemTab,
7382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                  &DBE_Capabilities);
7392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if (LVDBE_Status != LVDBE_SUCCESS) return((LVM_ReturnStatus_en)LVDBE_Status);
7402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->hDBEInstance = hDBEInstance;             /* Save the instance handle */
7412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
7422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
7432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
7442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
7452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Initialise the N-Band Equaliser module
7462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
7472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
7482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVEQNB_Handle_t          hEQNBInstance;             /* Instance handle */
7492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVEQNB_MemTab_t          EQNB_MemTab;               /* Memory table */
7502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVEQNB_Capabilities_t    EQNB_Capabilities;         /* Initial capabilities */
7512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVEQNB_ReturnStatus_en   LVEQNB_Status;             /* Function call status */
7522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
7532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
7542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
7552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Set the initialisation parameters
7562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
7572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->Params.EQNB_OperatingMode   = LVM_EQNB_OFF;
7582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->Params.EQNB_NBands          = 0;
7592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->Params.pEQNB_BandDefinition = LVM_NULL;
7602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->EQNB_Active                 = LVM_FALSE;
7612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
7622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
7632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
7642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Set the initialisation capabilities
7652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
7662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        EQNB_Capabilities.SampleRate      = LVEQNB_CAP_FS_8000 | LVEQNB_CAP_FS_11025 | LVEQNB_CAP_FS_12000 | LVEQNB_CAP_FS_16000 | LVEQNB_CAP_FS_22050 | LVEQNB_CAP_FS_24000 | LVEQNB_CAP_FS_32000 | LVEQNB_CAP_FS_44100 | LVEQNB_CAP_FS_48000;
7672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        EQNB_Capabilities.MaxBlockSize    = (LVM_UINT16)InternalBlockSize;
7682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        EQNB_Capabilities.MaxBands        = pInstParams->EQNB_NumBands;
7692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        EQNB_Capabilities.SourceFormat    = LVEQNB_CAP_STEREO | LVEQNB_CAP_MONOINSTEREO;
7702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        EQNB_Capabilities.CallBack        = pInstance->CallBack;
7712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        EQNB_Capabilities.pBundleInstance  = (void*)pInstance;
7722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
7732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
7742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
7752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Get the memory requirements and then set the address pointers, forcing alignment
7762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
7772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVEQNB_Status = LVEQNB_Memory(LVM_NULL,             /* Get the memory requirements */
7782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                      &EQNB_MemTab,
7792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                      &EQNB_Capabilities);
7802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        EQNB_MemTab.Region[LVEQNB_MEMREGION_INSTANCE].pBaseAddress        = &pInstance->EQNB_Instance;
7812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        EQNB_MemTab.Region[LVEQNB_MEMREGION_PERSISTENT_DATA].pBaseAddress = (void *)InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_FAST_DATA],
7822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                                                                                        EQNB_MemTab.Region[LVEQNB_MEMREGION_PERSISTENT_DATA].Size);
7832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        EQNB_MemTab.Region[LVEQNB_MEMREGION_PERSISTENT_COEF].pBaseAddress = (void *)InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_FAST_COEF],
7842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                                                                                        EQNB_MemTab.Region[LVEQNB_MEMREGION_PERSISTENT_COEF].Size);
7852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        EQNB_MemTab.Region[LVEQNB_MEMREGION_SCRATCH].pBaseAddress         = (void *)InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_TEMPORARY_FAST],
7862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                                                                                        0);
7872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
7882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
7892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
7902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Initialise the Dynamic Bass Enhancement instance and save the instance handle
7912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
7922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        hEQNBInstance = LVM_NULL;                           /* Set to NULL to return handle */
7932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVEQNB_Status = LVEQNB_Init(&hEQNBInstance,         /* Initiailse */
7942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    &EQNB_MemTab,
7952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    &EQNB_Capabilities);
7962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if (LVEQNB_Status != LVEQNB_SUCCESS) return((LVM_ReturnStatus_en)LVEQNB_Status);
7972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->hEQNBInstance = hEQNBInstance;           /* Save the instance handle */
7982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
7992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
8012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Headroom management memory allocation
8022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
8032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
8042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->pHeadroom_BandDefs = InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_FAST_DATA],
8052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                                        (LVM_HEADROOM_MAX_NBANDS * sizeof(LVM_HeadroomBandDef_t)));
8062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->pHeadroom_UserDefs = InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_FAST_DATA],
8072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                                       (LVM_HEADROOM_MAX_NBANDS * sizeof(LVM_HeadroomBandDef_t)));
8082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /* Headroom management parameters initialisation */
8102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->NewHeadroomParams.NHeadroomBands = 2;
8112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->NewHeadroomParams.pHeadroomDefinition = pInstance->pHeadroom_BandDefs;
8122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->NewHeadroomParams.pHeadroomDefinition[0].Limit_Low          = 20;
8132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->NewHeadroomParams.pHeadroomDefinition[0].Limit_High         = 4999;
8142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->NewHeadroomParams.pHeadroomDefinition[0].Headroom_Offset    = 3;
8152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->NewHeadroomParams.pHeadroomDefinition[1].Limit_Low          = 5000;
8162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->NewHeadroomParams.pHeadroomDefinition[1].Limit_High         = 24000;
8172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->NewHeadroomParams.pHeadroomDefinition[1].Headroom_Offset    = 4;
8182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->NewHeadroomParams.Headroom_OperatingMode = LVM_HEADROOM_ON;
8192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->Headroom =0;
8212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
8222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
8252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Initialise the PSA module
8262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
8272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
8282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pLVPSA_Handle_t     hPSAInstance = LVM_NULL;   /* Instance handle */
8292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVPSA_MemTab_t      PSA_MemTab;
8302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVPSA_RETURN        PSA_Status;                 /* Function call status */
8312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVPSA_FilterParam_t FiltersParams[9];
8322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if(pInstParams->PSA_Included==LVM_PSA_ON)
8342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
8352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            pInstance->PSA_InitParams.SpectralDataBufferDuration   = (LVM_UINT16) 500;
8362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            pInstance->PSA_InitParams.MaxInputBlockSize            = (LVM_UINT16) 2048;
8372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            pInstance->PSA_InitParams.nBands                       = (LVM_UINT16) 9;
8382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            pInstance->PSA_InitParams.pFiltersParams               = &FiltersParams[0];
8392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            for(i = 0; i < pInstance->PSA_InitParams.nBands; i++)
8402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            {
8412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                FiltersParams[i].CenterFrequency    = (LVM_UINT16) 1000;
8422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                FiltersParams[i].QFactor            = (LVM_UINT16) 100;
8432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                FiltersParams[i].PostGain           = (LVM_INT16)  0;
8442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            }
8452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            /*Get the memory requirements and then set the address pointers*/
8472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            PSA_Status = LVPSA_Memory (hPSAInstance,
8482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                          &PSA_MemTab,
8492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                          &pInstance->PSA_InitParams);
8502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            if (PSA_Status != LVPSA_OK)
8522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            {
8532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                return((LVM_ReturnStatus_en) LVM_ALGORITHMPSA);
8542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            }
8552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            /* Slow Data */
8572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            PSA_MemTab.Region[LVM_PERSISTENT_SLOW_DATA].pBaseAddress = (void *)InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_SLOW_DATA],
8582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                PSA_MemTab.Region[LVM_PERSISTENT_SLOW_DATA].Size);
8592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            /* Fast Data */
8622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            PSA_MemTab.Region[LVM_PERSISTENT_FAST_DATA].pBaseAddress = (void *)InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_FAST_DATA],
8632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                PSA_MemTab.Region[LVM_PERSISTENT_FAST_DATA].Size);
8642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            /* Fast Coef */
8672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            PSA_MemTab.Region[LVM_PERSISTENT_FAST_COEF].pBaseAddress = (void *)InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_FAST_COEF],
8682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                PSA_MemTab.Region[LVM_PERSISTENT_FAST_COEF].Size);
8692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            /* Fast Temporary */
8712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            pInstance->pPSAInput = InstAlloc_AddMember(&AllocMem[LVM_TEMPORARY_FAST],
8722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                                                     (LVM_UINT32) MAX_INTERNAL_BLOCKSIZE * sizeof(LVM_INT16));
8732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            PSA_MemTab.Region[LVM_TEMPORARY_FAST].pBaseAddress       = (void *)InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_TEMPORARY_FAST],0);
8752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            /*Initialise PSA instance and save the instance handle*/
8782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            pInstance->PSA_ControlParams.Fs = LVM_FS_48000;
8792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            pInstance->PSA_ControlParams.LevelDetectionSpeed  = LVPSA_SPEED_MEDIUM;
8802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            PSA_Status = LVPSA_Init (&hPSAInstance,
8812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    &pInstance->PSA_InitParams,
8822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    &pInstance->PSA_ControlParams,
8832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                    &PSA_MemTab);
8842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            if (PSA_Status != LVPSA_OK)
8862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            {
8872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                return((LVM_ReturnStatus_en) LVM_ALGORITHMPSA);
8882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            }
8892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            pInstance->hPSAInstance = hPSAInstance;       /* Save the instance handle */
8912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            pInstance->PSA_GainOffset = 0;
8922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
8932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        else
8942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
8952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            pInstance->hPSAInstance = LVM_NULL;
8962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
8972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
8982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
8992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Set the initialisation parameters.
9002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
9012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->Params.PSA_PeakDecayRate   = LVM_PSA_SPEED_MEDIUM;
9022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->Params.PSA_Enable          = LVM_PSA_OFF;
9032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
9042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
9052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
9062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Copy the initial parameters to the new parameters for correct readback of
9072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * the settings.
9082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
9092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->NewParams = pInstance->Params;
9102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
9112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
9122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
9132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Create configuration number
9142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
9152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->ConfigurationNumber = 0x00000000;
9162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->ConfigurationNumber += LVM_CS_MASK;
9172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->ConfigurationNumber += LVM_EQNB_MASK;
9182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->ConfigurationNumber += LVM_DBE_MASK;
9192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->ConfigurationNumber += LVM_VC_MASK;
9202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    pInstance->ConfigurationNumber += LVM_PSA_MASK;
9212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
9222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(((pInstance->ConfigurationNumber  & LVM_CS_MASK)!=0)  ||
9232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        ((pInstance->ConfigurationNumber & LVM_DBE_MASK)!=0) ||
9242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        ((pInstance->ConfigurationNumber & LVM_EQNB_MASK)!=0)||
9252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        ((pInstance->ConfigurationNumber & LVM_TE_MASK)!=0)  ||
9262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        ((pInstance->ConfigurationNumber & LVM_VC_MASK)!=0))
9272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
9282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->BlickSizeMultiple    = 4;
9292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
9302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    else
9312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
9322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInstance->BlickSizeMultiple    = 1;
9332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
9342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
9352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return(Status);
9362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
9372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
9382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
9392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
9402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
9412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION:                LVM_ClearAudioBuffers                                       */
9422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
9432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION:                                                                         */
9442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  This function is used to clear the internal audio buffers of the bundle.            */
9452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
9462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS:                                                                          */
9472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  hInstance               Instance handle                                             */
9482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
9492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* RETURNS:                                                                             */
9502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  LVM_SUCCESS             Initialisation succeeded                                    */
9512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  LVM_NULLADDRESS         Instance or scratch memory has a NULL pointer               */
9522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
9532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* NOTES:                                                                               */
9542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  1. This function must not be interrupted by the LVM_Process function                */
9552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
9562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
9572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
9582c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVM_ReturnStatus_en LVM_ClearAudioBuffers(LVM_Handle_t  hInstance)
9592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{
9602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_MemTab_t            MemTab;                                     /* Memory table */
9612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_InstParams_t        InstParams;                                 /* Instance parameters */
9622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_ControlParams_t     Params;                                     /* Control Parameters */
9632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_Instance_t          *pInstance  = (LVM_Instance_t  *)hInstance; /* Pointer to Instance */
964f6c7a40f8cbbd2fa1a4131ef91b30cf7c5c2d0d7Eric Laurent    LVM_HeadroomParams_t    HeadroomParams;
9652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
9662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
9672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(hInstance == LVM_NULL){
9682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        return LVM_NULLADDRESS;
9692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
9702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
9712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /* Save the control parameters */ /* coverity[unchecked_value] */ /* Do not check return value internal function calls */
9722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_GetControlParameters(hInstance, &Params);
9732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
974f6c7a40f8cbbd2fa1a4131ef91b30cf7c5c2d0d7Eric Laurent    /*Save the headroom parameters*/
975f6c7a40f8cbbd2fa1a4131ef91b30cf7c5c2d0d7Eric Laurent    LVM_GetHeadroomParams(hInstance, &HeadroomParams);
976f6c7a40f8cbbd2fa1a4131ef91b30cf7c5c2d0d7Eric Laurent
9772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*  Retrieve allocated buffers in memtab */
9782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_GetMemoryTable(hInstance, &MemTab,  LVM_NULL);
9792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
9802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*  Save the instance parameters */
9812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    InstParams = pInstance->InstParams;
9822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
9832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*  Call  LVM_GetInstanceHandle to re-initialise the bundle */
9842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_GetInstanceHandle( &hInstance,
9852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           &MemTab,
9862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                           &InstParams);
9872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
9882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /* Restore control parameters */ /* coverity[unchecked_value] */ /* Do not check return value internal function calls */
9892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_SetControlParameters(hInstance, &Params);
9902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
991f6c7a40f8cbbd2fa1a4131ef91b30cf7c5c2d0d7Eric Laurent    /*Restore the headroom parameters*/
992f6c7a40f8cbbd2fa1a4131ef91b30cf7c5c2d0d7Eric Laurent    LVM_SetHeadroomParams(hInstance, &HeadroomParams);
993f6c7a40f8cbbd2fa1a4131ef91b30cf7c5c2d0d7Eric Laurent
9942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /* DC removal filter */
9952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    DC_2I_D16_TRC_WRA_01_Init(&pInstance->DC_RemovalInstance);
9962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
9972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
9982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return LVM_SUCCESS;
9992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
10002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
10012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
10022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1003