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