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