1c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/*
2c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * Copyright (C) 2004-2010 NXP Software
3c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * Copyright (C) 2010 The Android Open Source Project
4c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent *
5c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * Licensed under the Apache License, Version 2.0 (the "License");
6c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * you may not use this file except in compliance with the License.
7c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * You may obtain a copy of the License at
8c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent *
9c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent *      http://www.apache.org/licenses/LICENSE-2.0
10c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent *
11c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * Unless required by applicable law or agreed to in writing, software
12c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * distributed under the License is distributed on an "AS IS" BASIS,
13c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * See the License for the specific language governing permissions and
15c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * limitations under the License.
16c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent */
17c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
18c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/****************************************************************************************/
19c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/*                                                                                      */
20c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* Includes                                                                             */
21c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/*                                                                                      */
22c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/****************************************************************************************/
23c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent#include "LVREV_Private.h"
24c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent#include "VectorArithmetic.h"
25c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
26c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
27c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/****************************************************************************************/
28c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/*                                                                                      */
29c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* FUNCTION:                LVREV_Process                                               */
30c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/*                                                                                      */
31c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* DESCRIPTION:                                                                         */
32c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/*  Process function for the LVREV module.                                              */
33c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/*                                                                                      */
34c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* PARAMETERS:                                                                          */
35c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/*  hInstance               Instance handle                                             */
36c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/*  pInData                 Pointer to the input data                                   */
37c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/*  pOutData                Pointer to the output data                                  */
38c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/*  NumSamples              Number of samples in the input buffer                       */
39c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/*                                                                                      */
40c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* RETURNS:                                                                             */
41c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/*  LVREV_Success           Succeeded                                                   */
42c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/*  LVREV_INVALIDNUMSAMPLES NumSamples was larger than the maximum block size           */
43c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/*  LVREV_NULLADDRESS       When one of hInstance, pInData or pOutData is NULL          */
44c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/*                                                                                      */
45c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* NOTES:                                                                               */
46c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/*  1. The input and output buffers must be 32-bit aligned                              */
47c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/*                                                                                      */
48c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/****************************************************************************************/
49c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric LaurentLVREV_ReturnStatus_en LVREV_Process(LVREV_Handle_t      hInstance,
50c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                                    const LVM_INT32     *pInData,
51c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                                    LVM_INT32           *pOutData,
52c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                                    const LVM_UINT16    NumSamples)
53c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent{
54c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent   LVREV_Instance_st     *pLVREV_Private = (LVREV_Instance_st *)hInstance;
55c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent   LVM_INT32             *pInput  = (LVM_INT32 *)pInData;
56c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent   LVM_INT32             *pOutput = pOutData;
575185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent   LVM_INT32             SamplesToProcess, RemainingSamples;
585185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent   LVM_INT32             format = 1;
59c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
60c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    /*
61c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * Check for error conditions
62c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     */
63c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
64c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    /* Check for NULL pointers */
65c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    if((hInstance == LVM_NULL) || (pInData == LVM_NULL) || (pOutData == LVM_NULL))
66c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    {
67c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        return LVREV_NULLADDRESS;
68c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    }
69c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
70c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    /*
71c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * Apply the new controls settings if required
72c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     */
73c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    if(pLVREV_Private->bControlPending == LVM_TRUE)
74c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    {
75c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        LVREV_ReturnStatus_en   errorCode;
76c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
77c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        /*
78c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent         * Clear the pending flag and update the control settings
79c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent         */
80c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        pLVREV_Private->bControlPending = LVM_FALSE;
81c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
82c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        errorCode = LVREV_ApplyNewSettings (pLVREV_Private);
83c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
84c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        if(errorCode != LVREV_SUCCESS)
85c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        {
86c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            return errorCode;
87c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        }
88c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    }
89c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
90c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    /*
91c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * Trap the case where the number of samples is zero.
92c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     */
93c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    if (NumSamples == 0)
94c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    {
95c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        return LVREV_SUCCESS;
96c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    }
97c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
985185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent    /*
995185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent     * If OFF copy and reformat the data as necessary
1005185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent     */
1015185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent    if (pLVREV_Private->CurrentParams.OperatingMode == LVM_MODE_OFF)
1025185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent    {
1035185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent        if(pInput != pOutput)
1045185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent        {
1055185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent            /*
1065185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent             * Copy the data to the output buffer, convert to stereo is required
1075185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent             */
1085185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent
1095185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent            if(pLVREV_Private->CurrentParams.SourceFormat == LVM_MONO){
1105185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent                MonoTo2I_32(pInput, pOutput, NumSamples);
1115185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent            } else {
1125185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent                Copy_16((LVM_INT16 *)pInput,
1135185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent                        (LVM_INT16 *)pOutput,
1145185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent                        (LVM_INT16)(NumSamples << 2)); // 32 bit data, stereo
1155185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent            }
1165185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent        }
1175185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent
1185185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent        return LVREV_SUCCESS;
1195185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent    }
1205185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent
121c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    RemainingSamples = (LVM_INT32)NumSamples;
122c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
123c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    if (pLVREV_Private->CurrentParams.SourceFormat != LVM_MONO)
124c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    {
125c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        format = 2;
126c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    }
127c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
128c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    while (RemainingSamples!=0)
129c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    {
130c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        /*
1315185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent         * Process the data
132c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent         */
133c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
1345185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent        if(RemainingSamples >  pLVREV_Private->MaxBlkLen)
1355185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent        {
1365185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent            SamplesToProcess =  pLVREV_Private->MaxBlkLen;
1375185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent            RemainingSamples = (LVM_INT16)(RemainingSamples - SamplesToProcess);
138c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        }
139c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        else
140c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        {
1415185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent            SamplesToProcess = RemainingSamples;
1425185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent            RemainingSamples = 0;
1435185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent        }
144c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
1455185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent        ReverbBlock(pInput, pOutput, pLVREV_Private, (LVM_UINT16)SamplesToProcess);
146c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
1475185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent        pInput  = (LVM_INT32 *)(pInput +(SamplesToProcess*format));
1485185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent        pOutput = (LVM_INT32 *)(pOutput+(SamplesToProcess*2));      // Always stereo output
149c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    }
150c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
151c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    return LVREV_SUCCESS;
152c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent}
153c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
154c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
155c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
156c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/****************************************************************************************/
157c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/*                                                                                      */
158c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* FUNCTION:                ReverbBlock                                                 */
159c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/*                                                                                      */
160c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* DESCRIPTION:                                                                         */
161c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/*  Process function for the LVREV module.                                              */
162c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/*                                                                                      */
163c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* PARAMETERS:                                                                          */
164c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/*  hInstance               Instance handle                                             */
165c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/*  pInData                 Pointer to the input data                                   */
166c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/*  pOutData                Pointer to the output data                                  */
167c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/*  NumSamples              Number of samples in the input buffer                       */
168c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/*                                                                                      */
169c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* RETURNS:                                                                             */
170c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/*  LVREV_Success           Succeeded                                                   */
171c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/*  LVREV_INVALIDNUMSAMPLES NumSamples was larger than the maximum block size           */
172c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/*  LVREV_NULLADDRESS       When one of hInstance, pInData or pOutData is NULL          */
173c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/*                                                                                      */
174c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* NOTES:                                                                               */
175c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/*  1. The input and output buffers must be 32-bit aligned                              */
176c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/*                                                                                      */
177c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/****************************************************************************************/
178c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
179c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurentvoid ReverbBlock(LVM_INT32 *pInput, LVM_INT32 *pOutput, LVREV_Instance_st *pPrivate, LVM_UINT16 NumSamples)
180c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent{
181c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    LVM_INT16   j, size;
182c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    LVM_INT32   *pDelayLine;
183c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    LVM_INT32   *pDelayLineInput = pPrivate->pScratch;
184c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    LVM_INT32   *pScratch = pPrivate->pScratch;
185c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    LVM_INT32   *pIn;
186c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    LVM_INT32   *pTemp = pPrivate->pInputSave;
187c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    LVM_INT32   NumberOfDelayLines;
188c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
189c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    /******************************************************************************
190c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * All calculations will go into the buffer pointed to by pTemp, this will    *
191c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * then be mixed with the original input to create the final output.          *
192c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     *                                                                            *
193c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * When INPLACE processing is selected this must be a temporary buffer and    *
194c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * hence this is the worst case, so for simplicity this will ALWAYS be so     *
195c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     *                                                                            *
196c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * The input buffer will remain untouched until the output of the mixer if    *
197c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * INPLACE processing is selected.                                            *
198c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     *                                                                            *
199c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * The temp buffer will always be NumSamples in size regardless of MONO or    *
200c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * STEREO input. In the case of stereo input all processing is done in MONO   *
201c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     * and the final output is converted to STEREO after the mixer                *
202c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     ******************************************************************************/
203c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
204c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    if(pPrivate->InstanceParams.NumDelays == LVREV_DELAYLINES_4 )
205c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    {
206c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        NumberOfDelayLines = 4;
207c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    }
208c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    else if(pPrivate->InstanceParams.NumDelays == LVREV_DELAYLINES_2 )
209c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    {
210c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        NumberOfDelayLines = 2;
211c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    }
212c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    else
213c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    {
214c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        NumberOfDelayLines = 1;
215c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    }
216c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
217c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    if(pPrivate->CurrentParams.SourceFormat == LVM_MONO)
218c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    {
219c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        pIn = pInput;
220c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    }
221c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    else
222c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    {
223c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        /*
224c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent         *  Stereo to mono conversion
225c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent         */
226c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
227c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        From2iToMono_32( pInput,
228c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                         pTemp,
229c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                         (LVM_INT16)NumSamples);
230c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
231c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        pIn = pTemp;
232c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    }
233c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
234c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    Mult3s_32x16(pIn,
235c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                 (LVM_INT16)LVREV_HEADROOM,
236c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                 pTemp,
237c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                 (LVM_INT16)NumSamples);
238c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
239c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    /*
240c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     *  High pass filter
241c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     */
242c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    FO_1I_D32F32C31_TRC_WRA_01( &pPrivate->pFastCoef->HPCoefs,
243c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                                pTemp,
244c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                                pTemp,
245c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                                (LVM_INT16)NumSamples);
246c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    /*
247c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     *  Low pass filter
248c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     */
249c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    FO_1I_D32F32C31_TRC_WRA_01( &pPrivate->pFastCoef->LPCoefs,
250c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                                pTemp,
251c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                                pTemp,
252c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                                (LVM_INT16)NumSamples);
253c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
254c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    /*
255c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     *  Process all delay lines
256c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     */
257c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
258c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    for(j = 0; j < NumberOfDelayLines; j++)
259c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    {
260c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        pDelayLine = pPrivate->pScratchDelayLine[j];
261c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
262c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        /*
263c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent         * All-pass filter with pop and click suppression
264c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent         */
265c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        /* Get the smoothed, delayed output. Put it in the output buffer */
266c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        MixSoft_2St_D32C31_SAT(&pPrivate->Mixer_APTaps[j],
267c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                               pPrivate->pOffsetA[j],
268c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                               pPrivate->pOffsetB[j],
269c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                               pDelayLine,
270c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                               (LVM_INT16)NumSamples);
271c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        /* Re-align the all pass filter delay buffer and copying the fixed delay data to the AP delay in the process */
272c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        Copy_16((LVM_INT16 *)&pPrivate->pDelay_T[j][NumSamples],
273c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                (LVM_INT16 *)pPrivate->pDelay_T[j],
274c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                (LVM_INT16)((pPrivate->T[j]-NumSamples) << 1));         /* 32-bit data */
275c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        /* Apply the smoothed feedback and save to fixed delay input (currently empty) */
276c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        MixSoft_1St_D32C31_WRA(&pPrivate->Mixer_SGFeedback[j],
277c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                               pDelayLine,
278c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                               &pPrivate->pDelay_T[j][pPrivate->T[j]-NumSamples],
279c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                               (LVM_INT16)NumSamples);
280c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        /* Sum into the AP delay line */
281c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        Mac3s_Sat_32x16(&pPrivate->pDelay_T[j][pPrivate->T[j]-NumSamples],
282c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                        -0x7fff,                                        /* Invert since the feedback coefficient is negative */
283c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                        &pPrivate->pDelay_T[j][pPrivate->Delay_AP[j]-NumSamples],
284c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                        (LVM_INT16)NumSamples);
285c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        /* Apply smoothed feedforward sand save to fixed delay input (currently empty) */
286c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        MixSoft_1St_D32C31_WRA(&pPrivate->Mixer_SGFeedforward[j],
287c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                               &pPrivate->pDelay_T[j][pPrivate->Delay_AP[j]-NumSamples],
288c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                               &pPrivate->pDelay_T[j][pPrivate->T[j]-NumSamples],
289c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                               (LVM_INT16)NumSamples);
290c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        /* Sum into the AP output */
291c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        Mac3s_Sat_32x16(&pPrivate->pDelay_T[j][pPrivate->T[j]-NumSamples],
292c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                        0x7fff,
293c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                        pDelayLine,
294c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                        (LVM_INT16)NumSamples);
295c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
296c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        /*
297c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent         *  Feedback gain
298c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent         */
299c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        MixSoft_1St_D32C31_WRA(&pPrivate->FeedbackMixer[j], pDelayLine, pDelayLine, NumSamples);
300c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
301c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        /*
302c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent         *  Low pass filter
303c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent         */
304c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        FO_1I_D32F32C31_TRC_WRA_01( &pPrivate->pFastCoef->RevLPCoefs[j],
305c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                                    pDelayLine,
306c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                                    pDelayLine,
307c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                                    (LVM_INT16)NumSamples);
308c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    }
309c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
310c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    /*
311c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     *  Apply rotation matrix and delay samples
312c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     */
313c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    for(j = 0; j < NumberOfDelayLines; j++)
314c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    {
315c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
316c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        Copy_16( (LVM_INT16*)(pTemp),
317c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                 (LVM_INT16*)(pDelayLineInput),
318c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                 (LVM_INT16)(NumSamples << 1));
319c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
320c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        /*
321c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent         *  Rotation matrix mix
322c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent         */
323c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        switch(j)
324c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        {
325c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            case 3:
326c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                /*
327c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                 *  Add delay line 1 and 2 contribution
328c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                 */
329c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                 Mac3s_Sat_32x16(pPrivate->pScratchDelayLine[1], -0x8000, pDelayLineInput, (LVM_INT16)NumSamples);
330c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                 Mac3s_Sat_32x16(pPrivate->pScratchDelayLine[2], -0x8000, pDelayLineInput, (LVM_INT16)NumSamples);
331c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
332c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                break;
333c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            case 2:
334c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
335c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                /*
336c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                 *  Add delay line 0 and 3 contribution
337c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                 */
338c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                 Mac3s_Sat_32x16(pPrivate->pScratchDelayLine[0], -0x8000, pDelayLineInput, (LVM_INT16)NumSamples);
339c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                 Mac3s_Sat_32x16(pPrivate->pScratchDelayLine[3], -0x8000, pDelayLineInput, (LVM_INT16)NumSamples);
340c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
341c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                break;
342c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            case 1:
343c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                if(pPrivate->InstanceParams.NumDelays == LVREV_DELAYLINES_4)
344c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                {
345c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                    /*
346c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                     *  Add delay line 0 and 3 contribution
347c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                     */
348c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                    Mac3s_Sat_32x16(pPrivate->pScratchDelayLine[0], -0x8000, pDelayLineInput, (LVM_INT16)NumSamples);
349c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                    Add2_Sat_32x32(pPrivate->pScratchDelayLine[3], pDelayLineInput, (LVM_INT16)NumSamples);
350c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
351c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                }
352c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                else
353c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                {
354c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                    /*
355c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                     *  Add delay line 0 and 1 contribution
356c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                     */
357c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                     Mac3s_Sat_32x16(pPrivate->pScratchDelayLine[0], -0x8000, pDelayLineInput, (LVM_INT16)NumSamples);
358c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                     Mac3s_Sat_32x16(pPrivate->pScratchDelayLine[1], -0x8000, pDelayLineInput, (LVM_INT16)NumSamples);
359c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
360c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                }
361c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                break;
362c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            case 0:
363c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                if(pPrivate->InstanceParams.NumDelays == LVREV_DELAYLINES_4)
364c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                {
365c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                    /*
366c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                     *  Add delay line 1 and 2 contribution
367c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                     */
368c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                    Mac3s_Sat_32x16(pPrivate->pScratchDelayLine[1], -0x8000, pDelayLineInput, (LVM_INT16)NumSamples);
369c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                    Add2_Sat_32x32(pPrivate->pScratchDelayLine[2], pDelayLineInput, (LVM_INT16)NumSamples);
370c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
371c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                }
372c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                else if(pPrivate->InstanceParams.NumDelays == LVREV_DELAYLINES_2)
373c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                {
374c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                    /*
375c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                     *  Add delay line 0 and 1 contribution
376c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                     */
377c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                    Add2_Sat_32x32(pPrivate->pScratchDelayLine[0], pDelayLineInput, (LVM_INT16)NumSamples);
378c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                    Mac3s_Sat_32x16(pPrivate->pScratchDelayLine[1], -0x8000, pDelayLineInput, (LVM_INT16)NumSamples);
379c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
380c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                }
381c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                else
382c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                {
383c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                    /*
384c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                     *  Add delay line 0 contribution
385c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                     */
386c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
387c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                    /*             SOURCE                          DESTINATION*/
388c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                    Add2_Sat_32x32(pPrivate->pScratchDelayLine[0], pDelayLineInput, (LVM_INT16)NumSamples);
389c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                }
390c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                break;
391c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            default:
392c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                break;
393c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        }
394c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
395c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        /*
396c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent         *  Delay samples
397c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent         */
398c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        Copy_16((LVM_INT16 *)pDelayLineInput,
399c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                (LVM_INT16 *)&pPrivate->pDelay_T[j][pPrivate->T[j]-NumSamples],
400c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                (LVM_INT16)(NumSamples << 1));              /* 32-bit data */
401c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
402c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    }
403c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
404c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
405c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    /*
406c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     *  Create stereo output
407c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     */
408c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    switch(pPrivate->InstanceParams.NumDelays)
409c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    {
410c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        case LVREV_DELAYLINES_4:
411c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent             Add2_Sat_32x32(pPrivate->pScratchDelayLine[3],
412c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                            pPrivate->pScratchDelayLine[0],
413c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                            (LVM_INT16)NumSamples);
414c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent             Add2_Sat_32x32(pPrivate->pScratchDelayLine[2],
415c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                            pPrivate->pScratchDelayLine[1],
416c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                            (LVM_INT16)NumSamples);
417c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
418c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
4195185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent            JoinTo2i_32x32(pPrivate->pScratchDelayLine[0],
4205185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent                           pPrivate->pScratchDelayLine[1],
4215185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent                           pTemp,
4225185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent                           (LVM_INT16)NumSamples);
4235185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent
424c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
425c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            break;
426c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        case LVREV_DELAYLINES_2:
427c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
428c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent             Copy_16( (LVM_INT16*)pPrivate->pScratchDelayLine[1],
429c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                      (LVM_INT16*)pScratch,
430c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                      (LVM_INT16)(NumSamples << 1));
431c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
4325185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent            Mac3s_Sat_32x16(pPrivate->pScratchDelayLine[0],
4335185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent                            -0x8000,
4345185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent                            pScratch,
4355185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent                            (LVM_INT16)NumSamples);
436c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
437c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent             Add2_Sat_32x32(pPrivate->pScratchDelayLine[1],
438c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                            pPrivate->pScratchDelayLine[0],
439c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                            (LVM_INT16)NumSamples);
440c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
441c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
4425185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent             JoinTo2i_32x32(pPrivate->pScratchDelayLine[0],
4435185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent                            pScratch,
444c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                            pTemp,
445c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                            (LVM_INT16)NumSamples);
4465185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent            break;
4475185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent        case LVREV_DELAYLINES_1:
4485185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent            MonoTo2I_32(pPrivate->pScratchDelayLine[0],
4495185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent                        pTemp,
4505185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent                        (LVM_INT16)NumSamples);
451c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            break;
452c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent        default:
453c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent            break;
454c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    }
455c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
456c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
457c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    /*
458c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     *  Dry/wet mixer
459c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent     */
460c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
4615185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent    size = (LVM_INT16)(NumSamples << 1);
462c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    MixSoft_2St_D32C31_SAT(&pPrivate->BypassMixer,
4635185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent                           pTemp,
464c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                           pTemp,
465c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                           pOutput,
466c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                           size);
467c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
468c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    /* Apply Gain*/
469c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
470c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    Shift_Sat_v32xv32 (LVREV_OUTPUTGAIN_SHIFT,
471c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                       pOutput,
472c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                       pOutput,
473c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                       size);
474c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
475c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    MixSoft_1St_D32C31_WRA(&pPrivate->GainMixer,
476c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                           pOutput,
477c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                           pOutput,
478c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent                           size);
4795185b0138aaeffeecc93b958cb9cd9821f260fafEric Laurent
480c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent    return;
481c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent}
482c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
483c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
484c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent/* End of file */
485c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent
486