156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * File:
456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * eas_reverb.c
556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Contents and purpose:
756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Contains the implementation of the Reverb effect.
856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
1056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Copyright Sonic Network Inc. 2006
117df30109963092559d3760c0661a020f9daf1030The Android Open Source Project
127df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
137df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * you may not use this file except in compliance with the License.
147df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * You may obtain a copy of the License at
157df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
167df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
177df30109963092559d3760c0661a020f9daf1030The Android Open Source Project *
187df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
197df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
207df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
217df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * See the License for the specific language governing permissions and
227df30109963092559d3760c0661a020f9daf1030The Android Open Source Project * limitations under the License.
2356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
2456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
2556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Revision Control:
2656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *   $Revision: 510 $
2756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *   $Date: 2006-12-19 01:47:33 -0800 (Tue, 19 Dec 2006) $
2856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
2956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
3056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
3156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*------------------------------------
3256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * includes
3356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *------------------------------------
3456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
3556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
3656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_data.h"
3756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_effects.h"
3856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_math.h"
3956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_reverbdata.h"
4056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_reverb.h"
4156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_config.h"
4256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_host.h"
4356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_report.h"
4456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
4556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/* prototypes for effects interface */
4656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT ReverbInit (EAS_DATA_HANDLE pEASData, EAS_VOID_PTR *pInstData);
4756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic void ReverbProcess (EAS_VOID_PTR pInstData, EAS_PCM *pSrc, EAS_PCM *pDst, EAS_I32 numSamples);
4856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT ReverbShutdown (EAS_DATA_HANDLE pEASData, EAS_VOID_PTR pInstData);
4956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT ReverbGetParam (EAS_VOID_PTR pInstData, EAS_I32 param, EAS_I32 *pValue);
5056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT ReverbSetParam (EAS_VOID_PTR pInstData, EAS_I32 param, EAS_I32 value);
5156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
5256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/* common effects interface for configuration module */
5356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksconst S_EFFECTS_INTERFACE EAS_Reverb =
5456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
5556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    ReverbInit,
5656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    ReverbProcess,
5756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    ReverbShutdown,
5856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    ReverbGetParam,
5956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    ReverbSetParam
6056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks};
6156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
6256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
6356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
6456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
6556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * InitializeReverb()
6656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
6756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
6856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
6956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
7056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
7156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
7256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
7356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
7456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
7556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT ReverbInit(EAS_DATA_HANDLE pEASData, EAS_VOID_PTR *pInstData)
7656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
7756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 i;
7856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U16 nOffset;
7956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_INT temp;
8056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
8156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_REVERB_OBJECT *pReverbData;
8256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_REVERB_PRESET *pPreset;
8356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
8456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* check Configuration Module for data allocation */
8556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pEASData->staticMemoryModel)
8656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pReverbData = EAS_CMEnumFXData(EAS_MODULE_REVERB);
8756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
8856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* allocate dynamic memory */
8956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    else
9056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pReverbData = EAS_HWMalloc(pEASData->hwInstData, sizeof(S_REVERB_OBJECT));
9156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
9256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pReverbData == NULL)
9356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
9456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_FATAL, "Failed to allocate Reverb memory\n"); */ }
9556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_MALLOC_FAILED;
9656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
9756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
9856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* clear the structure */
9956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_HWMemSet(pReverbData, 0, sizeof(S_REVERB_OBJECT));
10056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
10156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    ReverbReadInPresets(pReverbData);
10256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
10356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_nMinSamplesToAdd = REVERB_UPDATE_PERIOD_IN_SAMPLES;
10456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
10556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_nRevOutFbkR = 0;
10656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_nRevOutFbkL = 0;
10756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
10856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_sAp0.m_zApIn  = AP0_IN;
10956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_sAp0.m_zApOut = AP0_IN + DEFAULT_AP0_LENGTH;
11056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_sAp0.m_nApGain = DEFAULT_AP0_GAIN;
11156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
11256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_zD0In = DELAY0_IN;
11356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
11456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_sAp1.m_zApIn  = AP1_IN;
11556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_sAp1.m_zApOut = AP1_IN + DEFAULT_AP1_LENGTH;
11656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_sAp1.m_nApGain = DEFAULT_AP1_GAIN;
11756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
11856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_zD1In = DELAY1_IN;
11956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
12056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_zLpf0    = 0;
12156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_zLpf1    = 0;
12256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_nLpfFwd  = 8837;
12356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_nLpfFbk  = 6494;
12456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
12556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_nSin     = 0;
12656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_nCos     = 0;
12756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_nSinIncrement    = 0;
12856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_nCosIncrement    = 0;
12956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
13056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    // set xfade parameters
13156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_nXfadeInterval = (EAS_U16)REVERB_XFADE_PERIOD_IN_SAMPLES;
13256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_nXfadeCounter = pReverbData->m_nXfadeInterval + 1;   // force update on first iteration
13356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_nPhase = -32768;
13456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_nPhaseIncrement = REVERB_XFADE_PHASE_INCREMENT;
13556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
13656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_nNoise = (EAS_I16)0xABCD;
13756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
13856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_nMaxExcursion = 0x007F;
13956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
14056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    // set delay tap lengths
14156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    nOffset = ReverbCalculateNoise( pReverbData->m_nMaxExcursion,
14256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                                    &pReverbData->m_nNoise );
14356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
14456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_zD1Cross =
14556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        DELAY1_OUT - pReverbData->m_nMaxExcursion + nOffset;
14656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
14756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    nOffset = ReverbCalculateNoise( pReverbData->m_nMaxExcursion,
14856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                                    &pReverbData->m_nNoise );
14956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
15056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_zD0Cross =
15156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        DELAY1_OUT - pReverbData->m_nMaxExcursion - nOffset;
15256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
15356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    nOffset = ReverbCalculateNoise( pReverbData->m_nMaxExcursion,
15456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                                    &pReverbData->m_nNoise );
15556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
15656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_zD0Self  =
15756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        DELAY0_OUT - pReverbData->m_nMaxExcursion - nOffset;
15856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
15956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    nOffset = ReverbCalculateNoise( pReverbData->m_nMaxExcursion,
16056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                                    &pReverbData->m_nNoise );
16156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
16256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_zD1Self  =
16356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        DELAY1_OUT - pReverbData->m_nMaxExcursion + nOffset;
16456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
16556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    // for debugging purposes, allow noise generator
16656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_bUseNoise = EAS_FALSE;
16756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
16856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    // for debugging purposes, allow bypass
16956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_bBypass = EAS_TRUE;  //EAS_FALSE;
17056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
17156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_nNextRoom = 1;
17256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
17356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_nCurrentRoom = pReverbData->m_nNextRoom + 1; // force update on first iteration
17456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
17556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_nWet = REVERB_DEFAULT_WET;
17656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
17756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_nDry = REVERB_DEFAULT_DRY;
17856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
17956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    // set base index into circular buffer
18056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_nBaseIndex = 0;
18156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
18256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    // set the early reflections, L
18356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_sEarlyL.m_nLpfFbk = 4915;
18456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_sEarlyL.m_nLpfFwd = 27852;
18556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_sEarlyL.m_zLpf = 0;
18656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
18756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    for (i=0; i < REVERB_MAX_NUM_REFLECTIONS; i++)
18856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
18956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pReverbData->m_sEarlyL.m_nGain[i] = 0;
19056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pReverbData->m_sEarlyL.m_zDelay[i] = 0;
19156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
19256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
19356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    // set the early reflections, R
19456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_sEarlyR.m_nLpfFbk = 4915;
19556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_sEarlyR.m_nLpfFwd = 27852;
19656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_sEarlyR.m_zLpf = 0;
19756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
19856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    for (i=0; i < REVERB_MAX_NUM_REFLECTIONS; i++)
19956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
20056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pReverbData->m_sEarlyR.m_nGain[i] = 0;
20156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pReverbData->m_sEarlyR.m_zDelay[i] = 0;
20256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
20356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
20456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    // clear the reverb delay line
20556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    for (i=0; i < REVERB_BUFFER_SIZE_IN_SAMPLES; i++)
20656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
20756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pReverbData->m_nDelayLine[i] = 0;
20856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
20956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
21056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    ////////////////////////////////
21156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    ///code from the EAS DEMO Reverb
21256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    //now copy from the new preset into the reverb
21356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pPreset = &pReverbData->m_sPreset.m_sPreset[pReverbData->m_nNextRoom];
21456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
21556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_nLpfFbk = pPreset->m_nLpfFbk;
21656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_nLpfFwd = pPreset->m_nLpfFwd;
21756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
21856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_nEarly = pPreset->m_nEarly;
21956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_nWet = pPreset->m_nWet;
22056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_nDry = pPreset->m_nDry;
22156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
22256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_nMaxExcursion = pPreset->m_nMaxExcursion;
22356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    //stored as time based, convert to sample based
22456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    temp = pPreset->m_nXfadeInterval;
22556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /*lint -e{702} shift for performance */
22656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    temp = (temp * _OUTPUT_SAMPLE_RATE) >> 16;
22756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_nXfadeInterval = (EAS_U16) temp;
22856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    //gsReverbObject.m_nXfadeInterval = pPreset->m_nXfadeInterval;
22956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
23056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_sAp0.m_nApGain = pPreset->m_nAp0_ApGain;
23156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    //stored as time based, convert to absolute sample value
23256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    temp = pPreset->m_nAp0_ApOut;
23356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /*lint -e{702} shift for performance */
23456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    temp = (temp * _OUTPUT_SAMPLE_RATE) >> 16;
23556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_sAp0.m_zApOut = (EAS_U16) (pReverbData->m_sAp0.m_zApIn + temp);
23656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    //gsReverbObject.m_sAp0.m_zApOut = pPreset->m_nAp0_ApOut;
23756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
23856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_sAp1.m_nApGain = pPreset->m_nAp1_ApGain;
23956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    //stored as time based, convert to absolute sample value
24056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    temp = pPreset->m_nAp1_ApOut;
24156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /*lint -e{702} shift for performance */
24256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    temp = (temp * _OUTPUT_SAMPLE_RATE) >> 16;
24356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_sAp1.m_zApOut = (EAS_U16) (pReverbData->m_sAp1.m_zApIn + temp);
24456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    //gsReverbObject.m_sAp1.m_zApOut = pPreset->m_nAp1_ApOut;
24556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    ///code from the EAS DEMO Reverb
24656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    ////////////////////////////////
24756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
24856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    *pInstData = pReverbData;
24956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
25056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
25156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
25256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}   /* end InitializeReverb */
25356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
25456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
25556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
25656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
25756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * ReverbProcess()
25856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
25956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
26056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Reverberate the requested number of samples (block based processing)
26156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
26256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
26356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pInputBuffer - src buffer
26456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pOutputBuffer - dst buffer
26556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * nNumSamplesToAdd - number of samples to write to buffer
26656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
26756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
26856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * number of samples actually written to buffer
26956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
27056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
27156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * - samples are added to the presently free buffer
27256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
27356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
27456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
27556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic void ReverbProcess(EAS_VOID_PTR pInstData, EAS_PCM *pSrc, EAS_PCM *pDst, EAS_I32 numSamples)
27656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
27756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_REVERB_OBJECT *pReverbData;
27856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
27956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData = (S_REVERB_OBJECT*) pInstData;
28056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
28156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    //if bypassed or the preset forces the signal to be completely dry
28256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pReverbData->m_bBypass ||
28356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        (pReverbData->m_nWet == 0 && pReverbData->m_nDry == 32767))
28456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
28556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (pSrc != pDst)
28656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            EAS_HWMemCpy(pSrc, pDst, numSamples * NUM_OUTPUT_CHANNELS * (EAS_I32) sizeof(EAS_PCM));
28756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return;
28856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
28956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
29056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pReverbData->m_nNextRoom != pReverbData->m_nCurrentRoom)
29156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
29256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        ReverbUpdateRoom(pReverbData);
29356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
29456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
29556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    ReverbUpdateXfade(pReverbData, numSamples);
29656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
29756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    Reverb(pReverbData, numSamples, pDst, pSrc);
29856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
29956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* check if update counter needs to be reset */
30056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pReverbData->m_nUpdateCounter >= REVERB_MODULO_UPDATE_PERIOD_IN_SAMPLES)
30156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
30256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* update interval has elapsed, so reset counter */
30356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pReverbData->m_nUpdateCounter = 0;
30456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }   /* end if m_nUpdateCounter >= update interval */
30556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
30656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* increment update counter */
30756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_nUpdateCounter += (EAS_I16)numSamples;
30856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
30956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}   /* end ComputeReverb */
31056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
31156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
31256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * ReverbUpdateXfade
31356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
31456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
31556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Update the xfade parameters as required
31656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
31756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
31856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * nNumSamplesToAdd - number of samples to write to buffer
31956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
32056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
32156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
32256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
32356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
32456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * - xfade parameters will be changed
32556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
32656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
32756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
32856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT ReverbUpdateXfade(S_REVERB_OBJECT *pReverbData, EAS_INT nNumSamplesToAdd)
32956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
33056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U16 nOffset;
33156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I16 tempCos;
33256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I16 tempSin;
33356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
33456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pReverbData->m_nXfadeCounter >= pReverbData->m_nXfadeInterval)
33556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
33656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* update interval has elapsed, so reset counter */
33756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pReverbData->m_nXfadeCounter = 0;
33856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
33956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        // Pin the sin,cos values to min / max values to ensure that the
34056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        // modulated taps' coefs are zero (thus no clicks)
34156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (pReverbData->m_nPhaseIncrement > 0)
34256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
34356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            // if phase increment > 0, then sin -> 1, cos -> 0
34456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pReverbData->m_nSin = 32767;
34556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pReverbData->m_nCos = 0;
34656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
34756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            // reset the phase to match the sin, cos values
34856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pReverbData->m_nPhase = 32767;
34956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
35056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            // modulate the cross taps because their tap coefs are zero
35156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            nOffset = ReverbCalculateNoise( pReverbData->m_nMaxExcursion, &pReverbData->m_nNoise );
35256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
35356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pReverbData->m_zD1Cross =
35456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                DELAY1_OUT - pReverbData->m_nMaxExcursion + nOffset;
35556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
35656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            nOffset = ReverbCalculateNoise( pReverbData->m_nMaxExcursion, &pReverbData->m_nNoise );
35756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
35856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pReverbData->m_zD0Cross =
35956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                DELAY0_OUT - pReverbData->m_nMaxExcursion - nOffset;
36056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
36156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        else
36256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
36356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            // if phase increment < 0, then sin -> 0, cos -> 1
36456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pReverbData->m_nSin = 0;
36556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pReverbData->m_nCos = 32767;
36656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
36756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            // reset the phase to match the sin, cos values
36856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pReverbData->m_nPhase = -32768;
36956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
37056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            // modulate the self taps because their tap coefs are zero
37156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            nOffset = ReverbCalculateNoise( pReverbData->m_nMaxExcursion, &pReverbData->m_nNoise );
37256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
37356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pReverbData->m_zD0Self  =
37456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                DELAY0_OUT - pReverbData->m_nMaxExcursion - nOffset;
37556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
37656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            nOffset = ReverbCalculateNoise( pReverbData->m_nMaxExcursion, &pReverbData->m_nNoise );
37756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
37856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pReverbData->m_zD1Self  =
37956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                DELAY1_OUT - pReverbData->m_nMaxExcursion + nOffset;
38056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
38156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }   // end if-else (pReverbData->m_nPhaseIncrement > 0)
38256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
38356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        // Reverse the direction of the sin,cos so that the
38456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        // tap whose coef was previously increasing now decreases
38556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        // and vice versa
38656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pReverbData->m_nPhaseIncrement = -pReverbData->m_nPhaseIncrement;
38756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
38856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }   // end if counter >= update interval
38956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
39056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    //compute what phase will be next time
39156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_nPhase += pReverbData->m_nPhaseIncrement;
39256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
39356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    //calculate what the new sin and cos need to reach by the next update
39456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    ReverbCalculateSinCos(pReverbData->m_nPhase, &tempSin, &tempCos);
39556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
39656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    //calculate the per-sample increment required to get there by the next update
39756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /*lint -e{702} shift for performance */
39856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_nSinIncrement =
39956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            (tempSin - pReverbData->m_nSin) >> REVERB_UPDATE_PERIOD_IN_BITS;
40056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
40156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /*lint -e{702} shift for performance */
40256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_nCosIncrement =
40356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            (tempCos - pReverbData->m_nCos) >> REVERB_UPDATE_PERIOD_IN_BITS;
40456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
40556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
40656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* increment update counter */
40756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_nXfadeCounter += (EAS_U16) nNumSamplesToAdd;
40856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
40956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
41056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
41156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}   /* end ReverbUpdateXfade */
41256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
41356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
41456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
41556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * ReverbCalculateNoise
41656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
41756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
41856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Calculate a noise sample and limit its value
41956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
42056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
42156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * nMaxExcursion - noise value is limited to this value
42256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pnNoise - return new noise sample in this (not limited)
42356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
42456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
42556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * new limited noise value
42656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
42756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
42856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * - *pnNoise noise value is updated
42956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
43056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
43156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
43256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_U16 ReverbCalculateNoise(EAS_U16 nMaxExcursion, EAS_I16 *pnNoise)
43356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
43456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    // calculate new noise value
43556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    *pnNoise = (EAS_I16) (*pnNoise * 5 + 1);
43656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
43756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#if 0   // 1xxx, test
43856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    *pnNoise = 0;
43956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif  // 1xxx, test
44056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
44156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    // return the limited noise value
44256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return (nMaxExcursion & (*pnNoise));
44356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
44456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}   /* end ReverbCalculateNoise */
44556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
44656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
44756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * ReverbCalculateSinCos
44856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
44956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
45056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Calculate a new sin and cosine value based on the given phase
45156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
45256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
45356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * nPhase   - phase angle
45456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pnSin    - input old value, output new value
45556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pnCos    - input old value, output new value
45656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
45756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
45856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
45956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
46056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * - *pnSin, *pnCos are updated
46156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
46256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
46356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
46456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT ReverbCalculateSinCos(EAS_I16 nPhase, EAS_I16 *pnSin, EAS_I16 *pnCos)
46556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
46656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 nTemp;
46756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 nNetAngle;
46856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
46956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    //  -1 <=  nPhase  < 1
47056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    // However, for the calculation, we need a value
47156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    // that ranges from -1/2 to +1/2, so divide the phase by 2
47256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /*lint -e{702} shift for performance */
47356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    nNetAngle = nPhase >> 1;
47456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
47556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /*
47656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    Implement the following
47756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    sin(x) = (2-4*c)*x^2 + c + x
47856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    cos(x) = (2-4*c)*x^2 + c - x
47956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
48056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks      where  c = 1/sqrt(2)
48156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    using the a0 + x*(a1 + x*a2) approach
48256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    */
48356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
48456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* limit the input "angle" to be between -0.5 and +0.5 */
48556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (nNetAngle > EG1_HALF)
48656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
48756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        nNetAngle = EG1_HALF;
48856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
48956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    else if (nNetAngle < EG1_MINUS_HALF)
49056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
49156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        nNetAngle = EG1_MINUS_HALF;
49256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
49356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
49456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* calculate sin */
49556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    nTemp = EG1_ONE + MULT_EG1_EG1(REVERB_PAN_G2, nNetAngle);
49656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    nTemp = REVERB_PAN_G0 + MULT_EG1_EG1(nTemp, nNetAngle);
49756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    *pnSin = (EAS_I16) SATURATE_EG1(nTemp);
49856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
49956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* calculate cos */
50056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    nTemp = -EG1_ONE + MULT_EG1_EG1(REVERB_PAN_G2, nNetAngle);
50156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    nTemp = REVERB_PAN_G0 + MULT_EG1_EG1(nTemp, nNetAngle);
50256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    *pnCos = (EAS_I16) SATURATE_EG1(nTemp);
50356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
50456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
50556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}   /* end ReverbCalculateSinCos */
50656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
50756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
50856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Reverb
50956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
51056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
51156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * apply reverb to the given signal
51256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
51356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
51456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * nNu
51556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pnSin    - input old value, output new value
51656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pnCos    - input old value, output new value
51756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
51856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
51956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * number of samples actually reverberated
52056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
52156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
52256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
52356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
52456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
52556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT Reverb(S_REVERB_OBJECT *pReverbData, EAS_INT nNumSamplesToAdd, EAS_PCM *pOutputBuffer, EAS_PCM *pInputBuffer)
52656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
52756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 i;
52856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 nDelayOut;
52956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U16 nBase;
53056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
53156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U32 nAddr;
53256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 nTemp1;
53356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 nTemp2;
53456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 nApIn;
53556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 nApOut;
53656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
53756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 j;
53856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 nEarlyOut;
53956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
54056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 tempValue;
54156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
54256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
54356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    // get the base address
54456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    nBase = pReverbData->m_nBaseIndex;
54556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
54656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    for (i=0; i < nNumSamplesToAdd; i++)
54756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
54856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        // ********** Left Allpass - start
54956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        // left input = (left dry/4) + right feedback from previous period
55056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /*lint -e{702} use shift for performance */
55156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        nApIn = ((*pInputBuffer++)>>2) + pReverbData->m_nRevOutFbkR;
55256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks//      nApIn = *pInputBuffer++;    // 1xxx test and debug ap
55356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
55456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        // fetch allpass delay line out
55556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        //nAddr = CIRCULAR(nBase, psAp0->m_zApOut, REVERB_BUFFER_MASK);
55656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        nAddr = CIRCULAR(nBase, pReverbData->m_sAp0.m_zApOut, REVERB_BUFFER_MASK);
55756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        nDelayOut = pReverbData->m_nDelayLine[nAddr];
55856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
55956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        // calculate allpass feedforward; subtract the feedforward result
56056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        nTemp1 = MULT_EG1_EG1(nApIn, pReverbData->m_sAp0.m_nApGain);
56156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        nApOut = SATURATE(nDelayOut - nTemp1);          // allpass output
56256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
56356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        // calculate allpass feedback; add the feedback result
56456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        nTemp1 = MULT_EG1_EG1(nApOut, pReverbData->m_sAp0.m_nApGain);
56556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        nTemp1 = SATURATE(nApIn + nTemp1);
56656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
56756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        // inject into allpass delay
56856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        nAddr = CIRCULAR(nBase, pReverbData->m_sAp0.m_zApIn, REVERB_BUFFER_MASK);
56956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pReverbData->m_nDelayLine[nAddr] = (EAS_PCM) nTemp1;
57056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
57156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        // inject allpass output into delay line
57256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        nAddr = CIRCULAR(nBase, pReverbData->m_zD0In, REVERB_BUFFER_MASK);
57356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pReverbData->m_nDelayLine[nAddr] = (EAS_PCM) nApOut;
57456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
57556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        // ********** Left Allpass - end
57656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
57756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        // ********** Right Allpass - start
57856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        // right input = (right dry/4) + left feedback from previous period
57956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /*lint -e{702} use shift for performance */
58056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        nApIn = ((*pInputBuffer++)>>2) + pReverbData->m_nRevOutFbkL;
58156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks//      nApIn = *pInputBuffer++;    // 1xxx test and debug ap
58256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
58356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        // fetch allpass delay line out
58456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        nAddr = CIRCULAR(nBase, pReverbData->m_sAp1.m_zApOut, REVERB_BUFFER_MASK);
58556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        nDelayOut = pReverbData->m_nDelayLine[nAddr];
58656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
58756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        // calculate allpass feedforward; subtract the feedforward result
58856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        nTemp1 = MULT_EG1_EG1(nApIn, pReverbData->m_sAp1.m_nApGain);
58956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        nApOut = SATURATE(nDelayOut - nTemp1);          // allpass output
59056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
59156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        // calculate allpass feedback; add the feedback result
59256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        nTemp1 = MULT_EG1_EG1(nApOut, pReverbData->m_sAp1.m_nApGain);
59356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        nTemp1 = SATURATE(nApIn + nTemp1);
59456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
59556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        // inject into allpass delay
59656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        nAddr = CIRCULAR(nBase, pReverbData->m_sAp1.m_zApIn, REVERB_BUFFER_MASK);
59756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pReverbData->m_nDelayLine[nAddr] = (EAS_PCM) nTemp1;
59856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
59956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        // inject allpass output into delay line
60056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        nAddr = CIRCULAR(nBase, pReverbData->m_zD1In, REVERB_BUFFER_MASK);
60156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pReverbData->m_nDelayLine[nAddr] = (EAS_PCM) nApOut;
60256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
60356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        // ********** Right Allpass - end
60456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
60556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        // ********** D0 output - start
60656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        // fetch delay line self out
60756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        nAddr = CIRCULAR(nBase, pReverbData->m_zD0Self, REVERB_BUFFER_MASK);
60856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        nDelayOut = pReverbData->m_nDelayLine[nAddr];
60956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
61056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        // calculate delay line self out
61156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        nTemp1 = MULT_EG1_EG1(nDelayOut, pReverbData->m_nSin);
61256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
61356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        // fetch delay line cross out
61456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        nAddr = CIRCULAR(nBase, pReverbData->m_zD1Cross, REVERB_BUFFER_MASK);
61556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        nDelayOut = pReverbData->m_nDelayLine[nAddr];
61656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
61756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        // calculate delay line self out
61856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        nTemp2 = MULT_EG1_EG1(nDelayOut, pReverbData->m_nCos);
61956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
62056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        // calculate unfiltered delay out
62156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        nDelayOut = SATURATE(nTemp1 + nTemp2);
62256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
62356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        // calculate lowpass filter (mixer scale factor included in LPF feedforward)
62456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        nTemp1 = MULT_EG1_EG1(nDelayOut, pReverbData->m_nLpfFwd);
62556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
62656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        nTemp2 = MULT_EG1_EG1(pReverbData->m_zLpf0, pReverbData->m_nLpfFbk);
62756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
62856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        // calculate filtered delay out and simultaneously update LPF state variable
62956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        // filtered delay output is stored in m_zLpf0
63056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pReverbData->m_zLpf0 = (EAS_PCM) SATURATE(nTemp1 + nTemp2);
63156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
63256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        // ********** D0 output - end
63356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
63456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        // ********** D1 output - start
63556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        // fetch delay line self out
63656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        nAddr = CIRCULAR(nBase, pReverbData->m_zD1Self, REVERB_BUFFER_MASK);
63756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        nDelayOut = pReverbData->m_nDelayLine[nAddr];
63856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
63956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        // calculate delay line self out
64056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        nTemp1 = MULT_EG1_EG1(nDelayOut, pReverbData->m_nSin);
64156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
64256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        // fetch delay line cross out
64356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        nAddr = CIRCULAR(nBase, pReverbData->m_zD0Cross, REVERB_BUFFER_MASK);
64456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        nDelayOut = pReverbData->m_nDelayLine[nAddr];
64556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
64656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        // calculate delay line self out
64756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        nTemp2 = MULT_EG1_EG1(nDelayOut, pReverbData->m_nCos);
64856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
64956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        // calculate unfiltered delay out
65056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        nDelayOut = SATURATE(nTemp1 + nTemp2);
65156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
65256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        // calculate lowpass filter (mixer scale factor included in LPF feedforward)
65356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        nTemp1 = MULT_EG1_EG1(nDelayOut, pReverbData->m_nLpfFwd);
65456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
65556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        nTemp2 = MULT_EG1_EG1(pReverbData->m_zLpf1, pReverbData->m_nLpfFbk);
65656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
65756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        // calculate filtered delay out and simultaneously update LPF state variable
65856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        // filtered delay output is stored in m_zLpf1
65956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pReverbData->m_zLpf1 = (EAS_PCM)SATURATE(nTemp1 + nTemp2);
66056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
66156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        // ********** D1 output - end
66256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
66356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        // ********** mixer and feedback - start
66456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        // sum is fedback to right input (R + L)
66556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pReverbData->m_nRevOutFbkL =
66656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            (EAS_PCM)SATURATE((EAS_I32)pReverbData->m_zLpf1 + (EAS_I32)pReverbData->m_zLpf0);
66756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
66856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        // difference is feedback to left input (R - L)
66956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /*lint -e{685} lint complains that it can't saturate negative */
67056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pReverbData->m_nRevOutFbkR =
67156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            (EAS_PCM)SATURATE((EAS_I32)pReverbData->m_zLpf1 - (EAS_I32)pReverbData->m_zLpf0);
67256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
67356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        // ********** mixer and feedback - end
67456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
67556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        // ********** start early reflection generator, left
67656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        //psEarly = &(pReverbData->m_sEarlyL);
67756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
67856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        nEarlyOut = 0;
67956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
68056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        for (j=0; j < REVERB_MAX_NUM_REFLECTIONS; j++)
68156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
68256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            // fetch delay line out
68356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            //nAddr = CIRCULAR(nBase, psEarly->m_zDelay[j], REVERB_BUFFER_MASK);
68456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            nAddr = CIRCULAR(nBase, pReverbData->m_sEarlyL.m_zDelay[j], REVERB_BUFFER_MASK);
68556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
68656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            nDelayOut = pReverbData->m_nDelayLine[nAddr];
68756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
68856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            // calculate reflection
68956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            //nTemp1 = MULT_EG1_EG1(nDelayOut, psEarly->m_nGain[j]);
69056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            nTemp1 = MULT_EG1_EG1(nDelayOut, pReverbData->m_sEarlyL.m_nGain[j]);
69156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
69256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            nEarlyOut = SATURATE(nEarlyOut + nTemp1);
69356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
69456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }   // end for (j=0; j < REVERB_MAX_NUM_REFLECTIONS; j++)
69556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
69656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        // apply lowpass to early reflections
69756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        //nTemp1 = MULT_EG1_EG1(nEarlyOut, psEarly->m_nLpfFwd);
69856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        nTemp1 = MULT_EG1_EG1(nEarlyOut, pReverbData->m_sEarlyL.m_nLpfFwd);
69956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
70056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        //nTemp2 = MULT_EG1_EG1(psEarly->m_zLpf, psEarly->m_nLpfFbk);
70156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        nTemp2 = MULT_EG1_EG1(pReverbData->m_sEarlyL.m_zLpf, pReverbData->m_sEarlyL.m_nLpfFbk);
70256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
70356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
70456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        // calculate filtered out and simultaneously update LPF state variable
70556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        // filtered output is stored in m_zLpf1
70656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        //psEarly->m_zLpf = SATURATE(nTemp1 + nTemp2);
70756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pReverbData->m_sEarlyL.m_zLpf = (EAS_PCM) SATURATE(nTemp1 + nTemp2);
70856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
70956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        // combine filtered early and late reflections for output
71056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        //*pOutputBuffer++ = inL;
71156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        //tempValue = SATURATE(psEarly->m_zLpf + pReverbData->m_nRevOutFbkL);
71256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        tempValue = SATURATE((EAS_I32)pReverbData->m_sEarlyL.m_zLpf + (EAS_I32)pReverbData->m_nRevOutFbkL);
71356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        //scale reverb output by wet level
71456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /*lint -e{701} use shift for performance */
71556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        tempValue = MULT_EG1_EG1(tempValue, (pReverbData->m_nWet<<1));
71656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        //sum with output buffer
71756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        tempValue += *pOutputBuffer;
71856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        *pOutputBuffer++ = (EAS_PCM)SATURATE(tempValue);
71956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
72056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        // ********** end early reflection generator, left
72156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
72256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        // ********** start early reflection generator, right
72356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        //psEarly = &(pReverbData->m_sEarlyR);
72456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
72556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        nEarlyOut = 0;
72656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
72756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        for (j=0; j < REVERB_MAX_NUM_REFLECTIONS; j++)
72856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
72956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            // fetch delay line out
73056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            nAddr = CIRCULAR(nBase, pReverbData->m_sEarlyR.m_zDelay[j], REVERB_BUFFER_MASK);
73156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            nDelayOut = pReverbData->m_nDelayLine[nAddr];
73256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
73356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            // calculate reflection
73456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            nTemp1 = MULT_EG1_EG1(nDelayOut, pReverbData->m_sEarlyR.m_nGain[j]);
73556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
73656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            nEarlyOut = SATURATE(nEarlyOut + nTemp1);
73756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
73856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }   // end for (j=0; j < REVERB_MAX_NUM_REFLECTIONS; j++)
73956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
74056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        // apply lowpass to early reflections
74156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        nTemp1 = MULT_EG1_EG1(nEarlyOut, pReverbData->m_sEarlyR.m_nLpfFwd);
74256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
74356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        nTemp2 = MULT_EG1_EG1(pReverbData->m_sEarlyR.m_zLpf, pReverbData->m_sEarlyR.m_nLpfFbk);
74456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
74556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        // calculate filtered out and simultaneously update LPF state variable
74656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        // filtered output is stored in m_zLpf1
74756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pReverbData->m_sEarlyR.m_zLpf = (EAS_PCM)SATURATE(nTemp1 + nTemp2);
74856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
74956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        // combine filtered early and late reflections for output
75056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        //*pOutputBuffer++ = inR;
75156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        tempValue = SATURATE((EAS_I32)pReverbData->m_sEarlyR.m_zLpf + (EAS_I32)pReverbData->m_nRevOutFbkR);
75256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        //scale reverb output by wet level
75356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /*lint -e{701} use shift for performance */
75456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        tempValue = MULT_EG1_EG1(tempValue, (pReverbData->m_nWet << 1));
75556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        //sum with output buffer
75656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        tempValue = tempValue + *pOutputBuffer;
75756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        *pOutputBuffer++ = (EAS_PCM)SATURATE(tempValue);
75856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
75956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        // ********** end early reflection generator, right
76056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
76156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        // decrement base addr for next sample period
76256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        nBase--;
76356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
76456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pReverbData->m_nSin += pReverbData->m_nSinIncrement;
76556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pReverbData->m_nCos += pReverbData->m_nCosIncrement;
76656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
76756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }   // end for (i=0; i < nNumSamplesToAdd; i++)
76856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
76956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    // store the most up to date version
77056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_nBaseIndex = nBase;
77156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
77256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
77356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}   /* end Reverb */
77456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
77556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
77656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
77756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
77856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * ReverbShutdown()
77956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
78056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
78156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Initializes the Reverb effect.
78256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
78356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
78456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pInstData        - handle to instance data
78556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
78656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
78756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
78856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
78956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
79056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
79156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
79256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
79356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT ReverbShutdown (EAS_DATA_HANDLE pEASData, EAS_VOID_PTR pInstData)
79456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
79556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* check Configuration Module for static memory allocation */
79656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (!pEASData->staticMemoryModel)
79756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        EAS_HWFree(pEASData->hwInstData, pInstData);
79856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
79956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} /* end ReverbShutdown */
80056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
80156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
80256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * ReverbGetParam()
80356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
80456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
80556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Get a Reverb parameter
80656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
80756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
80856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pInstData        - handle to instance data
80956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * param            - parameter index
81056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * *pValue          - pointer to variable to hold retrieved value
81156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
81256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
81356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
81456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
81556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
81656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
81756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
81856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
81956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT ReverbGetParam (EAS_VOID_PTR pInstData, EAS_I32 param, EAS_I32 *pValue)
82056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
82156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_REVERB_OBJECT *p;
82256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
82356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    p = (S_REVERB_OBJECT*) pInstData;
82456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
82556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    switch (param)
82656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
82756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        case EAS_PARAM_REVERB_BYPASS:
82856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            *pValue = (EAS_I32) p->m_bBypass;
82956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            break;
83056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        case EAS_PARAM_REVERB_PRESET:
83156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            *pValue = (EAS_I8) p->m_nCurrentRoom;
83256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            break;
83356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        case EAS_PARAM_REVERB_WET:
83456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            *pValue = p->m_nWet;
83556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            break;
83656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        case EAS_PARAM_REVERB_DRY:
83756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            *pValue = p->m_nDry;
83856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            break;
83956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        default:
84056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return EAS_ERROR_INVALID_PARAMETER;
84156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
84256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
84356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} /* end ReverbGetParam */
84456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
84556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
84656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
84756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * ReverbSetParam()
84856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
84956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
85056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Set a Reverb parameter
85156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
85256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
85356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pInstData        - handle to instance data
85456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * param            - parameter index
85556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * *pValue          - new paramter value
85656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
85756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
85856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
85956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
86056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
86156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
86256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
86356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
86456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT ReverbSetParam (EAS_VOID_PTR pInstData, EAS_I32 param, EAS_I32 value)
86556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
86656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_REVERB_OBJECT *p;
86756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
86856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    p = (S_REVERB_OBJECT*) pInstData;
86956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
87056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    switch (param)
87156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
87256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        case EAS_PARAM_REVERB_BYPASS:
87356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            p->m_bBypass = (EAS_BOOL) value;
87456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            break;
87556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        case EAS_PARAM_REVERB_PRESET:
87656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if(value!=EAS_PARAM_REVERB_LARGE_HALL && value!=EAS_PARAM_REVERB_HALL &&
87756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                value!=EAS_PARAM_REVERB_CHAMBER && value!=EAS_PARAM_REVERB_ROOM)
87856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return EAS_ERROR_INVALID_PARAMETER;
87956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            p->m_nNextRoom = (EAS_I16)value;
88056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            break;
88156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        case EAS_PARAM_REVERB_WET:
88256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if(value>EAS_REVERB_WET_MAX || value<EAS_REVERB_WET_MIN)
88356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return EAS_ERROR_INVALID_PARAMETER;
88456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            p->m_nWet = (EAS_I16)value;
88556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            break;
88656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        case EAS_PARAM_REVERB_DRY:
88756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if(value>EAS_REVERB_DRY_MAX || value<EAS_REVERB_DRY_MIN)
88856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return EAS_ERROR_INVALID_PARAMETER;
88956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            p->m_nDry = (EAS_I16)value;
89056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            break;
89156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        default:
89256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return EAS_ERROR_INVALID_PARAMETER;
89356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
89456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
89556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} /* end ReverbSetParam */
89656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
89756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
89856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
89956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * ReverbUpdateRoom
90056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
90156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
90256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Update the room's preset parameters as required
90356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
90456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
90556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
90656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
90756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
90856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
90956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
91056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * - reverb paramters (fbk, fwd, etc) will be changed
91156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * - m_nCurrentRoom := m_nNextRoom
91256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
91356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
91456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT ReverbUpdateRoom(S_REVERB_OBJECT *pReverbData)
91556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
91656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_INT temp;
91756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
91856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_REVERB_PRESET *pPreset = &pReverbData->m_sPreset.m_sPreset[pReverbData->m_nNextRoom];
91956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
92056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_nLpfFwd = pPreset->m_nLpfFwd;
92156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_nLpfFbk = pPreset->m_nLpfFbk;
92256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
92356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_nEarly = pPreset->m_nEarly;
92456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_nWet = pPreset->m_nWet;
92556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_nDry = pPreset->m_nDry;
92656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
92756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
92856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_nMaxExcursion = pPreset->m_nMaxExcursion;
92956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    //stored as time based, convert to sample based
93056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    temp = pPreset->m_nXfadeInterval;
93156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /*lint -e{702} shift for performance */
93256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    temp = (temp * _OUTPUT_SAMPLE_RATE) >> 16;
93356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_nXfadeInterval = (EAS_U16) temp;
93456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    //gpsReverbObject->m_nXfadeInterval = pPreset->m_nXfadeInterval;
93556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_sAp0.m_nApGain = pPreset->m_nAp0_ApGain;
93656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    //stored as time based, convert to absolute sample value
93756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    temp = pPreset->m_nAp0_ApOut;
93856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /*lint -e{702} shift for performance */
93956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    temp = (temp * _OUTPUT_SAMPLE_RATE) >> 16;
94056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_sAp0.m_zApOut = (EAS_U16) (pReverbData->m_sAp0.m_zApIn + temp);
94156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    //gpsReverbObject->m_sAp0.m_zApOut = pPreset->m_nAp0_ApOut;
94256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_sAp1.m_nApGain = pPreset->m_nAp1_ApGain;
94356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    //stored as time based, convert to absolute sample value
94456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    temp = pPreset->m_nAp1_ApOut;
94556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /*lint -e{702} shift for performance */
94656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    temp = (temp * _OUTPUT_SAMPLE_RATE) >> 16;
94756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_sAp1.m_zApOut = (EAS_U16) (pReverbData->m_sAp1.m_zApIn + temp);
94856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    //gpsReverbObject->m_sAp1.m_zApOut = pPreset->m_nAp1_ApOut;
94956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
95056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pReverbData->m_nCurrentRoom = pReverbData->m_nNextRoom;
95156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
95256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
95356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
95456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}   /* end ReverbUpdateRoom */
95556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
95656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
95756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
95856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * ReverbReadInPresets()
95956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
96056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose: sets global reverb preset bank to defaults
96156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
96256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
96356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
96456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
96556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
96656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
96756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
96856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT ReverbReadInPresets(S_REVERB_OBJECT *pReverbData)
96956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
97056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
97156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    int preset = 0;
97256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    int defaultPreset = 0;
97356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
97456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    //now init any remaining presets to defaults
97556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    for (defaultPreset = preset; defaultPreset < REVERB_MAX_ROOM_TYPE; defaultPreset++)
97656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
97756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        S_REVERB_PRESET *pPreset = &pReverbData->m_sPreset.m_sPreset[defaultPreset];
97856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (defaultPreset == 0 || defaultPreset > REVERB_MAX_ROOM_TYPE-1)
97956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
98056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nLpfFbk = 8307;
98156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nLpfFwd = 14768;
98256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarly = 0;
98356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nWet = 27690;
98456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nDry = 32767;
98556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyL_LpfFbk = 3692;
98656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyL_LpfFwd = 29075;
98756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyL_Delay0 = 922;
98856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyL_Gain0 = 22152;
98956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyL_Delay1 = 1462;
99056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyL_Gain1 = 17537;
99156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyL_Delay2 = 0;
99256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyL_Gain2 = 14768;
99356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyL_Delay3 = 1221;
99456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyL_Gain3 = 14307;
99556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyL_Delay4 = 0;
99656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyL_Gain4 = 13384;
99756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyR_Delay0 = 502;
99856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyR_Gain0 = 20306;
99956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyR_Delay1 = 1762;
100056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyR_Gain1 = 17537;
100156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyR_Delay2 = 0;
100256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyR_Gain2 = 14768;
100356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyR_Delay3 = 0;
100456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyR_Gain3 = 16153;
100556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyR_Delay4 = 0;
100656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyR_Gain4 = 13384;
100756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nMaxExcursion = 127;
100856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nXfadeInterval = 6388;
100956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nAp0_ApGain = 15691;
101056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nAp0_ApOut = 711;
101156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nAp1_ApGain = 17999;
101256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nAp1_ApOut = 1113;
101356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_rfu4 = 0;
101456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_rfu5 = 0;
101556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_rfu6 = 0;
101656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_rfu7 = 0;
101756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_rfu8 = 0;
101856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_rfu9 = 0;
101956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_rfu10 = 0;
102056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
102156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        else if (defaultPreset == 1)
102256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
102356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nLpfFbk = 6461;
102456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nLpfFwd = 14307;
102556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarly = 0;
102656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nWet = 27690;
102756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nDry = 32767;
102856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyL_LpfFbk = 3692;
102956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyL_LpfFwd = 29075;
103056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyL_Delay0 = 922;
103156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyL_Gain0 = 22152;
103256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyL_Delay1 = 1462;
103356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyL_Gain1 = 17537;
103456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyL_Delay2 = 0;
103556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyL_Gain2 = 14768;
103656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyL_Delay3 = 1221;
103756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyL_Gain3 = 14307;
103856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyL_Delay4 = 0;
103956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyL_Gain4 = 13384;
104056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyR_Delay0 = 502;
104156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyR_Gain0 = 20306;
104256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyR_Delay1 = 1762;
104356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyR_Gain1 = 17537;
104456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyR_Delay2 = 0;
104556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyR_Gain2 = 14768;
104656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyR_Delay3 = 0;
104756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyR_Gain3 = 16153;
104856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyR_Delay4 = 0;
104956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyR_Gain4 = 13384;
105056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nMaxExcursion = 127;
105156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nXfadeInterval = 6391;
105256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nAp0_ApGain = 15230;
105356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nAp0_ApOut = 708;
105456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nAp1_ApGain = 9692;
105556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nAp1_ApOut = 1113;
105656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_rfu4 = 0;
105756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_rfu5 = 0;
105856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_rfu6 = 0;
105956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_rfu7 = 0;
106056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_rfu8 = 0;
106156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_rfu9 = 0;
106256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_rfu10 = 0;
106356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
106456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        else if (defaultPreset == 2)
106556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
106656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nLpfFbk = 5077;
106756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nLpfFwd = 12922;
106856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarly = 0;
106956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nWet = 24460;
107056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nDry = 32767;
107156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyL_LpfFbk = 3692;
107256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyL_LpfFwd = 29075;
107356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyL_Delay0 = 922;
107456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyL_Gain0 = 22152;
107556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyL_Delay1 = 1462;
107656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyL_Gain1 = 17537;
107756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyL_Delay2 = 0;
107856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyL_Gain2 = 14768;
107956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyL_Delay3 = 1221;
108056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyL_Gain3 = 14307;
108156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyL_Delay4 = 0;
108256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyL_Gain4 = 13384;
108356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyR_Delay0 = 502;
108456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyR_Gain0 = 20306;
108556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyR_Delay1 = 1762;
108656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyR_Gain1 = 17537;
108756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyR_Delay2 = 0;
108856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyR_Gain2 = 14768;
108956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyR_Delay3 = 0;
109056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyR_Gain3 = 16153;
109156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyR_Delay4 = 0;
109256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyR_Gain4 = 13384;
109356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nMaxExcursion = 127;
109456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nXfadeInterval = 6449;
109556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nAp0_ApGain = 15691;
109656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nAp0_ApOut = 774;
109756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nAp1_ApGain = 15691;
109856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nAp1_ApOut = 1113;
109956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_rfu4 = 0;
110056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_rfu5 = 0;
110156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_rfu6 = 0;
110256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_rfu7 = 0;
110356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_rfu8 = 0;
110456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_rfu9 = 0;
110556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_rfu10 = 0;
110656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
110756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        else if (defaultPreset == 3)
110856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
110956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nLpfFbk = 5077;
111056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nLpfFwd = 11076;
111156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarly = 0;
111256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nWet = 23075;
111356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nDry = 32767;
111456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyL_LpfFbk = 3692;
111556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyL_LpfFwd = 29075;
111656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyL_Delay0 = 922;
111756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyL_Gain0 = 22152;
111856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyL_Delay1 = 1462;
111956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyL_Gain1 = 17537;
112056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyL_Delay2 = 0;
112156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyL_Gain2 = 14768;
112256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyL_Delay3 = 1221;
112356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyL_Gain3 = 14307;
112456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyL_Delay4 = 0;
112556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyL_Gain4 = 13384;
112656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyR_Delay0 = 502;
112756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyR_Gain0 = 20306;
112856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyR_Delay1 = 1762;
112956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyR_Gain1 = 17537;
113056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyR_Delay2 = 0;
113156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyR_Gain2 = 14768;
113256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyR_Delay3 = 0;
113356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyR_Gain3 = 16153;
113456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyR_Delay4 = 0;
113556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nEarlyR_Gain4 = 13384;
113656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nMaxExcursion = 127;
113756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nXfadeInterval = 6470;   //6483;
113856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nAp0_ApGain = 14768;
113956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nAp0_ApOut = 792;
114056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nAp1_ApGain = 15783;
114156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nAp1_ApOut = 1113;
114256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_rfu4 = 0;
114356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_rfu5 = 0;
114456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_rfu6 = 0;
114556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_rfu7 = 0;
114656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_rfu8 = 0;
114756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_rfu9 = 0;
114856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_rfu10 = 0;
114956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
115056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
115156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
115256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
115356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
115456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
1155