156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * File:
456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * eas_chorus.c
556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Contents and purpose:
756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Contains the implementation of the Chorus 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: 499 $
2756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *   $Date: 2006-12-11 16:07:20 -0800 (Mon, 11 Dec 2006) $
2856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
2956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
3056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
3156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_data.h"
3256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_effects.h"
3356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_math.h"
3456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_chorusdata.h"
3556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_chorus.h"
3656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_config.h"
3756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_host.h"
3856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_report.h"
3956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
4056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/* prototypes for effects interface */
4156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT ChorusInit (EAS_DATA_HANDLE pEASData, EAS_VOID_PTR *pInstData);
4256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic void ChorusProcess (EAS_VOID_PTR pInstData, EAS_PCM *pSrc, EAS_PCM *pDst, EAS_I32 numSamples);
4356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT ChorusShutdown (EAS_DATA_HANDLE pEASData, EAS_VOID_PTR pInstData);
4456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT ChorusGetParam (EAS_VOID_PTR pInstData, EAS_I32 param, EAS_I32 *pValue);
4556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT ChorusSetParam (EAS_VOID_PTR pInstData, EAS_I32 param, EAS_I32 value);
4656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
4756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/* common effects interface for configuration module */
4856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksconst S_EFFECTS_INTERFACE EAS_Chorus =
4956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
5056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    ChorusInit,
5156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    ChorusProcess,
5256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    ChorusShutdown,
5356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    ChorusGetParam,
5456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    ChorusSetParam
5556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks};
5656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
5756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
5856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
5956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks//LFO shape table used by the chorus, larger table would sound better
6056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks//this is a sine wave, where 32767 = 1.0
6156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic const EAS_I16 EAS_chorusShape[CHORUS_SHAPE_SIZE] = {
6256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    0, 1608, 3212, 4808, 6393, 7962, 9512, 11309, 12539, 14010, 15446, 16846, 18204, 19519, 20787, 22005, 23170,
6356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    24279, 25329, 26319, 27245, 28105, 28898, 29621, 30273, 30852, 31356, 31785, 32137, 32412, 32609, 32728,
6456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    32767, 32728, 32609, 32412, 32137, 31785, 31356, 30852, 30273, 29621, 28898, 28105, 27245, 26319, 25329,
6556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    24279, 23170, 22005, 20787, 19519, 18204, 16846, 15446, 14010, 12539, 11039, 9512, 7962, 6393, 4808, 3212,
6656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    1608, 0, -1608, -3212, -4808, -6393, -7962, -9512, -11309, -12539, -14010, -15446, -16846, -18204, -19519,
6756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    -20787, -22005, -23170, -24279, -25329, -26319, -27245, -28105, -28898, -29621, -30273, -30852, -31356, -31785,
6856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    -32137, -32412, -32609, -32728, -32767, -32728, -32609, -32412, -32137, -31785, -31356, -30852, -30273, -29621,
6956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    -28898, -28105, -27245, -26319, -25329, -24279, -23170, -22005, -20787, -19519, -18204, -16846, -15446, -14010,
7056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    -12539, -11039, -9512, -7962, -6393, -4808, -3212, -1608
7156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks};
7256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
7356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
7456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * InitializeChorus()
7556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
7656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose: Initializes chorus parameters
7756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
7856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
7956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
8056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
8156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
8256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
8356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
8456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
8556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT ChorusInit (EAS_DATA_HANDLE pEASData, EAS_VOID_PTR *pInstData)
8656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
8756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_CHORUS_OBJECT *pChorusData;
8856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_CHORUS_PRESET *pPreset;
8956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 index;
9056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
9156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* check Configuration Module for data allocation */
9256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pEASData->staticMemoryModel)
9356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pChorusData = EAS_CMEnumFXData(EAS_MODULE_CHORUS);
9456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
9556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* allocate dynamic memory */
9656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    else
9756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pChorusData = EAS_HWMalloc(pEASData->hwInstData, sizeof(S_CHORUS_OBJECT));
9856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
9956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pChorusData == NULL)
10056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
10156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_FATAL, "Failed to allocate Chorus memory\n"); */ }
10256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_MALLOC_FAILED;
10356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
10456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
10556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* clear the structure */
10656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_HWMemSet(pChorusData, 0, sizeof(S_CHORUS_OBJECT));
10756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
10856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    ChorusReadInPresets(pChorusData);
10956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
11056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* set some default values */
11156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pChorusData->bypass =       EAS_CHORUS_BYPASS_DEFAULT;
11256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pChorusData->preset =       EAS_CHORUS_PRESET_DEFAULT;
11356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pChorusData->m_nLevel =     EAS_CHORUS_LEVEL_DEFAULT;
11456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pChorusData->m_nRate =      EAS_CHORUS_RATE_DEFAULT;
11556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pChorusData->m_nDepth =     EAS_CHORUS_DEPTH_DEFAULT;
11656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
11756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    //chorus rate and depth need some massaging from preset value (which is sample rate independent)
11856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
11956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    //convert rate from steps of .05 Hz to value which can be used as phase increment,
12056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    //with current CHORUS_SHAPE_SIZE and rate limits, this fits into 16 bits
12156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    //want to compute ((shapeSize * 65536) * (storedRate/20))/sampleRate;
12256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    //computing it as below allows rate steps to be evenly spaced
12356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    //uses 32 bit divide, but only once when new value is selected
12456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pChorusData->m_nRate = (EAS_I16)
12556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        ((((EAS_I32)CHORUS_SHAPE_SIZE<<16)/(20*(EAS_I32)_OUTPUT_SAMPLE_RATE)) * pChorusData->m_nRate);
12656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
12756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    //convert depth from steps of .05 ms, to samples, with 16 bit whole part, discard fraction
12856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    //want to compute ((depth * sampleRate)/20000)
12956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    //use the following approximation since 105/32 is roughly 65536/20000
13056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /*lint -e{704} use shift for performance */
13156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pChorusData->m_nDepth = (EAS_I16)
13256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        (((((EAS_I32)pChorusData->m_nDepth * _OUTPUT_SAMPLE_RATE)>>5) * 105) >> 16);
13356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
13456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pChorusData->m_nLevel = pChorusData->m_nLevel;
13556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
13656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    //zero delay memory for chorus
13756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    for (index = CHORUS_L_SIZE - 1; index >= 0; index--)
13856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
13956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pChorusData->chorusDelayL[index] = 0;
14056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
14156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    for (index = CHORUS_R_SIZE - 1; index >= 0; index--)
14256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
14356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pChorusData->chorusDelayR[index] = 0;
14456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
14556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
14656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    //init delay line index, these are used to implement circular delay buffer
14756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pChorusData->chorusIndexL = 0;
14856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pChorusData->chorusIndexR = 0;
14956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
15056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    //init LFO phase
15156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    //16 bit whole part, 16 bit fraction
15256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pChorusData->lfoLPhase = 0;
15356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pChorusData->lfoRPhase = (CHORUS_SHAPE_SIZE << 16) >> 2; // 1/4 of total, i.e. 90 degrees out of phase;
15456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
15556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    //init chorus delay position
15656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    //right now chorus delay is a compile-time value, as is sample rate
15756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pChorusData->chorusTapPosition = (EAS_I16)((CHORUS_DELAY_MS * _OUTPUT_SAMPLE_RATE)/1000);
15856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
15956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    //now copy from the new preset into Chorus
16056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pPreset = &pChorusData->m_sPreset.m_sPreset[pChorusData->m_nNextChorus];
16156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
16256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pChorusData->m_nLevel = pPreset->m_nLevel;
16356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pChorusData->m_nRate =  pPreset->m_nRate;
16456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pChorusData->m_nDepth = pPreset->m_nDepth;
16556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
16656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pChorusData->m_nRate = (EAS_I16)
16756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        ((((EAS_I32)CHORUS_SHAPE_SIZE<<16)/(20*(EAS_I32)_OUTPUT_SAMPLE_RATE)) * pChorusData->m_nRate);
16856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
16956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /*lint -e{704} use shift for performance */
17056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pChorusData->m_nDepth = (EAS_I16)
17156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        (((((EAS_I32)pChorusData->m_nDepth * _OUTPUT_SAMPLE_RATE)>>5) * 105) >> 16);
17256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
17356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    *pInstData = pChorusData;
17456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
17556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
17656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} /* end ChorusInit */
17756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
17856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
17956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * WeightedTap()
18056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
18156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose: Does fractional array look-up using linear interpolation
18256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
18356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * first convert indexDesired to actual desired index by taking into account indexReference
18456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * then do linear interpolation between two actual samples using fractional part
18556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
18656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
18756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * array: pointer to array of signed 16 bit values, typically either PCM data or control data
18856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * indexReference: the circular buffer relative offset
18956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * indexDesired: the fractional index we are looking up (16 bits index + 16 bits fraction)
19056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * indexLimit: the total size of the array, used to compute buffer wrap
19156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
19256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
19356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Value from the input array, linearly interpolated between two actual data values
19456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
19556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
19656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
19756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_I16 WeightedTap(const EAS_I16 *array, EAS_I16 indexReference, EAS_I32 indexDesired, EAS_I16 indexLimit)
19856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
19956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I16 index;
20056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I16 fraction;
20156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I16 val1;
20256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I16 val2;
20356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
20456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    //separate indexDesired into whole and fractional parts
20556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /*lint -e{704} use shift for performance */
20656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    index = (EAS_I16)(indexDesired >> 16);
20756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /*lint -e{704} use shift for performance */
20856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    fraction = (EAS_I16)((indexDesired>>1) & 0x07FFF); //just use 15 bits of fractional part
20956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
21056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    //adjust whole part by indexReference
21156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    index = indexReference - index;
21256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    //make sure we stay within array bounds, this implements circular buffer
21356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    while (index < 0)
21456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
21556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        index += indexLimit;
21656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
21756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
21856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    //get two adjacent values from the array
21956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    val1 = array[index];
22056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
22156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    //handle special case when index == 0, else typical case
22256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (index == 0)
22356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
22456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        val2 = array[indexLimit-1]; //get last value from array
22556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
22656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    else
22756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
22856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        val2 = array[index-1]; //get previous value from array
22956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
23056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
23156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    //compute linear interpolation as (val1 + ((val2-val1)*fraction))
23256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return(val1 + (EAS_I16)MULT_EG1_EG1(val2-val1,fraction));
23356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
23456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
23556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
23656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * ChorusProcess()
23756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
23856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose: compute the chorus on the input buffer, and mix into output buffer
23956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
24056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
24156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
24256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * src: pointer to input buffer of PCM values to be processed
24356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * dst: pointer to output buffer of PCM values we are to sume the result with
24456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * bufSize: the number of sample frames (i.e. stereo samples) in the buffer
24556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
24656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
24756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * None
24856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
24956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
25056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
25156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks//compute the chorus, and mix into output buffer
25256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic void ChorusProcess (EAS_VOID_PTR pInstData, EAS_PCM *pSrc, EAS_PCM *pDst, EAS_I32 numSamples)
25356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
25456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 ix;
25556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 nChannelNumber;
25656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I16 lfoValueLeft;
25756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I16 lfoValueRight;
25856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 positionOffsetL;
25956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 positionOffsetR;
26056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_PCM tapL;
26156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_PCM tapR;
26256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 tempValue;
26356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_PCM nInputSample;
26456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 nOutputSample;
26556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_PCM *pIn;
26656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_PCM *pOut;
26756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
26856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_CHORUS_OBJECT *pChorusData;
26956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
27056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pChorusData = (S_CHORUS_OBJECT*) pInstData;
27156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
27256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    //if the chorus is disabled or turned all the way down
27356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pChorusData->bypass == EAS_TRUE || pChorusData->m_nLevel == 0)
27456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
27556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (pSrc != pDst)
27656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            EAS_HWMemCpy(pSrc, pDst, numSamples * NUM_OUTPUT_CHANNELS * (EAS_I32) sizeof(EAS_PCM));
27756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return;
27856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
27956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
28056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pChorusData->m_nNextChorus != pChorusData->m_nCurrentChorus)
28156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
28256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        ChorusUpdate(pChorusData);
28356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
28456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
28556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    for (nChannelNumber = 0; nChannelNumber < NUM_OUTPUT_CHANNELS; nChannelNumber++)
28656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
28756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
28856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pIn = pSrc + nChannelNumber;
28956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pOut = pDst + nChannelNumber;
29056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
29156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if(nChannelNumber==0)
29256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
29356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            for (ix = 0; ix < numSamples; ix++)
29456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            {
29556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                nInputSample = *pIn;
29656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                pIn += NUM_OUTPUT_CHANNELS;
29756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
29856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                //feed input into chorus delay line
29956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                pChorusData->chorusDelayL[pChorusData->chorusIndexL] = nInputSample;
30056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
30156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                //compute chorus lfo value using phase as fractional index into chorus shape table
30256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                //resulting value is between -1.0 and 1.0, expressed as signed 16 bit number
30356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                lfoValueLeft = WeightedTap(EAS_chorusShape, 0, pChorusData->lfoLPhase, CHORUS_SHAPE_SIZE);
30456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
30556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                //scale chorus depth by lfo value to get relative fractional sample index
30656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                //index is expressed as 32 bit number with 16 bit fractional part
30756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                /*lint -e{703} use shift for performance */
30856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                positionOffsetL = pChorusData->m_nDepth * (((EAS_I32)lfoValueLeft) << 1);
30956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
31056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                //add fixed chorus delay to get actual fractional sample index
31156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                positionOffsetL += ((EAS_I32)pChorusData->chorusTapPosition) << 16;
31256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
31356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                //get tap value from chorus delay using fractional sample index
31456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                tapL = WeightedTap(pChorusData->chorusDelayL, pChorusData->chorusIndexL, positionOffsetL, CHORUS_L_SIZE);
31556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
31656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                //scale by chorus level, then sum with input buffer contents and saturate
31756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                tempValue = MULT_EG1_EG1(tapL, pChorusData->m_nLevel);
31856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                nOutputSample = SATURATE(tempValue + nInputSample);
31956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
32056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                *pOut = (EAS_I16)SATURATE(nOutputSample);
32156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                pOut += NUM_OUTPUT_CHANNELS;
32256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
32356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
32456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                //increment chorus delay index and make it wrap as needed
32556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                //this implements circular buffer
32656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                if ((pChorusData->chorusIndexL+=1) >= CHORUS_L_SIZE)
32756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    pChorusData->chorusIndexL = 0;
32856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
32956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                //increment fractional lfo phase, and make it wrap as needed
33056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                pChorusData->lfoLPhase += pChorusData->m_nRate;
33156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                while (pChorusData->lfoLPhase >= (CHORUS_SHAPE_SIZE<<16))
33256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                {
33356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    pChorusData->lfoLPhase -= (CHORUS_SHAPE_SIZE<<16);
33456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                }
33556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            }
33656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
33756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        else
33856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
33956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            for (ix = 0; ix < numSamples; ix++)
34056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            {
34156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                nInputSample = *pIn;
34256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                pIn += NUM_OUTPUT_CHANNELS;
34356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
34456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                //feed input into chorus delay line
34556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                pChorusData->chorusDelayR[pChorusData->chorusIndexR] = nInputSample;
34656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
34756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                //compute chorus lfo value using phase as fractional index into chorus shape table
34856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                //resulting value is between -1.0 and 1.0, expressed as signed 16 bit number
34956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                lfoValueRight = WeightedTap(EAS_chorusShape, 0, pChorusData->lfoRPhase, CHORUS_SHAPE_SIZE);
35056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
35156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                //scale chorus depth by lfo value to get relative fractional sample index
35256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                //index is expressed as 32 bit number with 16 bit fractional part
35356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                /*lint -e{703} use shift for performance */
35456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                positionOffsetR = pChorusData->m_nDepth * (((EAS_I32)lfoValueRight) << 1);
35556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
35656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                //add fixed chorus delay to get actual fractional sample index
35756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                positionOffsetR += ((EAS_I32)pChorusData->chorusTapPosition) << 16;
35856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
35956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                //get tap value from chorus delay using fractional sample index
36056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                tapR = WeightedTap(pChorusData->chorusDelayR, pChorusData->chorusIndexR, positionOffsetR, CHORUS_R_SIZE);
36156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
36256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                //scale by chorus level, then sum with output buffer contents and saturate
36356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                tempValue = MULT_EG1_EG1(tapR, pChorusData->m_nLevel);
36456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                nOutputSample = SATURATE(tempValue + nInputSample);
36556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
36656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                *pOut = (EAS_I16)SATURATE(nOutputSample);
36756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                pOut += NUM_OUTPUT_CHANNELS;
36856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
36956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                //increment chorus delay index and make it wrap as needed
37056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                //this implements circular buffer
37156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                if ((pChorusData->chorusIndexR+=1) >= CHORUS_R_SIZE)
37256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    pChorusData->chorusIndexR = 0;
37356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
37456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                //increment fractional lfo phase, and make it wrap as needed
37556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                pChorusData->lfoRPhase += pChorusData->m_nRate;
37656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                while (pChorusData->lfoRPhase >= (CHORUS_SHAPE_SIZE<<16))
37756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                {
37856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    pChorusData->lfoRPhase -= (CHORUS_SHAPE_SIZE<<16);
37956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                }
38056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            }
38156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
38256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
38356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
38456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}  /* end ChorusProcess */
38556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
38656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
38756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
38856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
38956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * ChorusShutdown()
39056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
39156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
39256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Initializes the Chorus effect.
39356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
39456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
39556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pInstData        - handle to instance data
39656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
39756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
39856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
39956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
40056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
40156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
40256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
40356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
40456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT ChorusShutdown (EAS_DATA_HANDLE pEASData, EAS_VOID_PTR pInstData)
40556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
40656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* check Configuration Module for static memory allocation */
40756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (!pEASData->staticMemoryModel)
40856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        EAS_HWFree(pEASData->hwInstData, pInstData);
40956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
41056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} /* end ChorusShutdown */
41156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
41256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
41356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * ChorusGetParam()
41456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
41556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
41656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Get a Chorus parameter
41756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
41856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
41956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pInstData        - handle to instance data
42056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * param            - parameter index
42156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * *pValue          - pointer to variable to hold retrieved value
42256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
42356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
42456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
42556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
42656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
42756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
42856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
42956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
43056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT ChorusGetParam (EAS_VOID_PTR pInstData, EAS_I32 param, EAS_I32 *pValue)
43156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
43256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_CHORUS_OBJECT *p;
43356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
43456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    p = (S_CHORUS_OBJECT*) pInstData;
43556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
43656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    switch (param)
43756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
43856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        case EAS_PARAM_CHORUS_BYPASS:
43956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            *pValue = (EAS_I32) p->bypass;
44056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            break;
44156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        case EAS_PARAM_CHORUS_PRESET:
44256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            *pValue = (EAS_I8) p->m_nCurrentChorus;
44356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            break;
44456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        case EAS_PARAM_CHORUS_RATE:
44556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            *pValue = (EAS_I32) p->m_nRate;
44656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            break;
44756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        case EAS_PARAM_CHORUS_DEPTH:
44856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            *pValue = (EAS_I32) p->m_nDepth;
44956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            break;
45056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        case EAS_PARAM_CHORUS_LEVEL:
45156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            *pValue = (EAS_I32) p->m_nLevel;
45256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            break;
45356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        default:
45456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return EAS_ERROR_INVALID_PARAMETER;
45556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
45656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
45756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} /* end ChorusGetParam */
45856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
45956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
46056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
46156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * ChorusSetParam()
46256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
46356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
46456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Set a Chorus parameter
46556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
46656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
46756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pInstData        - handle to instance data
46856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * param            - parameter index
46956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * *pValue          - new paramter value
47056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
47156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
47256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
47356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
47456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
47556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
47656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
47756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
47856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT ChorusSetParam (EAS_VOID_PTR pInstData, EAS_I32 param, EAS_I32 value)
47956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
48056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_CHORUS_OBJECT *p;
48156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
48256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    p = (S_CHORUS_OBJECT*) pInstData;
48356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
48456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    switch (param)
48556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
48656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        case EAS_PARAM_CHORUS_BYPASS:
48756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            p->bypass = (EAS_BOOL) value;
48856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            break;
48956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        case EAS_PARAM_CHORUS_PRESET:
49056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if(value!=EAS_PARAM_CHORUS_PRESET1 && value!=EAS_PARAM_CHORUS_PRESET2 &&
49156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                value!=EAS_PARAM_CHORUS_PRESET3 && value!=EAS_PARAM_CHORUS_PRESET4)
49256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return EAS_ERROR_INVALID_PARAMETER;
49356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            p->m_nNextChorus = (EAS_I8)value;
49456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            break;
49556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        case EAS_PARAM_CHORUS_RATE:
49656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if(value<EAS_CHORUS_RATE_MIN || value>EAS_CHORUS_RATE_MAX)
49756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return EAS_ERROR_INVALID_PARAMETER;
49856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            p->m_nRate = (EAS_I16) value;
49956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            break;
50056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        case EAS_PARAM_CHORUS_DEPTH:
50156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if(value<EAS_CHORUS_DEPTH_MIN || value>EAS_CHORUS_DEPTH_MAX)
50256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return EAS_ERROR_INVALID_PARAMETER;
50356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            p->m_nDepth = (EAS_I16) value;
50456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            break;
50556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        case EAS_PARAM_CHORUS_LEVEL:
50656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            if(value<EAS_CHORUS_LEVEL_MIN || value>EAS_CHORUS_LEVEL_MAX)
50756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                return EAS_ERROR_INVALID_PARAMETER;
50856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            p->m_nLevel = (EAS_I16) value;
50956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            break;
51056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
51156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        default:
51256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            return EAS_ERROR_INVALID_PARAMETER;
51356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
51456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
51556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks} /* end ChorusSetParam */
51656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
51756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
51856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
51956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * ChorusReadInPresets()
52056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
52156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose: sets global Chorus preset bank to defaults
52256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
52356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
52456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
52556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
52656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
52756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
52856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
52956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT ChorusReadInPresets(S_CHORUS_OBJECT *pChorusData)
53056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
53156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
53256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    int preset = 0;
53356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    int defaultPreset = 0;
53456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
53556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    //now init any remaining presets to defaults
53656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    for (defaultPreset = preset; defaultPreset < CHORUS_MAX_TYPE; defaultPreset++)
53756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
53856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        S_CHORUS_PRESET *pPreset = &pChorusData->m_sPreset.m_sPreset[defaultPreset];
53956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (defaultPreset == 0 || defaultPreset > CHORUS_MAX_TYPE-1)
54056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
54156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nDepth = 39;
54256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nRate = 30;
54356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nLevel = 32767;
54456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
54556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        else if (defaultPreset == 1)
54656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
54756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nDepth = 21;
54856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nRate = 45;
54956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nLevel = 25000;
55056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
55156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        else if (defaultPreset == 2)
55256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
55356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nDepth = 53;
55456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nRate = 25;
55556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nLevel = 32000;
55656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
55756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        else if (defaultPreset == 3)
55856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
55956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nDepth = 32;
56056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nRate = 37;
56156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pPreset->m_nLevel = 29000;
56256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
56356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
56456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
56556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
56656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
56756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
56856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
56956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
57056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * ChorusUpdate
57156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
57256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
57356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Update the Chorus preset parameters as required
57456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
57556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
57656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
57756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
57856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
57956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
58056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
58156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * - chorus paramters will be changed
58256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * - m_nCurrentRoom := m_nNextRoom
58356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
58456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
58556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksstatic EAS_RESULT ChorusUpdate(S_CHORUS_OBJECT *pChorusData)
58656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
58756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    S_CHORUS_PRESET *pPreset = &pChorusData->m_sPreset.m_sPreset[pChorusData->m_nNextChorus];
58856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
58956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pChorusData->m_nLevel = pPreset->m_nLevel;
59056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pChorusData->m_nRate =  pPreset->m_nRate;
59156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pChorusData->m_nDepth = pPreset->m_nDepth;
59256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
59356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pChorusData->m_nRate = (EAS_I16)
59456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        ((((EAS_I32)CHORUS_SHAPE_SIZE<<16)/(20*(EAS_I32)_OUTPUT_SAMPLE_RATE)) * pChorusData->m_nRate);
59556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
59656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /*lint -e{704} use shift for performance */
59756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pChorusData->m_nDepth = (EAS_I16)
59856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        (((((EAS_I32)pChorusData->m_nDepth * _OUTPUT_SAMPLE_RATE)>>5) * 105) >> 16);
59956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
60056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    pChorusData->m_nCurrentChorus = pChorusData->m_nNextChorus;
60156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
60256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
60356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
60456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}   /* end ChorusUpdate */
605