1*ec779b8eSAndroid Build Coastguard Worker /*
2*ec779b8eSAndroid Build Coastguard Worker * Copyright (C) 2008 The Android Open Source Project
3*ec779b8eSAndroid Build Coastguard Worker *
4*ec779b8eSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*ec779b8eSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*ec779b8eSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*ec779b8eSAndroid Build Coastguard Worker *
8*ec779b8eSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*ec779b8eSAndroid Build Coastguard Worker *
10*ec779b8eSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*ec779b8eSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*ec779b8eSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*ec779b8eSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*ec779b8eSAndroid Build Coastguard Worker * limitations under the License.
15*ec779b8eSAndroid Build Coastguard Worker */
16*ec779b8eSAndroid Build Coastguard Worker
17*ec779b8eSAndroid Build Coastguard Worker #define LOG_TAG "EffectReverb"
18*ec779b8eSAndroid Build Coastguard Worker //#define LOG_NDEBUG 0
19*ec779b8eSAndroid Build Coastguard Worker
20*ec779b8eSAndroid Build Coastguard Worker #include <stdbool.h>
21*ec779b8eSAndroid Build Coastguard Worker #include <stdlib.h>
22*ec779b8eSAndroid Build Coastguard Worker #include <string.h>
23*ec779b8eSAndroid Build Coastguard Worker
24*ec779b8eSAndroid Build Coastguard Worker #include <log/log.h>
25*ec779b8eSAndroid Build Coastguard Worker
26*ec779b8eSAndroid Build Coastguard Worker #include "EffectReverb.h"
27*ec779b8eSAndroid Build Coastguard Worker #include "EffectsMath.h"
28*ec779b8eSAndroid Build Coastguard Worker
29*ec779b8eSAndroid Build Coastguard Worker // effect_handle_t interface implementation for reverb effect
30*ec779b8eSAndroid Build Coastguard Worker const struct effect_interface_s gReverbInterface = {
31*ec779b8eSAndroid Build Coastguard Worker Reverb_Process,
32*ec779b8eSAndroid Build Coastguard Worker Reverb_Command,
33*ec779b8eSAndroid Build Coastguard Worker Reverb_GetDescriptor,
34*ec779b8eSAndroid Build Coastguard Worker NULL
35*ec779b8eSAndroid Build Coastguard Worker };
36*ec779b8eSAndroid Build Coastguard Worker
37*ec779b8eSAndroid Build Coastguard Worker // Google auxiliary environmental reverb UUID: 1f0ae2e0-4ef7-11df-bc09-0002a5d5c51b
38*ec779b8eSAndroid Build Coastguard Worker static const effect_descriptor_t gAuxEnvReverbDescriptor = {
39*ec779b8eSAndroid Build Coastguard Worker {0xc2e5d5f0, 0x94bd, 0x4763, 0x9cac, {0x4e, 0x23, 0x4d, 0x06, 0x83, 0x9e}},
40*ec779b8eSAndroid Build Coastguard Worker {0x1f0ae2e0, 0x4ef7, 0x11df, 0xbc09, {0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}},
41*ec779b8eSAndroid Build Coastguard Worker EFFECT_CONTROL_API_VERSION,
42*ec779b8eSAndroid Build Coastguard Worker // flags other than EFFECT_FLAG_TYPE_AUXILIARY set for test purpose
43*ec779b8eSAndroid Build Coastguard Worker EFFECT_FLAG_TYPE_AUXILIARY | EFFECT_FLAG_DEVICE_IND | EFFECT_FLAG_AUDIO_MODE_IND,
44*ec779b8eSAndroid Build Coastguard Worker 0, // TODO
45*ec779b8eSAndroid Build Coastguard Worker 33,
46*ec779b8eSAndroid Build Coastguard Worker "Aux Environmental Reverb",
47*ec779b8eSAndroid Build Coastguard Worker "The Android Open Source Project"
48*ec779b8eSAndroid Build Coastguard Worker };
49*ec779b8eSAndroid Build Coastguard Worker
50*ec779b8eSAndroid Build Coastguard Worker // Google insert environmental reverb UUID: aa476040-6342-11df-91a4-0002a5d5c51b
51*ec779b8eSAndroid Build Coastguard Worker static const effect_descriptor_t gInsertEnvReverbDescriptor = {
52*ec779b8eSAndroid Build Coastguard Worker {0xc2e5d5f0, 0x94bd, 0x4763, 0x9cac, {0x4e, 0x23, 0x4d, 0x06, 0x83, 0x9e}},
53*ec779b8eSAndroid Build Coastguard Worker {0xaa476040, 0x6342, 0x11df, 0x91a4, {0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}},
54*ec779b8eSAndroid Build Coastguard Worker EFFECT_CONTROL_API_VERSION,
55*ec779b8eSAndroid Build Coastguard Worker EFFECT_FLAG_TYPE_INSERT | EFFECT_FLAG_INSERT_FIRST,
56*ec779b8eSAndroid Build Coastguard Worker 0, // TODO
57*ec779b8eSAndroid Build Coastguard Worker 33,
58*ec779b8eSAndroid Build Coastguard Worker "Insert Environmental reverb",
59*ec779b8eSAndroid Build Coastguard Worker "The Android Open Source Project"
60*ec779b8eSAndroid Build Coastguard Worker };
61*ec779b8eSAndroid Build Coastguard Worker
62*ec779b8eSAndroid Build Coastguard Worker // Google auxiliary preset reverb UUID: 63909320-53a6-11df-bdbd-0002a5d5c51b
63*ec779b8eSAndroid Build Coastguard Worker static const effect_descriptor_t gAuxPresetReverbDescriptor = {
64*ec779b8eSAndroid Build Coastguard Worker {0x47382d60, 0xddd8, 0x11db, 0xbf3a, {0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}},
65*ec779b8eSAndroid Build Coastguard Worker {0x63909320, 0x53a6, 0x11df, 0xbdbd, {0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}},
66*ec779b8eSAndroid Build Coastguard Worker EFFECT_CONTROL_API_VERSION,
67*ec779b8eSAndroid Build Coastguard Worker EFFECT_FLAG_TYPE_AUXILIARY,
68*ec779b8eSAndroid Build Coastguard Worker 0, // TODO
69*ec779b8eSAndroid Build Coastguard Worker 33,
70*ec779b8eSAndroid Build Coastguard Worker "Aux Preset Reverb",
71*ec779b8eSAndroid Build Coastguard Worker "The Android Open Source Project"
72*ec779b8eSAndroid Build Coastguard Worker };
73*ec779b8eSAndroid Build Coastguard Worker
74*ec779b8eSAndroid Build Coastguard Worker // Google insert preset reverb UUID: d93dc6a0-6342-11df-b128-0002a5d5c51b
75*ec779b8eSAndroid Build Coastguard Worker static const effect_descriptor_t gInsertPresetReverbDescriptor = {
76*ec779b8eSAndroid Build Coastguard Worker {0x47382d60, 0xddd8, 0x11db, 0xbf3a, {0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}},
77*ec779b8eSAndroid Build Coastguard Worker {0xd93dc6a0, 0x6342, 0x11df, 0xb128, {0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}},
78*ec779b8eSAndroid Build Coastguard Worker EFFECT_CONTROL_API_VERSION,
79*ec779b8eSAndroid Build Coastguard Worker EFFECT_FLAG_TYPE_INSERT | EFFECT_FLAG_INSERT_FIRST,
80*ec779b8eSAndroid Build Coastguard Worker 0, // TODO
81*ec779b8eSAndroid Build Coastguard Worker 33,
82*ec779b8eSAndroid Build Coastguard Worker "Insert Preset Reverb",
83*ec779b8eSAndroid Build Coastguard Worker "The Android Open Source Project"
84*ec779b8eSAndroid Build Coastguard Worker };
85*ec779b8eSAndroid Build Coastguard Worker
86*ec779b8eSAndroid Build Coastguard Worker // gDescriptors contains pointers to all defined effect descriptor in this library
87*ec779b8eSAndroid Build Coastguard Worker static const effect_descriptor_t * const gDescriptors[] = {
88*ec779b8eSAndroid Build Coastguard Worker &gAuxEnvReverbDescriptor,
89*ec779b8eSAndroid Build Coastguard Worker &gInsertEnvReverbDescriptor,
90*ec779b8eSAndroid Build Coastguard Worker &gAuxPresetReverbDescriptor,
91*ec779b8eSAndroid Build Coastguard Worker &gInsertPresetReverbDescriptor
92*ec779b8eSAndroid Build Coastguard Worker };
93*ec779b8eSAndroid Build Coastguard Worker
94*ec779b8eSAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
95*ec779b8eSAndroid Build Coastguard Worker * Effect API implementation
96*ec779b8eSAndroid Build Coastguard Worker *--------------------------------------------------------------------------*/
97*ec779b8eSAndroid Build Coastguard Worker
98*ec779b8eSAndroid Build Coastguard Worker /*--- Effect Library Interface Implementation ---*/
99*ec779b8eSAndroid Build Coastguard Worker
EffectCreate(const effect_uuid_t * uuid,int32_t sessionId,int32_t ioId,effect_handle_t * pHandle)100*ec779b8eSAndroid Build Coastguard Worker int EffectCreate(const effect_uuid_t *uuid,
101*ec779b8eSAndroid Build Coastguard Worker int32_t sessionId,
102*ec779b8eSAndroid Build Coastguard Worker int32_t ioId,
103*ec779b8eSAndroid Build Coastguard Worker effect_handle_t *pHandle) {
104*ec779b8eSAndroid Build Coastguard Worker int ret;
105*ec779b8eSAndroid Build Coastguard Worker int i;
106*ec779b8eSAndroid Build Coastguard Worker reverb_module_t *module;
107*ec779b8eSAndroid Build Coastguard Worker const effect_descriptor_t *desc;
108*ec779b8eSAndroid Build Coastguard Worker int aux = 0;
109*ec779b8eSAndroid Build Coastguard Worker int preset = 0;
110*ec779b8eSAndroid Build Coastguard Worker (void)sessionId;
111*ec779b8eSAndroid Build Coastguard Worker (void)ioId;
112*ec779b8eSAndroid Build Coastguard Worker
113*ec779b8eSAndroid Build Coastguard Worker ALOGV("EffectLibCreateEffect start");
114*ec779b8eSAndroid Build Coastguard Worker
115*ec779b8eSAndroid Build Coastguard Worker if (pHandle == NULL || uuid == NULL) {
116*ec779b8eSAndroid Build Coastguard Worker return -EINVAL;
117*ec779b8eSAndroid Build Coastguard Worker }
118*ec779b8eSAndroid Build Coastguard Worker
119*ec779b8eSAndroid Build Coastguard Worker for (i = 0; gDescriptors[i] != NULL; i++) {
120*ec779b8eSAndroid Build Coastguard Worker desc = gDescriptors[i];
121*ec779b8eSAndroid Build Coastguard Worker if (memcmp(uuid, &desc->uuid, sizeof(effect_uuid_t))
122*ec779b8eSAndroid Build Coastguard Worker == 0) {
123*ec779b8eSAndroid Build Coastguard Worker break;
124*ec779b8eSAndroid Build Coastguard Worker }
125*ec779b8eSAndroid Build Coastguard Worker }
126*ec779b8eSAndroid Build Coastguard Worker
127*ec779b8eSAndroid Build Coastguard Worker if (gDescriptors[i] == NULL) {
128*ec779b8eSAndroid Build Coastguard Worker return -ENOENT;
129*ec779b8eSAndroid Build Coastguard Worker }
130*ec779b8eSAndroid Build Coastguard Worker
131*ec779b8eSAndroid Build Coastguard Worker module = malloc(sizeof(reverb_module_t));
132*ec779b8eSAndroid Build Coastguard Worker
133*ec779b8eSAndroid Build Coastguard Worker module->itfe = &gReverbInterface;
134*ec779b8eSAndroid Build Coastguard Worker
135*ec779b8eSAndroid Build Coastguard Worker module->context.mState = REVERB_STATE_UNINITIALIZED;
136*ec779b8eSAndroid Build Coastguard Worker
137*ec779b8eSAndroid Build Coastguard Worker if (memcmp(&desc->type, SL_IID_PRESETREVERB, sizeof(effect_uuid_t)) == 0) {
138*ec779b8eSAndroid Build Coastguard Worker preset = 1;
139*ec779b8eSAndroid Build Coastguard Worker }
140*ec779b8eSAndroid Build Coastguard Worker if ((desc->flags & EFFECT_FLAG_TYPE_MASK) == EFFECT_FLAG_TYPE_AUXILIARY) {
141*ec779b8eSAndroid Build Coastguard Worker aux = 1;
142*ec779b8eSAndroid Build Coastguard Worker }
143*ec779b8eSAndroid Build Coastguard Worker ret = Reverb_Init(module, aux, preset);
144*ec779b8eSAndroid Build Coastguard Worker if (ret < 0) {
145*ec779b8eSAndroid Build Coastguard Worker ALOGW("EffectLibCreateEffect() init failed");
146*ec779b8eSAndroid Build Coastguard Worker free(module);
147*ec779b8eSAndroid Build Coastguard Worker return ret;
148*ec779b8eSAndroid Build Coastguard Worker }
149*ec779b8eSAndroid Build Coastguard Worker
150*ec779b8eSAndroid Build Coastguard Worker *pHandle = (effect_handle_t) module;
151*ec779b8eSAndroid Build Coastguard Worker
152*ec779b8eSAndroid Build Coastguard Worker module->context.mState = REVERB_STATE_INITIALIZED;
153*ec779b8eSAndroid Build Coastguard Worker
154*ec779b8eSAndroid Build Coastguard Worker ALOGV("EffectLibCreateEffect %p ,size %zu", module, sizeof(reverb_module_t));
155*ec779b8eSAndroid Build Coastguard Worker
156*ec779b8eSAndroid Build Coastguard Worker return 0;
157*ec779b8eSAndroid Build Coastguard Worker }
158*ec779b8eSAndroid Build Coastguard Worker
EffectRelease(effect_handle_t handle)159*ec779b8eSAndroid Build Coastguard Worker int EffectRelease(effect_handle_t handle) {
160*ec779b8eSAndroid Build Coastguard Worker reverb_module_t *pRvbModule = (reverb_module_t *)handle;
161*ec779b8eSAndroid Build Coastguard Worker
162*ec779b8eSAndroid Build Coastguard Worker ALOGV("EffectLibReleaseEffect %p", handle);
163*ec779b8eSAndroid Build Coastguard Worker if (handle == NULL) {
164*ec779b8eSAndroid Build Coastguard Worker return -EINVAL;
165*ec779b8eSAndroid Build Coastguard Worker }
166*ec779b8eSAndroid Build Coastguard Worker
167*ec779b8eSAndroid Build Coastguard Worker pRvbModule->context.mState = REVERB_STATE_UNINITIALIZED;
168*ec779b8eSAndroid Build Coastguard Worker
169*ec779b8eSAndroid Build Coastguard Worker free(pRvbModule);
170*ec779b8eSAndroid Build Coastguard Worker return 0;
171*ec779b8eSAndroid Build Coastguard Worker }
172*ec779b8eSAndroid Build Coastguard Worker
EffectGetDescriptor(const effect_uuid_t * uuid,effect_descriptor_t * pDescriptor)173*ec779b8eSAndroid Build Coastguard Worker int EffectGetDescriptor(const effect_uuid_t *uuid,
174*ec779b8eSAndroid Build Coastguard Worker effect_descriptor_t *pDescriptor) {
175*ec779b8eSAndroid Build Coastguard Worker int i;
176*ec779b8eSAndroid Build Coastguard Worker int length = sizeof(gDescriptors) / sizeof(const effect_descriptor_t *);
177*ec779b8eSAndroid Build Coastguard Worker
178*ec779b8eSAndroid Build Coastguard Worker if (pDescriptor == NULL || uuid == NULL){
179*ec779b8eSAndroid Build Coastguard Worker ALOGV("EffectGetDescriptor() called with NULL pointer");
180*ec779b8eSAndroid Build Coastguard Worker return -EINVAL;
181*ec779b8eSAndroid Build Coastguard Worker }
182*ec779b8eSAndroid Build Coastguard Worker
183*ec779b8eSAndroid Build Coastguard Worker for (i = 0; i < length; i++) {
184*ec779b8eSAndroid Build Coastguard Worker if (memcmp(uuid, &gDescriptors[i]->uuid, sizeof(effect_uuid_t)) == 0) {
185*ec779b8eSAndroid Build Coastguard Worker *pDescriptor = *gDescriptors[i];
186*ec779b8eSAndroid Build Coastguard Worker ALOGV("EffectGetDescriptor - UUID matched Reverb type %d, UUID = %x",
187*ec779b8eSAndroid Build Coastguard Worker i, gDescriptors[i]->uuid.timeLow);
188*ec779b8eSAndroid Build Coastguard Worker return 0;
189*ec779b8eSAndroid Build Coastguard Worker }
190*ec779b8eSAndroid Build Coastguard Worker }
191*ec779b8eSAndroid Build Coastguard Worker
192*ec779b8eSAndroid Build Coastguard Worker return -EINVAL;
193*ec779b8eSAndroid Build Coastguard Worker } /* end EffectGetDescriptor */
194*ec779b8eSAndroid Build Coastguard Worker
195*ec779b8eSAndroid Build Coastguard Worker /*--- Effect Control Interface Implementation ---*/
196*ec779b8eSAndroid Build Coastguard Worker
Reverb_Process(effect_handle_t self,audio_buffer_t * inBuffer,audio_buffer_t * outBuffer)197*ec779b8eSAndroid Build Coastguard Worker static int Reverb_Process(effect_handle_t self, audio_buffer_t *inBuffer, audio_buffer_t *outBuffer) {
198*ec779b8eSAndroid Build Coastguard Worker reverb_object_t *pReverb;
199*ec779b8eSAndroid Build Coastguard Worker int16_t *pSrc, *pDst;
200*ec779b8eSAndroid Build Coastguard Worker reverb_module_t *pRvbModule = (reverb_module_t *)self;
201*ec779b8eSAndroid Build Coastguard Worker
202*ec779b8eSAndroid Build Coastguard Worker if (pRvbModule == NULL) {
203*ec779b8eSAndroid Build Coastguard Worker return -EINVAL;
204*ec779b8eSAndroid Build Coastguard Worker }
205*ec779b8eSAndroid Build Coastguard Worker
206*ec779b8eSAndroid Build Coastguard Worker if (inBuffer == NULL || inBuffer->raw == NULL ||
207*ec779b8eSAndroid Build Coastguard Worker outBuffer == NULL || outBuffer->raw == NULL ||
208*ec779b8eSAndroid Build Coastguard Worker inBuffer->frameCount != outBuffer->frameCount) {
209*ec779b8eSAndroid Build Coastguard Worker return -EINVAL;
210*ec779b8eSAndroid Build Coastguard Worker }
211*ec779b8eSAndroid Build Coastguard Worker
212*ec779b8eSAndroid Build Coastguard Worker pReverb = (reverb_object_t*) &pRvbModule->context;
213*ec779b8eSAndroid Build Coastguard Worker
214*ec779b8eSAndroid Build Coastguard Worker if (pReverb->mState == REVERB_STATE_UNINITIALIZED) {
215*ec779b8eSAndroid Build Coastguard Worker return -EINVAL;
216*ec779b8eSAndroid Build Coastguard Worker }
217*ec779b8eSAndroid Build Coastguard Worker if (pReverb->mState == REVERB_STATE_INITIALIZED) {
218*ec779b8eSAndroid Build Coastguard Worker return -ENODATA;
219*ec779b8eSAndroid Build Coastguard Worker }
220*ec779b8eSAndroid Build Coastguard Worker
221*ec779b8eSAndroid Build Coastguard Worker //if bypassed or the preset forces the signal to be completely dry
222*ec779b8eSAndroid Build Coastguard Worker if (pReverb->m_bBypass != 0) {
223*ec779b8eSAndroid Build Coastguard Worker if (inBuffer->raw != outBuffer->raw) {
224*ec779b8eSAndroid Build Coastguard Worker int16_t smp;
225*ec779b8eSAndroid Build Coastguard Worker pSrc = inBuffer->s16;
226*ec779b8eSAndroid Build Coastguard Worker pDst = outBuffer->s16;
227*ec779b8eSAndroid Build Coastguard Worker size_t count = inBuffer->frameCount;
228*ec779b8eSAndroid Build Coastguard Worker if (pRvbModule->config.inputCfg.channels == pRvbModule->config.outputCfg.channels) {
229*ec779b8eSAndroid Build Coastguard Worker count *= 2;
230*ec779b8eSAndroid Build Coastguard Worker while (count--) {
231*ec779b8eSAndroid Build Coastguard Worker *pDst++ = *pSrc++;
232*ec779b8eSAndroid Build Coastguard Worker }
233*ec779b8eSAndroid Build Coastguard Worker } else {
234*ec779b8eSAndroid Build Coastguard Worker while (count--) {
235*ec779b8eSAndroid Build Coastguard Worker smp = *pSrc++;
236*ec779b8eSAndroid Build Coastguard Worker *pDst++ = smp;
237*ec779b8eSAndroid Build Coastguard Worker *pDst++ = smp;
238*ec779b8eSAndroid Build Coastguard Worker }
239*ec779b8eSAndroid Build Coastguard Worker }
240*ec779b8eSAndroid Build Coastguard Worker }
241*ec779b8eSAndroid Build Coastguard Worker return 0;
242*ec779b8eSAndroid Build Coastguard Worker }
243*ec779b8eSAndroid Build Coastguard Worker
244*ec779b8eSAndroid Build Coastguard Worker if (pReverb->m_nNextRoom != pReverb->m_nCurrentRoom) {
245*ec779b8eSAndroid Build Coastguard Worker ReverbUpdateRoom(pReverb, true);
246*ec779b8eSAndroid Build Coastguard Worker }
247*ec779b8eSAndroid Build Coastguard Worker
248*ec779b8eSAndroid Build Coastguard Worker pSrc = inBuffer->s16;
249*ec779b8eSAndroid Build Coastguard Worker pDst = outBuffer->s16;
250*ec779b8eSAndroid Build Coastguard Worker size_t numSamples = outBuffer->frameCount;
251*ec779b8eSAndroid Build Coastguard Worker while (numSamples) {
252*ec779b8eSAndroid Build Coastguard Worker uint32_t processedSamples;
253*ec779b8eSAndroid Build Coastguard Worker if (numSamples > (uint32_t) pReverb->m_nUpdatePeriodInSamples) {
254*ec779b8eSAndroid Build Coastguard Worker processedSamples = (uint32_t) pReverb->m_nUpdatePeriodInSamples;
255*ec779b8eSAndroid Build Coastguard Worker } else {
256*ec779b8eSAndroid Build Coastguard Worker processedSamples = numSamples;
257*ec779b8eSAndroid Build Coastguard Worker }
258*ec779b8eSAndroid Build Coastguard Worker
259*ec779b8eSAndroid Build Coastguard Worker /* increment update counter */
260*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nUpdateCounter += (int16_t) processedSamples;
261*ec779b8eSAndroid Build Coastguard Worker /* check if update counter needs to be reset */
262*ec779b8eSAndroid Build Coastguard Worker if (pReverb->m_nUpdateCounter >= pReverb->m_nUpdatePeriodInSamples) {
263*ec779b8eSAndroid Build Coastguard Worker /* update interval has elapsed, so reset counter */
264*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nUpdateCounter -= pReverb->m_nUpdatePeriodInSamples;
265*ec779b8eSAndroid Build Coastguard Worker ReverbUpdateXfade(pReverb, pReverb->m_nUpdatePeriodInSamples);
266*ec779b8eSAndroid Build Coastguard Worker
267*ec779b8eSAndroid Build Coastguard Worker } /* end if m_nUpdateCounter >= update interval */
268*ec779b8eSAndroid Build Coastguard Worker
269*ec779b8eSAndroid Build Coastguard Worker Reverb(pReverb, processedSamples, pDst, pSrc);
270*ec779b8eSAndroid Build Coastguard Worker
271*ec779b8eSAndroid Build Coastguard Worker numSamples -= processedSamples;
272*ec779b8eSAndroid Build Coastguard Worker if (pReverb->m_Aux) {
273*ec779b8eSAndroid Build Coastguard Worker pSrc += processedSamples;
274*ec779b8eSAndroid Build Coastguard Worker } else {
275*ec779b8eSAndroid Build Coastguard Worker pSrc += processedSamples * NUM_OUTPUT_CHANNELS;
276*ec779b8eSAndroid Build Coastguard Worker }
277*ec779b8eSAndroid Build Coastguard Worker pDst += processedSamples * NUM_OUTPUT_CHANNELS;
278*ec779b8eSAndroid Build Coastguard Worker }
279*ec779b8eSAndroid Build Coastguard Worker
280*ec779b8eSAndroid Build Coastguard Worker return 0;
281*ec779b8eSAndroid Build Coastguard Worker }
282*ec779b8eSAndroid Build Coastguard Worker
283*ec779b8eSAndroid Build Coastguard Worker
Reverb_Command(effect_handle_t self,uint32_t cmdCode,uint32_t cmdSize,void * pCmdData,uint32_t * replySize,void * pReplyData)284*ec779b8eSAndroid Build Coastguard Worker static int Reverb_Command(effect_handle_t self, uint32_t cmdCode, uint32_t cmdSize,
285*ec779b8eSAndroid Build Coastguard Worker void *pCmdData, uint32_t *replySize, void *pReplyData) {
286*ec779b8eSAndroid Build Coastguard Worker reverb_module_t *pRvbModule = (reverb_module_t *) self;
287*ec779b8eSAndroid Build Coastguard Worker reverb_object_t *pReverb;
288*ec779b8eSAndroid Build Coastguard Worker
289*ec779b8eSAndroid Build Coastguard Worker if (pRvbModule == NULL ||
290*ec779b8eSAndroid Build Coastguard Worker pRvbModule->context.mState == REVERB_STATE_UNINITIALIZED) {
291*ec779b8eSAndroid Build Coastguard Worker return -EINVAL;
292*ec779b8eSAndroid Build Coastguard Worker }
293*ec779b8eSAndroid Build Coastguard Worker
294*ec779b8eSAndroid Build Coastguard Worker pReverb = (reverb_object_t*) &pRvbModule->context;
295*ec779b8eSAndroid Build Coastguard Worker
296*ec779b8eSAndroid Build Coastguard Worker ALOGV("Reverb_Command command %d cmdSize %d",cmdCode, cmdSize);
297*ec779b8eSAndroid Build Coastguard Worker
298*ec779b8eSAndroid Build Coastguard Worker switch (cmdCode) {
299*ec779b8eSAndroid Build Coastguard Worker case EFFECT_CMD_INIT:
300*ec779b8eSAndroid Build Coastguard Worker if (pReplyData == NULL || *replySize != sizeof(int)) {
301*ec779b8eSAndroid Build Coastguard Worker return -EINVAL;
302*ec779b8eSAndroid Build Coastguard Worker }
303*ec779b8eSAndroid Build Coastguard Worker *(int *) pReplyData = Reverb_Init(pRvbModule, pReverb->m_Aux, pReverb->m_Preset);
304*ec779b8eSAndroid Build Coastguard Worker if (*(int *) pReplyData == 0) {
305*ec779b8eSAndroid Build Coastguard Worker pRvbModule->context.mState = REVERB_STATE_INITIALIZED;
306*ec779b8eSAndroid Build Coastguard Worker }
307*ec779b8eSAndroid Build Coastguard Worker break;
308*ec779b8eSAndroid Build Coastguard Worker case EFFECT_CMD_SET_CONFIG:
309*ec779b8eSAndroid Build Coastguard Worker if (pCmdData == NULL || cmdSize != sizeof(effect_config_t)
310*ec779b8eSAndroid Build Coastguard Worker || pReplyData == NULL || *replySize != sizeof(int)) {
311*ec779b8eSAndroid Build Coastguard Worker return -EINVAL;
312*ec779b8eSAndroid Build Coastguard Worker }
313*ec779b8eSAndroid Build Coastguard Worker *(int *) pReplyData = Reverb_setConfig(pRvbModule,
314*ec779b8eSAndroid Build Coastguard Worker (effect_config_t *)pCmdData, false);
315*ec779b8eSAndroid Build Coastguard Worker break;
316*ec779b8eSAndroid Build Coastguard Worker case EFFECT_CMD_GET_CONFIG:
317*ec779b8eSAndroid Build Coastguard Worker if (pReplyData == NULL || *replySize != sizeof(effect_config_t)) {
318*ec779b8eSAndroid Build Coastguard Worker return -EINVAL;
319*ec779b8eSAndroid Build Coastguard Worker }
320*ec779b8eSAndroid Build Coastguard Worker Reverb_getConfig(pRvbModule, (effect_config_t *) pCmdData);
321*ec779b8eSAndroid Build Coastguard Worker break;
322*ec779b8eSAndroid Build Coastguard Worker case EFFECT_CMD_RESET:
323*ec779b8eSAndroid Build Coastguard Worker Reverb_Reset(pReverb, false);
324*ec779b8eSAndroid Build Coastguard Worker break;
325*ec779b8eSAndroid Build Coastguard Worker case EFFECT_CMD_GET_PARAM:
326*ec779b8eSAndroid Build Coastguard Worker ALOGV("Reverb_Command EFFECT_CMD_GET_PARAM pCmdData %p, *replySize %d, pReplyData: %p",pCmdData, *replySize, pReplyData);
327*ec779b8eSAndroid Build Coastguard Worker
328*ec779b8eSAndroid Build Coastguard Worker if (pCmdData == NULL || cmdSize < (int)(sizeof(effect_param_t) + sizeof(int32_t)) ||
329*ec779b8eSAndroid Build Coastguard Worker pReplyData == NULL || *replySize < (int) sizeof(effect_param_t)) {
330*ec779b8eSAndroid Build Coastguard Worker return -EINVAL;
331*ec779b8eSAndroid Build Coastguard Worker }
332*ec779b8eSAndroid Build Coastguard Worker effect_param_t *rep = (effect_param_t *) pReplyData;
333*ec779b8eSAndroid Build Coastguard Worker memcpy(pReplyData, pCmdData, sizeof(effect_param_t) + sizeof(int32_t));
334*ec779b8eSAndroid Build Coastguard Worker ALOGV("Reverb_Command EFFECT_CMD_GET_PARAM param %d, replySize %d",*(int32_t *)rep->data, rep->vsize);
335*ec779b8eSAndroid Build Coastguard Worker rep->status = Reverb_getParameter(pReverb, *(int32_t *)rep->data, &rep->vsize,
336*ec779b8eSAndroid Build Coastguard Worker rep->data + sizeof(int32_t));
337*ec779b8eSAndroid Build Coastguard Worker *replySize = sizeof(effect_param_t) + sizeof(int32_t) + rep->vsize;
338*ec779b8eSAndroid Build Coastguard Worker break;
339*ec779b8eSAndroid Build Coastguard Worker case EFFECT_CMD_SET_PARAM:
340*ec779b8eSAndroid Build Coastguard Worker ALOGV("Reverb_Command EFFECT_CMD_SET_PARAM cmdSize %d pCmdData %p, *replySize %d, pReplyData %p",
341*ec779b8eSAndroid Build Coastguard Worker cmdSize, pCmdData, *replySize, pReplyData);
342*ec779b8eSAndroid Build Coastguard Worker if (pCmdData == NULL || (cmdSize < (int)(sizeof(effect_param_t) + sizeof(int32_t)))
343*ec779b8eSAndroid Build Coastguard Worker || pReplyData == NULL || *replySize != (int)sizeof(int32_t)) {
344*ec779b8eSAndroid Build Coastguard Worker return -EINVAL;
345*ec779b8eSAndroid Build Coastguard Worker }
346*ec779b8eSAndroid Build Coastguard Worker effect_param_t *cmd = (effect_param_t *) pCmdData;
347*ec779b8eSAndroid Build Coastguard Worker *(int *)pReplyData = Reverb_setParameter(pReverb, *(int32_t *)cmd->data,
348*ec779b8eSAndroid Build Coastguard Worker cmd->vsize, cmd->data + sizeof(int32_t));
349*ec779b8eSAndroid Build Coastguard Worker break;
350*ec779b8eSAndroid Build Coastguard Worker case EFFECT_CMD_ENABLE:
351*ec779b8eSAndroid Build Coastguard Worker if (pReplyData == NULL || *replySize != sizeof(int)) {
352*ec779b8eSAndroid Build Coastguard Worker return -EINVAL;
353*ec779b8eSAndroid Build Coastguard Worker }
354*ec779b8eSAndroid Build Coastguard Worker if (pReverb->mState != REVERB_STATE_INITIALIZED) {
355*ec779b8eSAndroid Build Coastguard Worker return -ENOSYS;
356*ec779b8eSAndroid Build Coastguard Worker }
357*ec779b8eSAndroid Build Coastguard Worker pReverb->mState = REVERB_STATE_ACTIVE;
358*ec779b8eSAndroid Build Coastguard Worker ALOGV("EFFECT_CMD_ENABLE() OK");
359*ec779b8eSAndroid Build Coastguard Worker *(int *)pReplyData = 0;
360*ec779b8eSAndroid Build Coastguard Worker break;
361*ec779b8eSAndroid Build Coastguard Worker case EFFECT_CMD_DISABLE:
362*ec779b8eSAndroid Build Coastguard Worker if (pReplyData == NULL || *replySize != sizeof(int)) {
363*ec779b8eSAndroid Build Coastguard Worker return -EINVAL;
364*ec779b8eSAndroid Build Coastguard Worker }
365*ec779b8eSAndroid Build Coastguard Worker if (pReverb->mState != REVERB_STATE_ACTIVE) {
366*ec779b8eSAndroid Build Coastguard Worker return -ENOSYS;
367*ec779b8eSAndroid Build Coastguard Worker }
368*ec779b8eSAndroid Build Coastguard Worker pReverb->mState = REVERB_STATE_INITIALIZED;
369*ec779b8eSAndroid Build Coastguard Worker ALOGV("EFFECT_CMD_DISABLE() OK");
370*ec779b8eSAndroid Build Coastguard Worker *(int *)pReplyData = 0;
371*ec779b8eSAndroid Build Coastguard Worker break;
372*ec779b8eSAndroid Build Coastguard Worker case EFFECT_CMD_SET_DEVICE:
373*ec779b8eSAndroid Build Coastguard Worker if (pCmdData == NULL || cmdSize != (int)sizeof(uint32_t)) {
374*ec779b8eSAndroid Build Coastguard Worker return -EINVAL;
375*ec779b8eSAndroid Build Coastguard Worker }
376*ec779b8eSAndroid Build Coastguard Worker ALOGV("Reverb_Command EFFECT_CMD_SET_DEVICE: 0x%08x", *(uint32_t *)pCmdData);
377*ec779b8eSAndroid Build Coastguard Worker break;
378*ec779b8eSAndroid Build Coastguard Worker case EFFECT_CMD_SET_VOLUME: {
379*ec779b8eSAndroid Build Coastguard Worker // audio output is always stereo => 2 channel volumes
380*ec779b8eSAndroid Build Coastguard Worker if (pCmdData == NULL || cmdSize != (int)sizeof(uint32_t) * 2) {
381*ec779b8eSAndroid Build Coastguard Worker return -EINVAL;
382*ec779b8eSAndroid Build Coastguard Worker }
383*ec779b8eSAndroid Build Coastguard Worker float left = (float)(*(uint32_t *)pCmdData) / (1 << 24);
384*ec779b8eSAndroid Build Coastguard Worker float right = (float)(*((uint32_t *)pCmdData + 1)) / (1 << 24);
385*ec779b8eSAndroid Build Coastguard Worker ALOGV("Reverb_Command EFFECT_CMD_SET_VOLUME: left %f, right %f ", left, right);
386*ec779b8eSAndroid Build Coastguard Worker break;
387*ec779b8eSAndroid Build Coastguard Worker }
388*ec779b8eSAndroid Build Coastguard Worker case EFFECT_CMD_SET_AUDIO_MODE:
389*ec779b8eSAndroid Build Coastguard Worker if (pCmdData == NULL || cmdSize != (int)sizeof(uint32_t)) {
390*ec779b8eSAndroid Build Coastguard Worker return -EINVAL;
391*ec779b8eSAndroid Build Coastguard Worker }
392*ec779b8eSAndroid Build Coastguard Worker ALOGV("Reverb_Command EFFECT_CMD_SET_AUDIO_MODE: %d", *(uint32_t *)pCmdData);
393*ec779b8eSAndroid Build Coastguard Worker break;
394*ec779b8eSAndroid Build Coastguard Worker default:
395*ec779b8eSAndroid Build Coastguard Worker ALOGW("Reverb_Command invalid command %d",cmdCode);
396*ec779b8eSAndroid Build Coastguard Worker return -EINVAL;
397*ec779b8eSAndroid Build Coastguard Worker }
398*ec779b8eSAndroid Build Coastguard Worker
399*ec779b8eSAndroid Build Coastguard Worker return 0;
400*ec779b8eSAndroid Build Coastguard Worker }
401*ec779b8eSAndroid Build Coastguard Worker
Reverb_GetDescriptor(effect_handle_t self,effect_descriptor_t * pDescriptor)402*ec779b8eSAndroid Build Coastguard Worker int Reverb_GetDescriptor(effect_handle_t self,
403*ec779b8eSAndroid Build Coastguard Worker effect_descriptor_t *pDescriptor)
404*ec779b8eSAndroid Build Coastguard Worker {
405*ec779b8eSAndroid Build Coastguard Worker reverb_module_t *pRvbModule = (reverb_module_t *) self;
406*ec779b8eSAndroid Build Coastguard Worker reverb_object_t *pReverb;
407*ec779b8eSAndroid Build Coastguard Worker const effect_descriptor_t *desc;
408*ec779b8eSAndroid Build Coastguard Worker
409*ec779b8eSAndroid Build Coastguard Worker if (pRvbModule == NULL ||
410*ec779b8eSAndroid Build Coastguard Worker pRvbModule->context.mState == REVERB_STATE_UNINITIALIZED) {
411*ec779b8eSAndroid Build Coastguard Worker return -EINVAL;
412*ec779b8eSAndroid Build Coastguard Worker }
413*ec779b8eSAndroid Build Coastguard Worker
414*ec779b8eSAndroid Build Coastguard Worker pReverb = (reverb_object_t*) &pRvbModule->context;
415*ec779b8eSAndroid Build Coastguard Worker
416*ec779b8eSAndroid Build Coastguard Worker if (pReverb->m_Aux) {
417*ec779b8eSAndroid Build Coastguard Worker if (pReverb->m_Preset) {
418*ec779b8eSAndroid Build Coastguard Worker desc = &gAuxPresetReverbDescriptor;
419*ec779b8eSAndroid Build Coastguard Worker } else {
420*ec779b8eSAndroid Build Coastguard Worker desc = &gAuxEnvReverbDescriptor;
421*ec779b8eSAndroid Build Coastguard Worker }
422*ec779b8eSAndroid Build Coastguard Worker } else {
423*ec779b8eSAndroid Build Coastguard Worker if (pReverb->m_Preset) {
424*ec779b8eSAndroid Build Coastguard Worker desc = &gInsertPresetReverbDescriptor;
425*ec779b8eSAndroid Build Coastguard Worker } else {
426*ec779b8eSAndroid Build Coastguard Worker desc = &gInsertEnvReverbDescriptor;
427*ec779b8eSAndroid Build Coastguard Worker }
428*ec779b8eSAndroid Build Coastguard Worker }
429*ec779b8eSAndroid Build Coastguard Worker
430*ec779b8eSAndroid Build Coastguard Worker *pDescriptor = *desc;
431*ec779b8eSAndroid Build Coastguard Worker
432*ec779b8eSAndroid Build Coastguard Worker return 0;
433*ec779b8eSAndroid Build Coastguard Worker } /* end Reverb_getDescriptor */
434*ec779b8eSAndroid Build Coastguard Worker
435*ec779b8eSAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
436*ec779b8eSAndroid Build Coastguard Worker * Reverb internal functions
437*ec779b8eSAndroid Build Coastguard Worker *--------------------------------------------------------------------------*/
438*ec779b8eSAndroid Build Coastguard Worker
439*ec779b8eSAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
440*ec779b8eSAndroid Build Coastguard Worker * Reverb_Init()
441*ec779b8eSAndroid Build Coastguard Worker *----------------------------------------------------------------------------
442*ec779b8eSAndroid Build Coastguard Worker * Purpose:
443*ec779b8eSAndroid Build Coastguard Worker * Initialize reverb context and apply default parameters
444*ec779b8eSAndroid Build Coastguard Worker *
445*ec779b8eSAndroid Build Coastguard Worker * Inputs:
446*ec779b8eSAndroid Build Coastguard Worker * pRvbModule - pointer to reverb effect module
447*ec779b8eSAndroid Build Coastguard Worker * aux - indicates if the reverb is used as auxiliary (1) or insert (0)
448*ec779b8eSAndroid Build Coastguard Worker * preset - indicates if the reverb is used in preset (1) or environmental (0) mode
449*ec779b8eSAndroid Build Coastguard Worker *
450*ec779b8eSAndroid Build Coastguard Worker * Outputs:
451*ec779b8eSAndroid Build Coastguard Worker *
452*ec779b8eSAndroid Build Coastguard Worker * Side Effects:
453*ec779b8eSAndroid Build Coastguard Worker *
454*ec779b8eSAndroid Build Coastguard Worker *----------------------------------------------------------------------------
455*ec779b8eSAndroid Build Coastguard Worker */
456*ec779b8eSAndroid Build Coastguard Worker
Reverb_Init(reverb_module_t * pRvbModule,int aux,int preset)457*ec779b8eSAndroid Build Coastguard Worker int Reverb_Init(reverb_module_t *pRvbModule, int aux, int preset) {
458*ec779b8eSAndroid Build Coastguard Worker int ret;
459*ec779b8eSAndroid Build Coastguard Worker
460*ec779b8eSAndroid Build Coastguard Worker ALOGV("Reverb_Init module %p, aux: %d, preset: %d", pRvbModule,aux, preset);
461*ec779b8eSAndroid Build Coastguard Worker
462*ec779b8eSAndroid Build Coastguard Worker memset(&pRvbModule->context, 0, sizeof(reverb_object_t));
463*ec779b8eSAndroid Build Coastguard Worker
464*ec779b8eSAndroid Build Coastguard Worker pRvbModule->context.m_Aux = (uint16_t)aux;
465*ec779b8eSAndroid Build Coastguard Worker pRvbModule->context.m_Preset = (uint16_t)preset;
466*ec779b8eSAndroid Build Coastguard Worker
467*ec779b8eSAndroid Build Coastguard Worker pRvbModule->config.inputCfg.samplingRate = 44100;
468*ec779b8eSAndroid Build Coastguard Worker if (aux) {
469*ec779b8eSAndroid Build Coastguard Worker pRvbModule->config.inputCfg.channels = AUDIO_CHANNEL_OUT_MONO;
470*ec779b8eSAndroid Build Coastguard Worker } else {
471*ec779b8eSAndroid Build Coastguard Worker pRvbModule->config.inputCfg.channels = AUDIO_CHANNEL_OUT_STEREO;
472*ec779b8eSAndroid Build Coastguard Worker }
473*ec779b8eSAndroid Build Coastguard Worker pRvbModule->config.inputCfg.format = AUDIO_FORMAT_PCM_16_BIT;
474*ec779b8eSAndroid Build Coastguard Worker pRvbModule->config.inputCfg.bufferProvider.getBuffer = NULL;
475*ec779b8eSAndroid Build Coastguard Worker pRvbModule->config.inputCfg.bufferProvider.releaseBuffer = NULL;
476*ec779b8eSAndroid Build Coastguard Worker pRvbModule->config.inputCfg.bufferProvider.cookie = NULL;
477*ec779b8eSAndroid Build Coastguard Worker pRvbModule->config.inputCfg.accessMode = EFFECT_BUFFER_ACCESS_READ;
478*ec779b8eSAndroid Build Coastguard Worker pRvbModule->config.inputCfg.mask = EFFECT_CONFIG_ALL;
479*ec779b8eSAndroid Build Coastguard Worker pRvbModule->config.outputCfg.samplingRate = 44100;
480*ec779b8eSAndroid Build Coastguard Worker pRvbModule->config.outputCfg.channels = AUDIO_CHANNEL_OUT_STEREO;
481*ec779b8eSAndroid Build Coastguard Worker pRvbModule->config.outputCfg.format = AUDIO_FORMAT_PCM_16_BIT;
482*ec779b8eSAndroid Build Coastguard Worker pRvbModule->config.outputCfg.bufferProvider.getBuffer = NULL;
483*ec779b8eSAndroid Build Coastguard Worker pRvbModule->config.outputCfg.bufferProvider.releaseBuffer = NULL;
484*ec779b8eSAndroid Build Coastguard Worker pRvbModule->config.outputCfg.bufferProvider.cookie = NULL;
485*ec779b8eSAndroid Build Coastguard Worker pRvbModule->config.outputCfg.accessMode = EFFECT_BUFFER_ACCESS_ACCUMULATE;
486*ec779b8eSAndroid Build Coastguard Worker pRvbModule->config.outputCfg.mask = EFFECT_CONFIG_ALL;
487*ec779b8eSAndroid Build Coastguard Worker
488*ec779b8eSAndroid Build Coastguard Worker ret = Reverb_setConfig(pRvbModule, &pRvbModule->config, true);
489*ec779b8eSAndroid Build Coastguard Worker if (ret < 0) {
490*ec779b8eSAndroid Build Coastguard Worker ALOGV("Reverb_Init error %d on module %p", ret, pRvbModule);
491*ec779b8eSAndroid Build Coastguard Worker }
492*ec779b8eSAndroid Build Coastguard Worker
493*ec779b8eSAndroid Build Coastguard Worker return ret;
494*ec779b8eSAndroid Build Coastguard Worker }
495*ec779b8eSAndroid Build Coastguard Worker
496*ec779b8eSAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
497*ec779b8eSAndroid Build Coastguard Worker * Reverb_setConfig()
498*ec779b8eSAndroid Build Coastguard Worker *----------------------------------------------------------------------------
499*ec779b8eSAndroid Build Coastguard Worker * Purpose:
500*ec779b8eSAndroid Build Coastguard Worker * Set input and output audio configuration.
501*ec779b8eSAndroid Build Coastguard Worker *
502*ec779b8eSAndroid Build Coastguard Worker * Inputs:
503*ec779b8eSAndroid Build Coastguard Worker * pRvbModule - pointer to reverb effect module
504*ec779b8eSAndroid Build Coastguard Worker * pConfig - pointer to effect_config_t structure containing input
505*ec779b8eSAndroid Build Coastguard Worker * and output audio parameters configuration
506*ec779b8eSAndroid Build Coastguard Worker * init - true if called from init function
507*ec779b8eSAndroid Build Coastguard Worker * Outputs:
508*ec779b8eSAndroid Build Coastguard Worker *
509*ec779b8eSAndroid Build Coastguard Worker * Side Effects:
510*ec779b8eSAndroid Build Coastguard Worker *
511*ec779b8eSAndroid Build Coastguard Worker *----------------------------------------------------------------------------
512*ec779b8eSAndroid Build Coastguard Worker */
513*ec779b8eSAndroid Build Coastguard Worker
Reverb_setConfig(reverb_module_t * pRvbModule,effect_config_t * pConfig,bool init)514*ec779b8eSAndroid Build Coastguard Worker int Reverb_setConfig(reverb_module_t *pRvbModule, effect_config_t *pConfig,
515*ec779b8eSAndroid Build Coastguard Worker bool init) {
516*ec779b8eSAndroid Build Coastguard Worker reverb_object_t *pReverb = &pRvbModule->context;
517*ec779b8eSAndroid Build Coastguard Worker int bufferSizeInSamples;
518*ec779b8eSAndroid Build Coastguard Worker int updatePeriodInSamples;
519*ec779b8eSAndroid Build Coastguard Worker int xfadePeriodInSamples;
520*ec779b8eSAndroid Build Coastguard Worker
521*ec779b8eSAndroid Build Coastguard Worker // Check configuration compatibility with build options
522*ec779b8eSAndroid Build Coastguard Worker if (pConfig->inputCfg.samplingRate
523*ec779b8eSAndroid Build Coastguard Worker != pConfig->outputCfg.samplingRate
524*ec779b8eSAndroid Build Coastguard Worker || pConfig->outputCfg.channels != OUTPUT_CHANNELS
525*ec779b8eSAndroid Build Coastguard Worker || pConfig->inputCfg.format != AUDIO_FORMAT_PCM_16_BIT
526*ec779b8eSAndroid Build Coastguard Worker || pConfig->outputCfg.format != AUDIO_FORMAT_PCM_16_BIT) {
527*ec779b8eSAndroid Build Coastguard Worker ALOGV("Reverb_setConfig invalid config");
528*ec779b8eSAndroid Build Coastguard Worker return -EINVAL;
529*ec779b8eSAndroid Build Coastguard Worker }
530*ec779b8eSAndroid Build Coastguard Worker if ((pReverb->m_Aux && (pConfig->inputCfg.channels != AUDIO_CHANNEL_OUT_MONO)) ||
531*ec779b8eSAndroid Build Coastguard Worker (!pReverb->m_Aux && (pConfig->inputCfg.channels != AUDIO_CHANNEL_OUT_STEREO))) {
532*ec779b8eSAndroid Build Coastguard Worker ALOGV("Reverb_setConfig invalid config");
533*ec779b8eSAndroid Build Coastguard Worker return -EINVAL;
534*ec779b8eSAndroid Build Coastguard Worker }
535*ec779b8eSAndroid Build Coastguard Worker
536*ec779b8eSAndroid Build Coastguard Worker pRvbModule->config = *pConfig;
537*ec779b8eSAndroid Build Coastguard Worker
538*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nSamplingRate = pRvbModule->config.outputCfg.samplingRate;
539*ec779b8eSAndroid Build Coastguard Worker
540*ec779b8eSAndroid Build Coastguard Worker switch (pReverb->m_nSamplingRate) {
541*ec779b8eSAndroid Build Coastguard Worker case 8000:
542*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nUpdatePeriodInBits = 5;
543*ec779b8eSAndroid Build Coastguard Worker bufferSizeInSamples = 4096;
544*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nCosWT_5KHz = -23170;
545*ec779b8eSAndroid Build Coastguard Worker break;
546*ec779b8eSAndroid Build Coastguard Worker case 16000:
547*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nUpdatePeriodInBits = 6;
548*ec779b8eSAndroid Build Coastguard Worker bufferSizeInSamples = 8192;
549*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nCosWT_5KHz = -12540;
550*ec779b8eSAndroid Build Coastguard Worker break;
551*ec779b8eSAndroid Build Coastguard Worker case 22050:
552*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nUpdatePeriodInBits = 7;
553*ec779b8eSAndroid Build Coastguard Worker bufferSizeInSamples = 8192;
554*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nCosWT_5KHz = 4768;
555*ec779b8eSAndroid Build Coastguard Worker break;
556*ec779b8eSAndroid Build Coastguard Worker case 32000:
557*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nUpdatePeriodInBits = 7;
558*ec779b8eSAndroid Build Coastguard Worker bufferSizeInSamples = 16384;
559*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nCosWT_5KHz = 18205;
560*ec779b8eSAndroid Build Coastguard Worker break;
561*ec779b8eSAndroid Build Coastguard Worker case 44100:
562*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nUpdatePeriodInBits = 8;
563*ec779b8eSAndroid Build Coastguard Worker bufferSizeInSamples = 16384;
564*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nCosWT_5KHz = 24799;
565*ec779b8eSAndroid Build Coastguard Worker break;
566*ec779b8eSAndroid Build Coastguard Worker case 48000:
567*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nUpdatePeriodInBits = 8;
568*ec779b8eSAndroid Build Coastguard Worker bufferSizeInSamples = 16384;
569*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nCosWT_5KHz = 25997;
570*ec779b8eSAndroid Build Coastguard Worker break;
571*ec779b8eSAndroid Build Coastguard Worker default:
572*ec779b8eSAndroid Build Coastguard Worker ALOGV("Reverb_setConfig invalid sampling rate %d", pReverb->m_nSamplingRate);
573*ec779b8eSAndroid Build Coastguard Worker return -EINVAL;
574*ec779b8eSAndroid Build Coastguard Worker }
575*ec779b8eSAndroid Build Coastguard Worker
576*ec779b8eSAndroid Build Coastguard Worker // Define a mask for circular addressing, so that array index
577*ec779b8eSAndroid Build Coastguard Worker // can wraparound and stay in array boundary of 0, 1, ..., (buffer size -1)
578*ec779b8eSAndroid Build Coastguard Worker // The buffer size MUST be a power of two
579*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nBufferMask = (int32_t) (bufferSizeInSamples - 1);
580*ec779b8eSAndroid Build Coastguard Worker /* reverb parameters are updated every 2^(pReverb->m_nUpdatePeriodInBits) samples */
581*ec779b8eSAndroid Build Coastguard Worker updatePeriodInSamples = (int32_t) (0x1L << pReverb->m_nUpdatePeriodInBits);
582*ec779b8eSAndroid Build Coastguard Worker /*
583*ec779b8eSAndroid Build Coastguard Worker calculate the update counter by bitwise ANDING with this value to
584*ec779b8eSAndroid Build Coastguard Worker generate a 2^n modulo value
585*ec779b8eSAndroid Build Coastguard Worker */
586*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nUpdatePeriodInSamples = (int32_t) updatePeriodInSamples;
587*ec779b8eSAndroid Build Coastguard Worker
588*ec779b8eSAndroid Build Coastguard Worker xfadePeriodInSamples = (int32_t) (REVERB_XFADE_PERIOD_IN_SECONDS
589*ec779b8eSAndroid Build Coastguard Worker * (double) pReverb->m_nSamplingRate);
590*ec779b8eSAndroid Build Coastguard Worker
591*ec779b8eSAndroid Build Coastguard Worker // set xfade parameters
592*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nPhaseIncrement
593*ec779b8eSAndroid Build Coastguard Worker = (int16_t) (65536 / ((int16_t) xfadePeriodInSamples
594*ec779b8eSAndroid Build Coastguard Worker / (int16_t) updatePeriodInSamples));
595*ec779b8eSAndroid Build Coastguard Worker
596*ec779b8eSAndroid Build Coastguard Worker if (init) {
597*ec779b8eSAndroid Build Coastguard Worker ReverbReadInPresets(pReverb);
598*ec779b8eSAndroid Build Coastguard Worker
599*ec779b8eSAndroid Build Coastguard Worker // for debugging purposes, allow noise generator
600*ec779b8eSAndroid Build Coastguard Worker pReverb->m_bUseNoise = true;
601*ec779b8eSAndroid Build Coastguard Worker
602*ec779b8eSAndroid Build Coastguard Worker // for debugging purposes, allow bypass
603*ec779b8eSAndroid Build Coastguard Worker pReverb->m_bBypass = 0;
604*ec779b8eSAndroid Build Coastguard Worker
605*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nNextRoom = 1;
606*ec779b8eSAndroid Build Coastguard Worker
607*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nNoise = (int16_t) 0xABCD;
608*ec779b8eSAndroid Build Coastguard Worker }
609*ec779b8eSAndroid Build Coastguard Worker
610*ec779b8eSAndroid Build Coastguard Worker Reverb_Reset(pReverb, init);
611*ec779b8eSAndroid Build Coastguard Worker
612*ec779b8eSAndroid Build Coastguard Worker return 0;
613*ec779b8eSAndroid Build Coastguard Worker }
614*ec779b8eSAndroid Build Coastguard Worker
615*ec779b8eSAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
616*ec779b8eSAndroid Build Coastguard Worker * Reverb_getConfig()
617*ec779b8eSAndroid Build Coastguard Worker *----------------------------------------------------------------------------
618*ec779b8eSAndroid Build Coastguard Worker * Purpose:
619*ec779b8eSAndroid Build Coastguard Worker * Get input and output audio configuration.
620*ec779b8eSAndroid Build Coastguard Worker *
621*ec779b8eSAndroid Build Coastguard Worker * Inputs:
622*ec779b8eSAndroid Build Coastguard Worker * pRvbModule - pointer to reverb effect module
623*ec779b8eSAndroid Build Coastguard Worker * pConfig - pointer to effect_config_t structure containing input
624*ec779b8eSAndroid Build Coastguard Worker * and output audio parameters configuration
625*ec779b8eSAndroid Build Coastguard Worker * Outputs:
626*ec779b8eSAndroid Build Coastguard Worker *
627*ec779b8eSAndroid Build Coastguard Worker * Side Effects:
628*ec779b8eSAndroid Build Coastguard Worker *
629*ec779b8eSAndroid Build Coastguard Worker *----------------------------------------------------------------------------
630*ec779b8eSAndroid Build Coastguard Worker */
631*ec779b8eSAndroid Build Coastguard Worker
Reverb_getConfig(reverb_module_t * pRvbModule,effect_config_t * pConfig)632*ec779b8eSAndroid Build Coastguard Worker void Reverb_getConfig(reverb_module_t *pRvbModule, effect_config_t *pConfig)
633*ec779b8eSAndroid Build Coastguard Worker {
634*ec779b8eSAndroid Build Coastguard Worker *pConfig = pRvbModule->config;
635*ec779b8eSAndroid Build Coastguard Worker }
636*ec779b8eSAndroid Build Coastguard Worker
637*ec779b8eSAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
638*ec779b8eSAndroid Build Coastguard Worker * Reverb_Reset()
639*ec779b8eSAndroid Build Coastguard Worker *----------------------------------------------------------------------------
640*ec779b8eSAndroid Build Coastguard Worker * Purpose:
641*ec779b8eSAndroid Build Coastguard Worker * Reset internal states and clear delay lines.
642*ec779b8eSAndroid Build Coastguard Worker *
643*ec779b8eSAndroid Build Coastguard Worker * Inputs:
644*ec779b8eSAndroid Build Coastguard Worker * pReverb - pointer to reverb context
645*ec779b8eSAndroid Build Coastguard Worker * init - true if called from init function
646*ec779b8eSAndroid Build Coastguard Worker *
647*ec779b8eSAndroid Build Coastguard Worker * Outputs:
648*ec779b8eSAndroid Build Coastguard Worker *
649*ec779b8eSAndroid Build Coastguard Worker * Side Effects:
650*ec779b8eSAndroid Build Coastguard Worker *
651*ec779b8eSAndroid Build Coastguard Worker *----------------------------------------------------------------------------
652*ec779b8eSAndroid Build Coastguard Worker */
653*ec779b8eSAndroid Build Coastguard Worker
Reverb_Reset(reverb_object_t * pReverb,bool init)654*ec779b8eSAndroid Build Coastguard Worker void Reverb_Reset(reverb_object_t *pReverb, bool init) {
655*ec779b8eSAndroid Build Coastguard Worker int bufferSizeInSamples = (int32_t) (pReverb->m_nBufferMask + 1);
656*ec779b8eSAndroid Build Coastguard Worker int maxApSamples;
657*ec779b8eSAndroid Build Coastguard Worker int maxDelaySamples;
658*ec779b8eSAndroid Build Coastguard Worker int maxEarlySamples;
659*ec779b8eSAndroid Build Coastguard Worker int ap1In;
660*ec779b8eSAndroid Build Coastguard Worker int delay0In;
661*ec779b8eSAndroid Build Coastguard Worker int delay1In;
662*ec779b8eSAndroid Build Coastguard Worker int32_t i;
663*ec779b8eSAndroid Build Coastguard Worker uint16_t nOffset;
664*ec779b8eSAndroid Build Coastguard Worker
665*ec779b8eSAndroid Build Coastguard Worker maxApSamples = ((int32_t) (MAX_AP_TIME * pReverb->m_nSamplingRate) >> 16);
666*ec779b8eSAndroid Build Coastguard Worker maxDelaySamples = ((int32_t) (MAX_DELAY_TIME * pReverb->m_nSamplingRate)
667*ec779b8eSAndroid Build Coastguard Worker >> 16);
668*ec779b8eSAndroid Build Coastguard Worker maxEarlySamples = ((int32_t) (MAX_EARLY_TIME * pReverb->m_nSamplingRate)
669*ec779b8eSAndroid Build Coastguard Worker >> 16);
670*ec779b8eSAndroid Build Coastguard Worker
671*ec779b8eSAndroid Build Coastguard Worker ap1In = (AP0_IN + maxApSamples + GUARD);
672*ec779b8eSAndroid Build Coastguard Worker delay0In = (ap1In + maxApSamples + GUARD);
673*ec779b8eSAndroid Build Coastguard Worker delay1In = (delay0In + maxDelaySamples + GUARD);
674*ec779b8eSAndroid Build Coastguard Worker // Define the max offsets for the end points of each section
675*ec779b8eSAndroid Build Coastguard Worker // i.e., we don't expect a given section's taps to go beyond
676*ec779b8eSAndroid Build Coastguard Worker // the following limits
677*ec779b8eSAndroid Build Coastguard Worker
678*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nEarly0in = (delay1In + maxDelaySamples + GUARD);
679*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nEarly1in = (pReverb->m_nEarly0in + maxEarlySamples + GUARD);
680*ec779b8eSAndroid Build Coastguard Worker
681*ec779b8eSAndroid Build Coastguard Worker pReverb->m_sAp0.m_zApIn = AP0_IN;
682*ec779b8eSAndroid Build Coastguard Worker
683*ec779b8eSAndroid Build Coastguard Worker pReverb->m_zD0In = delay0In;
684*ec779b8eSAndroid Build Coastguard Worker
685*ec779b8eSAndroid Build Coastguard Worker pReverb->m_sAp1.m_zApIn = ap1In;
686*ec779b8eSAndroid Build Coastguard Worker
687*ec779b8eSAndroid Build Coastguard Worker pReverb->m_zD1In = delay1In;
688*ec779b8eSAndroid Build Coastguard Worker
689*ec779b8eSAndroid Build Coastguard Worker pReverb->m_zOutLpfL = 0;
690*ec779b8eSAndroid Build Coastguard Worker pReverb->m_zOutLpfR = 0;
691*ec779b8eSAndroid Build Coastguard Worker
692*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nRevFbkR = 0;
693*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nRevFbkL = 0;
694*ec779b8eSAndroid Build Coastguard Worker
695*ec779b8eSAndroid Build Coastguard Worker // set base index into circular buffer
696*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nBaseIndex = 0;
697*ec779b8eSAndroid Build Coastguard Worker
698*ec779b8eSAndroid Build Coastguard Worker // clear the reverb delay line
699*ec779b8eSAndroid Build Coastguard Worker for (i = 0; i < bufferSizeInSamples; i++) {
700*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nDelayLine[i] = 0;
701*ec779b8eSAndroid Build Coastguard Worker }
702*ec779b8eSAndroid Build Coastguard Worker
703*ec779b8eSAndroid Build Coastguard Worker ReverbUpdateRoom(pReverb, init);
704*ec779b8eSAndroid Build Coastguard Worker
705*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nUpdateCounter = 0;
706*ec779b8eSAndroid Build Coastguard Worker
707*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nPhase = -32768;
708*ec779b8eSAndroid Build Coastguard Worker
709*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nSin = 0;
710*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nCos = 0;
711*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nSinIncrement = 0;
712*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nCosIncrement = 0;
713*ec779b8eSAndroid Build Coastguard Worker
714*ec779b8eSAndroid Build Coastguard Worker // set delay tap lengths
715*ec779b8eSAndroid Build Coastguard Worker nOffset = ReverbCalculateNoise(pReverb);
716*ec779b8eSAndroid Build Coastguard Worker
717*ec779b8eSAndroid Build Coastguard Worker pReverb->m_zD1Cross = pReverb->m_nDelay1Out - pReverb->m_nMaxExcursion
718*ec779b8eSAndroid Build Coastguard Worker + nOffset;
719*ec779b8eSAndroid Build Coastguard Worker
720*ec779b8eSAndroid Build Coastguard Worker nOffset = ReverbCalculateNoise(pReverb);
721*ec779b8eSAndroid Build Coastguard Worker
722*ec779b8eSAndroid Build Coastguard Worker pReverb->m_zD0Cross = pReverb->m_nDelay0Out - pReverb->m_nMaxExcursion
723*ec779b8eSAndroid Build Coastguard Worker - nOffset;
724*ec779b8eSAndroid Build Coastguard Worker
725*ec779b8eSAndroid Build Coastguard Worker nOffset = ReverbCalculateNoise(pReverb);
726*ec779b8eSAndroid Build Coastguard Worker
727*ec779b8eSAndroid Build Coastguard Worker pReverb->m_zD0Self = pReverb->m_nDelay0Out - pReverb->m_nMaxExcursion
728*ec779b8eSAndroid Build Coastguard Worker - nOffset;
729*ec779b8eSAndroid Build Coastguard Worker
730*ec779b8eSAndroid Build Coastguard Worker nOffset = ReverbCalculateNoise(pReverb);
731*ec779b8eSAndroid Build Coastguard Worker
732*ec779b8eSAndroid Build Coastguard Worker pReverb->m_zD1Self = pReverb->m_nDelay1Out - pReverb->m_nMaxExcursion
733*ec779b8eSAndroid Build Coastguard Worker + nOffset;
734*ec779b8eSAndroid Build Coastguard Worker }
735*ec779b8eSAndroid Build Coastguard Worker
736*ec779b8eSAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
737*ec779b8eSAndroid Build Coastguard Worker * Reverb_getParameter()
738*ec779b8eSAndroid Build Coastguard Worker *----------------------------------------------------------------------------
739*ec779b8eSAndroid Build Coastguard Worker * Purpose:
740*ec779b8eSAndroid Build Coastguard Worker * Get a Reverb parameter
741*ec779b8eSAndroid Build Coastguard Worker *
742*ec779b8eSAndroid Build Coastguard Worker * Inputs:
743*ec779b8eSAndroid Build Coastguard Worker * pReverb - handle to instance data
744*ec779b8eSAndroid Build Coastguard Worker * param - parameter
745*ec779b8eSAndroid Build Coastguard Worker * pValue - pointer to variable to hold retrieved value
746*ec779b8eSAndroid Build Coastguard Worker * pSize - pointer to value size: maximum size as input
747*ec779b8eSAndroid Build Coastguard Worker *
748*ec779b8eSAndroid Build Coastguard Worker * Outputs:
749*ec779b8eSAndroid Build Coastguard Worker * *pValue updated with parameter value
750*ec779b8eSAndroid Build Coastguard Worker * *pSize updated with actual value size
751*ec779b8eSAndroid Build Coastguard Worker *
752*ec779b8eSAndroid Build Coastguard Worker *
753*ec779b8eSAndroid Build Coastguard Worker * Side Effects:
754*ec779b8eSAndroid Build Coastguard Worker *
755*ec779b8eSAndroid Build Coastguard Worker *----------------------------------------------------------------------------
756*ec779b8eSAndroid Build Coastguard Worker */
Reverb_getParameter(reverb_object_t * pReverb,int32_t param,uint32_t * pSize,void * pValue)757*ec779b8eSAndroid Build Coastguard Worker int Reverb_getParameter(reverb_object_t *pReverb, int32_t param, uint32_t *pSize,
758*ec779b8eSAndroid Build Coastguard Worker void *pValue) {
759*ec779b8eSAndroid Build Coastguard Worker int32_t *pValue32;
760*ec779b8eSAndroid Build Coastguard Worker int16_t *pValue16;
761*ec779b8eSAndroid Build Coastguard Worker t_reverb_settings *pProperties;
762*ec779b8eSAndroid Build Coastguard Worker int32_t temp;
763*ec779b8eSAndroid Build Coastguard Worker int32_t temp2;
764*ec779b8eSAndroid Build Coastguard Worker uint32_t size;
765*ec779b8eSAndroid Build Coastguard Worker
766*ec779b8eSAndroid Build Coastguard Worker if (pReverb->m_Preset) {
767*ec779b8eSAndroid Build Coastguard Worker if (param != REVERB_PARAM_PRESET || *pSize < sizeof(int16_t)) {
768*ec779b8eSAndroid Build Coastguard Worker return -EINVAL;
769*ec779b8eSAndroid Build Coastguard Worker }
770*ec779b8eSAndroid Build Coastguard Worker size = sizeof(int16_t);
771*ec779b8eSAndroid Build Coastguard Worker pValue16 = (int16_t *)pValue;
772*ec779b8eSAndroid Build Coastguard Worker // REVERB_PRESET_NONE is mapped to bypass
773*ec779b8eSAndroid Build Coastguard Worker if (pReverb->m_bBypass != 0) {
774*ec779b8eSAndroid Build Coastguard Worker *pValue16 = (int16_t)REVERB_PRESET_NONE;
775*ec779b8eSAndroid Build Coastguard Worker } else {
776*ec779b8eSAndroid Build Coastguard Worker *pValue16 = (int16_t)(pReverb->m_nNextRoom + 1);
777*ec779b8eSAndroid Build Coastguard Worker }
778*ec779b8eSAndroid Build Coastguard Worker ALOGV("get REVERB_PARAM_PRESET, preset %d", *pValue16);
779*ec779b8eSAndroid Build Coastguard Worker } else {
780*ec779b8eSAndroid Build Coastguard Worker switch (param) {
781*ec779b8eSAndroid Build Coastguard Worker case REVERB_PARAM_ROOM_LEVEL:
782*ec779b8eSAndroid Build Coastguard Worker case REVERB_PARAM_ROOM_HF_LEVEL:
783*ec779b8eSAndroid Build Coastguard Worker case REVERB_PARAM_DECAY_HF_RATIO:
784*ec779b8eSAndroid Build Coastguard Worker case REVERB_PARAM_REFLECTIONS_LEVEL:
785*ec779b8eSAndroid Build Coastguard Worker case REVERB_PARAM_REVERB_LEVEL:
786*ec779b8eSAndroid Build Coastguard Worker case REVERB_PARAM_DIFFUSION:
787*ec779b8eSAndroid Build Coastguard Worker case REVERB_PARAM_DENSITY:
788*ec779b8eSAndroid Build Coastguard Worker size = sizeof(int16_t);
789*ec779b8eSAndroid Build Coastguard Worker break;
790*ec779b8eSAndroid Build Coastguard Worker
791*ec779b8eSAndroid Build Coastguard Worker case REVERB_PARAM_BYPASS:
792*ec779b8eSAndroid Build Coastguard Worker case REVERB_PARAM_DECAY_TIME:
793*ec779b8eSAndroid Build Coastguard Worker case REVERB_PARAM_REFLECTIONS_DELAY:
794*ec779b8eSAndroid Build Coastguard Worker case REVERB_PARAM_REVERB_DELAY:
795*ec779b8eSAndroid Build Coastguard Worker size = sizeof(int32_t);
796*ec779b8eSAndroid Build Coastguard Worker break;
797*ec779b8eSAndroid Build Coastguard Worker
798*ec779b8eSAndroid Build Coastguard Worker case REVERB_PARAM_PROPERTIES:
799*ec779b8eSAndroid Build Coastguard Worker size = sizeof(t_reverb_settings);
800*ec779b8eSAndroid Build Coastguard Worker break;
801*ec779b8eSAndroid Build Coastguard Worker
802*ec779b8eSAndroid Build Coastguard Worker default:
803*ec779b8eSAndroid Build Coastguard Worker return -EINVAL;
804*ec779b8eSAndroid Build Coastguard Worker }
805*ec779b8eSAndroid Build Coastguard Worker
806*ec779b8eSAndroid Build Coastguard Worker if (*pSize < size) {
807*ec779b8eSAndroid Build Coastguard Worker return -EINVAL;
808*ec779b8eSAndroid Build Coastguard Worker }
809*ec779b8eSAndroid Build Coastguard Worker
810*ec779b8eSAndroid Build Coastguard Worker pValue32 = (int32_t *) pValue;
811*ec779b8eSAndroid Build Coastguard Worker pValue16 = (int16_t *) pValue;
812*ec779b8eSAndroid Build Coastguard Worker pProperties = (t_reverb_settings *) pValue;
813*ec779b8eSAndroid Build Coastguard Worker
814*ec779b8eSAndroid Build Coastguard Worker switch (param) {
815*ec779b8eSAndroid Build Coastguard Worker case REVERB_PARAM_BYPASS:
816*ec779b8eSAndroid Build Coastguard Worker *pValue32 = (int32_t) pReverb->m_bBypass;
817*ec779b8eSAndroid Build Coastguard Worker break;
818*ec779b8eSAndroid Build Coastguard Worker
819*ec779b8eSAndroid Build Coastguard Worker case REVERB_PARAM_PROPERTIES:
820*ec779b8eSAndroid Build Coastguard Worker pValue16 = &pProperties->roomLevel;
821*ec779b8eSAndroid Build Coastguard Worker /* FALL THROUGH */
822*ec779b8eSAndroid Build Coastguard Worker
823*ec779b8eSAndroid Build Coastguard Worker case REVERB_PARAM_ROOM_LEVEL:
824*ec779b8eSAndroid Build Coastguard Worker // Convert m_nRoomLpfFwd to millibels
825*ec779b8eSAndroid Build Coastguard Worker temp = (pReverb->m_nRoomLpfFwd << 15)
826*ec779b8eSAndroid Build Coastguard Worker / (32767 - pReverb->m_nRoomLpfFbk);
827*ec779b8eSAndroid Build Coastguard Worker *pValue16 = Effects_Linear16ToMillibels(temp);
828*ec779b8eSAndroid Build Coastguard Worker
829*ec779b8eSAndroid Build Coastguard Worker ALOGV("get REVERB_PARAM_ROOM_LEVEL %d, gain %d, m_nRoomLpfFwd %d, m_nRoomLpfFbk %d", *pValue16, temp, pReverb->m_nRoomLpfFwd, pReverb->m_nRoomLpfFbk);
830*ec779b8eSAndroid Build Coastguard Worker
831*ec779b8eSAndroid Build Coastguard Worker if (param == REVERB_PARAM_ROOM_LEVEL) {
832*ec779b8eSAndroid Build Coastguard Worker break;
833*ec779b8eSAndroid Build Coastguard Worker }
834*ec779b8eSAndroid Build Coastguard Worker pValue16 = &pProperties->roomHFLevel;
835*ec779b8eSAndroid Build Coastguard Worker /* FALL THROUGH */
836*ec779b8eSAndroid Build Coastguard Worker
837*ec779b8eSAndroid Build Coastguard Worker case REVERB_PARAM_ROOM_HF_LEVEL:
838*ec779b8eSAndroid Build Coastguard Worker // The ratio between linear gain at 0Hz and at 5000Hz for the room low pass is:
839*ec779b8eSAndroid Build Coastguard Worker // (1 + a1) / sqrt(a1^2 + 2*C*a1 + 1) where:
840*ec779b8eSAndroid Build Coastguard Worker // - a1 is minus the LP feedback gain: -pReverb->m_nRoomLpfFbk
841*ec779b8eSAndroid Build Coastguard Worker // - C is cos(2piWT) @ 5000Hz: pReverb->m_nCosWT_5KHz
842*ec779b8eSAndroid Build Coastguard Worker
843*ec779b8eSAndroid Build Coastguard Worker temp = MULT_EG1_EG1(pReverb->m_nRoomLpfFbk, pReverb->m_nRoomLpfFbk);
844*ec779b8eSAndroid Build Coastguard Worker ALOGV("get REVERB_PARAM_ROOM_HF_LEVEL, a1^2 %d", temp);
845*ec779b8eSAndroid Build Coastguard Worker temp2 = MULT_EG1_EG1(pReverb->m_nRoomLpfFbk, pReverb->m_nCosWT_5KHz)
846*ec779b8eSAndroid Build Coastguard Worker << 1;
847*ec779b8eSAndroid Build Coastguard Worker ALOGV("get REVERB_PARAM_ROOM_HF_LEVEL, 2 Cos a1 %d", temp2);
848*ec779b8eSAndroid Build Coastguard Worker temp = 32767 + temp - temp2;
849*ec779b8eSAndroid Build Coastguard Worker ALOGV("get REVERB_PARAM_ROOM_HF_LEVEL, a1^2 + 2 Cos a1 + 1 %d", temp);
850*ec779b8eSAndroid Build Coastguard Worker temp = Effects_Sqrt(temp) * 181;
851*ec779b8eSAndroid Build Coastguard Worker ALOGV("get REVERB_PARAM_ROOM_HF_LEVEL, SQRT(a1^2 + 2 Cos a1 + 1) %d", temp);
852*ec779b8eSAndroid Build Coastguard Worker temp = ((32767 - pReverb->m_nRoomLpfFbk) << 15) / temp;
853*ec779b8eSAndroid Build Coastguard Worker
854*ec779b8eSAndroid Build Coastguard Worker ALOGV("get REVERB_PARAM_ROOM_HF_LEVEL, gain %d, m_nRoomLpfFwd %d, m_nRoomLpfFbk %d", temp, pReverb->m_nRoomLpfFwd, pReverb->m_nRoomLpfFbk);
855*ec779b8eSAndroid Build Coastguard Worker
856*ec779b8eSAndroid Build Coastguard Worker *pValue16 = Effects_Linear16ToMillibels(temp);
857*ec779b8eSAndroid Build Coastguard Worker
858*ec779b8eSAndroid Build Coastguard Worker if (param == REVERB_PARAM_ROOM_HF_LEVEL) {
859*ec779b8eSAndroid Build Coastguard Worker break;
860*ec779b8eSAndroid Build Coastguard Worker }
861*ec779b8eSAndroid Build Coastguard Worker pValue32 = (int32_t *)&pProperties->decayTime;
862*ec779b8eSAndroid Build Coastguard Worker /* FALL THROUGH */
863*ec779b8eSAndroid Build Coastguard Worker
864*ec779b8eSAndroid Build Coastguard Worker case REVERB_PARAM_DECAY_TIME:
865*ec779b8eSAndroid Build Coastguard Worker // Calculate reverb feedback path gain
866*ec779b8eSAndroid Build Coastguard Worker temp = (pReverb->m_nRvbLpfFwd << 15) / (32767 - pReverb->m_nRvbLpfFbk);
867*ec779b8eSAndroid Build Coastguard Worker temp = Effects_Linear16ToMillibels(temp);
868*ec779b8eSAndroid Build Coastguard Worker
869*ec779b8eSAndroid Build Coastguard Worker // Calculate decay time: g = -6000 d/DT , g gain in millibels, d reverb delay, DT decay time
870*ec779b8eSAndroid Build Coastguard Worker temp = (-6000 * pReverb->m_nLateDelay) / temp;
871*ec779b8eSAndroid Build Coastguard Worker
872*ec779b8eSAndroid Build Coastguard Worker // Convert samples to ms
873*ec779b8eSAndroid Build Coastguard Worker *pValue32 = (temp * 1000) / pReverb->m_nSamplingRate;
874*ec779b8eSAndroid Build Coastguard Worker
875*ec779b8eSAndroid Build Coastguard Worker ALOGV("get REVERB_PARAM_DECAY_TIME, samples %d, ms %d", temp, *pValue32);
876*ec779b8eSAndroid Build Coastguard Worker
877*ec779b8eSAndroid Build Coastguard Worker if (param == REVERB_PARAM_DECAY_TIME) {
878*ec779b8eSAndroid Build Coastguard Worker break;
879*ec779b8eSAndroid Build Coastguard Worker }
880*ec779b8eSAndroid Build Coastguard Worker pValue16 = &pProperties->decayHFRatio;
881*ec779b8eSAndroid Build Coastguard Worker /* FALL THROUGH */
882*ec779b8eSAndroid Build Coastguard Worker
883*ec779b8eSAndroid Build Coastguard Worker case REVERB_PARAM_DECAY_HF_RATIO:
884*ec779b8eSAndroid Build Coastguard Worker // If r is the decay HF ratio (r = REVERB_PARAM_DECAY_HF_RATIO/1000) we have:
885*ec779b8eSAndroid Build Coastguard Worker // DT_5000Hz = DT_0Hz * r
886*ec779b8eSAndroid Build Coastguard Worker // and G_5000Hz = -6000 * d / DT_5000Hz and G_0Hz = -6000 * d / DT_0Hz in millibels so :
887*ec779b8eSAndroid Build Coastguard Worker // r = G_0Hz/G_5000Hz in millibels
888*ec779b8eSAndroid Build Coastguard Worker // The linear gain at 5000Hz is b0 / sqrt(a1^2 + 2*C*a1 + 1) where:
889*ec779b8eSAndroid Build Coastguard Worker // - a1 is minus the LP feedback gain: -pReverb->m_nRvbLpfFbk
890*ec779b8eSAndroid Build Coastguard Worker // - b0 is the LP forward gain: pReverb->m_nRvbLpfFwd
891*ec779b8eSAndroid Build Coastguard Worker // - C is cos(2piWT) @ 5000Hz: pReverb->m_nCosWT_5KHz
892*ec779b8eSAndroid Build Coastguard Worker if (pReverb->m_nRvbLpfFbk == 0) {
893*ec779b8eSAndroid Build Coastguard Worker *pValue16 = 1000;
894*ec779b8eSAndroid Build Coastguard Worker ALOGV("get REVERB_PARAM_DECAY_HF_RATIO, pReverb->m_nRvbLpfFbk == 0, ratio %d", *pValue16);
895*ec779b8eSAndroid Build Coastguard Worker } else {
896*ec779b8eSAndroid Build Coastguard Worker temp = MULT_EG1_EG1(pReverb->m_nRvbLpfFbk, pReverb->m_nRvbLpfFbk);
897*ec779b8eSAndroid Build Coastguard Worker temp2 = MULT_EG1_EG1(pReverb->m_nRvbLpfFbk, pReverb->m_nCosWT_5KHz)
898*ec779b8eSAndroid Build Coastguard Worker << 1;
899*ec779b8eSAndroid Build Coastguard Worker temp = 32767 + temp - temp2;
900*ec779b8eSAndroid Build Coastguard Worker temp = Effects_Sqrt(temp) * 181;
901*ec779b8eSAndroid Build Coastguard Worker temp = (pReverb->m_nRvbLpfFwd << 15) / temp;
902*ec779b8eSAndroid Build Coastguard Worker // The linear gain at 0Hz is b0 / (a1 + 1)
903*ec779b8eSAndroid Build Coastguard Worker temp2 = (pReverb->m_nRvbLpfFwd << 15) / (32767
904*ec779b8eSAndroid Build Coastguard Worker - pReverb->m_nRvbLpfFbk);
905*ec779b8eSAndroid Build Coastguard Worker
906*ec779b8eSAndroid Build Coastguard Worker temp = Effects_Linear16ToMillibels(temp);
907*ec779b8eSAndroid Build Coastguard Worker temp2 = Effects_Linear16ToMillibels(temp2);
908*ec779b8eSAndroid Build Coastguard Worker ALOGV("get REVERB_PARAM_DECAY_HF_RATIO, gain 5KHz %d mB, gain DC %d mB", temp, temp2);
909*ec779b8eSAndroid Build Coastguard Worker
910*ec779b8eSAndroid Build Coastguard Worker if (temp == 0)
911*ec779b8eSAndroid Build Coastguard Worker temp = 1;
912*ec779b8eSAndroid Build Coastguard Worker temp = (int16_t) ((1000 * temp2) / temp);
913*ec779b8eSAndroid Build Coastguard Worker if (temp > 1000)
914*ec779b8eSAndroid Build Coastguard Worker temp = 1000;
915*ec779b8eSAndroid Build Coastguard Worker
916*ec779b8eSAndroid Build Coastguard Worker *pValue16 = temp;
917*ec779b8eSAndroid Build Coastguard Worker ALOGV("get REVERB_PARAM_DECAY_HF_RATIO, ratio %d", *pValue16);
918*ec779b8eSAndroid Build Coastguard Worker }
919*ec779b8eSAndroid Build Coastguard Worker
920*ec779b8eSAndroid Build Coastguard Worker if (param == REVERB_PARAM_DECAY_HF_RATIO) {
921*ec779b8eSAndroid Build Coastguard Worker break;
922*ec779b8eSAndroid Build Coastguard Worker }
923*ec779b8eSAndroid Build Coastguard Worker pValue16 = &pProperties->reflectionsLevel;
924*ec779b8eSAndroid Build Coastguard Worker /* FALL THROUGH */
925*ec779b8eSAndroid Build Coastguard Worker
926*ec779b8eSAndroid Build Coastguard Worker case REVERB_PARAM_REFLECTIONS_LEVEL:
927*ec779b8eSAndroid Build Coastguard Worker *pValue16 = Effects_Linear16ToMillibels(pReverb->m_nEarlyGain);
928*ec779b8eSAndroid Build Coastguard Worker
929*ec779b8eSAndroid Build Coastguard Worker ALOGV("get REVERB_PARAM_REFLECTIONS_LEVEL, %d", *pValue16);
930*ec779b8eSAndroid Build Coastguard Worker if (param == REVERB_PARAM_REFLECTIONS_LEVEL) {
931*ec779b8eSAndroid Build Coastguard Worker break;
932*ec779b8eSAndroid Build Coastguard Worker }
933*ec779b8eSAndroid Build Coastguard Worker pValue32 = (int32_t *)&pProperties->reflectionsDelay;
934*ec779b8eSAndroid Build Coastguard Worker /* FALL THROUGH */
935*ec779b8eSAndroid Build Coastguard Worker
936*ec779b8eSAndroid Build Coastguard Worker case REVERB_PARAM_REFLECTIONS_DELAY:
937*ec779b8eSAndroid Build Coastguard Worker // convert samples to ms
938*ec779b8eSAndroid Build Coastguard Worker *pValue32 = (pReverb->m_nEarlyDelay * 1000) / pReverb->m_nSamplingRate;
939*ec779b8eSAndroid Build Coastguard Worker
940*ec779b8eSAndroid Build Coastguard Worker ALOGV("get REVERB_PARAM_REFLECTIONS_DELAY, samples %d, ms %d", pReverb->m_nEarlyDelay, *pValue32);
941*ec779b8eSAndroid Build Coastguard Worker
942*ec779b8eSAndroid Build Coastguard Worker if (param == REVERB_PARAM_REFLECTIONS_DELAY) {
943*ec779b8eSAndroid Build Coastguard Worker break;
944*ec779b8eSAndroid Build Coastguard Worker }
945*ec779b8eSAndroid Build Coastguard Worker pValue16 = &pProperties->reverbLevel;
946*ec779b8eSAndroid Build Coastguard Worker /* FALL THROUGH */
947*ec779b8eSAndroid Build Coastguard Worker
948*ec779b8eSAndroid Build Coastguard Worker case REVERB_PARAM_REVERB_LEVEL:
949*ec779b8eSAndroid Build Coastguard Worker // Convert linear gain to millibels
950*ec779b8eSAndroid Build Coastguard Worker *pValue16 = Effects_Linear16ToMillibels(pReverb->m_nLateGain << 2);
951*ec779b8eSAndroid Build Coastguard Worker
952*ec779b8eSAndroid Build Coastguard Worker ALOGV("get REVERB_PARAM_REVERB_LEVEL %d", *pValue16);
953*ec779b8eSAndroid Build Coastguard Worker
954*ec779b8eSAndroid Build Coastguard Worker if (param == REVERB_PARAM_REVERB_LEVEL) {
955*ec779b8eSAndroid Build Coastguard Worker break;
956*ec779b8eSAndroid Build Coastguard Worker }
957*ec779b8eSAndroid Build Coastguard Worker pValue32 = (int32_t *)&pProperties->reverbDelay;
958*ec779b8eSAndroid Build Coastguard Worker /* FALL THROUGH */
959*ec779b8eSAndroid Build Coastguard Worker
960*ec779b8eSAndroid Build Coastguard Worker case REVERB_PARAM_REVERB_DELAY:
961*ec779b8eSAndroid Build Coastguard Worker // convert samples to ms
962*ec779b8eSAndroid Build Coastguard Worker *pValue32 = (pReverb->m_nLateDelay * 1000) / pReverb->m_nSamplingRate;
963*ec779b8eSAndroid Build Coastguard Worker
964*ec779b8eSAndroid Build Coastguard Worker ALOGV("get REVERB_PARAM_REVERB_DELAY, samples %d, ms %d", pReverb->m_nLateDelay, *pValue32);
965*ec779b8eSAndroid Build Coastguard Worker
966*ec779b8eSAndroid Build Coastguard Worker if (param == REVERB_PARAM_REVERB_DELAY) {
967*ec779b8eSAndroid Build Coastguard Worker break;
968*ec779b8eSAndroid Build Coastguard Worker }
969*ec779b8eSAndroid Build Coastguard Worker pValue16 = &pProperties->diffusion;
970*ec779b8eSAndroid Build Coastguard Worker /* FALL THROUGH */
971*ec779b8eSAndroid Build Coastguard Worker
972*ec779b8eSAndroid Build Coastguard Worker case REVERB_PARAM_DIFFUSION:
973*ec779b8eSAndroid Build Coastguard Worker temp = (int16_t) ((1000 * (pReverb->m_sAp0.m_nApGain - AP0_GAIN_BASE))
974*ec779b8eSAndroid Build Coastguard Worker / AP0_GAIN_RANGE);
975*ec779b8eSAndroid Build Coastguard Worker
976*ec779b8eSAndroid Build Coastguard Worker if (temp < 0)
977*ec779b8eSAndroid Build Coastguard Worker temp = 0;
978*ec779b8eSAndroid Build Coastguard Worker if (temp > 1000)
979*ec779b8eSAndroid Build Coastguard Worker temp = 1000;
980*ec779b8eSAndroid Build Coastguard Worker
981*ec779b8eSAndroid Build Coastguard Worker *pValue16 = temp;
982*ec779b8eSAndroid Build Coastguard Worker ALOGV("get REVERB_PARAM_DIFFUSION, %d, AP0 gain %d", *pValue16, pReverb->m_sAp0.m_nApGain);
983*ec779b8eSAndroid Build Coastguard Worker
984*ec779b8eSAndroid Build Coastguard Worker if (param == REVERB_PARAM_DIFFUSION) {
985*ec779b8eSAndroid Build Coastguard Worker break;
986*ec779b8eSAndroid Build Coastguard Worker }
987*ec779b8eSAndroid Build Coastguard Worker pValue16 = &pProperties->density;
988*ec779b8eSAndroid Build Coastguard Worker /* FALL THROUGH */
989*ec779b8eSAndroid Build Coastguard Worker
990*ec779b8eSAndroid Build Coastguard Worker case REVERB_PARAM_DENSITY:
991*ec779b8eSAndroid Build Coastguard Worker // Calculate AP delay in time units
992*ec779b8eSAndroid Build Coastguard Worker temp = ((pReverb->m_sAp0.m_zApOut - pReverb->m_sAp0.m_zApIn) << 16)
993*ec779b8eSAndroid Build Coastguard Worker / pReverb->m_nSamplingRate;
994*ec779b8eSAndroid Build Coastguard Worker
995*ec779b8eSAndroid Build Coastguard Worker temp = (int16_t) ((1000 * (temp - AP0_TIME_BASE)) / AP0_TIME_RANGE);
996*ec779b8eSAndroid Build Coastguard Worker
997*ec779b8eSAndroid Build Coastguard Worker if (temp < 0)
998*ec779b8eSAndroid Build Coastguard Worker temp = 0;
999*ec779b8eSAndroid Build Coastguard Worker if (temp > 1000)
1000*ec779b8eSAndroid Build Coastguard Worker temp = 1000;
1001*ec779b8eSAndroid Build Coastguard Worker
1002*ec779b8eSAndroid Build Coastguard Worker *pValue16 = temp;
1003*ec779b8eSAndroid Build Coastguard Worker
1004*ec779b8eSAndroid Build Coastguard Worker ALOGV("get REVERB_PARAM_DENSITY, %d, AP0 delay smps %d", *pValue16, pReverb->m_sAp0.m_zApOut - pReverb->m_sAp0.m_zApIn);
1005*ec779b8eSAndroid Build Coastguard Worker break;
1006*ec779b8eSAndroid Build Coastguard Worker
1007*ec779b8eSAndroid Build Coastguard Worker default:
1008*ec779b8eSAndroid Build Coastguard Worker break;
1009*ec779b8eSAndroid Build Coastguard Worker }
1010*ec779b8eSAndroid Build Coastguard Worker }
1011*ec779b8eSAndroid Build Coastguard Worker
1012*ec779b8eSAndroid Build Coastguard Worker *pSize = size;
1013*ec779b8eSAndroid Build Coastguard Worker
1014*ec779b8eSAndroid Build Coastguard Worker ALOGV("Reverb_getParameter, context %p, param %d, value %d",
1015*ec779b8eSAndroid Build Coastguard Worker pReverb, param, *(int *)pValue);
1016*ec779b8eSAndroid Build Coastguard Worker
1017*ec779b8eSAndroid Build Coastguard Worker return 0;
1018*ec779b8eSAndroid Build Coastguard Worker } /* end Reverb_getParameter */
1019*ec779b8eSAndroid Build Coastguard Worker
1020*ec779b8eSAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
1021*ec779b8eSAndroid Build Coastguard Worker * Reverb_setParameter()
1022*ec779b8eSAndroid Build Coastguard Worker *----------------------------------------------------------------------------
1023*ec779b8eSAndroid Build Coastguard Worker * Purpose:
1024*ec779b8eSAndroid Build Coastguard Worker * Set a Reverb parameter
1025*ec779b8eSAndroid Build Coastguard Worker *
1026*ec779b8eSAndroid Build Coastguard Worker * Inputs:
1027*ec779b8eSAndroid Build Coastguard Worker * pReverb - handle to instance data
1028*ec779b8eSAndroid Build Coastguard Worker * param - parameter
1029*ec779b8eSAndroid Build Coastguard Worker * pValue - pointer to parameter value
1030*ec779b8eSAndroid Build Coastguard Worker * size - value size
1031*ec779b8eSAndroid Build Coastguard Worker *
1032*ec779b8eSAndroid Build Coastguard Worker * Outputs:
1033*ec779b8eSAndroid Build Coastguard Worker *
1034*ec779b8eSAndroid Build Coastguard Worker *
1035*ec779b8eSAndroid Build Coastguard Worker * Side Effects:
1036*ec779b8eSAndroid Build Coastguard Worker *
1037*ec779b8eSAndroid Build Coastguard Worker *----------------------------------------------------------------------------
1038*ec779b8eSAndroid Build Coastguard Worker */
Reverb_setParameter(reverb_object_t * pReverb,int32_t param,uint32_t size,void * pValue)1039*ec779b8eSAndroid Build Coastguard Worker int Reverb_setParameter(reverb_object_t *pReverb, int32_t param, uint32_t size,
1040*ec779b8eSAndroid Build Coastguard Worker void *pValue) {
1041*ec779b8eSAndroid Build Coastguard Worker int32_t value32;
1042*ec779b8eSAndroid Build Coastguard Worker int16_t value16;
1043*ec779b8eSAndroid Build Coastguard Worker t_reverb_settings *pProperties;
1044*ec779b8eSAndroid Build Coastguard Worker int32_t i;
1045*ec779b8eSAndroid Build Coastguard Worker int32_t temp;
1046*ec779b8eSAndroid Build Coastguard Worker int32_t temp2;
1047*ec779b8eSAndroid Build Coastguard Worker reverb_preset_t *pPreset;
1048*ec779b8eSAndroid Build Coastguard Worker int maxSamples;
1049*ec779b8eSAndroid Build Coastguard Worker int32_t averageDelay;
1050*ec779b8eSAndroid Build Coastguard Worker uint32_t paramSize;
1051*ec779b8eSAndroid Build Coastguard Worker
1052*ec779b8eSAndroid Build Coastguard Worker ALOGV("Reverb_setParameter, context %p, param %d, value16 %d, value32 %d",
1053*ec779b8eSAndroid Build Coastguard Worker pReverb, param, *(int16_t *)pValue, *(int32_t *)pValue);
1054*ec779b8eSAndroid Build Coastguard Worker
1055*ec779b8eSAndroid Build Coastguard Worker if (pReverb->m_Preset) {
1056*ec779b8eSAndroid Build Coastguard Worker if (param != REVERB_PARAM_PRESET || size != sizeof(int16_t)) {
1057*ec779b8eSAndroid Build Coastguard Worker return -EINVAL;
1058*ec779b8eSAndroid Build Coastguard Worker }
1059*ec779b8eSAndroid Build Coastguard Worker value16 = *(int16_t *)pValue;
1060*ec779b8eSAndroid Build Coastguard Worker ALOGV("set REVERB_PARAM_PRESET, preset %d", value16);
1061*ec779b8eSAndroid Build Coastguard Worker if (value16 < REVERB_PRESET_NONE || value16 > REVERB_PRESET_PLATE) {
1062*ec779b8eSAndroid Build Coastguard Worker return -EINVAL;
1063*ec779b8eSAndroid Build Coastguard Worker }
1064*ec779b8eSAndroid Build Coastguard Worker // REVERB_PRESET_NONE is mapped to bypass
1065*ec779b8eSAndroid Build Coastguard Worker if (value16 == REVERB_PRESET_NONE) {
1066*ec779b8eSAndroid Build Coastguard Worker pReverb->m_bBypass = 1;
1067*ec779b8eSAndroid Build Coastguard Worker } else {
1068*ec779b8eSAndroid Build Coastguard Worker pReverb->m_bBypass = 0;
1069*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nNextRoom = value16 - 1;
1070*ec779b8eSAndroid Build Coastguard Worker }
1071*ec779b8eSAndroid Build Coastguard Worker } else {
1072*ec779b8eSAndroid Build Coastguard Worker switch (param) {
1073*ec779b8eSAndroid Build Coastguard Worker case REVERB_PARAM_ROOM_LEVEL:
1074*ec779b8eSAndroid Build Coastguard Worker case REVERB_PARAM_ROOM_HF_LEVEL:
1075*ec779b8eSAndroid Build Coastguard Worker case REVERB_PARAM_DECAY_HF_RATIO:
1076*ec779b8eSAndroid Build Coastguard Worker case REVERB_PARAM_REFLECTIONS_LEVEL:
1077*ec779b8eSAndroid Build Coastguard Worker case REVERB_PARAM_REVERB_LEVEL:
1078*ec779b8eSAndroid Build Coastguard Worker case REVERB_PARAM_DIFFUSION:
1079*ec779b8eSAndroid Build Coastguard Worker case REVERB_PARAM_DENSITY:
1080*ec779b8eSAndroid Build Coastguard Worker paramSize = sizeof(int16_t);
1081*ec779b8eSAndroid Build Coastguard Worker break;
1082*ec779b8eSAndroid Build Coastguard Worker
1083*ec779b8eSAndroid Build Coastguard Worker case REVERB_PARAM_BYPASS:
1084*ec779b8eSAndroid Build Coastguard Worker case REVERB_PARAM_DECAY_TIME:
1085*ec779b8eSAndroid Build Coastguard Worker case REVERB_PARAM_REFLECTIONS_DELAY:
1086*ec779b8eSAndroid Build Coastguard Worker case REVERB_PARAM_REVERB_DELAY:
1087*ec779b8eSAndroid Build Coastguard Worker paramSize = sizeof(int32_t);
1088*ec779b8eSAndroid Build Coastguard Worker break;
1089*ec779b8eSAndroid Build Coastguard Worker
1090*ec779b8eSAndroid Build Coastguard Worker case REVERB_PARAM_PROPERTIES:
1091*ec779b8eSAndroid Build Coastguard Worker paramSize = sizeof(t_reverb_settings);
1092*ec779b8eSAndroid Build Coastguard Worker break;
1093*ec779b8eSAndroid Build Coastguard Worker
1094*ec779b8eSAndroid Build Coastguard Worker default:
1095*ec779b8eSAndroid Build Coastguard Worker return -EINVAL;
1096*ec779b8eSAndroid Build Coastguard Worker }
1097*ec779b8eSAndroid Build Coastguard Worker
1098*ec779b8eSAndroid Build Coastguard Worker if (size != paramSize) {
1099*ec779b8eSAndroid Build Coastguard Worker return -EINVAL;
1100*ec779b8eSAndroid Build Coastguard Worker }
1101*ec779b8eSAndroid Build Coastguard Worker
1102*ec779b8eSAndroid Build Coastguard Worker if (paramSize == sizeof(int16_t)) {
1103*ec779b8eSAndroid Build Coastguard Worker value16 = *(int16_t *) pValue;
1104*ec779b8eSAndroid Build Coastguard Worker } else if (paramSize == sizeof(int32_t)) {
1105*ec779b8eSAndroid Build Coastguard Worker value32 = *(int32_t *) pValue;
1106*ec779b8eSAndroid Build Coastguard Worker } else {
1107*ec779b8eSAndroid Build Coastguard Worker pProperties = (t_reverb_settings *) pValue;
1108*ec779b8eSAndroid Build Coastguard Worker }
1109*ec779b8eSAndroid Build Coastguard Worker
1110*ec779b8eSAndroid Build Coastguard Worker pPreset = &pReverb->m_sPreset.m_sPreset[pReverb->m_nNextRoom];
1111*ec779b8eSAndroid Build Coastguard Worker
1112*ec779b8eSAndroid Build Coastguard Worker switch (param) {
1113*ec779b8eSAndroid Build Coastguard Worker case REVERB_PARAM_BYPASS:
1114*ec779b8eSAndroid Build Coastguard Worker pReverb->m_bBypass = (uint16_t)value32;
1115*ec779b8eSAndroid Build Coastguard Worker break;
1116*ec779b8eSAndroid Build Coastguard Worker
1117*ec779b8eSAndroid Build Coastguard Worker case REVERB_PARAM_PROPERTIES:
1118*ec779b8eSAndroid Build Coastguard Worker value16 = pProperties->roomLevel;
1119*ec779b8eSAndroid Build Coastguard Worker /* FALL THROUGH */
1120*ec779b8eSAndroid Build Coastguard Worker
1121*ec779b8eSAndroid Build Coastguard Worker case REVERB_PARAM_ROOM_LEVEL:
1122*ec779b8eSAndroid Build Coastguard Worker // Convert millibels to linear 16 bit signed => m_nRoomLpfFwd
1123*ec779b8eSAndroid Build Coastguard Worker if (value16 > 0)
1124*ec779b8eSAndroid Build Coastguard Worker return -EINVAL;
1125*ec779b8eSAndroid Build Coastguard Worker
1126*ec779b8eSAndroid Build Coastguard Worker temp = Effects_MillibelsToLinear16(value16);
1127*ec779b8eSAndroid Build Coastguard Worker
1128*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nRoomLpfFwd
1129*ec779b8eSAndroid Build Coastguard Worker = MULT_EG1_EG1(temp, (32767 - pReverb->m_nRoomLpfFbk));
1130*ec779b8eSAndroid Build Coastguard Worker
1131*ec779b8eSAndroid Build Coastguard Worker ALOGV("REVERB_PARAM_ROOM_LEVEL, gain %d, new m_nRoomLpfFwd %d, m_nRoomLpfFbk %d", temp, pReverb->m_nRoomLpfFwd, pReverb->m_nRoomLpfFbk);
1132*ec779b8eSAndroid Build Coastguard Worker if (param == REVERB_PARAM_ROOM_LEVEL)
1133*ec779b8eSAndroid Build Coastguard Worker break;
1134*ec779b8eSAndroid Build Coastguard Worker value16 = pProperties->roomHFLevel;
1135*ec779b8eSAndroid Build Coastguard Worker /* FALL THROUGH */
1136*ec779b8eSAndroid Build Coastguard Worker
1137*ec779b8eSAndroid Build Coastguard Worker case REVERB_PARAM_ROOM_HF_LEVEL:
1138*ec779b8eSAndroid Build Coastguard Worker
1139*ec779b8eSAndroid Build Coastguard Worker // Limit to 0 , -40dB range because of low pass implementation
1140*ec779b8eSAndroid Build Coastguard Worker if (value16 > 0 || value16 < -4000)
1141*ec779b8eSAndroid Build Coastguard Worker return -EINVAL;
1142*ec779b8eSAndroid Build Coastguard Worker // Convert attenuation @ 5000H expressed in millibels to => m_nRoomLpfFbk
1143*ec779b8eSAndroid Build Coastguard Worker // m_nRoomLpfFbk is -a1 where a1 is the solution of:
1144*ec779b8eSAndroid Build Coastguard Worker // a1^2 + 2*(C-dG^2)/(1-dG^2)*a1 + 1 = 0 where:
1145*ec779b8eSAndroid Build Coastguard Worker // - C is cos(2*pi*5000/Fs) (pReverb->m_nCosWT_5KHz)
1146*ec779b8eSAndroid Build Coastguard Worker // - dG is G0/Gf (G0 is the linear gain at DC and Gf is the wanted gain at 5000Hz)
1147*ec779b8eSAndroid Build Coastguard Worker
1148*ec779b8eSAndroid Build Coastguard Worker // Save current DC gain m_nRoomLpfFwd / (32767 - m_nRoomLpfFbk) to keep it unchanged
1149*ec779b8eSAndroid Build Coastguard Worker // while changing HF level
1150*ec779b8eSAndroid Build Coastguard Worker temp2 = (pReverb->m_nRoomLpfFwd << 15) / (32767
1151*ec779b8eSAndroid Build Coastguard Worker - pReverb->m_nRoomLpfFbk);
1152*ec779b8eSAndroid Build Coastguard Worker if (value16 == 0) {
1153*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nRoomLpfFbk = 0;
1154*ec779b8eSAndroid Build Coastguard Worker } else {
1155*ec779b8eSAndroid Build Coastguard Worker int32_t dG2, b, delta;
1156*ec779b8eSAndroid Build Coastguard Worker
1157*ec779b8eSAndroid Build Coastguard Worker // dG^2
1158*ec779b8eSAndroid Build Coastguard Worker temp = Effects_MillibelsToLinear16(value16);
1159*ec779b8eSAndroid Build Coastguard Worker ALOGV("REVERB_PARAM_ROOM_HF_LEVEL, HF gain %d", temp);
1160*ec779b8eSAndroid Build Coastguard Worker temp = (1 << 30) / temp;
1161*ec779b8eSAndroid Build Coastguard Worker ALOGV("REVERB_PARAM_ROOM_HF_LEVEL, 1/ HF gain %d", temp);
1162*ec779b8eSAndroid Build Coastguard Worker dG2 = (int32_t) (((int64_t) temp * (int64_t) temp) >> 15);
1163*ec779b8eSAndroid Build Coastguard Worker ALOGV("REVERB_PARAM_ROOM_HF_LEVEL, 1/ HF gain ^ 2 %d", dG2);
1164*ec779b8eSAndroid Build Coastguard Worker // b = 2*(C-dG^2)/(1-dG^2)
1165*ec779b8eSAndroid Build Coastguard Worker b = (int32_t) ((((int64_t) 1 << (15 + 1))
1166*ec779b8eSAndroid Build Coastguard Worker * ((int64_t) pReverb->m_nCosWT_5KHz - (int64_t) dG2))
1167*ec779b8eSAndroid Build Coastguard Worker / ((int64_t) 32767 - (int64_t) dG2));
1168*ec779b8eSAndroid Build Coastguard Worker
1169*ec779b8eSAndroid Build Coastguard Worker // delta = b^2 - 4
1170*ec779b8eSAndroid Build Coastguard Worker delta = (int32_t) ((((int64_t) b * (int64_t) b) >> 15) - (1 << (15
1171*ec779b8eSAndroid Build Coastguard Worker + 2)));
1172*ec779b8eSAndroid Build Coastguard Worker
1173*ec779b8eSAndroid Build Coastguard Worker ALOGV_IF(delta > (1<<30), " delta overflow %d", delta);
1174*ec779b8eSAndroid Build Coastguard Worker
1175*ec779b8eSAndroid Build Coastguard Worker ALOGV("REVERB_PARAM_ROOM_HF_LEVEL, dG2 %d, b %d, delta %d, m_nCosWT_5KHz %d", dG2, b, delta, pReverb->m_nCosWT_5KHz);
1176*ec779b8eSAndroid Build Coastguard Worker // m_nRoomLpfFbk = -a1 = - (- b + sqrt(delta)) / 2
1177*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nRoomLpfFbk = (b - Effects_Sqrt(delta) * 181) >> 1;
1178*ec779b8eSAndroid Build Coastguard Worker }
1179*ec779b8eSAndroid Build Coastguard Worker ALOGV("REVERB_PARAM_ROOM_HF_LEVEL, olg DC gain %d new m_nRoomLpfFbk %d, old m_nRoomLpfFwd %d",
1180*ec779b8eSAndroid Build Coastguard Worker temp2, pReverb->m_nRoomLpfFbk, pReverb->m_nRoomLpfFwd);
1181*ec779b8eSAndroid Build Coastguard Worker
1182*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nRoomLpfFwd
1183*ec779b8eSAndroid Build Coastguard Worker = MULT_EG1_EG1(temp2, (32767 - pReverb->m_nRoomLpfFbk));
1184*ec779b8eSAndroid Build Coastguard Worker ALOGV("REVERB_PARAM_ROOM_HF_LEVEL, new m_nRoomLpfFwd %d", pReverb->m_nRoomLpfFwd);
1185*ec779b8eSAndroid Build Coastguard Worker
1186*ec779b8eSAndroid Build Coastguard Worker if (param == REVERB_PARAM_ROOM_HF_LEVEL)
1187*ec779b8eSAndroid Build Coastguard Worker break;
1188*ec779b8eSAndroid Build Coastguard Worker value32 = pProperties->decayTime;
1189*ec779b8eSAndroid Build Coastguard Worker /* FALL THROUGH */
1190*ec779b8eSAndroid Build Coastguard Worker
1191*ec779b8eSAndroid Build Coastguard Worker case REVERB_PARAM_DECAY_TIME:
1192*ec779b8eSAndroid Build Coastguard Worker
1193*ec779b8eSAndroid Build Coastguard Worker // Convert milliseconds to => m_nRvbLpfFwd (function of m_nRvbLpfFbk)
1194*ec779b8eSAndroid Build Coastguard Worker // convert ms to samples
1195*ec779b8eSAndroid Build Coastguard Worker value32 = (value32 * pReverb->m_nSamplingRate) / 1000;
1196*ec779b8eSAndroid Build Coastguard Worker
1197*ec779b8eSAndroid Build Coastguard Worker // calculate valid decay time range as a function of current reverb delay and
1198*ec779b8eSAndroid Build Coastguard Worker // max feed back gain. Min value <=> -40dB in one pass, Max value <=> feedback gain = -1 dB
1199*ec779b8eSAndroid Build Coastguard Worker // Calculate attenuation for each round in late reverb given a total attenuation of -6000 millibels.
1200*ec779b8eSAndroid Build Coastguard Worker // g = -6000 d/DT , g gain in millibels, d reverb delay, DT decay time
1201*ec779b8eSAndroid Build Coastguard Worker averageDelay = pReverb->m_nLateDelay - pReverb->m_nMaxExcursion;
1202*ec779b8eSAndroid Build Coastguard Worker averageDelay += ((pReverb->m_sAp0.m_zApOut - pReverb->m_sAp0.m_zApIn)
1203*ec779b8eSAndroid Build Coastguard Worker + (pReverb->m_sAp1.m_zApOut - pReverb->m_sAp1.m_zApIn)) >> 1;
1204*ec779b8eSAndroid Build Coastguard Worker
1205*ec779b8eSAndroid Build Coastguard Worker temp = (-6000 * averageDelay) / value32;
1206*ec779b8eSAndroid Build Coastguard Worker ALOGV("REVERB_PARAM_DECAY_TIME, delay smps %d, DT smps %d, gain mB %d",averageDelay, value32, temp);
1207*ec779b8eSAndroid Build Coastguard Worker if (temp < -4000 || temp > -100)
1208*ec779b8eSAndroid Build Coastguard Worker return -EINVAL;
1209*ec779b8eSAndroid Build Coastguard Worker
1210*ec779b8eSAndroid Build Coastguard Worker // calculate low pass gain by adding reverb input attenuation (pReverb->m_nLateGain) and substrating output
1211*ec779b8eSAndroid Build Coastguard Worker // xfade and sum gain (max +9dB)
1212*ec779b8eSAndroid Build Coastguard Worker temp -= Effects_Linear16ToMillibels(pReverb->m_nLateGain) + 900;
1213*ec779b8eSAndroid Build Coastguard Worker temp = Effects_MillibelsToLinear16(temp);
1214*ec779b8eSAndroid Build Coastguard Worker
1215*ec779b8eSAndroid Build Coastguard Worker // DC gain (temp) = b0 / (1 + a1) = pReverb->m_nRvbLpfFwd / (32767 - pReverb->m_nRvbLpfFbk)
1216*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nRvbLpfFwd
1217*ec779b8eSAndroid Build Coastguard Worker = MULT_EG1_EG1(temp, (32767 - pReverb->m_nRvbLpfFbk));
1218*ec779b8eSAndroid Build Coastguard Worker
1219*ec779b8eSAndroid Build Coastguard Worker ALOGV("REVERB_PARAM_DECAY_TIME, gain %d, new m_nRvbLpfFwd %d, old m_nRvbLpfFbk %d, reverb gain %d", temp, pReverb->m_nRvbLpfFwd, pReverb->m_nRvbLpfFbk, Effects_Linear16ToMillibels(pReverb->m_nLateGain));
1220*ec779b8eSAndroid Build Coastguard Worker
1221*ec779b8eSAndroid Build Coastguard Worker if (param == REVERB_PARAM_DECAY_TIME)
1222*ec779b8eSAndroid Build Coastguard Worker break;
1223*ec779b8eSAndroid Build Coastguard Worker value16 = pProperties->decayHFRatio;
1224*ec779b8eSAndroid Build Coastguard Worker /* FALL THROUGH */
1225*ec779b8eSAndroid Build Coastguard Worker
1226*ec779b8eSAndroid Build Coastguard Worker case REVERB_PARAM_DECAY_HF_RATIO:
1227*ec779b8eSAndroid Build Coastguard Worker
1228*ec779b8eSAndroid Build Coastguard Worker // We limit max value to 1000 because reverb filter is lowpass only
1229*ec779b8eSAndroid Build Coastguard Worker if (value16 < 100 || value16 > 1000)
1230*ec779b8eSAndroid Build Coastguard Worker return -EINVAL;
1231*ec779b8eSAndroid Build Coastguard Worker // Convert per mille to => m_nLpfFwd, m_nLpfFbk
1232*ec779b8eSAndroid Build Coastguard Worker
1233*ec779b8eSAndroid Build Coastguard Worker // Save current DC gain m_nRoomLpfFwd / (32767 - m_nRoomLpfFbk) to keep it unchanged
1234*ec779b8eSAndroid Build Coastguard Worker // while changing HF level
1235*ec779b8eSAndroid Build Coastguard Worker temp2 = (pReverb->m_nRvbLpfFwd << 15) / (32767 - pReverb->m_nRvbLpfFbk);
1236*ec779b8eSAndroid Build Coastguard Worker
1237*ec779b8eSAndroid Build Coastguard Worker if (value16 == 1000) {
1238*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nRvbLpfFbk = 0;
1239*ec779b8eSAndroid Build Coastguard Worker } else {
1240*ec779b8eSAndroid Build Coastguard Worker int32_t dG2, b, delta;
1241*ec779b8eSAndroid Build Coastguard Worker
1242*ec779b8eSAndroid Build Coastguard Worker temp = Effects_Linear16ToMillibels(temp2);
1243*ec779b8eSAndroid Build Coastguard Worker // G_5000Hz = G_DC * (1000/REVERB_PARAM_DECAY_HF_RATIO) in millibels
1244*ec779b8eSAndroid Build Coastguard Worker
1245*ec779b8eSAndroid Build Coastguard Worker value32 = ((int32_t) 1000 << 15) / (int32_t) value16;
1246*ec779b8eSAndroid Build Coastguard Worker ALOGV("REVERB_PARAM_DECAY_HF_RATIO, DC gain %d, DC gain mB %d, 1000/R %d", temp2, temp, value32);
1247*ec779b8eSAndroid Build Coastguard Worker
1248*ec779b8eSAndroid Build Coastguard Worker temp = (int32_t) (((int64_t) temp * (int64_t) value32) >> 15);
1249*ec779b8eSAndroid Build Coastguard Worker
1250*ec779b8eSAndroid Build Coastguard Worker if (temp < -4000) {
1251*ec779b8eSAndroid Build Coastguard Worker ALOGV("REVERB_PARAM_DECAY_HF_RATIO HF gain overflow %d mB", temp);
1252*ec779b8eSAndroid Build Coastguard Worker temp = -4000;
1253*ec779b8eSAndroid Build Coastguard Worker }
1254*ec779b8eSAndroid Build Coastguard Worker
1255*ec779b8eSAndroid Build Coastguard Worker temp = Effects_MillibelsToLinear16(temp);
1256*ec779b8eSAndroid Build Coastguard Worker ALOGV("REVERB_PARAM_DECAY_HF_RATIO, HF gain %d", temp);
1257*ec779b8eSAndroid Build Coastguard Worker // dG^2
1258*ec779b8eSAndroid Build Coastguard Worker temp = (temp2 << 15) / temp;
1259*ec779b8eSAndroid Build Coastguard Worker dG2 = (int32_t) (((int64_t) temp * (int64_t) temp) >> 15);
1260*ec779b8eSAndroid Build Coastguard Worker
1261*ec779b8eSAndroid Build Coastguard Worker // b = 2*(C-dG^2)/(1-dG^2)
1262*ec779b8eSAndroid Build Coastguard Worker b = (int32_t) ((((int64_t) 1 << (15 + 1))
1263*ec779b8eSAndroid Build Coastguard Worker * ((int64_t) pReverb->m_nCosWT_5KHz - (int64_t) dG2))
1264*ec779b8eSAndroid Build Coastguard Worker / ((int64_t) 32767 - (int64_t) dG2));
1265*ec779b8eSAndroid Build Coastguard Worker
1266*ec779b8eSAndroid Build Coastguard Worker // delta = b^2 - 4
1267*ec779b8eSAndroid Build Coastguard Worker delta = (int32_t) ((((int64_t) b * (int64_t) b) >> 15) - (1 << (15
1268*ec779b8eSAndroid Build Coastguard Worker + 2)));
1269*ec779b8eSAndroid Build Coastguard Worker
1270*ec779b8eSAndroid Build Coastguard Worker // m_nRoomLpfFbk = -a1 = - (- b + sqrt(delta)) / 2
1271*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nRvbLpfFbk = (b - Effects_Sqrt(delta) * 181) >> 1;
1272*ec779b8eSAndroid Build Coastguard Worker
1273*ec779b8eSAndroid Build Coastguard Worker ALOGV("REVERB_PARAM_DECAY_HF_RATIO, dG2 %d, b %d, delta %d", dG2, b, delta);
1274*ec779b8eSAndroid Build Coastguard Worker
1275*ec779b8eSAndroid Build Coastguard Worker }
1276*ec779b8eSAndroid Build Coastguard Worker
1277*ec779b8eSAndroid Build Coastguard Worker ALOGV("REVERB_PARAM_DECAY_HF_RATIO, gain %d, m_nRvbLpfFbk %d, m_nRvbLpfFwd %d", temp2, pReverb->m_nRvbLpfFbk, pReverb->m_nRvbLpfFwd);
1278*ec779b8eSAndroid Build Coastguard Worker
1279*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nRvbLpfFwd
1280*ec779b8eSAndroid Build Coastguard Worker = MULT_EG1_EG1(temp2, (32767 - pReverb->m_nRvbLpfFbk));
1281*ec779b8eSAndroid Build Coastguard Worker
1282*ec779b8eSAndroid Build Coastguard Worker if (param == REVERB_PARAM_DECAY_HF_RATIO)
1283*ec779b8eSAndroid Build Coastguard Worker break;
1284*ec779b8eSAndroid Build Coastguard Worker value16 = pProperties->reflectionsLevel;
1285*ec779b8eSAndroid Build Coastguard Worker /* FALL THROUGH */
1286*ec779b8eSAndroid Build Coastguard Worker
1287*ec779b8eSAndroid Build Coastguard Worker case REVERB_PARAM_REFLECTIONS_LEVEL:
1288*ec779b8eSAndroid Build Coastguard Worker // We limit max value to 0 because gain is limited to 0dB
1289*ec779b8eSAndroid Build Coastguard Worker if (value16 > 0 || value16 < -6000)
1290*ec779b8eSAndroid Build Coastguard Worker return -EINVAL;
1291*ec779b8eSAndroid Build Coastguard Worker
1292*ec779b8eSAndroid Build Coastguard Worker // Convert millibels to linear 16 bit signed and recompute m_sEarlyL.m_nGain[i] and m_sEarlyR.m_nGain[i].
1293*ec779b8eSAndroid Build Coastguard Worker value16 = Effects_MillibelsToLinear16(value16);
1294*ec779b8eSAndroid Build Coastguard Worker for (i = 0; i < REVERB_MAX_NUM_REFLECTIONS; i++) {
1295*ec779b8eSAndroid Build Coastguard Worker pReverb->m_sEarlyL.m_nGain[i]
1296*ec779b8eSAndroid Build Coastguard Worker = MULT_EG1_EG1(pPreset->m_sEarlyL.m_nGain[i],value16);
1297*ec779b8eSAndroid Build Coastguard Worker pReverb->m_sEarlyR.m_nGain[i]
1298*ec779b8eSAndroid Build Coastguard Worker = MULT_EG1_EG1(pPreset->m_sEarlyR.m_nGain[i],value16);
1299*ec779b8eSAndroid Build Coastguard Worker }
1300*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nEarlyGain = value16;
1301*ec779b8eSAndroid Build Coastguard Worker ALOGV("REVERB_PARAM_REFLECTIONS_LEVEL, m_nEarlyGain %d", pReverb->m_nEarlyGain);
1302*ec779b8eSAndroid Build Coastguard Worker
1303*ec779b8eSAndroid Build Coastguard Worker if (param == REVERB_PARAM_REFLECTIONS_LEVEL)
1304*ec779b8eSAndroid Build Coastguard Worker break;
1305*ec779b8eSAndroid Build Coastguard Worker value32 = pProperties->reflectionsDelay;
1306*ec779b8eSAndroid Build Coastguard Worker /* FALL THROUGH */
1307*ec779b8eSAndroid Build Coastguard Worker
1308*ec779b8eSAndroid Build Coastguard Worker case REVERB_PARAM_REFLECTIONS_DELAY:
1309*ec779b8eSAndroid Build Coastguard Worker // We limit max value MAX_EARLY_TIME
1310*ec779b8eSAndroid Build Coastguard Worker // convert ms to time units
1311*ec779b8eSAndroid Build Coastguard Worker temp = (value32 * 65536) / 1000;
1312*ec779b8eSAndroid Build Coastguard Worker if (temp < 0 || temp > MAX_EARLY_TIME)
1313*ec779b8eSAndroid Build Coastguard Worker return -EINVAL;
1314*ec779b8eSAndroid Build Coastguard Worker
1315*ec779b8eSAndroid Build Coastguard Worker maxSamples = (int32_t) (MAX_EARLY_TIME * pReverb->m_nSamplingRate)
1316*ec779b8eSAndroid Build Coastguard Worker >> 16;
1317*ec779b8eSAndroid Build Coastguard Worker temp = (temp * pReverb->m_nSamplingRate) >> 16;
1318*ec779b8eSAndroid Build Coastguard Worker for (i = 0; i < REVERB_MAX_NUM_REFLECTIONS; i++) {
1319*ec779b8eSAndroid Build Coastguard Worker temp2 = temp + (((int32_t) pPreset->m_sEarlyL.m_zDelay[i]
1320*ec779b8eSAndroid Build Coastguard Worker * pReverb->m_nSamplingRate) >> 16);
1321*ec779b8eSAndroid Build Coastguard Worker if (temp2 > maxSamples)
1322*ec779b8eSAndroid Build Coastguard Worker temp2 = maxSamples;
1323*ec779b8eSAndroid Build Coastguard Worker pReverb->m_sEarlyL.m_zDelay[i] = pReverb->m_nEarly0in + temp2;
1324*ec779b8eSAndroid Build Coastguard Worker temp2 = temp + (((int32_t) pPreset->m_sEarlyR.m_zDelay[i]
1325*ec779b8eSAndroid Build Coastguard Worker * pReverb->m_nSamplingRate) >> 16);
1326*ec779b8eSAndroid Build Coastguard Worker if (temp2 > maxSamples)
1327*ec779b8eSAndroid Build Coastguard Worker temp2 = maxSamples;
1328*ec779b8eSAndroid Build Coastguard Worker pReverb->m_sEarlyR.m_zDelay[i] = pReverb->m_nEarly1in + temp2;
1329*ec779b8eSAndroid Build Coastguard Worker }
1330*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nEarlyDelay = temp;
1331*ec779b8eSAndroid Build Coastguard Worker
1332*ec779b8eSAndroid Build Coastguard Worker ALOGV("REVERB_PARAM_REFLECTIONS_DELAY, m_nEarlyDelay smps %d max smp delay %d", pReverb->m_nEarlyDelay, maxSamples);
1333*ec779b8eSAndroid Build Coastguard Worker
1334*ec779b8eSAndroid Build Coastguard Worker // Convert milliseconds to sample count => m_nEarlyDelay
1335*ec779b8eSAndroid Build Coastguard Worker if (param == REVERB_PARAM_REFLECTIONS_DELAY)
1336*ec779b8eSAndroid Build Coastguard Worker break;
1337*ec779b8eSAndroid Build Coastguard Worker value16 = pProperties->reverbLevel;
1338*ec779b8eSAndroid Build Coastguard Worker /* FALL THROUGH */
1339*ec779b8eSAndroid Build Coastguard Worker
1340*ec779b8eSAndroid Build Coastguard Worker case REVERB_PARAM_REVERB_LEVEL:
1341*ec779b8eSAndroid Build Coastguard Worker // We limit max value to 0 because gain is limited to 0dB
1342*ec779b8eSAndroid Build Coastguard Worker if (value16 > 0 || value16 < -6000)
1343*ec779b8eSAndroid Build Coastguard Worker return -EINVAL;
1344*ec779b8eSAndroid Build Coastguard Worker // Convert millibels to linear 16 bits (gange 0 - 8191) => m_nLateGain.
1345*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nLateGain = Effects_MillibelsToLinear16(value16) >> 2;
1346*ec779b8eSAndroid Build Coastguard Worker
1347*ec779b8eSAndroid Build Coastguard Worker ALOGV("REVERB_PARAM_REVERB_LEVEL, m_nLateGain %d", pReverb->m_nLateGain);
1348*ec779b8eSAndroid Build Coastguard Worker
1349*ec779b8eSAndroid Build Coastguard Worker if (param == REVERB_PARAM_REVERB_LEVEL)
1350*ec779b8eSAndroid Build Coastguard Worker break;
1351*ec779b8eSAndroid Build Coastguard Worker value32 = pProperties->reverbDelay;
1352*ec779b8eSAndroid Build Coastguard Worker /* FALL THROUGH */
1353*ec779b8eSAndroid Build Coastguard Worker
1354*ec779b8eSAndroid Build Coastguard Worker case REVERB_PARAM_REVERB_DELAY:
1355*ec779b8eSAndroid Build Coastguard Worker // We limit max value to MAX_DELAY_TIME
1356*ec779b8eSAndroid Build Coastguard Worker // convert ms to time units
1357*ec779b8eSAndroid Build Coastguard Worker temp = (value32 * 65536) / 1000;
1358*ec779b8eSAndroid Build Coastguard Worker if (temp < 0 || temp > MAX_DELAY_TIME)
1359*ec779b8eSAndroid Build Coastguard Worker return -EINVAL;
1360*ec779b8eSAndroid Build Coastguard Worker
1361*ec779b8eSAndroid Build Coastguard Worker maxSamples = (int32_t) (MAX_DELAY_TIME * pReverb->m_nSamplingRate)
1362*ec779b8eSAndroid Build Coastguard Worker >> 16;
1363*ec779b8eSAndroid Build Coastguard Worker temp = (temp * pReverb->m_nSamplingRate) >> 16;
1364*ec779b8eSAndroid Build Coastguard Worker if ((temp + pReverb->m_nMaxExcursion) > maxSamples) {
1365*ec779b8eSAndroid Build Coastguard Worker temp = maxSamples - pReverb->m_nMaxExcursion;
1366*ec779b8eSAndroid Build Coastguard Worker }
1367*ec779b8eSAndroid Build Coastguard Worker if (temp < pReverb->m_nMaxExcursion) {
1368*ec779b8eSAndroid Build Coastguard Worker temp = pReverb->m_nMaxExcursion;
1369*ec779b8eSAndroid Build Coastguard Worker }
1370*ec779b8eSAndroid Build Coastguard Worker
1371*ec779b8eSAndroid Build Coastguard Worker temp -= pReverb->m_nLateDelay;
1372*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nDelay0Out += temp;
1373*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nDelay1Out += temp;
1374*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nLateDelay += temp;
1375*ec779b8eSAndroid Build Coastguard Worker
1376*ec779b8eSAndroid Build Coastguard Worker ALOGV("REVERB_PARAM_REVERB_DELAY, m_nLateDelay smps %d max smp delay %d", pReverb->m_nLateDelay, maxSamples);
1377*ec779b8eSAndroid Build Coastguard Worker
1378*ec779b8eSAndroid Build Coastguard Worker // Convert milliseconds to sample count => m_nDelay1Out + m_nMaxExcursion
1379*ec779b8eSAndroid Build Coastguard Worker if (param == REVERB_PARAM_REVERB_DELAY)
1380*ec779b8eSAndroid Build Coastguard Worker break;
1381*ec779b8eSAndroid Build Coastguard Worker
1382*ec779b8eSAndroid Build Coastguard Worker value16 = pProperties->diffusion;
1383*ec779b8eSAndroid Build Coastguard Worker /* FALL THROUGH */
1384*ec779b8eSAndroid Build Coastguard Worker
1385*ec779b8eSAndroid Build Coastguard Worker case REVERB_PARAM_DIFFUSION:
1386*ec779b8eSAndroid Build Coastguard Worker if (value16 < 0 || value16 > 1000)
1387*ec779b8eSAndroid Build Coastguard Worker return -EINVAL;
1388*ec779b8eSAndroid Build Coastguard Worker
1389*ec779b8eSAndroid Build Coastguard Worker // Convert per mille to m_sAp0.m_nApGain, m_sAp1.m_nApGain
1390*ec779b8eSAndroid Build Coastguard Worker pReverb->m_sAp0.m_nApGain = AP0_GAIN_BASE + ((int32_t) value16
1391*ec779b8eSAndroid Build Coastguard Worker * AP0_GAIN_RANGE) / 1000;
1392*ec779b8eSAndroid Build Coastguard Worker pReverb->m_sAp1.m_nApGain = AP1_GAIN_BASE + ((int32_t) value16
1393*ec779b8eSAndroid Build Coastguard Worker * AP1_GAIN_RANGE) / 1000;
1394*ec779b8eSAndroid Build Coastguard Worker
1395*ec779b8eSAndroid Build Coastguard Worker ALOGV("REVERB_PARAM_DIFFUSION, m_sAp0.m_nApGain %d m_sAp1.m_nApGain %d", pReverb->m_sAp0.m_nApGain, pReverb->m_sAp1.m_nApGain);
1396*ec779b8eSAndroid Build Coastguard Worker
1397*ec779b8eSAndroid Build Coastguard Worker if (param == REVERB_PARAM_DIFFUSION)
1398*ec779b8eSAndroid Build Coastguard Worker break;
1399*ec779b8eSAndroid Build Coastguard Worker
1400*ec779b8eSAndroid Build Coastguard Worker value16 = pProperties->density;
1401*ec779b8eSAndroid Build Coastguard Worker /* FALL THROUGH */
1402*ec779b8eSAndroid Build Coastguard Worker
1403*ec779b8eSAndroid Build Coastguard Worker case REVERB_PARAM_DENSITY:
1404*ec779b8eSAndroid Build Coastguard Worker if (value16 < 0 || value16 > 1000)
1405*ec779b8eSAndroid Build Coastguard Worker return -EINVAL;
1406*ec779b8eSAndroid Build Coastguard Worker
1407*ec779b8eSAndroid Build Coastguard Worker // Convert per mille to m_sAp0.m_zApOut, m_sAp1.m_zApOut
1408*ec779b8eSAndroid Build Coastguard Worker maxSamples = (int32_t) (MAX_AP_TIME * pReverb->m_nSamplingRate) >> 16;
1409*ec779b8eSAndroid Build Coastguard Worker
1410*ec779b8eSAndroid Build Coastguard Worker temp = AP0_TIME_BASE + ((int32_t) value16 * AP0_TIME_RANGE) / 1000;
1411*ec779b8eSAndroid Build Coastguard Worker /*lint -e{702} shift for performance */
1412*ec779b8eSAndroid Build Coastguard Worker temp = (temp * pReverb->m_nSamplingRate) >> 16;
1413*ec779b8eSAndroid Build Coastguard Worker if (temp > maxSamples)
1414*ec779b8eSAndroid Build Coastguard Worker temp = maxSamples;
1415*ec779b8eSAndroid Build Coastguard Worker pReverb->m_sAp0.m_zApOut = (uint16_t) (pReverb->m_sAp0.m_zApIn + temp);
1416*ec779b8eSAndroid Build Coastguard Worker
1417*ec779b8eSAndroid Build Coastguard Worker ALOGV("REVERB_PARAM_DENSITY, Ap0 delay smps %d", temp);
1418*ec779b8eSAndroid Build Coastguard Worker
1419*ec779b8eSAndroid Build Coastguard Worker temp = AP1_TIME_BASE + ((int32_t) value16 * AP1_TIME_RANGE) / 1000;
1420*ec779b8eSAndroid Build Coastguard Worker /*lint -e{702} shift for performance */
1421*ec779b8eSAndroid Build Coastguard Worker temp = (temp * pReverb->m_nSamplingRate) >> 16;
1422*ec779b8eSAndroid Build Coastguard Worker if (temp > maxSamples)
1423*ec779b8eSAndroid Build Coastguard Worker temp = maxSamples;
1424*ec779b8eSAndroid Build Coastguard Worker pReverb->m_sAp1.m_zApOut = (uint16_t) (pReverb->m_sAp1.m_zApIn + temp);
1425*ec779b8eSAndroid Build Coastguard Worker
1426*ec779b8eSAndroid Build Coastguard Worker ALOGV("Ap1 delay smps %d", temp);
1427*ec779b8eSAndroid Build Coastguard Worker
1428*ec779b8eSAndroid Build Coastguard Worker break;
1429*ec779b8eSAndroid Build Coastguard Worker
1430*ec779b8eSAndroid Build Coastguard Worker default:
1431*ec779b8eSAndroid Build Coastguard Worker break;
1432*ec779b8eSAndroid Build Coastguard Worker }
1433*ec779b8eSAndroid Build Coastguard Worker }
1434*ec779b8eSAndroid Build Coastguard Worker
1435*ec779b8eSAndroid Build Coastguard Worker return 0;
1436*ec779b8eSAndroid Build Coastguard Worker } /* end Reverb_setParameter */
1437*ec779b8eSAndroid Build Coastguard Worker
1438*ec779b8eSAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
1439*ec779b8eSAndroid Build Coastguard Worker * ReverbUpdateXfade
1440*ec779b8eSAndroid Build Coastguard Worker *----------------------------------------------------------------------------
1441*ec779b8eSAndroid Build Coastguard Worker * Purpose:
1442*ec779b8eSAndroid Build Coastguard Worker * Update the xfade parameters as required
1443*ec779b8eSAndroid Build Coastguard Worker *
1444*ec779b8eSAndroid Build Coastguard Worker * Inputs:
1445*ec779b8eSAndroid Build Coastguard Worker * nNumSamplesToAdd - number of samples to write to buffer
1446*ec779b8eSAndroid Build Coastguard Worker *
1447*ec779b8eSAndroid Build Coastguard Worker * Outputs:
1448*ec779b8eSAndroid Build Coastguard Worker *
1449*ec779b8eSAndroid Build Coastguard Worker *
1450*ec779b8eSAndroid Build Coastguard Worker * Side Effects:
1451*ec779b8eSAndroid Build Coastguard Worker * - xfade parameters will be changed
1452*ec779b8eSAndroid Build Coastguard Worker *
1453*ec779b8eSAndroid Build Coastguard Worker *----------------------------------------------------------------------------
1454*ec779b8eSAndroid Build Coastguard Worker */
ReverbUpdateXfade(reverb_object_t * pReverb,int nNumSamplesToAdd)1455*ec779b8eSAndroid Build Coastguard Worker static int ReverbUpdateXfade(reverb_object_t *pReverb, int nNumSamplesToAdd) {
1456*ec779b8eSAndroid Build Coastguard Worker uint16_t nOffset;
1457*ec779b8eSAndroid Build Coastguard Worker int16_t tempCos;
1458*ec779b8eSAndroid Build Coastguard Worker int16_t tempSin;
1459*ec779b8eSAndroid Build Coastguard Worker
1460*ec779b8eSAndroid Build Coastguard Worker if (pReverb->m_nXfadeCounter >= pReverb->m_nXfadeInterval) {
1461*ec779b8eSAndroid Build Coastguard Worker /* update interval has elapsed, so reset counter */
1462*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nXfadeCounter = 0;
1463*ec779b8eSAndroid Build Coastguard Worker
1464*ec779b8eSAndroid Build Coastguard Worker // Pin the sin,cos values to min / max values to ensure that the
1465*ec779b8eSAndroid Build Coastguard Worker // modulated taps' coefs are zero (thus no clicks)
1466*ec779b8eSAndroid Build Coastguard Worker if (pReverb->m_nPhaseIncrement > 0) {
1467*ec779b8eSAndroid Build Coastguard Worker // if phase increment > 0, then sin -> 1, cos -> 0
1468*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nSin = 32767;
1469*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nCos = 0;
1470*ec779b8eSAndroid Build Coastguard Worker
1471*ec779b8eSAndroid Build Coastguard Worker // reset the phase to match the sin, cos values
1472*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nPhase = 32767;
1473*ec779b8eSAndroid Build Coastguard Worker
1474*ec779b8eSAndroid Build Coastguard Worker // modulate the cross taps because their tap coefs are zero
1475*ec779b8eSAndroid Build Coastguard Worker nOffset = ReverbCalculateNoise(pReverb);
1476*ec779b8eSAndroid Build Coastguard Worker
1477*ec779b8eSAndroid Build Coastguard Worker pReverb->m_zD1Cross = pReverb->m_nDelay1Out
1478*ec779b8eSAndroid Build Coastguard Worker - pReverb->m_nMaxExcursion + nOffset;
1479*ec779b8eSAndroid Build Coastguard Worker
1480*ec779b8eSAndroid Build Coastguard Worker nOffset = ReverbCalculateNoise(pReverb);
1481*ec779b8eSAndroid Build Coastguard Worker
1482*ec779b8eSAndroid Build Coastguard Worker pReverb->m_zD0Cross = pReverb->m_nDelay0Out
1483*ec779b8eSAndroid Build Coastguard Worker - pReverb->m_nMaxExcursion - nOffset;
1484*ec779b8eSAndroid Build Coastguard Worker } else {
1485*ec779b8eSAndroid Build Coastguard Worker // if phase increment < 0, then sin -> 0, cos -> 1
1486*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nSin = 0;
1487*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nCos = 32767;
1488*ec779b8eSAndroid Build Coastguard Worker
1489*ec779b8eSAndroid Build Coastguard Worker // reset the phase to match the sin, cos values
1490*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nPhase = -32768;
1491*ec779b8eSAndroid Build Coastguard Worker
1492*ec779b8eSAndroid Build Coastguard Worker // modulate the self taps because their tap coefs are zero
1493*ec779b8eSAndroid Build Coastguard Worker nOffset = ReverbCalculateNoise(pReverb);
1494*ec779b8eSAndroid Build Coastguard Worker
1495*ec779b8eSAndroid Build Coastguard Worker pReverb->m_zD0Self = pReverb->m_nDelay0Out
1496*ec779b8eSAndroid Build Coastguard Worker - pReverb->m_nMaxExcursion - nOffset;
1497*ec779b8eSAndroid Build Coastguard Worker
1498*ec779b8eSAndroid Build Coastguard Worker nOffset = ReverbCalculateNoise(pReverb);
1499*ec779b8eSAndroid Build Coastguard Worker
1500*ec779b8eSAndroid Build Coastguard Worker pReverb->m_zD1Self = pReverb->m_nDelay1Out
1501*ec779b8eSAndroid Build Coastguard Worker - pReverb->m_nMaxExcursion + nOffset;
1502*ec779b8eSAndroid Build Coastguard Worker
1503*ec779b8eSAndroid Build Coastguard Worker } // end if-else (pReverb->m_nPhaseIncrement > 0)
1504*ec779b8eSAndroid Build Coastguard Worker
1505*ec779b8eSAndroid Build Coastguard Worker // Reverse the direction of the sin,cos so that the
1506*ec779b8eSAndroid Build Coastguard Worker // tap whose coef was previously increasing now decreases
1507*ec779b8eSAndroid Build Coastguard Worker // and vice versa
1508*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nPhaseIncrement = -pReverb->m_nPhaseIncrement;
1509*ec779b8eSAndroid Build Coastguard Worker
1510*ec779b8eSAndroid Build Coastguard Worker } // end if counter >= update interval
1511*ec779b8eSAndroid Build Coastguard Worker
1512*ec779b8eSAndroid Build Coastguard Worker //compute what phase will be next time
1513*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nPhase += pReverb->m_nPhaseIncrement;
1514*ec779b8eSAndroid Build Coastguard Worker
1515*ec779b8eSAndroid Build Coastguard Worker //calculate what the new sin and cos need to reach by the next update
1516*ec779b8eSAndroid Build Coastguard Worker ReverbCalculateSinCos(pReverb->m_nPhase, &tempSin, &tempCos);
1517*ec779b8eSAndroid Build Coastguard Worker
1518*ec779b8eSAndroid Build Coastguard Worker //calculate the per-sample increment required to get there by the next update
1519*ec779b8eSAndroid Build Coastguard Worker /*lint -e{702} shift for performance */
1520*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nSinIncrement = (tempSin - pReverb->m_nSin)
1521*ec779b8eSAndroid Build Coastguard Worker >> pReverb->m_nUpdatePeriodInBits;
1522*ec779b8eSAndroid Build Coastguard Worker
1523*ec779b8eSAndroid Build Coastguard Worker /*lint -e{702} shift for performance */
1524*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nCosIncrement = (tempCos - pReverb->m_nCos)
1525*ec779b8eSAndroid Build Coastguard Worker >> pReverb->m_nUpdatePeriodInBits;
1526*ec779b8eSAndroid Build Coastguard Worker
1527*ec779b8eSAndroid Build Coastguard Worker /* increment update counter */
1528*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nXfadeCounter += (uint16_t) nNumSamplesToAdd;
1529*ec779b8eSAndroid Build Coastguard Worker
1530*ec779b8eSAndroid Build Coastguard Worker return 0;
1531*ec779b8eSAndroid Build Coastguard Worker
1532*ec779b8eSAndroid Build Coastguard Worker } /* end ReverbUpdateXfade */
1533*ec779b8eSAndroid Build Coastguard Worker
1534*ec779b8eSAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
1535*ec779b8eSAndroid Build Coastguard Worker * ReverbCalculateNoise
1536*ec779b8eSAndroid Build Coastguard Worker *----------------------------------------------------------------------------
1537*ec779b8eSAndroid Build Coastguard Worker * Purpose:
1538*ec779b8eSAndroid Build Coastguard Worker * Calculate a noise sample and limit its value
1539*ec779b8eSAndroid Build Coastguard Worker *
1540*ec779b8eSAndroid Build Coastguard Worker * Inputs:
1541*ec779b8eSAndroid Build Coastguard Worker * nMaxExcursion - noise value is limited to this value
1542*ec779b8eSAndroid Build Coastguard Worker * pnNoise - return new noise sample in this (not limited)
1543*ec779b8eSAndroid Build Coastguard Worker *
1544*ec779b8eSAndroid Build Coastguard Worker * Outputs:
1545*ec779b8eSAndroid Build Coastguard Worker * new limited noise value
1546*ec779b8eSAndroid Build Coastguard Worker *
1547*ec779b8eSAndroid Build Coastguard Worker * Side Effects:
1548*ec779b8eSAndroid Build Coastguard Worker * - *pnNoise noise value is updated
1549*ec779b8eSAndroid Build Coastguard Worker *
1550*ec779b8eSAndroid Build Coastguard Worker *----------------------------------------------------------------------------
1551*ec779b8eSAndroid Build Coastguard Worker */
ReverbCalculateNoise(reverb_object_t * pReverb)1552*ec779b8eSAndroid Build Coastguard Worker static uint16_t ReverbCalculateNoise(reverb_object_t *pReverb) {
1553*ec779b8eSAndroid Build Coastguard Worker int16_t nNoise = pReverb->m_nNoise;
1554*ec779b8eSAndroid Build Coastguard Worker
1555*ec779b8eSAndroid Build Coastguard Worker // calculate new noise value
1556*ec779b8eSAndroid Build Coastguard Worker if (pReverb->m_bUseNoise) {
1557*ec779b8eSAndroid Build Coastguard Worker nNoise = (int16_t) (nNoise * 5 + 1);
1558*ec779b8eSAndroid Build Coastguard Worker } else {
1559*ec779b8eSAndroid Build Coastguard Worker nNoise = 0;
1560*ec779b8eSAndroid Build Coastguard Worker }
1561*ec779b8eSAndroid Build Coastguard Worker
1562*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nNoise = nNoise;
1563*ec779b8eSAndroid Build Coastguard Worker // return the limited noise value
1564*ec779b8eSAndroid Build Coastguard Worker return (pReverb->m_nMaxExcursion & nNoise);
1565*ec779b8eSAndroid Build Coastguard Worker
1566*ec779b8eSAndroid Build Coastguard Worker } /* end ReverbCalculateNoise */
1567*ec779b8eSAndroid Build Coastguard Worker
1568*ec779b8eSAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
1569*ec779b8eSAndroid Build Coastguard Worker * ReverbCalculateSinCos
1570*ec779b8eSAndroid Build Coastguard Worker *----------------------------------------------------------------------------
1571*ec779b8eSAndroid Build Coastguard Worker * Purpose:
1572*ec779b8eSAndroid Build Coastguard Worker * Calculate a new sin and cosine value based on the given phase
1573*ec779b8eSAndroid Build Coastguard Worker *
1574*ec779b8eSAndroid Build Coastguard Worker * Inputs:
1575*ec779b8eSAndroid Build Coastguard Worker * nPhase - phase angle
1576*ec779b8eSAndroid Build Coastguard Worker * pnSin - input old value, output new value
1577*ec779b8eSAndroid Build Coastguard Worker * pnCos - input old value, output new value
1578*ec779b8eSAndroid Build Coastguard Worker *
1579*ec779b8eSAndroid Build Coastguard Worker * Outputs:
1580*ec779b8eSAndroid Build Coastguard Worker *
1581*ec779b8eSAndroid Build Coastguard Worker * Side Effects:
1582*ec779b8eSAndroid Build Coastguard Worker * - *pnSin, *pnCos are updated
1583*ec779b8eSAndroid Build Coastguard Worker *
1584*ec779b8eSAndroid Build Coastguard Worker *----------------------------------------------------------------------------
1585*ec779b8eSAndroid Build Coastguard Worker */
ReverbCalculateSinCos(int16_t nPhase,int16_t * pnSin,int16_t * pnCos)1586*ec779b8eSAndroid Build Coastguard Worker static int ReverbCalculateSinCos(int16_t nPhase, int16_t *pnSin, int16_t *pnCos) {
1587*ec779b8eSAndroid Build Coastguard Worker int32_t nTemp;
1588*ec779b8eSAndroid Build Coastguard Worker int32_t nNetAngle;
1589*ec779b8eSAndroid Build Coastguard Worker
1590*ec779b8eSAndroid Build Coastguard Worker // -1 <= nPhase < 1
1591*ec779b8eSAndroid Build Coastguard Worker // However, for the calculation, we need a value
1592*ec779b8eSAndroid Build Coastguard Worker // that ranges from -1/2 to +1/2, so divide the phase by 2
1593*ec779b8eSAndroid Build Coastguard Worker /*lint -e{702} shift for performance */
1594*ec779b8eSAndroid Build Coastguard Worker nNetAngle = nPhase >> 1;
1595*ec779b8eSAndroid Build Coastguard Worker
1596*ec779b8eSAndroid Build Coastguard Worker /*
1597*ec779b8eSAndroid Build Coastguard Worker Implement the following
1598*ec779b8eSAndroid Build Coastguard Worker sin(x) = (2-4*c)*x^2 + c + x
1599*ec779b8eSAndroid Build Coastguard Worker cos(x) = (2-4*c)*x^2 + c - x
1600*ec779b8eSAndroid Build Coastguard Worker
1601*ec779b8eSAndroid Build Coastguard Worker where c = 1/sqrt(2)
1602*ec779b8eSAndroid Build Coastguard Worker using the a0 + x*(a1 + x*a2) approach
1603*ec779b8eSAndroid Build Coastguard Worker */
1604*ec779b8eSAndroid Build Coastguard Worker
1605*ec779b8eSAndroid Build Coastguard Worker /* limit the input "angle" to be between -0.5 and +0.5 */
1606*ec779b8eSAndroid Build Coastguard Worker if (nNetAngle > EG1_HALF) {
1607*ec779b8eSAndroid Build Coastguard Worker nNetAngle = EG1_HALF;
1608*ec779b8eSAndroid Build Coastguard Worker } else if (nNetAngle < EG1_MINUS_HALF) {
1609*ec779b8eSAndroid Build Coastguard Worker nNetAngle = EG1_MINUS_HALF;
1610*ec779b8eSAndroid Build Coastguard Worker }
1611*ec779b8eSAndroid Build Coastguard Worker
1612*ec779b8eSAndroid Build Coastguard Worker /* calculate sin */
1613*ec779b8eSAndroid Build Coastguard Worker nTemp = EG1_ONE + MULT_EG1_EG1(REVERB_PAN_G2, nNetAngle);
1614*ec779b8eSAndroid Build Coastguard Worker nTemp = REVERB_PAN_G0 + MULT_EG1_EG1(nTemp, nNetAngle);
1615*ec779b8eSAndroid Build Coastguard Worker *pnSin = (int16_t) SATURATE_EG1(nTemp);
1616*ec779b8eSAndroid Build Coastguard Worker
1617*ec779b8eSAndroid Build Coastguard Worker /* calculate cos */
1618*ec779b8eSAndroid Build Coastguard Worker nTemp = -EG1_ONE + MULT_EG1_EG1(REVERB_PAN_G2, nNetAngle);
1619*ec779b8eSAndroid Build Coastguard Worker nTemp = REVERB_PAN_G0 + MULT_EG1_EG1(nTemp, nNetAngle);
1620*ec779b8eSAndroid Build Coastguard Worker *pnCos = (int16_t) SATURATE_EG1(nTemp);
1621*ec779b8eSAndroid Build Coastguard Worker
1622*ec779b8eSAndroid Build Coastguard Worker return 0;
1623*ec779b8eSAndroid Build Coastguard Worker } /* end ReverbCalculateSinCos */
1624*ec779b8eSAndroid Build Coastguard Worker
1625*ec779b8eSAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
1626*ec779b8eSAndroid Build Coastguard Worker * Reverb
1627*ec779b8eSAndroid Build Coastguard Worker *----------------------------------------------------------------------------
1628*ec779b8eSAndroid Build Coastguard Worker * Purpose:
1629*ec779b8eSAndroid Build Coastguard Worker * apply reverb to the given signal
1630*ec779b8eSAndroid Build Coastguard Worker *
1631*ec779b8eSAndroid Build Coastguard Worker * Inputs:
1632*ec779b8eSAndroid Build Coastguard Worker * nNu
1633*ec779b8eSAndroid Build Coastguard Worker * pnSin - input old value, output new value
1634*ec779b8eSAndroid Build Coastguard Worker * pnCos - input old value, output new value
1635*ec779b8eSAndroid Build Coastguard Worker *
1636*ec779b8eSAndroid Build Coastguard Worker * Outputs:
1637*ec779b8eSAndroid Build Coastguard Worker * number of samples actually reverberated
1638*ec779b8eSAndroid Build Coastguard Worker *
1639*ec779b8eSAndroid Build Coastguard Worker * Side Effects:
1640*ec779b8eSAndroid Build Coastguard Worker *
1641*ec779b8eSAndroid Build Coastguard Worker *----------------------------------------------------------------------------
1642*ec779b8eSAndroid Build Coastguard Worker */
Reverb(reverb_object_t * pReverb,int nNumSamplesToAdd,short * pOutputBuffer,short * pInputBuffer)1643*ec779b8eSAndroid Build Coastguard Worker static int Reverb(reverb_object_t *pReverb, int nNumSamplesToAdd,
1644*ec779b8eSAndroid Build Coastguard Worker short *pOutputBuffer, short *pInputBuffer) {
1645*ec779b8eSAndroid Build Coastguard Worker int32_t i;
1646*ec779b8eSAndroid Build Coastguard Worker int32_t nDelayOut0;
1647*ec779b8eSAndroid Build Coastguard Worker int32_t nDelayOut1;
1648*ec779b8eSAndroid Build Coastguard Worker uint16_t nBase;
1649*ec779b8eSAndroid Build Coastguard Worker
1650*ec779b8eSAndroid Build Coastguard Worker uint32_t nAddr;
1651*ec779b8eSAndroid Build Coastguard Worker int32_t nTemp1;
1652*ec779b8eSAndroid Build Coastguard Worker int32_t nTemp2;
1653*ec779b8eSAndroid Build Coastguard Worker int32_t nApIn;
1654*ec779b8eSAndroid Build Coastguard Worker int32_t nApOut;
1655*ec779b8eSAndroid Build Coastguard Worker
1656*ec779b8eSAndroid Build Coastguard Worker int32_t j;
1657*ec779b8eSAndroid Build Coastguard Worker
1658*ec779b8eSAndroid Build Coastguard Worker int32_t tempValue;
1659*ec779b8eSAndroid Build Coastguard Worker
1660*ec779b8eSAndroid Build Coastguard Worker // get the base address
1661*ec779b8eSAndroid Build Coastguard Worker nBase = pReverb->m_nBaseIndex;
1662*ec779b8eSAndroid Build Coastguard Worker
1663*ec779b8eSAndroid Build Coastguard Worker for (i = 0; i < nNumSamplesToAdd; i++) {
1664*ec779b8eSAndroid Build Coastguard Worker // ********** Left Allpass - start
1665*ec779b8eSAndroid Build Coastguard Worker nApIn = *pInputBuffer;
1666*ec779b8eSAndroid Build Coastguard Worker if (!pReverb->m_Aux) {
1667*ec779b8eSAndroid Build Coastguard Worker pInputBuffer++;
1668*ec779b8eSAndroid Build Coastguard Worker }
1669*ec779b8eSAndroid Build Coastguard Worker // store to early delay line
1670*ec779b8eSAndroid Build Coastguard Worker nAddr = CIRCULAR(nBase, pReverb->m_nEarly0in, pReverb->m_nBufferMask);
1671*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nDelayLine[nAddr] = (short) nApIn;
1672*ec779b8eSAndroid Build Coastguard Worker
1673*ec779b8eSAndroid Build Coastguard Worker // left input = (left dry * m_nLateGain) + right feedback from previous period
1674*ec779b8eSAndroid Build Coastguard Worker
1675*ec779b8eSAndroid Build Coastguard Worker nApIn = SATURATE(nApIn + pReverb->m_nRevFbkR);
1676*ec779b8eSAndroid Build Coastguard Worker nApIn = MULT_EG1_EG1(nApIn, pReverb->m_nLateGain);
1677*ec779b8eSAndroid Build Coastguard Worker
1678*ec779b8eSAndroid Build Coastguard Worker // fetch allpass delay line out
1679*ec779b8eSAndroid Build Coastguard Worker //nAddr = CIRCULAR(nBase, psAp0->m_zApOut, pReverb->m_nBufferMask);
1680*ec779b8eSAndroid Build Coastguard Worker nAddr
1681*ec779b8eSAndroid Build Coastguard Worker = CIRCULAR(nBase, pReverb->m_sAp0.m_zApOut, pReverb->m_nBufferMask);
1682*ec779b8eSAndroid Build Coastguard Worker nDelayOut0 = pReverb->m_nDelayLine[nAddr];
1683*ec779b8eSAndroid Build Coastguard Worker
1684*ec779b8eSAndroid Build Coastguard Worker // calculate allpass feedforward; subtract the feedforward result
1685*ec779b8eSAndroid Build Coastguard Worker nTemp1 = MULT_EG1_EG1(nApIn, pReverb->m_sAp0.m_nApGain);
1686*ec779b8eSAndroid Build Coastguard Worker nApOut = SATURATE(nDelayOut0 - nTemp1); // allpass output
1687*ec779b8eSAndroid Build Coastguard Worker
1688*ec779b8eSAndroid Build Coastguard Worker // calculate allpass feedback; add the feedback result
1689*ec779b8eSAndroid Build Coastguard Worker nTemp1 = MULT_EG1_EG1(nApOut, pReverb->m_sAp0.m_nApGain);
1690*ec779b8eSAndroid Build Coastguard Worker nTemp1 = SATURATE(nApIn + nTemp1);
1691*ec779b8eSAndroid Build Coastguard Worker
1692*ec779b8eSAndroid Build Coastguard Worker // inject into allpass delay
1693*ec779b8eSAndroid Build Coastguard Worker nAddr
1694*ec779b8eSAndroid Build Coastguard Worker = CIRCULAR(nBase, pReverb->m_sAp0.m_zApIn, pReverb->m_nBufferMask);
1695*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nDelayLine[nAddr] = (short) nTemp1;
1696*ec779b8eSAndroid Build Coastguard Worker
1697*ec779b8eSAndroid Build Coastguard Worker // inject allpass output into delay line
1698*ec779b8eSAndroid Build Coastguard Worker nAddr = CIRCULAR(nBase, pReverb->m_zD0In, pReverb->m_nBufferMask);
1699*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nDelayLine[nAddr] = (short) nApOut;
1700*ec779b8eSAndroid Build Coastguard Worker
1701*ec779b8eSAndroid Build Coastguard Worker // ********** Left Allpass - end
1702*ec779b8eSAndroid Build Coastguard Worker
1703*ec779b8eSAndroid Build Coastguard Worker // ********** Right Allpass - start
1704*ec779b8eSAndroid Build Coastguard Worker nApIn = (*pInputBuffer++);
1705*ec779b8eSAndroid Build Coastguard Worker // store to early delay line
1706*ec779b8eSAndroid Build Coastguard Worker nAddr = CIRCULAR(nBase, pReverb->m_nEarly1in, pReverb->m_nBufferMask);
1707*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nDelayLine[nAddr] = (short) nApIn;
1708*ec779b8eSAndroid Build Coastguard Worker
1709*ec779b8eSAndroid Build Coastguard Worker // right input = (right dry * m_nLateGain) + left feedback from previous period
1710*ec779b8eSAndroid Build Coastguard Worker /*lint -e{702} use shift for performance */
1711*ec779b8eSAndroid Build Coastguard Worker nApIn = SATURATE(nApIn + pReverb->m_nRevFbkL);
1712*ec779b8eSAndroid Build Coastguard Worker nApIn = MULT_EG1_EG1(nApIn, pReverb->m_nLateGain);
1713*ec779b8eSAndroid Build Coastguard Worker
1714*ec779b8eSAndroid Build Coastguard Worker // fetch allpass delay line out
1715*ec779b8eSAndroid Build Coastguard Worker nAddr
1716*ec779b8eSAndroid Build Coastguard Worker = CIRCULAR(nBase, pReverb->m_sAp1.m_zApOut, pReverb->m_nBufferMask);
1717*ec779b8eSAndroid Build Coastguard Worker nDelayOut1 = pReverb->m_nDelayLine[nAddr];
1718*ec779b8eSAndroid Build Coastguard Worker
1719*ec779b8eSAndroid Build Coastguard Worker // calculate allpass feedforward; subtract the feedforward result
1720*ec779b8eSAndroid Build Coastguard Worker nTemp1 = MULT_EG1_EG1(nApIn, pReverb->m_sAp1.m_nApGain);
1721*ec779b8eSAndroid Build Coastguard Worker nApOut = SATURATE(nDelayOut1 - nTemp1); // allpass output
1722*ec779b8eSAndroid Build Coastguard Worker
1723*ec779b8eSAndroid Build Coastguard Worker // calculate allpass feedback; add the feedback result
1724*ec779b8eSAndroid Build Coastguard Worker nTemp1 = MULT_EG1_EG1(nApOut, pReverb->m_sAp1.m_nApGain);
1725*ec779b8eSAndroid Build Coastguard Worker nTemp1 = SATURATE(nApIn + nTemp1);
1726*ec779b8eSAndroid Build Coastguard Worker
1727*ec779b8eSAndroid Build Coastguard Worker // inject into allpass delay
1728*ec779b8eSAndroid Build Coastguard Worker nAddr
1729*ec779b8eSAndroid Build Coastguard Worker = CIRCULAR(nBase, pReverb->m_sAp1.m_zApIn, pReverb->m_nBufferMask);
1730*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nDelayLine[nAddr] = (short) nTemp1;
1731*ec779b8eSAndroid Build Coastguard Worker
1732*ec779b8eSAndroid Build Coastguard Worker // inject allpass output into delay line
1733*ec779b8eSAndroid Build Coastguard Worker nAddr = CIRCULAR(nBase, pReverb->m_zD1In, pReverb->m_nBufferMask);
1734*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nDelayLine[nAddr] = (short) nApOut;
1735*ec779b8eSAndroid Build Coastguard Worker
1736*ec779b8eSAndroid Build Coastguard Worker // ********** Right Allpass - end
1737*ec779b8eSAndroid Build Coastguard Worker
1738*ec779b8eSAndroid Build Coastguard Worker // ********** D0 output - start
1739*ec779b8eSAndroid Build Coastguard Worker // fetch delay line self out
1740*ec779b8eSAndroid Build Coastguard Worker nAddr = CIRCULAR(nBase, pReverb->m_zD0Self, pReverb->m_nBufferMask);
1741*ec779b8eSAndroid Build Coastguard Worker nDelayOut0 = pReverb->m_nDelayLine[nAddr];
1742*ec779b8eSAndroid Build Coastguard Worker
1743*ec779b8eSAndroid Build Coastguard Worker // calculate delay line self out
1744*ec779b8eSAndroid Build Coastguard Worker nTemp1 = MULT_EG1_EG1(nDelayOut0, pReverb->m_nSin);
1745*ec779b8eSAndroid Build Coastguard Worker
1746*ec779b8eSAndroid Build Coastguard Worker // fetch delay line cross out
1747*ec779b8eSAndroid Build Coastguard Worker nAddr = CIRCULAR(nBase, pReverb->m_zD1Cross, pReverb->m_nBufferMask);
1748*ec779b8eSAndroid Build Coastguard Worker nDelayOut0 = pReverb->m_nDelayLine[nAddr];
1749*ec779b8eSAndroid Build Coastguard Worker
1750*ec779b8eSAndroid Build Coastguard Worker // calculate delay line self out
1751*ec779b8eSAndroid Build Coastguard Worker nTemp2 = MULT_EG1_EG1(nDelayOut0, pReverb->m_nCos);
1752*ec779b8eSAndroid Build Coastguard Worker
1753*ec779b8eSAndroid Build Coastguard Worker // calculate unfiltered delay out
1754*ec779b8eSAndroid Build Coastguard Worker nDelayOut0 = SATURATE(nTemp1 + nTemp2);
1755*ec779b8eSAndroid Build Coastguard Worker
1756*ec779b8eSAndroid Build Coastguard Worker // ********** D0 output - end
1757*ec779b8eSAndroid Build Coastguard Worker
1758*ec779b8eSAndroid Build Coastguard Worker // ********** D1 output - start
1759*ec779b8eSAndroid Build Coastguard Worker // fetch delay line self out
1760*ec779b8eSAndroid Build Coastguard Worker nAddr = CIRCULAR(nBase, pReverb->m_zD1Self, pReverb->m_nBufferMask);
1761*ec779b8eSAndroid Build Coastguard Worker nDelayOut1 = pReverb->m_nDelayLine[nAddr];
1762*ec779b8eSAndroid Build Coastguard Worker
1763*ec779b8eSAndroid Build Coastguard Worker // calculate delay line self out
1764*ec779b8eSAndroid Build Coastguard Worker nTemp1 = MULT_EG1_EG1(nDelayOut1, pReverb->m_nSin);
1765*ec779b8eSAndroid Build Coastguard Worker
1766*ec779b8eSAndroid Build Coastguard Worker // fetch delay line cross out
1767*ec779b8eSAndroid Build Coastguard Worker nAddr = CIRCULAR(nBase, pReverb->m_zD0Cross, pReverb->m_nBufferMask);
1768*ec779b8eSAndroid Build Coastguard Worker nDelayOut1 = pReverb->m_nDelayLine[nAddr];
1769*ec779b8eSAndroid Build Coastguard Worker
1770*ec779b8eSAndroid Build Coastguard Worker // calculate delay line self out
1771*ec779b8eSAndroid Build Coastguard Worker nTemp2 = MULT_EG1_EG1(nDelayOut1, pReverb->m_nCos);
1772*ec779b8eSAndroid Build Coastguard Worker
1773*ec779b8eSAndroid Build Coastguard Worker // calculate unfiltered delay out
1774*ec779b8eSAndroid Build Coastguard Worker nDelayOut1 = SATURATE(nTemp1 + nTemp2);
1775*ec779b8eSAndroid Build Coastguard Worker
1776*ec779b8eSAndroid Build Coastguard Worker // ********** D1 output - end
1777*ec779b8eSAndroid Build Coastguard Worker
1778*ec779b8eSAndroid Build Coastguard Worker // ********** mixer and feedback - start
1779*ec779b8eSAndroid Build Coastguard Worker // sum is fedback to right input (R + L)
1780*ec779b8eSAndroid Build Coastguard Worker nDelayOut0 = (short) SATURATE(nDelayOut0 + nDelayOut1);
1781*ec779b8eSAndroid Build Coastguard Worker
1782*ec779b8eSAndroid Build Coastguard Worker // difference is feedback to left input (R - L)
1783*ec779b8eSAndroid Build Coastguard Worker /*lint -e{685} lint complains that it can't saturate negative */
1784*ec779b8eSAndroid Build Coastguard Worker nDelayOut1 = (short) SATURATE(nDelayOut1 - nDelayOut0);
1785*ec779b8eSAndroid Build Coastguard Worker
1786*ec779b8eSAndroid Build Coastguard Worker // ********** mixer and feedback - end
1787*ec779b8eSAndroid Build Coastguard Worker
1788*ec779b8eSAndroid Build Coastguard Worker // calculate lowpass filter (mixer scale factor included in LPF feedforward)
1789*ec779b8eSAndroid Build Coastguard Worker nTemp1 = MULT_EG1_EG1(nDelayOut0, pReverb->m_nRvbLpfFwd);
1790*ec779b8eSAndroid Build Coastguard Worker
1791*ec779b8eSAndroid Build Coastguard Worker nTemp2 = MULT_EG1_EG1(pReverb->m_nRevFbkL, pReverb->m_nRvbLpfFbk);
1792*ec779b8eSAndroid Build Coastguard Worker
1793*ec779b8eSAndroid Build Coastguard Worker // calculate filtered delay out and simultaneously update LPF state variable
1794*ec779b8eSAndroid Build Coastguard Worker // filtered delay output is stored in m_nRevFbkL
1795*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nRevFbkL = (short) SATURATE(nTemp1 + nTemp2);
1796*ec779b8eSAndroid Build Coastguard Worker
1797*ec779b8eSAndroid Build Coastguard Worker // calculate lowpass filter (mixer scale factor included in LPF feedforward)
1798*ec779b8eSAndroid Build Coastguard Worker nTemp1 = MULT_EG1_EG1(nDelayOut1, pReverb->m_nRvbLpfFwd);
1799*ec779b8eSAndroid Build Coastguard Worker
1800*ec779b8eSAndroid Build Coastguard Worker nTemp2 = MULT_EG1_EG1(pReverb->m_nRevFbkR, pReverb->m_nRvbLpfFbk);
1801*ec779b8eSAndroid Build Coastguard Worker
1802*ec779b8eSAndroid Build Coastguard Worker // calculate filtered delay out and simultaneously update LPF state variable
1803*ec779b8eSAndroid Build Coastguard Worker // filtered delay output is stored in m_nRevFbkR
1804*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nRevFbkR = (short) SATURATE(nTemp1 + nTemp2);
1805*ec779b8eSAndroid Build Coastguard Worker
1806*ec779b8eSAndroid Build Coastguard Worker // ********** start early reflection generator, left
1807*ec779b8eSAndroid Build Coastguard Worker //psEarly = &(pReverb->m_sEarlyL);
1808*ec779b8eSAndroid Build Coastguard Worker
1809*ec779b8eSAndroid Build Coastguard Worker
1810*ec779b8eSAndroid Build Coastguard Worker for (j = 0; j < REVERB_MAX_NUM_REFLECTIONS; j++) {
1811*ec779b8eSAndroid Build Coastguard Worker // fetch delay line out
1812*ec779b8eSAndroid Build Coastguard Worker //nAddr = CIRCULAR(nBase, psEarly->m_zDelay[j], pReverb->m_nBufferMask);
1813*ec779b8eSAndroid Build Coastguard Worker nAddr
1814*ec779b8eSAndroid Build Coastguard Worker = CIRCULAR(nBase, pReverb->m_sEarlyL.m_zDelay[j], pReverb->m_nBufferMask);
1815*ec779b8eSAndroid Build Coastguard Worker
1816*ec779b8eSAndroid Build Coastguard Worker nTemp1 = pReverb->m_nDelayLine[nAddr];
1817*ec779b8eSAndroid Build Coastguard Worker
1818*ec779b8eSAndroid Build Coastguard Worker // calculate reflection
1819*ec779b8eSAndroid Build Coastguard Worker //nTemp1 = MULT_EG1_EG1(nDelayOut0, psEarly->m_nGain[j]);
1820*ec779b8eSAndroid Build Coastguard Worker nTemp1 = MULT_EG1_EG1(nTemp1, pReverb->m_sEarlyL.m_nGain[j]);
1821*ec779b8eSAndroid Build Coastguard Worker
1822*ec779b8eSAndroid Build Coastguard Worker nDelayOut0 = SATURATE(nDelayOut0 + nTemp1);
1823*ec779b8eSAndroid Build Coastguard Worker
1824*ec779b8eSAndroid Build Coastguard Worker } // end for (j=0; j < REVERB_MAX_NUM_REFLECTIONS; j++)
1825*ec779b8eSAndroid Build Coastguard Worker
1826*ec779b8eSAndroid Build Coastguard Worker // apply lowpass to early reflections and reverb output
1827*ec779b8eSAndroid Build Coastguard Worker //nTemp1 = MULT_EG1_EG1(nEarlyOut, psEarly->m_nRvbLpfFwd);
1828*ec779b8eSAndroid Build Coastguard Worker nTemp1 = MULT_EG1_EG1(nDelayOut0, pReverb->m_nRoomLpfFwd);
1829*ec779b8eSAndroid Build Coastguard Worker
1830*ec779b8eSAndroid Build Coastguard Worker //nTemp2 = MULT_EG1_EG1(psEarly->m_zLpf, psEarly->m_nLpfFbk);
1831*ec779b8eSAndroid Build Coastguard Worker nTemp2 = MULT_EG1_EG1(pReverb->m_zOutLpfL, pReverb->m_nRoomLpfFbk);
1832*ec779b8eSAndroid Build Coastguard Worker
1833*ec779b8eSAndroid Build Coastguard Worker // calculate filtered out and simultaneously update LPF state variable
1834*ec779b8eSAndroid Build Coastguard Worker // filtered output is stored in m_zOutLpfL
1835*ec779b8eSAndroid Build Coastguard Worker pReverb->m_zOutLpfL = (short) SATURATE(nTemp1 + nTemp2);
1836*ec779b8eSAndroid Build Coastguard Worker
1837*ec779b8eSAndroid Build Coastguard Worker //sum with output buffer
1838*ec779b8eSAndroid Build Coastguard Worker tempValue = *pOutputBuffer;
1839*ec779b8eSAndroid Build Coastguard Worker *pOutputBuffer++ = (short) SATURATE(tempValue+pReverb->m_zOutLpfL);
1840*ec779b8eSAndroid Build Coastguard Worker
1841*ec779b8eSAndroid Build Coastguard Worker // ********** end early reflection generator, left
1842*ec779b8eSAndroid Build Coastguard Worker
1843*ec779b8eSAndroid Build Coastguard Worker // ********** start early reflection generator, right
1844*ec779b8eSAndroid Build Coastguard Worker //psEarly = &(pReverb->m_sEarlyR);
1845*ec779b8eSAndroid Build Coastguard Worker
1846*ec779b8eSAndroid Build Coastguard Worker for (j = 0; j < REVERB_MAX_NUM_REFLECTIONS; j++) {
1847*ec779b8eSAndroid Build Coastguard Worker // fetch delay line out
1848*ec779b8eSAndroid Build Coastguard Worker nAddr
1849*ec779b8eSAndroid Build Coastguard Worker = CIRCULAR(nBase, pReverb->m_sEarlyR.m_zDelay[j], pReverb->m_nBufferMask);
1850*ec779b8eSAndroid Build Coastguard Worker nTemp1 = pReverb->m_nDelayLine[nAddr];
1851*ec779b8eSAndroid Build Coastguard Worker
1852*ec779b8eSAndroid Build Coastguard Worker // calculate reflection
1853*ec779b8eSAndroid Build Coastguard Worker nTemp1 = MULT_EG1_EG1(nTemp1, pReverb->m_sEarlyR.m_nGain[j]);
1854*ec779b8eSAndroid Build Coastguard Worker
1855*ec779b8eSAndroid Build Coastguard Worker nDelayOut1 = SATURATE(nDelayOut1 + nTemp1);
1856*ec779b8eSAndroid Build Coastguard Worker
1857*ec779b8eSAndroid Build Coastguard Worker } // end for (j=0; j < REVERB_MAX_NUM_REFLECTIONS; j++)
1858*ec779b8eSAndroid Build Coastguard Worker
1859*ec779b8eSAndroid Build Coastguard Worker // apply lowpass to early reflections
1860*ec779b8eSAndroid Build Coastguard Worker nTemp1 = MULT_EG1_EG1(nDelayOut1, pReverb->m_nRoomLpfFwd);
1861*ec779b8eSAndroid Build Coastguard Worker
1862*ec779b8eSAndroid Build Coastguard Worker nTemp2 = MULT_EG1_EG1(pReverb->m_zOutLpfR, pReverb->m_nRoomLpfFbk);
1863*ec779b8eSAndroid Build Coastguard Worker
1864*ec779b8eSAndroid Build Coastguard Worker // calculate filtered out and simultaneously update LPF state variable
1865*ec779b8eSAndroid Build Coastguard Worker // filtered output is stored in m_zOutLpfR
1866*ec779b8eSAndroid Build Coastguard Worker pReverb->m_zOutLpfR = (short) SATURATE(nTemp1 + nTemp2);
1867*ec779b8eSAndroid Build Coastguard Worker
1868*ec779b8eSAndroid Build Coastguard Worker //sum with output buffer
1869*ec779b8eSAndroid Build Coastguard Worker tempValue = *pOutputBuffer;
1870*ec779b8eSAndroid Build Coastguard Worker *pOutputBuffer++ = (short) SATURATE(tempValue + pReverb->m_zOutLpfR);
1871*ec779b8eSAndroid Build Coastguard Worker
1872*ec779b8eSAndroid Build Coastguard Worker // ********** end early reflection generator, right
1873*ec779b8eSAndroid Build Coastguard Worker
1874*ec779b8eSAndroid Build Coastguard Worker // decrement base addr for next sample period
1875*ec779b8eSAndroid Build Coastguard Worker nBase--;
1876*ec779b8eSAndroid Build Coastguard Worker
1877*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nSin += pReverb->m_nSinIncrement;
1878*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nCos += pReverb->m_nCosIncrement;
1879*ec779b8eSAndroid Build Coastguard Worker
1880*ec779b8eSAndroid Build Coastguard Worker } // end for (i=0; i < nNumSamplesToAdd; i++)
1881*ec779b8eSAndroid Build Coastguard Worker
1882*ec779b8eSAndroid Build Coastguard Worker // store the most up to date version
1883*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nBaseIndex = nBase;
1884*ec779b8eSAndroid Build Coastguard Worker
1885*ec779b8eSAndroid Build Coastguard Worker return 0;
1886*ec779b8eSAndroid Build Coastguard Worker } /* end Reverb */
1887*ec779b8eSAndroid Build Coastguard Worker
1888*ec779b8eSAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
1889*ec779b8eSAndroid Build Coastguard Worker * ReverbUpdateRoom
1890*ec779b8eSAndroid Build Coastguard Worker *----------------------------------------------------------------------------
1891*ec779b8eSAndroid Build Coastguard Worker * Purpose:
1892*ec779b8eSAndroid Build Coastguard Worker * Update the room's preset parameters as required
1893*ec779b8eSAndroid Build Coastguard Worker *
1894*ec779b8eSAndroid Build Coastguard Worker * Inputs:
1895*ec779b8eSAndroid Build Coastguard Worker *
1896*ec779b8eSAndroid Build Coastguard Worker * Outputs:
1897*ec779b8eSAndroid Build Coastguard Worker *
1898*ec779b8eSAndroid Build Coastguard Worker *
1899*ec779b8eSAndroid Build Coastguard Worker * Side Effects:
1900*ec779b8eSAndroid Build Coastguard Worker * - reverb paramters (fbk, fwd, etc) will be changed
1901*ec779b8eSAndroid Build Coastguard Worker * - m_nCurrentRoom := m_nNextRoom
1902*ec779b8eSAndroid Build Coastguard Worker *----------------------------------------------------------------------------
1903*ec779b8eSAndroid Build Coastguard Worker */
ReverbUpdateRoom(reverb_object_t * pReverb,bool fullUpdate)1904*ec779b8eSAndroid Build Coastguard Worker static int ReverbUpdateRoom(reverb_object_t *pReverb, bool fullUpdate) {
1905*ec779b8eSAndroid Build Coastguard Worker int temp;
1906*ec779b8eSAndroid Build Coastguard Worker int i;
1907*ec779b8eSAndroid Build Coastguard Worker int maxSamples;
1908*ec779b8eSAndroid Build Coastguard Worker int earlyDelay;
1909*ec779b8eSAndroid Build Coastguard Worker int earlyGain;
1910*ec779b8eSAndroid Build Coastguard Worker
1911*ec779b8eSAndroid Build Coastguard Worker reverb_preset_t *pPreset =
1912*ec779b8eSAndroid Build Coastguard Worker &pReverb->m_sPreset.m_sPreset[pReverb->m_nNextRoom];
1913*ec779b8eSAndroid Build Coastguard Worker
1914*ec779b8eSAndroid Build Coastguard Worker if (fullUpdate) {
1915*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nRvbLpfFwd = pPreset->m_nRvbLpfFwd;
1916*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nRvbLpfFbk = pPreset->m_nRvbLpfFbk;
1917*ec779b8eSAndroid Build Coastguard Worker
1918*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nEarlyGain = pPreset->m_nEarlyGain;
1919*ec779b8eSAndroid Build Coastguard Worker //stored as time based, convert to sample based
1920*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nLateGain = pPreset->m_nLateGain;
1921*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nRoomLpfFbk = pPreset->m_nRoomLpfFbk;
1922*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nRoomLpfFwd = pPreset->m_nRoomLpfFwd;
1923*ec779b8eSAndroid Build Coastguard Worker
1924*ec779b8eSAndroid Build Coastguard Worker // set the early reflections gains
1925*ec779b8eSAndroid Build Coastguard Worker earlyGain = pPreset->m_nEarlyGain;
1926*ec779b8eSAndroid Build Coastguard Worker for (i = 0; i < REVERB_MAX_NUM_REFLECTIONS; i++) {
1927*ec779b8eSAndroid Build Coastguard Worker pReverb->m_sEarlyL.m_nGain[i]
1928*ec779b8eSAndroid Build Coastguard Worker = MULT_EG1_EG1(pPreset->m_sEarlyL.m_nGain[i],earlyGain);
1929*ec779b8eSAndroid Build Coastguard Worker pReverb->m_sEarlyR.m_nGain[i]
1930*ec779b8eSAndroid Build Coastguard Worker = MULT_EG1_EG1(pPreset->m_sEarlyR.m_nGain[i],earlyGain);
1931*ec779b8eSAndroid Build Coastguard Worker }
1932*ec779b8eSAndroid Build Coastguard Worker
1933*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nMaxExcursion = pPreset->m_nMaxExcursion;
1934*ec779b8eSAndroid Build Coastguard Worker
1935*ec779b8eSAndroid Build Coastguard Worker pReverb->m_sAp0.m_nApGain = pPreset->m_nAp0_ApGain;
1936*ec779b8eSAndroid Build Coastguard Worker pReverb->m_sAp1.m_nApGain = pPreset->m_nAp1_ApGain;
1937*ec779b8eSAndroid Build Coastguard Worker
1938*ec779b8eSAndroid Build Coastguard Worker // set the early reflections delay
1939*ec779b8eSAndroid Build Coastguard Worker earlyDelay = ((int) pPreset->m_nEarlyDelay * pReverb->m_nSamplingRate)
1940*ec779b8eSAndroid Build Coastguard Worker >> 16;
1941*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nEarlyDelay = earlyDelay;
1942*ec779b8eSAndroid Build Coastguard Worker maxSamples = (int32_t) (MAX_EARLY_TIME * pReverb->m_nSamplingRate)
1943*ec779b8eSAndroid Build Coastguard Worker >> 16;
1944*ec779b8eSAndroid Build Coastguard Worker for (i = 0; i < REVERB_MAX_NUM_REFLECTIONS; i++) {
1945*ec779b8eSAndroid Build Coastguard Worker //stored as time based, convert to sample based
1946*ec779b8eSAndroid Build Coastguard Worker temp = earlyDelay + (((int) pPreset->m_sEarlyL.m_zDelay[i]
1947*ec779b8eSAndroid Build Coastguard Worker * pReverb->m_nSamplingRate) >> 16);
1948*ec779b8eSAndroid Build Coastguard Worker if (temp > maxSamples)
1949*ec779b8eSAndroid Build Coastguard Worker temp = maxSamples;
1950*ec779b8eSAndroid Build Coastguard Worker pReverb->m_sEarlyL.m_zDelay[i] = pReverb->m_nEarly0in + temp;
1951*ec779b8eSAndroid Build Coastguard Worker //stored as time based, convert to sample based
1952*ec779b8eSAndroid Build Coastguard Worker temp = earlyDelay + (((int) pPreset->m_sEarlyR.m_zDelay[i]
1953*ec779b8eSAndroid Build Coastguard Worker * pReverb->m_nSamplingRate) >> 16);
1954*ec779b8eSAndroid Build Coastguard Worker if (temp > maxSamples)
1955*ec779b8eSAndroid Build Coastguard Worker temp = maxSamples;
1956*ec779b8eSAndroid Build Coastguard Worker pReverb->m_sEarlyR.m_zDelay[i] = pReverb->m_nEarly1in + temp;
1957*ec779b8eSAndroid Build Coastguard Worker }
1958*ec779b8eSAndroid Build Coastguard Worker
1959*ec779b8eSAndroid Build Coastguard Worker maxSamples = (int32_t) (MAX_DELAY_TIME * pReverb->m_nSamplingRate)
1960*ec779b8eSAndroid Build Coastguard Worker >> 16;
1961*ec779b8eSAndroid Build Coastguard Worker //stored as time based, convert to sample based
1962*ec779b8eSAndroid Build Coastguard Worker /*lint -e{702} shift for performance */
1963*ec779b8eSAndroid Build Coastguard Worker temp = (pPreset->m_nLateDelay * pReverb->m_nSamplingRate) >> 16;
1964*ec779b8eSAndroid Build Coastguard Worker if ((temp + pReverb->m_nMaxExcursion) > maxSamples) {
1965*ec779b8eSAndroid Build Coastguard Worker temp = maxSamples - pReverb->m_nMaxExcursion;
1966*ec779b8eSAndroid Build Coastguard Worker }
1967*ec779b8eSAndroid Build Coastguard Worker temp -= pReverb->m_nLateDelay;
1968*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nDelay0Out += temp;
1969*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nDelay1Out += temp;
1970*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nLateDelay += temp;
1971*ec779b8eSAndroid Build Coastguard Worker
1972*ec779b8eSAndroid Build Coastguard Worker maxSamples = (int32_t) (MAX_AP_TIME * pReverb->m_nSamplingRate) >> 16;
1973*ec779b8eSAndroid Build Coastguard Worker //stored as time based, convert to absolute sample value
1974*ec779b8eSAndroid Build Coastguard Worker temp = pPreset->m_nAp0_ApOut;
1975*ec779b8eSAndroid Build Coastguard Worker /*lint -e{702} shift for performance */
1976*ec779b8eSAndroid Build Coastguard Worker temp = (temp * pReverb->m_nSamplingRate) >> 16;
1977*ec779b8eSAndroid Build Coastguard Worker if (temp > maxSamples)
1978*ec779b8eSAndroid Build Coastguard Worker temp = maxSamples;
1979*ec779b8eSAndroid Build Coastguard Worker pReverb->m_sAp0.m_zApOut = (uint16_t) (pReverb->m_sAp0.m_zApIn + temp);
1980*ec779b8eSAndroid Build Coastguard Worker
1981*ec779b8eSAndroid Build Coastguard Worker //stored as time based, convert to absolute sample value
1982*ec779b8eSAndroid Build Coastguard Worker temp = pPreset->m_nAp1_ApOut;
1983*ec779b8eSAndroid Build Coastguard Worker /*lint -e{702} shift for performance */
1984*ec779b8eSAndroid Build Coastguard Worker temp = (temp * pReverb->m_nSamplingRate) >> 16;
1985*ec779b8eSAndroid Build Coastguard Worker if (temp > maxSamples)
1986*ec779b8eSAndroid Build Coastguard Worker temp = maxSamples;
1987*ec779b8eSAndroid Build Coastguard Worker pReverb->m_sAp1.m_zApOut = (uint16_t) (pReverb->m_sAp1.m_zApIn + temp);
1988*ec779b8eSAndroid Build Coastguard Worker //gpsReverbObject->m_sAp1.m_zApOut = pPreset->m_nAp1_ApOut;
1989*ec779b8eSAndroid Build Coastguard Worker }
1990*ec779b8eSAndroid Build Coastguard Worker
1991*ec779b8eSAndroid Build Coastguard Worker //stored as time based, convert to sample based
1992*ec779b8eSAndroid Build Coastguard Worker temp = pPreset->m_nXfadeInterval;
1993*ec779b8eSAndroid Build Coastguard Worker /*lint -e{702} shift for performance */
1994*ec779b8eSAndroid Build Coastguard Worker temp = (temp * pReverb->m_nSamplingRate) >> 16;
1995*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nXfadeInterval = (uint16_t) temp;
1996*ec779b8eSAndroid Build Coastguard Worker //gsReverbObject.m_nXfadeInterval = pPreset->m_nXfadeInterval;
1997*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nXfadeCounter = pReverb->m_nXfadeInterval + 1; // force update on first iteration
1998*ec779b8eSAndroid Build Coastguard Worker
1999*ec779b8eSAndroid Build Coastguard Worker pReverb->m_nCurrentRoom = pReverb->m_nNextRoom;
2000*ec779b8eSAndroid Build Coastguard Worker
2001*ec779b8eSAndroid Build Coastguard Worker return 0;
2002*ec779b8eSAndroid Build Coastguard Worker
2003*ec779b8eSAndroid Build Coastguard Worker } /* end ReverbUpdateRoom */
2004*ec779b8eSAndroid Build Coastguard Worker
2005*ec779b8eSAndroid Build Coastguard Worker /*----------------------------------------------------------------------------
2006*ec779b8eSAndroid Build Coastguard Worker * ReverbReadInPresets()
2007*ec779b8eSAndroid Build Coastguard Worker *----------------------------------------------------------------------------
2008*ec779b8eSAndroid Build Coastguard Worker * Purpose: sets global reverb preset bank to defaults
2009*ec779b8eSAndroid Build Coastguard Worker *
2010*ec779b8eSAndroid Build Coastguard Worker * Inputs:
2011*ec779b8eSAndroid Build Coastguard Worker *
2012*ec779b8eSAndroid Build Coastguard Worker * Outputs:
2013*ec779b8eSAndroid Build Coastguard Worker *
2014*ec779b8eSAndroid Build Coastguard Worker *----------------------------------------------------------------------------
2015*ec779b8eSAndroid Build Coastguard Worker */
ReverbReadInPresets(reverb_object_t * pReverb)2016*ec779b8eSAndroid Build Coastguard Worker static int ReverbReadInPresets(reverb_object_t *pReverb) {
2017*ec779b8eSAndroid Build Coastguard Worker
2018*ec779b8eSAndroid Build Coastguard Worker int preset;
2019*ec779b8eSAndroid Build Coastguard Worker
2020*ec779b8eSAndroid Build Coastguard Worker // this is for test only. OpenSL ES presets are mapped to 4 presets.
2021*ec779b8eSAndroid Build Coastguard Worker // REVERB_PRESET_NONE is mapped to bypass
2022*ec779b8eSAndroid Build Coastguard Worker for (preset = 0; preset < REVERB_NUM_PRESETS; preset++) {
2023*ec779b8eSAndroid Build Coastguard Worker reverb_preset_t *pPreset = &pReverb->m_sPreset.m_sPreset[preset];
2024*ec779b8eSAndroid Build Coastguard Worker switch (preset + 1) {
2025*ec779b8eSAndroid Build Coastguard Worker case REVERB_PRESET_PLATE:
2026*ec779b8eSAndroid Build Coastguard Worker case REVERB_PRESET_SMALLROOM:
2027*ec779b8eSAndroid Build Coastguard Worker pPreset->m_nRvbLpfFbk = 5077;
2028*ec779b8eSAndroid Build Coastguard Worker pPreset->m_nRvbLpfFwd = 11076;
2029*ec779b8eSAndroid Build Coastguard Worker pPreset->m_nEarlyGain = 27690;
2030*ec779b8eSAndroid Build Coastguard Worker pPreset->m_nEarlyDelay = 1311;
2031*ec779b8eSAndroid Build Coastguard Worker pPreset->m_nLateGain = 8191;
2032*ec779b8eSAndroid Build Coastguard Worker pPreset->m_nLateDelay = 3932;
2033*ec779b8eSAndroid Build Coastguard Worker pPreset->m_nRoomLpfFbk = 3692;
2034*ec779b8eSAndroid Build Coastguard Worker pPreset->m_nRoomLpfFwd = 20474;
2035*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyL.m_zDelay[0] = 1376;
2036*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyL.m_nGain[0] = 22152;
2037*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyL.m_zDelay[1] = 1462;
2038*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyL.m_nGain[1] = 17537;
2039*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyL.m_zDelay[2] = 0;
2040*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyL.m_nGain[2] = 14768;
2041*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyL.m_zDelay[3] = 1835;
2042*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyL.m_nGain[3] = 14307;
2043*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyL.m_zDelay[4] = 0;
2044*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyL.m_nGain[4] = 13384;
2045*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyR.m_zDelay[0] = 721;
2046*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyR.m_nGain[0] = 20306;
2047*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyR.m_zDelay[1] = 2621;
2048*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyR.m_nGain[1] = 17537;
2049*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyR.m_zDelay[2] = 0;
2050*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyR.m_nGain[2] = 14768;
2051*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyR.m_zDelay[3] = 0;
2052*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyR.m_nGain[3] = 16153;
2053*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyR.m_zDelay[4] = 0;
2054*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyR.m_nGain[4] = 13384;
2055*ec779b8eSAndroid Build Coastguard Worker pPreset->m_nMaxExcursion = 127;
2056*ec779b8eSAndroid Build Coastguard Worker pPreset->m_nXfadeInterval = 6470; //6483;
2057*ec779b8eSAndroid Build Coastguard Worker pPreset->m_nAp0_ApGain = 14768;
2058*ec779b8eSAndroid Build Coastguard Worker pPreset->m_nAp0_ApOut = 792;
2059*ec779b8eSAndroid Build Coastguard Worker pPreset->m_nAp1_ApGain = 14777;
2060*ec779b8eSAndroid Build Coastguard Worker pPreset->m_nAp1_ApOut = 1191;
2061*ec779b8eSAndroid Build Coastguard Worker pPreset->m_rfu4 = 0;
2062*ec779b8eSAndroid Build Coastguard Worker pPreset->m_rfu5 = 0;
2063*ec779b8eSAndroid Build Coastguard Worker pPreset->m_rfu6 = 0;
2064*ec779b8eSAndroid Build Coastguard Worker pPreset->m_rfu7 = 0;
2065*ec779b8eSAndroid Build Coastguard Worker pPreset->m_rfu8 = 0;
2066*ec779b8eSAndroid Build Coastguard Worker pPreset->m_rfu9 = 0;
2067*ec779b8eSAndroid Build Coastguard Worker pPreset->m_rfu10 = 0;
2068*ec779b8eSAndroid Build Coastguard Worker break;
2069*ec779b8eSAndroid Build Coastguard Worker case REVERB_PRESET_MEDIUMROOM:
2070*ec779b8eSAndroid Build Coastguard Worker case REVERB_PRESET_LARGEROOM:
2071*ec779b8eSAndroid Build Coastguard Worker pPreset->m_nRvbLpfFbk = 5077;
2072*ec779b8eSAndroid Build Coastguard Worker pPreset->m_nRvbLpfFwd = 12922;
2073*ec779b8eSAndroid Build Coastguard Worker pPreset->m_nEarlyGain = 27690;
2074*ec779b8eSAndroid Build Coastguard Worker pPreset->m_nEarlyDelay = 1311;
2075*ec779b8eSAndroid Build Coastguard Worker pPreset->m_nLateGain = 8191;
2076*ec779b8eSAndroid Build Coastguard Worker pPreset->m_nLateDelay = 3932;
2077*ec779b8eSAndroid Build Coastguard Worker pPreset->m_nRoomLpfFbk = 3692;
2078*ec779b8eSAndroid Build Coastguard Worker pPreset->m_nRoomLpfFwd = 21703;
2079*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyL.m_zDelay[0] = 1376;
2080*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyL.m_nGain[0] = 22152;
2081*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyL.m_zDelay[1] = 1462;
2082*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyL.m_nGain[1] = 17537;
2083*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyL.m_zDelay[2] = 0;
2084*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyL.m_nGain[2] = 14768;
2085*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyL.m_zDelay[3] = 1835;
2086*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyL.m_nGain[3] = 14307;
2087*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyL.m_zDelay[4] = 0;
2088*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyL.m_nGain[4] = 13384;
2089*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyR.m_zDelay[0] = 721;
2090*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyR.m_nGain[0] = 20306;
2091*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyR.m_zDelay[1] = 2621;
2092*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyR.m_nGain[1] = 17537;
2093*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyR.m_zDelay[2] = 0;
2094*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyR.m_nGain[2] = 14768;
2095*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyR.m_zDelay[3] = 0;
2096*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyR.m_nGain[3] = 16153;
2097*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyR.m_zDelay[4] = 0;
2098*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyR.m_nGain[4] = 13384;
2099*ec779b8eSAndroid Build Coastguard Worker pPreset->m_nMaxExcursion = 127;
2100*ec779b8eSAndroid Build Coastguard Worker pPreset->m_nXfadeInterval = 6449;
2101*ec779b8eSAndroid Build Coastguard Worker pPreset->m_nAp0_ApGain = 15691;
2102*ec779b8eSAndroid Build Coastguard Worker pPreset->m_nAp0_ApOut = 774;
2103*ec779b8eSAndroid Build Coastguard Worker pPreset->m_nAp1_ApGain = 16317;
2104*ec779b8eSAndroid Build Coastguard Worker pPreset->m_nAp1_ApOut = 1155;
2105*ec779b8eSAndroid Build Coastguard Worker pPreset->m_rfu4 = 0;
2106*ec779b8eSAndroid Build Coastguard Worker pPreset->m_rfu5 = 0;
2107*ec779b8eSAndroid Build Coastguard Worker pPreset->m_rfu6 = 0;
2108*ec779b8eSAndroid Build Coastguard Worker pPreset->m_rfu7 = 0;
2109*ec779b8eSAndroid Build Coastguard Worker pPreset->m_rfu8 = 0;
2110*ec779b8eSAndroid Build Coastguard Worker pPreset->m_rfu9 = 0;
2111*ec779b8eSAndroid Build Coastguard Worker pPreset->m_rfu10 = 0;
2112*ec779b8eSAndroid Build Coastguard Worker break;
2113*ec779b8eSAndroid Build Coastguard Worker case REVERB_PRESET_MEDIUMHALL:
2114*ec779b8eSAndroid Build Coastguard Worker pPreset->m_nRvbLpfFbk = 6461;
2115*ec779b8eSAndroid Build Coastguard Worker pPreset->m_nRvbLpfFwd = 14307;
2116*ec779b8eSAndroid Build Coastguard Worker pPreset->m_nEarlyGain = 27690;
2117*ec779b8eSAndroid Build Coastguard Worker pPreset->m_nEarlyDelay = 1311;
2118*ec779b8eSAndroid Build Coastguard Worker pPreset->m_nLateGain = 8191;
2119*ec779b8eSAndroid Build Coastguard Worker pPreset->m_nLateDelay = 3932;
2120*ec779b8eSAndroid Build Coastguard Worker pPreset->m_nRoomLpfFbk = 3692;
2121*ec779b8eSAndroid Build Coastguard Worker pPreset->m_nRoomLpfFwd = 24569;
2122*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyL.m_zDelay[0] = 1376;
2123*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyL.m_nGain[0] = 22152;
2124*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyL.m_zDelay[1] = 1462;
2125*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyL.m_nGain[1] = 17537;
2126*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyL.m_zDelay[2] = 0;
2127*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyL.m_nGain[2] = 14768;
2128*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyL.m_zDelay[3] = 1835;
2129*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyL.m_nGain[3] = 14307;
2130*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyL.m_zDelay[4] = 0;
2131*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyL.m_nGain[4] = 13384;
2132*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyR.m_zDelay[0] = 721;
2133*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyR.m_nGain[0] = 20306;
2134*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyR.m_zDelay[1] = 2621;
2135*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyR.m_nGain[1] = 17537;
2136*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyR.m_zDelay[2] = 0;
2137*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyR.m_nGain[2] = 14768;
2138*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyR.m_zDelay[3] = 0;
2139*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyR.m_nGain[3] = 16153;
2140*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyR.m_zDelay[4] = 0;
2141*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyR.m_nGain[4] = 13384;
2142*ec779b8eSAndroid Build Coastguard Worker pPreset->m_nMaxExcursion = 127;
2143*ec779b8eSAndroid Build Coastguard Worker pPreset->m_nXfadeInterval = 6391;
2144*ec779b8eSAndroid Build Coastguard Worker pPreset->m_nAp0_ApGain = 15230;
2145*ec779b8eSAndroid Build Coastguard Worker pPreset->m_nAp0_ApOut = 708;
2146*ec779b8eSAndroid Build Coastguard Worker pPreset->m_nAp1_ApGain = 15547;
2147*ec779b8eSAndroid Build Coastguard Worker pPreset->m_nAp1_ApOut = 1023;
2148*ec779b8eSAndroid Build Coastguard Worker pPreset->m_rfu4 = 0;
2149*ec779b8eSAndroid Build Coastguard Worker pPreset->m_rfu5 = 0;
2150*ec779b8eSAndroid Build Coastguard Worker pPreset->m_rfu6 = 0;
2151*ec779b8eSAndroid Build Coastguard Worker pPreset->m_rfu7 = 0;
2152*ec779b8eSAndroid Build Coastguard Worker pPreset->m_rfu8 = 0;
2153*ec779b8eSAndroid Build Coastguard Worker pPreset->m_rfu9 = 0;
2154*ec779b8eSAndroid Build Coastguard Worker pPreset->m_rfu10 = 0;
2155*ec779b8eSAndroid Build Coastguard Worker break;
2156*ec779b8eSAndroid Build Coastguard Worker case REVERB_PRESET_LARGEHALL:
2157*ec779b8eSAndroid Build Coastguard Worker pPreset->m_nRvbLpfFbk = 8307;
2158*ec779b8eSAndroid Build Coastguard Worker pPreset->m_nRvbLpfFwd = 14768;
2159*ec779b8eSAndroid Build Coastguard Worker pPreset->m_nEarlyGain = 27690;
2160*ec779b8eSAndroid Build Coastguard Worker pPreset->m_nEarlyDelay = 1311;
2161*ec779b8eSAndroid Build Coastguard Worker pPreset->m_nLateGain = 8191;
2162*ec779b8eSAndroid Build Coastguard Worker pPreset->m_nLateDelay = 3932;
2163*ec779b8eSAndroid Build Coastguard Worker pPreset->m_nRoomLpfFbk = 3692;
2164*ec779b8eSAndroid Build Coastguard Worker pPreset->m_nRoomLpfFwd = 24569;
2165*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyL.m_zDelay[0] = 1376;
2166*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyL.m_nGain[0] = 22152;
2167*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyL.m_zDelay[1] = 2163;
2168*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyL.m_nGain[1] = 17537;
2169*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyL.m_zDelay[2] = 0;
2170*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyL.m_nGain[2] = 14768;
2171*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyL.m_zDelay[3] = 1835;
2172*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyL.m_nGain[3] = 14307;
2173*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyL.m_zDelay[4] = 0;
2174*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyL.m_nGain[4] = 13384;
2175*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyR.m_zDelay[0] = 721;
2176*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyR.m_nGain[0] = 20306;
2177*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyR.m_zDelay[1] = 2621;
2178*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyR.m_nGain[1] = 17537;
2179*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyR.m_zDelay[2] = 0;
2180*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyR.m_nGain[2] = 14768;
2181*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyR.m_zDelay[3] = 0;
2182*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyR.m_nGain[3] = 16153;
2183*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyR.m_zDelay[4] = 0;
2184*ec779b8eSAndroid Build Coastguard Worker pPreset->m_sEarlyR.m_nGain[4] = 13384;
2185*ec779b8eSAndroid Build Coastguard Worker pPreset->m_nMaxExcursion = 127;
2186*ec779b8eSAndroid Build Coastguard Worker pPreset->m_nXfadeInterval = 6388;
2187*ec779b8eSAndroid Build Coastguard Worker pPreset->m_nAp0_ApGain = 15691;
2188*ec779b8eSAndroid Build Coastguard Worker pPreset->m_nAp0_ApOut = 711;
2189*ec779b8eSAndroid Build Coastguard Worker pPreset->m_nAp1_ApGain = 16317;
2190*ec779b8eSAndroid Build Coastguard Worker pPreset->m_nAp1_ApOut = 1029;
2191*ec779b8eSAndroid Build Coastguard Worker pPreset->m_rfu4 = 0;
2192*ec779b8eSAndroid Build Coastguard Worker pPreset->m_rfu5 = 0;
2193*ec779b8eSAndroid Build Coastguard Worker pPreset->m_rfu6 = 0;
2194*ec779b8eSAndroid Build Coastguard Worker pPreset->m_rfu7 = 0;
2195*ec779b8eSAndroid Build Coastguard Worker pPreset->m_rfu8 = 0;
2196*ec779b8eSAndroid Build Coastguard Worker pPreset->m_rfu9 = 0;
2197*ec779b8eSAndroid Build Coastguard Worker pPreset->m_rfu10 = 0;
2198*ec779b8eSAndroid Build Coastguard Worker break;
2199*ec779b8eSAndroid Build Coastguard Worker }
2200*ec779b8eSAndroid Build Coastguard Worker }
2201*ec779b8eSAndroid Build Coastguard Worker
2202*ec779b8eSAndroid Build Coastguard Worker return 0;
2203*ec779b8eSAndroid Build Coastguard Worker }
2204*ec779b8eSAndroid Build Coastguard Worker
2205*ec779b8eSAndroid Build Coastguard Worker __attribute__ ((visibility ("default")))
2206*ec779b8eSAndroid Build Coastguard Worker audio_effect_library_t AUDIO_EFFECT_LIBRARY_INFO_SYM = {
2207*ec779b8eSAndroid Build Coastguard Worker .tag = AUDIO_EFFECT_LIBRARY_TAG,
2208*ec779b8eSAndroid Build Coastguard Worker .version = EFFECT_LIBRARY_API_VERSION,
2209*ec779b8eSAndroid Build Coastguard Worker .name = "Test Equalizer Library",
2210*ec779b8eSAndroid Build Coastguard Worker .implementor = "The Android Open Source Project",
2211*ec779b8eSAndroid Build Coastguard Worker .create_effect = EffectCreate,
2212*ec779b8eSAndroid Build Coastguard Worker .release_effect = EffectRelease,
2213*ec779b8eSAndroid Build Coastguard Worker .get_descriptor = EffectGetDescriptor,
2214*ec779b8eSAndroid Build Coastguard Worker };
2215