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/*                                                                                      */
212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  Includes                                                                            */
222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include "LVM_Private.h"
262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include "VectorArithmetic.h"
272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include "LVM_Coeffs.h"
282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION:                LVM_Process                                                 */
322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION:                                                                         */
342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  Process function for the LifeVibes module.                                          */
352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS:                                                                          */
372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  hInstance               Instance handle                                             */
382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  pInData                 Pointer to the input data                                   */
392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  pOutData                Pointer to the output data                                  */
402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  NumSamples              Number of samples in the input buffer                       */
412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  AudioTime               Audio Time of the current input buffer in ms                */
422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* RETURNS:                                                                             */
442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  LVM_SUCCESS            Succeeded                                                    */
452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  LVM_INVALIDNUMSAMPLES  When the NumSamples is not a valied multiple in unmanaged    */
462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                         buffer mode                                                  */
472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  LVM_ALIGNMENTERROR     When either the input our output buffers are not 32-bit      */
482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                         aligned in unmanaged mode                                    */
492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*  LVM_NULLADDRESS        When one of hInstance, pInData or pOutData is NULL           */
502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* NOTES:                                                                               */
522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*                                                                                      */
532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/
542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
552c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVM_ReturnStatus_en LVM_Process(LVM_Handle_t                hInstance,
562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                const LVM_INT16             *pInData,
572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                LVM_INT16                   *pOutData,
582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                LVM_UINT16                  NumSamples,
592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                LVM_UINT32                  AudioTime)
602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{
612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_Instance_t      *pInstance  = (LVM_Instance_t  *)hInstance;
632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_UINT16          SampleCount = NumSamples;
642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT16           *pInput     = (LVM_INT16 *)pInData;
652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT16           *pToProcess = (LVM_INT16 *)pInData;
662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_INT16           *pProcessed = pOutData;
672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    LVM_ReturnStatus_en  Status;
682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Check if the number of samples is zero
712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if (NumSamples == 0)
732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        return(LVM_SUCCESS);
752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Check valid points have been given
802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if ((hInstance == LVM_NULL) || (pInData == LVM_NULL) || (pOutData == LVM_NULL))
822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        return (LVM_NULLADDRESS);
842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * For unmanaged mode only
882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if(pInstance->InstParams.BufferMode == LVM_UNMANAGED_BUFFERS)
902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         /*
922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Check if the number of samples is a good multiple (unmanaged mode only)
932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if((NumSamples % pInstance->BlickSizeMultiple) != 0)
952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            return(LVM_INVALIDNUMSAMPLES);
972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
1002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Check the buffer alignment
1012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
102b302bd5d288be2d3363b80053ca2392560b00b25Ashok Bhat        if((((uintptr_t)pInData % 4) != 0) || (((uintptr_t)pOutData % 4) != 0))
1032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
1042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            return(LVM_ALIGNMENTERROR);
1052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
1062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
1072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
1102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Update new parameters if necessary
1112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
1122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if (pInstance->ControlPending == LVM_TRUE)
1132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
1142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        Status = LVM_ApplyNewSettings(hInstance);
1152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if(Status != LVM_SUCCESS)
1172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
1182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            return Status;
1192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
1202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
1212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
1242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Convert from Mono if necessary
1252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
1262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    if (pInstance->Params.SourceFormat == LVM_MONO)
1272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
1282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        MonoTo2I_16(pInData,                                /* Source */
1292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    pOutData,                               /* Destination */
1302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    (LVM_INT16)NumSamples);                 /* Number of input samples */
1312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pInput     = pOutData;
1322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        pToProcess = pOutData;
1332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
1342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    /*
1372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     * Process the data with managed buffers
1382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent     */
1392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    while (SampleCount != 0)
1402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    {
1412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
1422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Manage the input buffer and frame processing
1432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
1442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVM_BufferIn(hInstance,
1452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                     pInput,
1462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                     &pToProcess,
1472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                     &pProcessed,
1482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                     &SampleCount);
1492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
1512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Only process data when SampleCount is none zero, a zero count can occur when
1522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * the BufferIn routine is working in managed mode.
1532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
1542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        if (SampleCount != 0)
1552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        {
1562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            /*
1582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent             * Apply ConcertSound if required
1592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent             */
1602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            if (pInstance->CS_Active == LVM_TRUE)
1612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            {
1622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                (void)LVCS_Process(pInstance->hCSInstance,          /* Concert Sound instance handle */
1632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                   pToProcess,
1642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                   pProcessed,
1652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                   SampleCount);
1662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                pToProcess = pProcessed;
1672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            }
1682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            /*
1702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent             * Apply volume if required
1712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent             */
1722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            if (pInstance->VC_Active!=0)
1732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            {
1742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                LVC_MixSoft_1St_D16C31_SAT(&pInstance->VC_Volume,
1752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                       pToProcess,
1762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                       pProcessed,
1772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                       (LVM_INT16)(2*SampleCount));     /* Left and right*/
1782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                pToProcess = pProcessed;
1792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            }
1802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            /*
1822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent             * Call N-Band equaliser if enabled
1832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent             */
1842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            if (pInstance->EQNB_Active == LVM_TRUE)
1852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            {
1862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                LVEQNB_Process(pInstance->hEQNBInstance,        /* N-Band equaliser instance handle */
1872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                               pToProcess,
1882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                               pProcessed,
1892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                               SampleCount);
1902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                pToProcess = pProcessed;
1912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            }
1922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
1932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            /*
1942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent             * Call bass enhancement if enabled
1952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent             */
1962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            if (pInstance->DBE_Active == LVM_TRUE)
1972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            {
1982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                LVDBE_Process(pInstance->hDBEInstance,          /* Dynamic Bass Enhancement instance handle */
1992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                              pToProcess,
2002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                              pProcessed,
2012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                              SampleCount);
2022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                pToProcess = pProcessed;
2032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            }
2042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            /*
2062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent             * Bypass mode or everything off, so copy the input to the output
2072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent             */
2082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            if (pToProcess != pProcessed)
2092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            {
2102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                Copy_16(pToProcess,                             /* Source */
2112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        pProcessed,                             /* Destination */
2122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                        (LVM_INT16)(2*SampleCount));            /* Left and right */
2132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            }
2142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            /*
2162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent             * Apply treble boost if required
2172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent             */
2182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            if (pInstance->TE_Active == LVM_TRUE)
2192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            {
2202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                /*
2212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                 * Apply the filter
2222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                 */
2232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                FO_2I_D16F32C15_LShx_TRC_WRA_01(&pInstance->pTE_State->TrebleBoost_State,
2242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                           pProcessed,
2252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                           pProcessed,
2262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                           (LVM_INT16)SampleCount);
2272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            }
2292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            /*
2312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent             * Volume balance
2322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent             */
2332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            LVC_MixSoft_1St_2i_D16C31_SAT(&pInstance->VC_BalanceMix,
2342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                            pProcessed,
2352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                            pProcessed,
2362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                            SampleCount);
2372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            /*
2392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent             * Perform Parametric Spectum Analysis
2402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent             */
2412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            if ((pInstance->Params.PSA_Enable == LVM_PSA_ON)&&(pInstance->InstParams.PSA_Included==LVM_PSA_ON))
2422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            {
2432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    From2iToMono_16(pProcessed,
2442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                             pInstance->pPSAInput,
2452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                            (LVM_INT16) (SampleCount));
2462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                    LVPSA_Process(pInstance->hPSAInstance,
2482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                            pInstance->pPSAInput,
2492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                            (LVM_UINT16) (SampleCount),
2502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                            AudioTime);
2512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            }
2522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            /*
2552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent             * DC removal
2562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent             */
2572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent            DC_2I_D16_TRC_WRA_01(&pInstance->DC_RemovalInstance,
2582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                 pProcessed,
2592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                 pProcessed,
2602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                                 (LVM_INT16)SampleCount);
2612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        }
2642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        /*
2662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         * Manage the output buffer
2672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent         */
2682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent        LVM_BufferOut(hInstance,
2692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                      pOutData,
2702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent                      &SampleCount);
2712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    }
2732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent
2742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent    return(LVM_SUCCESS);
2752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent}
276