xref: /aosp_15_r20/external/sonivox/arm-wt-22k/lib_src/eas_mixer.c (revision f81fb7c475c4b71ff83bdcc517de2a8c174e4e5c)
1*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
2*f81fb7c4SAndroid Build Coastguard Worker  *
3*f81fb7c4SAndroid Build Coastguard Worker  * File:
4*f81fb7c4SAndroid Build Coastguard Worker  * eas_mixer.c
5*f81fb7c4SAndroid Build Coastguard Worker  *
6*f81fb7c4SAndroid Build Coastguard Worker  * Contents and purpose:
7*f81fb7c4SAndroid Build Coastguard Worker  * This file contains the critical components of the mix engine that
8*f81fb7c4SAndroid Build Coastguard Worker  * must be optimized for best performance.
9*f81fb7c4SAndroid Build Coastguard Worker  *
10*f81fb7c4SAndroid Build Coastguard Worker  * Copyright Sonic Network Inc. 2005
11*f81fb7c4SAndroid Build Coastguard Worker 
12*f81fb7c4SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
13*f81fb7c4SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
14*f81fb7c4SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
15*f81fb7c4SAndroid Build Coastguard Worker  *
16*f81fb7c4SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
17*f81fb7c4SAndroid Build Coastguard Worker  *
18*f81fb7c4SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
19*f81fb7c4SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
20*f81fb7c4SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
21*f81fb7c4SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
22*f81fb7c4SAndroid Build Coastguard Worker  * limitations under the License.
23*f81fb7c4SAndroid Build Coastguard Worker  *
24*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
25*f81fb7c4SAndroid Build Coastguard Worker  * Revision Control:
26*f81fb7c4SAndroid Build Coastguard Worker  *   $Revision: 706 $
27*f81fb7c4SAndroid Build Coastguard Worker  *   $Date: 2007-05-31 17:22:51 -0700 (Thu, 31 May 2007) $
28*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
29*f81fb7c4SAndroid Build Coastguard Worker */
30*f81fb7c4SAndroid Build Coastguard Worker 
31*f81fb7c4SAndroid Build Coastguard Worker //3 dls: This module is in the midst of being converted from a synth
32*f81fb7c4SAndroid Build Coastguard Worker //3 specific module to a general purpose mix engine
33*f81fb7c4SAndroid Build Coastguard Worker 
34*f81fb7c4SAndroid Build Coastguard Worker /*------------------------------------
35*f81fb7c4SAndroid Build Coastguard Worker  * includes
36*f81fb7c4SAndroid Build Coastguard Worker  *------------------------------------
37*f81fb7c4SAndroid Build Coastguard Worker */
38*f81fb7c4SAndroid Build Coastguard Worker #include "eas_data.h"
39*f81fb7c4SAndroid Build Coastguard Worker #include "eas_host.h"
40*f81fb7c4SAndroid Build Coastguard Worker #include "eas_math.h"
41*f81fb7c4SAndroid Build Coastguard Worker #include "eas_mixer.h"
42*f81fb7c4SAndroid Build Coastguard Worker #include "eas_config.h"
43*f81fb7c4SAndroid Build Coastguard Worker #include "eas_report.h"
44*f81fb7c4SAndroid Build Coastguard Worker 
45*f81fb7c4SAndroid Build Coastguard Worker #ifdef _MAXIMIZER_ENABLED
46*f81fb7c4SAndroid Build Coastguard Worker EAS_I32 MaximizerProcess (EAS_VOID_PTR pInstData, EAS_I32 *pSrc, EAS_I32 *pDst, EAS_I32 numSamples);
47*f81fb7c4SAndroid Build Coastguard Worker #endif
48*f81fb7c4SAndroid Build Coastguard Worker 
49*f81fb7c4SAndroid Build Coastguard Worker /*------------------------------------
50*f81fb7c4SAndroid Build Coastguard Worker  * defines
51*f81fb7c4SAndroid Build Coastguard Worker  *------------------------------------
52*f81fb7c4SAndroid Build Coastguard Worker */
53*f81fb7c4SAndroid Build Coastguard Worker 
54*f81fb7c4SAndroid Build Coastguard Worker /* need to boost stereo by ~3dB to compensate for the panner */
55*f81fb7c4SAndroid Build Coastguard Worker #define STEREO_3DB_GAIN_BOOST       512
56*f81fb7c4SAndroid Build Coastguard Worker 
57*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
58*f81fb7c4SAndroid Build Coastguard Worker  * EAS_MixEngineInit()
59*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
60*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
61*f81fb7c4SAndroid Build Coastguard Worker  * Prepares the mix engine for work, allocates buffers, locates effects modules, etc.
62*f81fb7c4SAndroid Build Coastguard Worker  *
63*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
64*f81fb7c4SAndroid Build Coastguard Worker  * pEASData         - instance data
65*f81fb7c4SAndroid Build Coastguard Worker  * pInstData        - pointer to variable to receive instance data handle
66*f81fb7c4SAndroid Build Coastguard Worker  *
67*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
68*f81fb7c4SAndroid Build Coastguard Worker  *
69*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
70*f81fb7c4SAndroid Build Coastguard Worker  *
71*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
72*f81fb7c4SAndroid Build Coastguard Worker */
EAS_MixEngineInit(S_EAS_DATA * pEASData)73*f81fb7c4SAndroid Build Coastguard Worker EAS_RESULT EAS_MixEngineInit (S_EAS_DATA *pEASData)
74*f81fb7c4SAndroid Build Coastguard Worker {
75*f81fb7c4SAndroid Build Coastguard Worker 
76*f81fb7c4SAndroid Build Coastguard Worker     /* check Configuration Module for mix buffer allocation */
77*f81fb7c4SAndroid Build Coastguard Worker     if (pEASData->staticMemoryModel)
78*f81fb7c4SAndroid Build Coastguard Worker         pEASData->pMixBuffer = EAS_CMEnumData(EAS_CM_MIX_BUFFER);
79*f81fb7c4SAndroid Build Coastguard Worker     else
80*f81fb7c4SAndroid Build Coastguard Worker         pEASData->pMixBuffer = EAS_HWMalloc(pEASData->hwInstData, BUFFER_SIZE_IN_MONO_SAMPLES * NUM_OUTPUT_CHANNELS * sizeof(EAS_I32));
81*f81fb7c4SAndroid Build Coastguard Worker     if (pEASData->pMixBuffer == NULL)
82*f81fb7c4SAndroid Build Coastguard Worker     {
83*f81fb7c4SAndroid Build Coastguard Worker         { /* dpp: EAS_ReportEx(_EAS_SEVERITY_FATAL, "Failed to allocate mix buffer memory\n"); */ }
84*f81fb7c4SAndroid Build Coastguard Worker         return EAS_ERROR_MALLOC_FAILED;
85*f81fb7c4SAndroid Build Coastguard Worker     }
86*f81fb7c4SAndroid Build Coastguard Worker     EAS_HWMemSet((void *)(pEASData->pMixBuffer), 0, BUFFER_SIZE_IN_MONO_SAMPLES * NUM_OUTPUT_CHANNELS * sizeof(EAS_I32));
87*f81fb7c4SAndroid Build Coastguard Worker 
88*f81fb7c4SAndroid Build Coastguard Worker     return EAS_SUCCESS;
89*f81fb7c4SAndroid Build Coastguard Worker }
90*f81fb7c4SAndroid Build Coastguard Worker 
91*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
92*f81fb7c4SAndroid Build Coastguard Worker  * EAS_MixEnginePrep()
93*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
94*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
95*f81fb7c4SAndroid Build Coastguard Worker  * Performs prep before synthesize a buffer of audio, such as clearing
96*f81fb7c4SAndroid Build Coastguard Worker  * audio buffers, etc.
97*f81fb7c4SAndroid Build Coastguard Worker  *
98*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
99*f81fb7c4SAndroid Build Coastguard Worker  * psEASData - pointer to overall EAS data structure
100*f81fb7c4SAndroid Build Coastguard Worker  *
101*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
102*f81fb7c4SAndroid Build Coastguard Worker  *
103*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
104*f81fb7c4SAndroid Build Coastguard Worker  *
105*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
106*f81fb7c4SAndroid Build Coastguard Worker */
EAS_MixEnginePrep(S_EAS_DATA * pEASData,EAS_I32 numSamples)107*f81fb7c4SAndroid Build Coastguard Worker void EAS_MixEnginePrep (S_EAS_DATA *pEASData, EAS_I32 numSamples)
108*f81fb7c4SAndroid Build Coastguard Worker {
109*f81fb7c4SAndroid Build Coastguard Worker 
110*f81fb7c4SAndroid Build Coastguard Worker     /* clear the mix buffer */
111*f81fb7c4SAndroid Build Coastguard Worker #if (NUM_OUTPUT_CHANNELS == 2)
112*f81fb7c4SAndroid Build Coastguard Worker     EAS_HWMemSet(pEASData->pMixBuffer, 0, numSamples * (EAS_I32) sizeof(long) * 2);
113*f81fb7c4SAndroid Build Coastguard Worker #else
114*f81fb7c4SAndroid Build Coastguard Worker     EAS_HWMemSet(pEASData->pMixBuffer, 0, (EAS_I32) numSamples * (EAS_I32) sizeof(long));
115*f81fb7c4SAndroid Build Coastguard Worker #endif
116*f81fb7c4SAndroid Build Coastguard Worker 
117*f81fb7c4SAndroid Build Coastguard Worker     /* need to clear other side-chain effect buffers (chorus & reverb) */
118*f81fb7c4SAndroid Build Coastguard Worker }
119*f81fb7c4SAndroid Build Coastguard Worker 
120*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
121*f81fb7c4SAndroid Build Coastguard Worker  * EAS_MixEnginePost
122*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
123*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
124*f81fb7c4SAndroid Build Coastguard Worker  * This routine does the post-processing after all voices have been
125*f81fb7c4SAndroid Build Coastguard Worker  * synthesized. It calls any sweeteners and does the final mixdown to
126*f81fb7c4SAndroid Build Coastguard Worker  * the output buffer.
127*f81fb7c4SAndroid Build Coastguard Worker  *
128*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
129*f81fb7c4SAndroid Build Coastguard Worker  *
130*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
131*f81fb7c4SAndroid Build Coastguard Worker  *
132*f81fb7c4SAndroid Build Coastguard Worker  * Notes:
133*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
134*f81fb7c4SAndroid Build Coastguard Worker */
EAS_MixEnginePost(S_EAS_DATA * pEASData,EAS_I32 numSamples)135*f81fb7c4SAndroid Build Coastguard Worker void EAS_MixEnginePost (S_EAS_DATA *pEASData, EAS_I32 numSamples)
136*f81fb7c4SAndroid Build Coastguard Worker {
137*f81fb7c4SAndroid Build Coastguard Worker     EAS_U16 gain;
138*f81fb7c4SAndroid Build Coastguard Worker 
139*f81fb7c4SAndroid Build Coastguard Worker //3 dls: Need to restore the mix engine metrics
140*f81fb7c4SAndroid Build Coastguard Worker 
141*f81fb7c4SAndroid Build Coastguard Worker     /* calculate the gain multiplier */
142*f81fb7c4SAndroid Build Coastguard Worker #ifdef _MAXIMIZER_ENABLED
143*f81fb7c4SAndroid Build Coastguard Worker     if (pEASData->effectsModules[EAS_MODULE_MAXIMIZER].effect)
144*f81fb7c4SAndroid Build Coastguard Worker     {
145*f81fb7c4SAndroid Build Coastguard Worker         EAS_I32 temp;
146*f81fb7c4SAndroid Build Coastguard Worker         temp = MaximizerProcess(pEASData->effectsModules[EAS_MODULE_MAXIMIZER].effectData, pEASData->pMixBuffer, pEASData->pMixBuffer, numSamples);
147*f81fb7c4SAndroid Build Coastguard Worker         temp = (temp * pEASData->masterGain) >> 15;
148*f81fb7c4SAndroid Build Coastguard Worker         if (temp > 32767)
149*f81fb7c4SAndroid Build Coastguard Worker             gain = 32767;
150*f81fb7c4SAndroid Build Coastguard Worker         else
151*f81fb7c4SAndroid Build Coastguard Worker             gain = (EAS_U16) temp;
152*f81fb7c4SAndroid Build Coastguard Worker     }
153*f81fb7c4SAndroid Build Coastguard Worker     else
154*f81fb7c4SAndroid Build Coastguard Worker         gain = (EAS_U16) pEASData->masterGain;
155*f81fb7c4SAndroid Build Coastguard Worker #else
156*f81fb7c4SAndroid Build Coastguard Worker     gain = (EAS_U16) pEASData->masterGain;
157*f81fb7c4SAndroid Build Coastguard Worker #endif
158*f81fb7c4SAndroid Build Coastguard Worker 
159*f81fb7c4SAndroid Build Coastguard Worker     /* Not using all the gain bits for now
160*f81fb7c4SAndroid Build Coastguard Worker      * Reduce the input to the compressor by 6dB to prevent saturation
161*f81fb7c4SAndroid Build Coastguard Worker      */
162*f81fb7c4SAndroid Build Coastguard Worker #ifdef _COMPRESSOR_ENABLED
163*f81fb7c4SAndroid Build Coastguard Worker     if (pEASData->effectsModules[EAS_MODULE_COMPRESSOR].effectData)
164*f81fb7c4SAndroid Build Coastguard Worker         gain = gain >> 5;
165*f81fb7c4SAndroid Build Coastguard Worker     else
166*f81fb7c4SAndroid Build Coastguard Worker         gain = gain >> 4;
167*f81fb7c4SAndroid Build Coastguard Worker #else
168*f81fb7c4SAndroid Build Coastguard Worker     gain = gain >> 4;
169*f81fb7c4SAndroid Build Coastguard Worker #endif
170*f81fb7c4SAndroid Build Coastguard Worker 
171*f81fb7c4SAndroid Build Coastguard Worker     /* convert 32-bit mix buffer to 16-bit output format */
172*f81fb7c4SAndroid Build Coastguard Worker #if (NUM_OUTPUT_CHANNELS == 2)
173*f81fb7c4SAndroid Build Coastguard Worker     SynthMasterGain(pEASData->pMixBuffer, pEASData->pOutputAudioBuffer, gain, (EAS_U16) ((EAS_U16) numSamples * 2));
174*f81fb7c4SAndroid Build Coastguard Worker #else
175*f81fb7c4SAndroid Build Coastguard Worker     SynthMasterGain(pEASData->pMixBuffer, pEASData->pOutputAudioBuffer, gain, (EAS_U16) numSamples);
176*f81fb7c4SAndroid Build Coastguard Worker #endif
177*f81fb7c4SAndroid Build Coastguard Worker 
178*f81fb7c4SAndroid Build Coastguard Worker #ifdef _ENHANCER_ENABLED
179*f81fb7c4SAndroid Build Coastguard Worker     /* enhancer effect */
180*f81fb7c4SAndroid Build Coastguard Worker     if (pEASData->effectsModules[EAS_MODULE_ENHANCER].effectData)
181*f81fb7c4SAndroid Build Coastguard Worker         (*pEASData->effectsModules[EAS_MODULE_ENHANCER].effect->pfProcess)
182*f81fb7c4SAndroid Build Coastguard Worker             (pEASData->effectsModules[EAS_MODULE_ENHANCER].effectData,
183*f81fb7c4SAndroid Build Coastguard Worker             pEASData->pOutputAudioBuffer,
184*f81fb7c4SAndroid Build Coastguard Worker             pEASData->pOutputAudioBuffer,
185*f81fb7c4SAndroid Build Coastguard Worker             numSamples);
186*f81fb7c4SAndroid Build Coastguard Worker #endif
187*f81fb7c4SAndroid Build Coastguard Worker 
188*f81fb7c4SAndroid Build Coastguard Worker #ifdef _GRAPHIC_EQ_ENABLED
189*f81fb7c4SAndroid Build Coastguard Worker     /* graphic EQ effect */
190*f81fb7c4SAndroid Build Coastguard Worker     if (pEASData->effectsModules[EAS_MODULE_GRAPHIC_EQ].effectData)
191*f81fb7c4SAndroid Build Coastguard Worker         (*pEASData->effectsModules[EAS_MODULE_GRAPHIC_EQ].effect->pfProcess)
192*f81fb7c4SAndroid Build Coastguard Worker             (pEASData->effectsModules[EAS_MODULE_GRAPHIC_EQ].effectData,
193*f81fb7c4SAndroid Build Coastguard Worker             pEASData->pOutputAudioBuffer,
194*f81fb7c4SAndroid Build Coastguard Worker             pEASData->pOutputAudioBuffer,
195*f81fb7c4SAndroid Build Coastguard Worker             numSamples);
196*f81fb7c4SAndroid Build Coastguard Worker #endif
197*f81fb7c4SAndroid Build Coastguard Worker 
198*f81fb7c4SAndroid Build Coastguard Worker #ifdef _COMPRESSOR_ENABLED
199*f81fb7c4SAndroid Build Coastguard Worker     /* compressor effect */
200*f81fb7c4SAndroid Build Coastguard Worker     if (pEASData->effectsModules[EAS_MODULE_COMPRESSOR].effectData)
201*f81fb7c4SAndroid Build Coastguard Worker         (*pEASData->effectsModules[EAS_MODULE_COMPRESSOR].effect->pfProcess)
202*f81fb7c4SAndroid Build Coastguard Worker             (pEASData->effectsModules[EAS_MODULE_COMPRESSOR].effectData,
203*f81fb7c4SAndroid Build Coastguard Worker             pEASData->pOutputAudioBuffer,
204*f81fb7c4SAndroid Build Coastguard Worker             pEASData->pOutputAudioBuffer,
205*f81fb7c4SAndroid Build Coastguard Worker             numSamples);
206*f81fb7c4SAndroid Build Coastguard Worker #endif
207*f81fb7c4SAndroid Build Coastguard Worker 
208*f81fb7c4SAndroid Build Coastguard Worker #ifdef _WOW_ENABLED
209*f81fb7c4SAndroid Build Coastguard Worker     /* WOW requires a 32-bit buffer, borrow the mix buffer and
210*f81fb7c4SAndroid Build Coastguard Worker      * pass it as the destination buffer
211*f81fb7c4SAndroid Build Coastguard Worker      */
212*f81fb7c4SAndroid Build Coastguard Worker     /*lint -e{740} temporarily passing a parameter through an existing I/F */
213*f81fb7c4SAndroid Build Coastguard Worker     if (pEASData->effectsModules[EAS_MODULE_WOW].effectData)
214*f81fb7c4SAndroid Build Coastguard Worker         (*pEASData->effectsModules[EAS_MODULE_WOW].effect->pfProcess)
215*f81fb7c4SAndroid Build Coastguard Worker             (pEASData->effectsModules[EAS_MODULE_WOW].effectData,
216*f81fb7c4SAndroid Build Coastguard Worker             pEASData->pOutputAudioBuffer,
217*f81fb7c4SAndroid Build Coastguard Worker             (EAS_PCM*) pEASData->pMixBuffer,
218*f81fb7c4SAndroid Build Coastguard Worker             numSamples);
219*f81fb7c4SAndroid Build Coastguard Worker #endif
220*f81fb7c4SAndroid Build Coastguard Worker 
221*f81fb7c4SAndroid Build Coastguard Worker #ifdef _TONECONTROLEQ_ENABLED
222*f81fb7c4SAndroid Build Coastguard Worker     /* ToneControlEQ effect */
223*f81fb7c4SAndroid Build Coastguard Worker     if (pEASData->effectsModules[EAS_MODULE_TONECONTROLEQ].effectData)
224*f81fb7c4SAndroid Build Coastguard Worker         (*pEASData->effectsModules[EAS_MODULE_TONECONTROLEQ].effect->pfProcess)
225*f81fb7c4SAndroid Build Coastguard Worker             (pEASData->effectsModules[EAS_MODULE_TONECONTROLEQ].effectData,
226*f81fb7c4SAndroid Build Coastguard Worker             pEASData->pOutputAudioBuffer,
227*f81fb7c4SAndroid Build Coastguard Worker             pEASData->pOutputAudioBuffer,
228*f81fb7c4SAndroid Build Coastguard Worker             numSamples);
229*f81fb7c4SAndroid Build Coastguard Worker #endif
230*f81fb7c4SAndroid Build Coastguard Worker 
231*f81fb7c4SAndroid Build Coastguard Worker #ifdef _REVERB_ENABLED
232*f81fb7c4SAndroid Build Coastguard Worker     /* Reverb effect */
233*f81fb7c4SAndroid Build Coastguard Worker     if (pEASData->effectsModules[EAS_MODULE_REVERB].effectData)
234*f81fb7c4SAndroid Build Coastguard Worker         (*pEASData->effectsModules[EAS_MODULE_REVERB].effect->pfProcess)
235*f81fb7c4SAndroid Build Coastguard Worker             (pEASData->effectsModules[EAS_MODULE_REVERB].effectData,
236*f81fb7c4SAndroid Build Coastguard Worker             pEASData->pOutputAudioBuffer,
237*f81fb7c4SAndroid Build Coastguard Worker             pEASData->pOutputAudioBuffer,
238*f81fb7c4SAndroid Build Coastguard Worker             numSamples);
239*f81fb7c4SAndroid Build Coastguard Worker #endif
240*f81fb7c4SAndroid Build Coastguard Worker 
241*f81fb7c4SAndroid Build Coastguard Worker #ifdef _CHORUS_ENABLED
242*f81fb7c4SAndroid Build Coastguard Worker     /* Chorus effect */
243*f81fb7c4SAndroid Build Coastguard Worker     if (pEASData->effectsModules[EAS_MODULE_CHORUS].effectData)
244*f81fb7c4SAndroid Build Coastguard Worker         (*pEASData->effectsModules[EAS_MODULE_CHORUS].effect->pfProcess)
245*f81fb7c4SAndroid Build Coastguard Worker             (pEASData->effectsModules[EAS_MODULE_CHORUS].effectData,
246*f81fb7c4SAndroid Build Coastguard Worker             pEASData->pOutputAudioBuffer,
247*f81fb7c4SAndroid Build Coastguard Worker             pEASData->pOutputAudioBuffer,
248*f81fb7c4SAndroid Build Coastguard Worker             numSamples);
249*f81fb7c4SAndroid Build Coastguard Worker #endif
250*f81fb7c4SAndroid Build Coastguard Worker 
251*f81fb7c4SAndroid Build Coastguard Worker }
252*f81fb7c4SAndroid Build Coastguard Worker 
253*f81fb7c4SAndroid Build Coastguard Worker #ifndef NATIVE_EAS_KERNEL
254*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
255*f81fb7c4SAndroid Build Coastguard Worker  * SynthMasterGain
256*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
257*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
258*f81fb7c4SAndroid Build Coastguard Worker  * Mixes down audio from 32-bit to 16-bit target buffer
259*f81fb7c4SAndroid Build Coastguard Worker  *
260*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
261*f81fb7c4SAndroid Build Coastguard Worker  *
262*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
263*f81fb7c4SAndroid Build Coastguard Worker  *
264*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
265*f81fb7c4SAndroid Build Coastguard Worker */
SynthMasterGain(long * pInputBuffer,EAS_PCM * pOutputBuffer,EAS_U16 nGain,EAS_U16 numSamples)266*f81fb7c4SAndroid Build Coastguard Worker void SynthMasterGain (long *pInputBuffer, EAS_PCM *pOutputBuffer, EAS_U16 nGain, EAS_U16 numSamples) {
267*f81fb7c4SAndroid Build Coastguard Worker 
268*f81fb7c4SAndroid Build Coastguard Worker     /* loop through the buffer */
269*f81fb7c4SAndroid Build Coastguard Worker     while (numSamples) {
270*f81fb7c4SAndroid Build Coastguard Worker         long s;
271*f81fb7c4SAndroid Build Coastguard Worker 
272*f81fb7c4SAndroid Build Coastguard Worker         numSamples--;
273*f81fb7c4SAndroid Build Coastguard Worker         /* read a sample from the input buffer and add some guard bits */
274*f81fb7c4SAndroid Build Coastguard Worker         s = *pInputBuffer++;
275*f81fb7c4SAndroid Build Coastguard Worker 
276*f81fb7c4SAndroid Build Coastguard Worker         /* add some guard bits */
277*f81fb7c4SAndroid Build Coastguard Worker         /*lint -e{704} <avoid divide for performance>*/
278*f81fb7c4SAndroid Build Coastguard Worker         s = s >> 7;
279*f81fb7c4SAndroid Build Coastguard Worker 
280*f81fb7c4SAndroid Build Coastguard Worker         /* apply master gain */
281*f81fb7c4SAndroid Build Coastguard Worker         s *= (long) nGain;
282*f81fb7c4SAndroid Build Coastguard Worker 
283*f81fb7c4SAndroid Build Coastguard Worker         /* shift to lower 16-bits */
284*f81fb7c4SAndroid Build Coastguard Worker         /*lint -e{704} <avoid divide for performance>*/
285*f81fb7c4SAndroid Build Coastguard Worker         s = s >> 9;
286*f81fb7c4SAndroid Build Coastguard Worker 
287*f81fb7c4SAndroid Build Coastguard Worker         /* saturate */
288*f81fb7c4SAndroid Build Coastguard Worker         s = SATURATE(s);
289*f81fb7c4SAndroid Build Coastguard Worker 
290*f81fb7c4SAndroid Build Coastguard Worker         *pOutputBuffer++ = (EAS_PCM)s;
291*f81fb7c4SAndroid Build Coastguard Worker     }
292*f81fb7c4SAndroid Build Coastguard Worker }
293*f81fb7c4SAndroid Build Coastguard Worker #endif
294*f81fb7c4SAndroid Build Coastguard Worker 
295*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
296*f81fb7c4SAndroid Build Coastguard Worker  * EAS_MixEngineShutdown()
297*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
298*f81fb7c4SAndroid Build Coastguard Worker  * Purpose:
299*f81fb7c4SAndroid Build Coastguard Worker  * Shuts down effects modules and deallocates memory
300*f81fb7c4SAndroid Build Coastguard Worker  *
301*f81fb7c4SAndroid Build Coastguard Worker  * Inputs:
302*f81fb7c4SAndroid Build Coastguard Worker  * pEASData         - instance data
303*f81fb7c4SAndroid Build Coastguard Worker  * pInstData        - instance data handle
304*f81fb7c4SAndroid Build Coastguard Worker  *
305*f81fb7c4SAndroid Build Coastguard Worker  * Outputs:
306*f81fb7c4SAndroid Build Coastguard Worker  *
307*f81fb7c4SAndroid Build Coastguard Worker  * Side Effects:
308*f81fb7c4SAndroid Build Coastguard Worker  *
309*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
310*f81fb7c4SAndroid Build Coastguard Worker */
EAS_MixEngineShutdown(S_EAS_DATA * pEASData)311*f81fb7c4SAndroid Build Coastguard Worker EAS_RESULT EAS_MixEngineShutdown (S_EAS_DATA *pEASData)
312*f81fb7c4SAndroid Build Coastguard Worker {
313*f81fb7c4SAndroid Build Coastguard Worker 
314*f81fb7c4SAndroid Build Coastguard Worker     /* check Configuration Module for static memory allocation */
315*f81fb7c4SAndroid Build Coastguard Worker     if (!pEASData->staticMemoryModel && (pEASData->pMixBuffer != NULL))
316*f81fb7c4SAndroid Build Coastguard Worker         EAS_HWFree(pEASData->hwInstData, pEASData->pMixBuffer);
317*f81fb7c4SAndroid Build Coastguard Worker 
318*f81fb7c4SAndroid Build Coastguard Worker     return EAS_SUCCESS;
319*f81fb7c4SAndroid Build Coastguard Worker }
320*f81fb7c4SAndroid Build Coastguard Worker 
321*f81fb7c4SAndroid Build Coastguard Worker #ifdef UNIFIED_MIXER
322*f81fb7c4SAndroid Build Coastguard Worker #ifndef NATIVE_MIX_STREAM
323*f81fb7c4SAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
324*f81fb7c4SAndroid Build Coastguard Worker  * EAS_MixStream
325*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
326*f81fb7c4SAndroid Build Coastguard Worker  * Mix a 16-bit stream into a 32-bit buffer
327*f81fb7c4SAndroid Build Coastguard Worker  *
328*f81fb7c4SAndroid Build Coastguard Worker  * pInputBuffer 16-bit input buffer
329*f81fb7c4SAndroid Build Coastguard Worker  * pMixBuffer   32-bit mix buffer
330*f81fb7c4SAndroid Build Coastguard Worker  * numSamples   number of samples to mix
331*f81fb7c4SAndroid Build Coastguard Worker  * gainLeft     initial gain left or mono
332*f81fb7c4SAndroid Build Coastguard Worker  * gainRight    initial gain right
333*f81fb7c4SAndroid Build Coastguard Worker  * gainLeft     left gain increment per sample
334*f81fb7c4SAndroid Build Coastguard Worker  * gainRight    right gain increment per sample
335*f81fb7c4SAndroid Build Coastguard Worker  * flags        bit 0 = stereo source
336*f81fb7c4SAndroid Build Coastguard Worker  *              bit 1 = stereo output
337*f81fb7c4SAndroid Build Coastguard Worker  *----------------------------------------------------------------------------
338*f81fb7c4SAndroid Build Coastguard Worker */
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)339*f81fb7c4SAndroid Build Coastguard Worker void 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)
340*f81fb7c4SAndroid Build Coastguard Worker {
341*f81fb7c4SAndroid Build Coastguard Worker     EAS_I32 temp;
342*f81fb7c4SAndroid Build Coastguard Worker     EAS_INT src, dest;
343*f81fb7c4SAndroid Build Coastguard Worker 
344*f81fb7c4SAndroid Build Coastguard Worker     /* NOTE: There are a lot of optimizations that can be done
345*f81fb7c4SAndroid Build Coastguard Worker      * in the native implementations based on register
346*f81fb7c4SAndroid Build Coastguard Worker      * availability, etc. For example, it may make sense to
347*f81fb7c4SAndroid Build Coastguard Worker      * break this down into 8 separate routines:
348*f81fb7c4SAndroid Build Coastguard Worker      *
349*f81fb7c4SAndroid Build Coastguard Worker      * 1. Mono source to mono output
350*f81fb7c4SAndroid Build Coastguard Worker      * 2. Mono source to stereo output
351*f81fb7c4SAndroid Build Coastguard Worker      * 3. Stereo source to mono output
352*f81fb7c4SAndroid Build Coastguard Worker      * 4. Stereo source to stereo output
353*f81fb7c4SAndroid Build Coastguard Worker      * 5. Mono source to mono output - no gain change
354*f81fb7c4SAndroid Build Coastguard Worker      * 6. Mono source to stereo output - no gain change
355*f81fb7c4SAndroid Build Coastguard Worker      * 7. Stereo source to mono output - no gain change
356*f81fb7c4SAndroid Build Coastguard Worker      * 8. Stereo source to stereo output - no gain change
357*f81fb7c4SAndroid Build Coastguard Worker      *
358*f81fb7c4SAndroid Build Coastguard Worker      * Other possibilities include loop unrolling, skipping
359*f81fb7c4SAndroid Build Coastguard Worker      * a gain calculation every 2 or 4 samples, etc.
360*f81fb7c4SAndroid Build Coastguard Worker      */
361*f81fb7c4SAndroid Build Coastguard Worker 
362*f81fb7c4SAndroid Build Coastguard Worker     /* no gain change, use fast loops */
363*f81fb7c4SAndroid Build Coastguard Worker     if ((gainIncLeft == 0) && (gainIncRight == 0))
364*f81fb7c4SAndroid Build Coastguard Worker     {
365*f81fb7c4SAndroid Build Coastguard Worker         switch (flags & (MIX_FLAGS_STEREO_SOURCE | MIX_FLAGS_STEREO_OUTPUT))
366*f81fb7c4SAndroid Build Coastguard Worker         {
367*f81fb7c4SAndroid Build Coastguard Worker             /* mono to mono */
368*f81fb7c4SAndroid Build Coastguard Worker             case 0:
369*f81fb7c4SAndroid Build Coastguard Worker                 gainLeft >>= 15;
370*f81fb7c4SAndroid Build Coastguard Worker                 for (src = dest = 0; src < numSamples; src++, dest++)
371*f81fb7c4SAndroid Build Coastguard Worker                 {
372*f81fb7c4SAndroid Build Coastguard Worker 
373*f81fb7c4SAndroid Build Coastguard Worker                     pMixBuffer[dest] += (pInputBuffer[src] * gainLeft) >> NUM_MIXER_GUARD_BITS;
374*f81fb7c4SAndroid Build Coastguard Worker                 }
375*f81fb7c4SAndroid Build Coastguard Worker                 break;
376*f81fb7c4SAndroid Build Coastguard Worker 
377*f81fb7c4SAndroid Build Coastguard Worker             /* mono to stereo */
378*f81fb7c4SAndroid Build Coastguard Worker             case MIX_FLAGS_STEREO_OUTPUT:
379*f81fb7c4SAndroid Build Coastguard Worker                 gainLeft >>= 15;
380*f81fb7c4SAndroid Build Coastguard Worker                 gainRight >>= 15;
381*f81fb7c4SAndroid Build Coastguard Worker                 for (src = dest = 0; src < numSamples; src++, dest+=2)
382*f81fb7c4SAndroid Build Coastguard Worker                 {
383*f81fb7c4SAndroid Build Coastguard Worker                     pMixBuffer[dest] += (pInputBuffer[src] * gainLeft) >> NUM_MIXER_GUARD_BITS;
384*f81fb7c4SAndroid Build Coastguard Worker                     pMixBuffer[dest+1] += (pInputBuffer[src] * gainRight) >> NUM_MIXER_GUARD_BITS;
385*f81fb7c4SAndroid Build Coastguard Worker                 }
386*f81fb7c4SAndroid Build Coastguard Worker                 break;
387*f81fb7c4SAndroid Build Coastguard Worker 
388*f81fb7c4SAndroid Build Coastguard Worker             /* stereo to mono */
389*f81fb7c4SAndroid Build Coastguard Worker             case MIX_FLAGS_STEREO_SOURCE:
390*f81fb7c4SAndroid Build Coastguard Worker                 gainLeft >>= 15;
391*f81fb7c4SAndroid Build Coastguard Worker                 gainRight >>= 15;
392*f81fb7c4SAndroid Build Coastguard Worker                 for (src = dest = 0; src < numSamples; src+=2, dest++)
393*f81fb7c4SAndroid Build Coastguard Worker                 {
394*f81fb7c4SAndroid Build Coastguard Worker                     temp = (pInputBuffer[src] * gainLeft) >> NUM_MIXER_GUARD_BITS;
395*f81fb7c4SAndroid Build Coastguard Worker                     temp += ((pInputBuffer[src+1] * gainRight) >> NUM_MIXER_GUARD_BITS);
396*f81fb7c4SAndroid Build Coastguard Worker                     pMixBuffer[dest] += temp;
397*f81fb7c4SAndroid Build Coastguard Worker                 }
398*f81fb7c4SAndroid Build Coastguard Worker                 break;
399*f81fb7c4SAndroid Build Coastguard Worker 
400*f81fb7c4SAndroid Build Coastguard Worker             /* stereo to stereo */
401*f81fb7c4SAndroid Build Coastguard Worker             case MIX_FLAGS_STEREO_SOURCE | MIX_FLAGS_STEREO_OUTPUT:
402*f81fb7c4SAndroid Build Coastguard Worker                 gainLeft >>= 15;
403*f81fb7c4SAndroid Build Coastguard Worker                 gainRight >>= 15;
404*f81fb7c4SAndroid Build Coastguard Worker                 for (src = dest = 0; src < numSamples; src+=2, dest+=2)
405*f81fb7c4SAndroid Build Coastguard Worker                 {
406*f81fb7c4SAndroid Build Coastguard Worker                     pMixBuffer[dest] += (pInputBuffer[src] * gainLeft) >> NUM_MIXER_GUARD_BITS;
407*f81fb7c4SAndroid Build Coastguard Worker                     pMixBuffer[dest+1] += (pInputBuffer[src+1] * gainRight) >> NUM_MIXER_GUARD_BITS;
408*f81fb7c4SAndroid Build Coastguard Worker                 }
409*f81fb7c4SAndroid Build Coastguard Worker                 break;
410*f81fb7c4SAndroid Build Coastguard Worker         }
411*f81fb7c4SAndroid Build Coastguard Worker     }
412*f81fb7c4SAndroid Build Coastguard Worker 
413*f81fb7c4SAndroid Build Coastguard Worker     /* gain change - do gain increment */
414*f81fb7c4SAndroid Build Coastguard Worker     else
415*f81fb7c4SAndroid Build Coastguard Worker     {
416*f81fb7c4SAndroid Build Coastguard Worker         switch (flags & (MIX_FLAGS_STEREO_SOURCE | MIX_FLAGS_STEREO_OUTPUT))
417*f81fb7c4SAndroid Build Coastguard Worker         {
418*f81fb7c4SAndroid Build Coastguard Worker             /* mono to mono */
419*f81fb7c4SAndroid Build Coastguard Worker             case 0:
420*f81fb7c4SAndroid Build Coastguard Worker                 for (src = dest = 0; src < numSamples; src++, dest++)
421*f81fb7c4SAndroid Build Coastguard Worker                 {
422*f81fb7c4SAndroid Build Coastguard Worker                     gainLeft += gainIncLeft;
423*f81fb7c4SAndroid Build Coastguard Worker                     pMixBuffer[dest] += (pInputBuffer[src] * (gainLeft >> 15)) >> NUM_MIXER_GUARD_BITS;
424*f81fb7c4SAndroid Build Coastguard Worker                 }
425*f81fb7c4SAndroid Build Coastguard Worker                 break;
426*f81fb7c4SAndroid Build Coastguard Worker 
427*f81fb7c4SAndroid Build Coastguard Worker             /* mono to stereo */
428*f81fb7c4SAndroid Build Coastguard Worker             case MIX_FLAGS_STEREO_OUTPUT:
429*f81fb7c4SAndroid Build Coastguard Worker                 for (src = dest = 0; src < numSamples; src++, dest+=2)
430*f81fb7c4SAndroid Build Coastguard Worker                 {
431*f81fb7c4SAndroid Build Coastguard Worker                     gainLeft += gainIncLeft;
432*f81fb7c4SAndroid Build Coastguard Worker                     gainRight += gainIncRight;
433*f81fb7c4SAndroid Build Coastguard Worker                     pMixBuffer[dest] += (pInputBuffer[src] * (gainLeft >> 15)) >> NUM_MIXER_GUARD_BITS;
434*f81fb7c4SAndroid Build Coastguard Worker                     pMixBuffer[dest+1] += (pInputBuffer[src] * (gainRight >> 15)) >> NUM_MIXER_GUARD_BITS;
435*f81fb7c4SAndroid Build Coastguard Worker                 }
436*f81fb7c4SAndroid Build Coastguard Worker                 break;
437*f81fb7c4SAndroid Build Coastguard Worker 
438*f81fb7c4SAndroid Build Coastguard Worker             /* stereo to mono */
439*f81fb7c4SAndroid Build Coastguard Worker             case MIX_FLAGS_STEREO_SOURCE:
440*f81fb7c4SAndroid Build Coastguard Worker                 for (src = dest = 0; src < numSamples; src+=2, dest++)
441*f81fb7c4SAndroid Build Coastguard Worker                 {
442*f81fb7c4SAndroid Build Coastguard Worker                     gainLeft += gainIncLeft;
443*f81fb7c4SAndroid Build Coastguard Worker                     gainRight += gainIncRight;
444*f81fb7c4SAndroid Build Coastguard Worker                     temp = (pInputBuffer[src] * (gainLeft >> 15)) >> NUM_MIXER_GUARD_BITS;
445*f81fb7c4SAndroid Build Coastguard Worker                     temp += ((pInputBuffer[src+1] * (gainRight >> 15)) >> NUM_MIXER_GUARD_BITS);
446*f81fb7c4SAndroid Build Coastguard Worker                     pMixBuffer[dest] += temp;
447*f81fb7c4SAndroid Build Coastguard Worker                 }
448*f81fb7c4SAndroid Build Coastguard Worker                 break;
449*f81fb7c4SAndroid Build Coastguard Worker 
450*f81fb7c4SAndroid Build Coastguard Worker             /* stereo to stereo */
451*f81fb7c4SAndroid Build Coastguard Worker             case MIX_FLAGS_STEREO_SOURCE | MIX_FLAGS_STEREO_OUTPUT:
452*f81fb7c4SAndroid Build Coastguard Worker                 for (src = dest = 0; src < numSamples; src+=2, dest+=2)
453*f81fb7c4SAndroid Build Coastguard Worker                 {
454*f81fb7c4SAndroid Build Coastguard Worker                     gainLeft += gainIncLeft;
455*f81fb7c4SAndroid Build Coastguard Worker                     gainRight += gainIncRight;
456*f81fb7c4SAndroid Build Coastguard Worker                     pMixBuffer[dest] += (pInputBuffer[src] * (gainLeft >> 15)) >> NUM_MIXER_GUARD_BITS;
457*f81fb7c4SAndroid Build Coastguard Worker                     pMixBuffer[dest+1] += (pInputBuffer[src+1] * (gainRight >> 15)) >> NUM_MIXER_GUARD_BITS;
458*f81fb7c4SAndroid Build Coastguard Worker                 }
459*f81fb7c4SAndroid Build Coastguard Worker                 break;
460*f81fb7c4SAndroid Build Coastguard Worker         }
461*f81fb7c4SAndroid Build Coastguard Worker     }
462*f81fb7c4SAndroid Build Coastguard Worker }
463*f81fb7c4SAndroid Build Coastguard Worker #endif
464*f81fb7c4SAndroid Build Coastguard Worker #endif
465*f81fb7c4SAndroid Build Coastguard Worker 
466