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