156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * File:
456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * eas_mixer.c
556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Contents and purpose:
756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * This file contains the critical components of the mix engine that
856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * must be optimized for best performance.
956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
1056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Copyright Sonic Network Inc. 2005
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: 706 $
2756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *   $Date: 2007-05-31 17:22:51 -0700 (Thu, 31 May 2007) $
2856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
2956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
3056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
3156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks//3 dls: This module is in the midst of being converted from a synth
3256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks//3 specific module to a general purpose mix engine
3356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
3456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*------------------------------------
3556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * includes
3656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *------------------------------------
3756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
3856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_data.h"
3956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_host.h"
4056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_math.h"
4156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_mixer.h"
4256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_config.h"
4356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#include "eas_report.h"
4456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
4556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _MAXIMIZER_ENABLED
4656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_I32 MaximizerProcess (EAS_VOID_PTR pInstData, EAS_I32 *pSrc, EAS_I32 *pDst, EAS_I32 numSamples);
4756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
4856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
4956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*------------------------------------
5056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * defines
5156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *------------------------------------
5256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
5356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
5456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/* need to boost stereo by ~3dB to compensate for the panner */
5556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#define STEREO_3DB_GAIN_BOOST       512
5656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
5756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
5856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_MixEngineInit()
5956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
6056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
6156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Prepares the mix engine for work, allocates buffers, locates effects modules, etc.
6256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
6356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
6456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - instance data
6556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pInstData        - pointer to variable to receive instance data handle
6656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
6756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
6856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
6956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
7056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
7156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
7256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
7356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_RESULT EAS_MixEngineInit (S_EAS_DATA *pEASData)
7456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
7556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
7656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* check Configuration Module for mix buffer allocation */
7756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pEASData->staticMemoryModel)
7856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pEASData->pMixBuffer = EAS_CMEnumData(EAS_CM_MIX_BUFFER);
7956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    else
8056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        pEASData->pMixBuffer = EAS_HWMalloc(pEASData->hwInstData, BUFFER_SIZE_IN_MONO_SAMPLES * NUM_OUTPUT_CHANNELS * sizeof(EAS_I32));
8156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pEASData->pMixBuffer == NULL)
8256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
8356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        { /* dpp: EAS_ReportEx(_EAS_SEVERITY_FATAL, "Failed to allocate mix buffer memory\n"); */ }
8456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        return EAS_ERROR_MALLOC_FAILED;
8556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
8656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_HWMemSet((void *)(pEASData->pMixBuffer), 0, BUFFER_SIZE_IN_MONO_SAMPLES * NUM_OUTPUT_CHANNELS * sizeof(EAS_I32));
8756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
8856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
8956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
9056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
9156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
9256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_MixEnginePrep()
9356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
9456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
9556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Performs prep before synthesize a buffer of audio, such as clearing
9656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * audio buffers, etc.
9756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
9856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
9956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * psEASData - pointer to overall EAS data structure
10056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
10156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
10256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
10356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
10456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
10556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
10656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
10756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksvoid EAS_MixEnginePrep (S_EAS_DATA *pEASData, EAS_I32 numSamples)
10856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
10956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
11056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* clear the mix buffer */
11156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#if (NUM_OUTPUT_CHANNELS == 2)
11256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_HWMemSet(pEASData->pMixBuffer, 0, numSamples * (EAS_I32) sizeof(long) * 2);
11356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#else
11456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_HWMemSet(pEASData->pMixBuffer, 0, (EAS_I32) numSamples * (EAS_I32) sizeof(long));
11556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
11656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
11756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* need to clear other side-chain effect buffers (chorus & reverb) */
11856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
11956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
12056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
12156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_MixEnginePost
12256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
12356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
12456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * This routine does the post-processing after all voices have been
12556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * synthesized. It calls any sweeteners and does the final mixdown to
12656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * the output buffer.
12756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
12856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
12956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
13056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
13156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
13256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Notes:
13356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
13456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
13556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksvoid EAS_MixEnginePost (S_EAS_DATA *pEASData, EAS_I32 numSamples)
13656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
13756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_U16 gain;
13856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
13956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks//3 dls: Need to restore the mix engine metrics
14056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
14156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* calculate the gain multiplier */
14256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _MAXIMIZER_ENABLED
14356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pEASData->effectsModules[EAS_MODULE_MAXIMIZER].effect)
14456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
14556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        EAS_I32 temp;
14656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        temp = MaximizerProcess(pEASData->effectsModules[EAS_MODULE_MAXIMIZER].effectData, pEASData->pMixBuffer, pEASData->pMixBuffer, numSamples);
14756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        temp = (temp * pEASData->masterGain) >> 15;
14856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        if (temp > 32767)
14956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            gain = 32767;
15056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        else
15156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            gain = (EAS_U16) temp;
15256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
15356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    else
15456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        gain = (EAS_U16) pEASData->masterGain;
15556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#else
15656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    gain = (EAS_U16) pEASData->masterGain;
15756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
15856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
15956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* Not using all the gain bits for now
16056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks     * Reduce the input to the compressor by 6dB to prevent saturation
16156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks     */
16256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _COMPRESSOR_ENABLED
16356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pEASData->effectsModules[EAS_MODULE_COMPRESSOR].effectData)
16456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        gain = gain >> 5;
16556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    else
16656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        gain = gain >> 4;
16756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#else
16856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    gain = gain >> 4;
16956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
17056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
17156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* convert 32-bit mix buffer to 16-bit output format */
17256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#if (NUM_OUTPUT_CHANNELS == 2)
17356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    SynthMasterGain(pEASData->pMixBuffer, pEASData->pOutputAudioBuffer, gain, (EAS_U16) ((EAS_U16) numSamples * 2));
17456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#else
17556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    SynthMasterGain(pEASData->pMixBuffer, pEASData->pOutputAudioBuffer, gain, (EAS_U16) numSamples);
17656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
17756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
17856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _ENHANCER_ENABLED
17956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* enhancer effect */
18056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pEASData->effectsModules[EAS_MODULE_ENHANCER].effectData)
18156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        (*pEASData->effectsModules[EAS_MODULE_ENHANCER].effect->pfProcess)
18256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            (pEASData->effectsModules[EAS_MODULE_ENHANCER].effectData,
18356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pEASData->pOutputAudioBuffer,
18456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pEASData->pOutputAudioBuffer,
18556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            numSamples);
18656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
18756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
18856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _GRAPHIC_EQ_ENABLED
18956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* graphic EQ effect */
19056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pEASData->effectsModules[EAS_MODULE_GRAPHIC_EQ].effectData)
19156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        (*pEASData->effectsModules[EAS_MODULE_GRAPHIC_EQ].effect->pfProcess)
19256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            (pEASData->effectsModules[EAS_MODULE_GRAPHIC_EQ].effectData,
19356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pEASData->pOutputAudioBuffer,
19456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pEASData->pOutputAudioBuffer,
19556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            numSamples);
19656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
19756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
19856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _COMPRESSOR_ENABLED
19956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* compressor effect */
20056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pEASData->effectsModules[EAS_MODULE_COMPRESSOR].effectData)
20156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        (*pEASData->effectsModules[EAS_MODULE_COMPRESSOR].effect->pfProcess)
20256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            (pEASData->effectsModules[EAS_MODULE_COMPRESSOR].effectData,
20356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pEASData->pOutputAudioBuffer,
20456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pEASData->pOutputAudioBuffer,
20556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            numSamples);
20656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
20756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
20856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _WOW_ENABLED
20956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* WOW requires a 32-bit buffer, borrow the mix buffer and
21056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks     * pass it as the destination buffer
21156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks     */
21256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /*lint -e{740} temporarily passing a parameter through an existing I/F */
21356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pEASData->effectsModules[EAS_MODULE_WOW].effectData)
21456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        (*pEASData->effectsModules[EAS_MODULE_WOW].effect->pfProcess)
21556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            (pEASData->effectsModules[EAS_MODULE_WOW].effectData,
21656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pEASData->pOutputAudioBuffer,
21756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            (EAS_PCM*) pEASData->pMixBuffer,
21856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            numSamples);
21956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
22056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
22156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _TONECONTROLEQ_ENABLED
22256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* ToneControlEQ effect */
22356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pEASData->effectsModules[EAS_MODULE_TONECONTROLEQ].effectData)
22456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        (*pEASData->effectsModules[EAS_MODULE_TONECONTROLEQ].effect->pfProcess)
22556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            (pEASData->effectsModules[EAS_MODULE_TONECONTROLEQ].effectData,
22656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pEASData->pOutputAudioBuffer,
22756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pEASData->pOutputAudioBuffer,
22856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            numSamples);
22956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
23056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
23156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _REVERB_ENABLED
23256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* Reverb effect */
23356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pEASData->effectsModules[EAS_MODULE_REVERB].effectData)
23456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        (*pEASData->effectsModules[EAS_MODULE_REVERB].effect->pfProcess)
23556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            (pEASData->effectsModules[EAS_MODULE_REVERB].effectData,
23656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pEASData->pOutputAudioBuffer,
23756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pEASData->pOutputAudioBuffer,
23856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            numSamples);
23956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
24056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
24156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef _CHORUS_ENABLED
24256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* Chorus effect */
24356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (pEASData->effectsModules[EAS_MODULE_CHORUS].effectData)
24456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        (*pEASData->effectsModules[EAS_MODULE_CHORUS].effect->pfProcess)
24556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            (pEASData->effectsModules[EAS_MODULE_CHORUS].effectData,
24656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pEASData->pOutputAudioBuffer,
24756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            pEASData->pOutputAudioBuffer,
24856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            numSamples);
24956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
25056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
25156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
25256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
25356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifndef NATIVE_EAS_KERNEL
25456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
25556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * SynthMasterGain
25656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
25756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
25856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Mixes down audio from 32-bit to 16-bit target buffer
25956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
26056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
26156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
26256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
26356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
26456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
26556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
26656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksvoid SynthMasterGain (long *pInputBuffer, EAS_PCM *pOutputBuffer, EAS_U16 nGain, EAS_U16 numSamples) {
26756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
26856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* loop through the buffer */
26956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    while (numSamples--) {
27056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        long s;
27156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
27256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* read a sample from the input buffer and add some guard bits */
27356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        s = *pInputBuffer++;
27456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
27556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* add some guard bits */
27656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /*lint -e{704} <avoid divide for performance>*/
27756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        s = s >> 7;
27856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
27956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* apply master gain */
28056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        s *= (long) nGain;
28156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
28256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* shift to lower 16-bits */
28356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /*lint -e{704} <avoid divide for performance>*/
28456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        s = s >> 9;
28556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
28656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        /* saturate */
28756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        s = SATURATE(s);
28856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
28956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        *pOutputBuffer++ = (EAS_PCM)s;
29056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
29156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
29256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
29356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
29456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
29556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_MixEngineShutdown()
29656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
29756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Purpose:
29856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Shuts down effects modules and deallocates memory
29956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
30056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Inputs:
30156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pEASData         - instance data
30256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pInstData        - instance data handle
30356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
30456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Outputs:
30556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
30656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Side Effects:
30756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
30856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
30956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
31056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave SparksEAS_RESULT EAS_MixEngineShutdown (S_EAS_DATA *pEASData)
31156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
31256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
31356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* check Configuration Module for static memory allocation */
31456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if (!pEASData->staticMemoryModel && (pEASData->pMixBuffer != NULL))
31556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        EAS_HWFree(pEASData->hwInstData, pEASData->pMixBuffer);
31656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
31756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    return EAS_SUCCESS;
31856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
31956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
32056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifdef UNIFIED_MIXER
32156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#ifndef NATIVE_MIX_STREAM
32256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks/*----------------------------------------------------------------------------
32356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * EAS_MixStream
32456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
32556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * Mix a 16-bit stream into a 32-bit buffer
32656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *
32756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pInputBuffer 16-bit input buffer
32856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * pMixBuffer   32-bit mix buffer
32956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * numSamples   number of samples to mix
33056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * gainLeft     initial gain left or mono
33156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * gainRight    initial gain right
33256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * gainLeft     left gain increment per sample
33356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * gainRight    right gain increment per sample
33456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks * flags        bit 0 = stereo source
33556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *              bit 1 = stereo output
33656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks *----------------------------------------------------------------------------
33756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks*/
33856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparksvoid EAS_MixStream (EAS_PCM *pInputBuffer, EAS_I32 *pMixBuffer, EAS_I32 numSamples, EAS_I32 gainLeft, EAS_I32 gainRight, EAS_I32 gainIncLeft, EAS_I32 gainIncRight, EAS_I32 flags)
33956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks{
34056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_I32 temp;
34156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    EAS_INT src, dest;
34256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
34356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* NOTE: There are a lot of optimizations that can be done
34456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks     * in the native implementations based on register
34556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks     * availability, etc. For example, it may make sense to
34656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks     * break this down into 8 separate routines:
34756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks     *
34856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks     * 1. Mono source to mono output
34956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks     * 2. Mono source to stereo output
35056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks     * 3. Stereo source to mono output
35156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks     * 4. Stereo source to stereo output
35256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks     * 5. Mono source to mono output - no gain change
35356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks     * 6. Mono source to stereo output - no gain change
35456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks     * 7. Stereo source to mono output - no gain change
35556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks     * 8. Stereo source to stereo output - no gain change
35656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks     *
35756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks     * Other possibilities include loop unrolling, skipping
35856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks     * a gain calculation every 2 or 4 samples, etc.
35956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks     */
36056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
36156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* no gain change, use fast loops */
36256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    if ((gainIncLeft == 0) && (gainIncRight == 0))
36356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
36456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        switch (flags & (MIX_FLAGS_STEREO_SOURCE | MIX_FLAGS_STEREO_OUTPUT))
36556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
36656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* mono to mono */
36756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            case 0:
36856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                gainLeft >>= 15;
36956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                for (src = dest = 0; src < numSamples; src++, dest++)
37056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                {
37156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
37256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    pMixBuffer[dest] += (pInputBuffer[src] * gainLeft) >> NUM_MIXER_GUARD_BITS;
37356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                }
37456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
37556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
37656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* mono to stereo */
37756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            case MIX_FLAGS_STEREO_OUTPUT:
37856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                gainLeft >>= 15;
37956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                gainRight >>= 15;
38056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                for (src = dest = 0; src < numSamples; src++, dest+=2)
38156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                {
38256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    pMixBuffer[dest] += (pInputBuffer[src] * gainLeft) >> NUM_MIXER_GUARD_BITS;
38356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    pMixBuffer[dest+1] += (pInputBuffer[src] * gainRight) >> NUM_MIXER_GUARD_BITS;
38456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                }
38556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
38656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
38756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* stereo to mono */
38856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            case MIX_FLAGS_STEREO_SOURCE:
38956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                gainLeft >>= 15;
39056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                gainRight >>= 15;
39156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                for (src = dest = 0; src < numSamples; src+=2, dest++)
39256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                {
39356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    temp = (pInputBuffer[src] * gainLeft) >> NUM_MIXER_GUARD_BITS;
39456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    temp += ((pInputBuffer[src+1] * gainRight) >> NUM_MIXER_GUARD_BITS);
39556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    pMixBuffer[dest] += temp;
39656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                }
39756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
39856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
39956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* stereo to stereo */
40056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            case MIX_FLAGS_STEREO_SOURCE | MIX_FLAGS_STEREO_OUTPUT:
40156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                gainLeft >>= 15;
40256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                gainRight >>= 15;
40356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                for (src = dest = 0; src < numSamples; src+=2, dest+=2)
40456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                {
40556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    pMixBuffer[dest] += (pInputBuffer[src] * gainLeft) >> NUM_MIXER_GUARD_BITS;
40656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    pMixBuffer[dest+1] += (pInputBuffer[src+1] * gainRight) >> NUM_MIXER_GUARD_BITS;
40756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                }
40856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
40956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
41056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
41156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
41256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    /* gain change - do gain increment */
41356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    else
41456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    {
41556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        switch (flags & (MIX_FLAGS_STEREO_SOURCE | MIX_FLAGS_STEREO_OUTPUT))
41656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        {
41756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* mono to mono */
41856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            case 0:
41956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                for (src = dest = 0; src < numSamples; src++, dest++)
42056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                {
42156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    gainLeft += gainIncLeft;
42256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    pMixBuffer[dest] += (pInputBuffer[src] * (gainLeft >> 15)) >> NUM_MIXER_GUARD_BITS;
42356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                }
42456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
42556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
42656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* mono to stereo */
42756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            case MIX_FLAGS_STEREO_OUTPUT:
42856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                for (src = dest = 0; src < numSamples; src++, dest+=2)
42956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                {
43056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    gainLeft += gainIncLeft;
43156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    gainRight += gainIncRight;
43256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    pMixBuffer[dest] += (pInputBuffer[src] * (gainLeft >> 15)) >> NUM_MIXER_GUARD_BITS;
43356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    pMixBuffer[dest+1] += (pInputBuffer[src] * (gainRight >> 15)) >> NUM_MIXER_GUARD_BITS;
43456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                }
43556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
43656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
43756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* stereo to mono */
43856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            case MIX_FLAGS_STEREO_SOURCE:
43956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                for (src = dest = 0; src < numSamples; src+=2, dest++)
44056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                {
44156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    gainLeft += gainIncLeft;
44256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    gainRight += gainIncRight;
44356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    temp = (pInputBuffer[src] * (gainLeft >> 15)) >> NUM_MIXER_GUARD_BITS;
44456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    temp += ((pInputBuffer[src+1] * (gainRight >> 15)) >> NUM_MIXER_GUARD_BITS);
44556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    pMixBuffer[dest] += temp;
44656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                }
44756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
44856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
44956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            /* stereo to stereo */
45056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks            case MIX_FLAGS_STEREO_SOURCE | MIX_FLAGS_STEREO_OUTPUT:
45156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                for (src = dest = 0; src < numSamples; src+=2, dest+=2)
45256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                {
45356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    gainLeft += gainIncLeft;
45456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    gainRight += gainIncRight;
45556c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    pMixBuffer[dest] += (pInputBuffer[src] * (gainLeft >> 15)) >> NUM_MIXER_GUARD_BITS;
45656c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                    pMixBuffer[dest+1] += (pInputBuffer[src+1] * (gainRight >> 15)) >> NUM_MIXER_GUARD_BITS;
45756c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                }
45856c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks                break;
45956c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks        }
46056c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks    }
46156c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks}
46256c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
46356c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks#endif
46456c99cd2c2c1e6ab038dac5fced5b92ccf11ff6cDave Sparks
465