EffectReverb.c revision ffe9c25ce85e1af55d58ec025adc6367d70db7e8
1135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/* 2135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Copyright (C) 2008 The Android Open Source Project 3135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * 4135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Licensed under the Apache License, Version 2.0 (the "License"); 5135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * you may not use this file except in compliance with the License. 6135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * You may obtain a copy of the License at 7135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * 8135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * http://www.apache.org/licenses/LICENSE-2.0 9135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * 10135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Unless required by applicable law or agreed to in writing, software 11135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * distributed under the License is distributed on an "AS IS" BASIS, 12135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * See the License for the specific language governing permissions and 14135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * limitations under the License. 15135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent */ 16135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 17135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define LOG_TAG "EffectReverb" 18135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 19135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define LOG_NDEBUG 0 20135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#include <cutils/log.h> 21be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent#include <stdlib.h> 22be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurent#include <string.h> 23135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#include <stdbool.h> 24135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#include "EffectReverb.h" 25135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#include "EffectsMath.h" 26135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 27135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// effect_interface_t interface implementation for reverb effect 28135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentconst struct effect_interface_s gReverbInterface = { 29135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent Reverb_Process, 30135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent Reverb_Command 31135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent}; 32135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 33135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Google auxiliary environmental reverb UUID: 1f0ae2e0-4ef7-11df-bc09-0002a5d5c51b 34135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentstatic const effect_descriptor_t gAuxEnvReverbDescriptor = { 35135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent {0xc2e5d5f0, 0x94bd, 0x4763, 0x9cac, {0x4e, 0x23, 0x4d, 0x06, 0x83, 0x9e}}, 36135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent {0x1f0ae2e0, 0x4ef7, 0x11df, 0xbc09, {0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}}, 37135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent EFFECT_API_VERSION, 38ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent // flags other than EFFECT_FLAG_TYPE_AUXILIARY set for test purpose 39ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent EFFECT_FLAG_TYPE_AUXILIARY | EFFECT_FLAG_DEVICE_IND | EFFECT_FLAG_AUDIO_MODE_IND, 40ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent 0, // TODO 41ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent 33, 42135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent "Aux Environmental Reverb", 43135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent "Google Inc." 44135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent}; 45135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 46135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Google insert environmental reverb UUID: aa476040-6342-11df-91a4-0002a5d5c51b 47135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentstatic const effect_descriptor_t gInsertEnvReverbDescriptor = { 48135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent {0xc2e5d5f0, 0x94bd, 0x4763, 0x9cac, {0x4e, 0x23, 0x4d, 0x06, 0x83, 0x9e}}, 49135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent {0xaa476040, 0x6342, 0x11df, 0x91a4, {0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}}, 50135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent EFFECT_API_VERSION, 51135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent EFFECT_FLAG_TYPE_INSERT | EFFECT_FLAG_INSERT_FIRST, 52ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent 0, // TODO 53ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent 33, 54135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent "Insert Environmental reverb", 55135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent "Google Inc." 56135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent}; 57135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 58135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Google auxiliary preset reverb UUID: 63909320-53a6-11df-bdbd-0002a5d5c51b 59135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentstatic const effect_descriptor_t gAuxPresetReverbDescriptor = { 60135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent {0x47382d60, 0xddd8, 0x4763, 0x11db, {0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}}, 61135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent {0x63909320, 0x53a6, 0x11df, 0xbdbd, {0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}}, 62135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent EFFECT_API_VERSION, 63135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent EFFECT_FLAG_TYPE_AUXILIARY, 64ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent 0, // TODO 65ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent 33, 66135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent "Aux Preset Reverb", 67135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent "Google Inc." 68135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent}; 69135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 70135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Google insert preset reverb UUID: d93dc6a0-6342-11df-b128-0002a5d5c51b 71135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentstatic const effect_descriptor_t gInsertPresetReverbDescriptor = { 72135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent {0x47382d60, 0xddd8, 0x4763, 0x11db, {0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}}, 73135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent {0xd93dc6a0, 0x6342, 0x11df, 0xb128, {0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}}, 74135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent EFFECT_API_VERSION, 75135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent EFFECT_FLAG_TYPE_INSERT | EFFECT_FLAG_INSERT_FIRST, 76ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent 0, // TODO 77ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent 33, 78135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent "Insert Preset Reverb", 79135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent "Google Inc." 80135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent}; 81135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 82135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// gDescriptors contains pointers to all defined effect descriptor in this library 83135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentstatic const effect_descriptor_t * const gDescriptors[] = { 84135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent &gAuxEnvReverbDescriptor, 85135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent &gInsertEnvReverbDescriptor, 86135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent &gAuxPresetReverbDescriptor, 87ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent &gInsertPresetReverbDescriptor 88135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent}; 89135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 90135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/*---------------------------------------------------------------------------- 91135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Effect API implementation 92135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *--------------------------------------------------------------------------*/ 93135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 94135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/*--- Effect Library Interface Implementation ---*/ 95135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 96be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurentint EffectQueryNumberEffects(uint32_t *pNumEffects) { 97ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent *pNumEffects = sizeof(gDescriptors) / sizeof(const effect_descriptor_t *); 98135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return 0; 99135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} 100135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 101ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurentint EffectQueryEffect(uint32_t index, effect_descriptor_t *pDescriptor) { 102135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (pDescriptor == NULL) { 103135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 104135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 105ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent if (index >= sizeof(gDescriptors) / sizeof(const effect_descriptor_t *)) { 106ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent return -EINVAL; 107135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 108ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent memcpy(pDescriptor, gDescriptors[index], 109135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent sizeof(effect_descriptor_t)); 110135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return 0; 111135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} 112135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 113135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentint EffectCreate(effect_uuid_t *uuid, 114ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent int32_t sessionId, 115ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent int32_t ioId, 116135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent effect_interface_t *pInterface) { 117135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int ret; 118135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int i; 119135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent reverb_module_t *module; 120135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent const effect_descriptor_t *desc; 121135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int aux = 0; 122135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int preset = 0; 123135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 124135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("EffectLibCreateEffect start"); 125135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 126135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (pInterface == NULL || uuid == NULL) { 127135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 128135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 129135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 130135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent for (i = 0; gDescriptors[i] != NULL; i++) { 131135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent desc = gDescriptors[i]; 132135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (memcmp(uuid, &desc->uuid, sizeof(effect_uuid_t)) 133135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent == 0) { 134135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 135135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 136135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 137135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 138135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (gDescriptors[i] == NULL) { 139135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -ENOENT; 140135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 141135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 142135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent module = malloc(sizeof(reverb_module_t)); 143135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 144135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent module->itfe = &gReverbInterface; 145135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 146135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (memcmp(&desc->type, SL_IID_PRESETREVERB, sizeof(effect_uuid_t)) == 0) { 147135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent preset = 1; 148135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 149135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if ((desc->flags & EFFECT_FLAG_TYPE_MASK) == EFFECT_FLAG_TYPE_AUXILIARY) { 150135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent aux = 1; 151135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 152135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent ret = Reverb_Init(module, aux, preset); 153135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (ret < 0) { 154135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGW("EffectLibCreateEffect() init failed"); 155135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent free(module); 156135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return ret; 157135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 158135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 159135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *pInterface = (effect_interface_t) module; 160135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 161ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent LOGV("EffectLibCreateEffect %p ,size %d", module, sizeof(reverb_module_t)); 162135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 163135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return 0; 164135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} 165135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 166135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentint EffectRelease(effect_interface_t interface) { 167135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent reverb_module_t *pRvbModule = (reverb_module_t *)interface; 168135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 169135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("EffectLibReleaseEffect %p", interface); 170135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (interface == NULL) { 171135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 172135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 173135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 174135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent free(pRvbModule); 175135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return 0; 176135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} 177135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 178135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 179135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/*--- Effect Control Interface Implementation ---*/ 180135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 181135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentstatic int Reverb_Process(effect_interface_t self, audio_buffer_t *inBuffer, audio_buffer_t *outBuffer) { 182135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent reverb_object_t *pReverb; 183135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int16_t *pSrc, *pDst; 184135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent reverb_module_t *pRvbModule = (reverb_module_t *)self; 185135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 186135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (pRvbModule == NULL) { 187135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 188135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 189135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 190135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (inBuffer == NULL || inBuffer->raw == NULL || 191135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent outBuffer == NULL || outBuffer->raw == NULL || 192135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent inBuffer->frameCount != outBuffer->frameCount) { 193135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 194135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 195135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 196135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb = (reverb_object_t*) &pRvbModule->context; 197135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 198135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent //if bypassed or the preset forces the signal to be completely dry 199135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (pReverb->m_bBypass) { 200ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent if (inBuffer->raw != outBuffer->raw) { 201ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent int16_t smp; 202ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent pSrc = inBuffer->s16; 203ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent pDst = outBuffer->s16; 204ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent size_t count = inBuffer->frameCount; 205ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent if (pRvbModule->config.inputCfg.channels == pRvbModule->config.outputCfg.channels) { 206ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent count *= 2; 207ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent while (count--) { 208ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent *pDst++ = *pSrc++; 209ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent } 210ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent } else { 211ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent while (count--) { 212ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent smp = *pSrc++; 213ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent *pDst++ = smp; 214ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent *pDst++ = smp; 215ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent } 216ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent } 217135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 218135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return 0; 219135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 220135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 221135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (pReverb->m_nNextRoom != pReverb->m_nCurrentRoom) { 222135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent ReverbUpdateRoom(pReverb, true); 223135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 224135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 225135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pSrc = inBuffer->s16; 226135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pDst = outBuffer->s16; 227135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent size_t numSamples = outBuffer->frameCount; 228135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent while (numSamples) { 229135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent uint32_t processedSamples; 230135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (numSamples > (uint32_t) pReverb->m_nUpdatePeriodInSamples) { 231135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent processedSamples = (uint32_t) pReverb->m_nUpdatePeriodInSamples; 232135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } else { 233135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent processedSamples = numSamples; 234135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 235135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 236135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent /* increment update counter */ 237135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nUpdateCounter += (int16_t) processedSamples; 238135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent /* check if update counter needs to be reset */ 239135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (pReverb->m_nUpdateCounter >= pReverb->m_nUpdatePeriodInSamples) { 240135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent /* update interval has elapsed, so reset counter */ 241135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nUpdateCounter -= pReverb->m_nUpdatePeriodInSamples; 242135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent ReverbUpdateXfade(pReverb, pReverb->m_nUpdatePeriodInSamples); 243135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 244135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } /* end if m_nUpdateCounter >= update interval */ 245135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 246135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent Reverb(pReverb, processedSamples, pDst, pSrc); 247135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 248135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent numSamples -= processedSamples; 249135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (pReverb->m_Aux) { 250ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent pSrc += processedSamples; 251135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } else { 252135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pSrc += processedSamples * NUM_OUTPUT_CHANNELS; 253135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 254ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent pDst += processedSamples * NUM_OUTPUT_CHANNELS; 255135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 256135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 257135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return 0; 258135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} 259135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 260135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentstatic int Reverb_Command(effect_interface_t self, int cmdCode, int cmdSize, 261135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent void *pCmdData, int *replySize, void *pReplyData) { 262135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent reverb_module_t *pRvbModule = (reverb_module_t *) self; 263135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent reverb_object_t *pReverb; 264135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int retsize; 265135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 266135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (pRvbModule == NULL) { 267135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 268135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 269135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 270135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb = (reverb_object_t*) &pRvbModule->context; 271135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 272135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("Reverb_Command command %d cmdSize %d",cmdCode, cmdSize); 273135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 274135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent switch (cmdCode) { 275135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EFFECT_CMD_INIT: 276135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (pReplyData == NULL || *replySize != sizeof(int)) { 277135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 278135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 279135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *(int *) pReplyData = Reverb_Init(pRvbModule, pReverb->m_Aux, pReverb->m_Preset); 280135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 281135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EFFECT_CMD_CONFIGURE: 282135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (pCmdData == NULL || cmdSize != sizeof(effect_config_t) 283135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent || pReplyData == NULL || *replySize != sizeof(int)) { 284135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 285135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 286135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *(int *) pReplyData = Reverb_Configure(pRvbModule, 287135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent (effect_config_t *)pCmdData, false); 288135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 289135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EFFECT_CMD_RESET: 290135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent Reverb_Reset(pReverb, false); 291135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 292135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EFFECT_CMD_GET_PARAM: 293135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("Reverb_Command EFFECT_CMD_GET_PARAM pCmdData %p, *replySize %d, pReplyData: %p",pCmdData, *replySize, pReplyData); 294135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 295135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (pCmdData == NULL || cmdSize < (int)(sizeof(effect_param_t) + sizeof(int32_t)) || 296135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReplyData == NULL || *replySize < (int) sizeof(effect_param_t)) { 297135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 298135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 299135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent effect_param_t *rep = (effect_param_t *) pReplyData; 300135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent memcpy(pReplyData, pCmdData, sizeof(effect_param_t) + sizeof(int32_t)); 301135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("Reverb_Command EFFECT_CMD_GET_PARAM param %d, replySize %d",*(int32_t *)rep->data, rep->vsize); 302135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent rep->status = Reverb_getParameter(pReverb, *(int32_t *)rep->data, &rep->vsize, 303135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent rep->data + sizeof(int32_t)); 304135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *replySize = sizeof(effect_param_t) + sizeof(int32_t) + rep->vsize; 305135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 306135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EFFECT_CMD_SET_PARAM: 307135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("Reverb_Command EFFECT_CMD_SET_PARAM cmdSize %d pCmdData %p, *replySize %d, pReplyData %p", 308135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent cmdSize, pCmdData, *replySize, pReplyData); 309135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (pCmdData == NULL || (cmdSize < (int)(sizeof(effect_param_t) + sizeof(int32_t))) 310135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent || pReplyData == NULL || *replySize != (int)sizeof(int32_t)) { 311135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 312135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 313135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent effect_param_t *cmd = (effect_param_t *) pCmdData; 314135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *(int *)pReplyData = Reverb_setParameter(pReverb, *(int32_t *)cmd->data, 315135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent cmd->vsize, cmd->data + sizeof(int32_t)); 316135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 317ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent case EFFECT_CMD_ENABLE: 318ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent case EFFECT_CMD_DISABLE: 319ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent if (pReplyData == NULL || *replySize != sizeof(int)) { 320ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent return -EINVAL; 321ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent } 322ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent *(int *)pReplyData = 0; 323ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent break; 324ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent case EFFECT_CMD_SET_DEVICE: 325ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent if (pCmdData == NULL || cmdSize != (int)sizeof(uint32_t)) { 326ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent return -EINVAL; 327ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent } 328ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent LOGV("Reverb_Command EFFECT_CMD_SET_DEVICE: 0x%08x", *(uint32_t *)pCmdData); 329ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent break; 330ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent case EFFECT_CMD_SET_VOLUME: { 331ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent // audio output is always stereo => 2 channel volumes 332ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent if (pCmdData == NULL || cmdSize != (int)sizeof(uint32_t) * 2) { 333ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent return -EINVAL; 334ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent } 335ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent float left = (float)(*(uint32_t *)pCmdData) / (1 << 24); 336ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent float right = (float)(*((uint32_t *)pCmdData + 1)) / (1 << 24); 337ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent LOGV("Reverb_Command EFFECT_CMD_SET_VOLUME: left %f, right %f ", left, right); 338ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent break; 339ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent } 340ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent case EFFECT_CMD_SET_AUDIO_MODE: 341ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent if (pCmdData == NULL || cmdSize != (int)sizeof(uint32_t)) { 342ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent return -EINVAL; 343ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent } 344ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent LOGV("Reverb_Command EFFECT_CMD_SET_AUDIO_MODE: %d", *(uint32_t *)pCmdData); 345ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent break; 346135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent default: 347135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGW("Reverb_Command invalid command %d",cmdCode); 348135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 349135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 350135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 351135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return 0; 352135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} 353135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 354135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 355135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/*---------------------------------------------------------------------------- 356135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Reverb internal functions 357135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *--------------------------------------------------------------------------*/ 358135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 359135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/*---------------------------------------------------------------------------- 360135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Reverb_Init() 361135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *---------------------------------------------------------------------------- 362135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Purpose: 363135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Initialize reverb context and apply default parameters 364135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * 365135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Inputs: 366135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * pRvbModule - pointer to reverb effect module 367135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * aux - indicates if the reverb is used as auxiliary (1) or insert (0) 368135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * preset - indicates if the reverb is used in preset (1) or environmental (0) mode 369135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * 370135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Outputs: 371135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * 372135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Side Effects: 373135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * 374135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *---------------------------------------------------------------------------- 375135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent */ 376135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 377135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentint Reverb_Init(reverb_module_t *pRvbModule, int aux, int preset) { 378135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int ret; 379135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 380135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("Reverb_Init module %p, aux: %d, preset: %d", pRvbModule,aux, preset); 381135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 382135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent memset(&pRvbModule->context, 0, sizeof(reverb_object_t)); 383135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 384135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pRvbModule->context.m_Aux = (uint16_t)aux; 385135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pRvbModule->context.m_Preset = (uint16_t)preset; 386135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 387135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pRvbModule->config.inputCfg.samplingRate = 44100; 388135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (aux) { 389135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pRvbModule->config.inputCfg.channels = CHANNEL_MONO; 390135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } else { 391135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pRvbModule->config.inputCfg.channels = CHANNEL_STEREO; 392135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 393ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent pRvbModule->config.inputCfg.format = SAMPLE_FORMAT_PCM_S15; 394135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pRvbModule->config.inputCfg.bufferProvider.getBuffer = NULL; 395135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pRvbModule->config.inputCfg.bufferProvider.releaseBuffer = NULL; 396135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pRvbModule->config.inputCfg.bufferProvider.cookie = NULL; 397135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pRvbModule->config.inputCfg.accessMode = EFFECT_BUFFER_ACCESS_READ; 398135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pRvbModule->config.inputCfg.mask = EFFECT_CONFIG_ALL; 399135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pRvbModule->config.outputCfg.samplingRate = 44100; 400135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pRvbModule->config.outputCfg.channels = CHANNEL_STEREO; 401ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent pRvbModule->config.outputCfg.format = SAMPLE_FORMAT_PCM_S15; 402135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pRvbModule->config.outputCfg.bufferProvider.getBuffer = NULL; 403135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pRvbModule->config.outputCfg.bufferProvider.releaseBuffer = NULL; 404135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pRvbModule->config.outputCfg.bufferProvider.cookie = NULL; 405135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pRvbModule->config.outputCfg.accessMode = EFFECT_BUFFER_ACCESS_ACCUMULATE; 406135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pRvbModule->config.outputCfg.mask = EFFECT_CONFIG_ALL; 407135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 408135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent ret = Reverb_Configure(pRvbModule, &pRvbModule->config, true); 409135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (ret < 0) { 410135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("Reverb_Init error %d on module %p", ret, pRvbModule); 411135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 412135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 413135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return ret; 414135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} 415135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 416135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/*---------------------------------------------------------------------------- 417135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Reverb_Init() 418135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *---------------------------------------------------------------------------- 419135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Purpose: 420135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Set input and output audio configuration. 421135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * 422135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Inputs: 423135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * pRvbModule - pointer to reverb effect module 424135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * pConfig - pointer to effect_config_t structure containing input 425135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * and output audio parameters configuration 426135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * init - true if called from init function 427135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Outputs: 428135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * 429135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Side Effects: 430135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * 431135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *---------------------------------------------------------------------------- 432135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent */ 433135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 434135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentint Reverb_Configure(reverb_module_t *pRvbModule, effect_config_t *pConfig, 435135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent bool init) { 436135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent reverb_object_t *pReverb = &pRvbModule->context; 437135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int bufferSizeInSamples; 438135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int updatePeriodInSamples; 439135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int xfadePeriodInSamples; 440135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 441135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // Check configuration compatibility with build options 442135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (pConfig->inputCfg.samplingRate 443135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent != pConfig->outputCfg.samplingRate 444135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent || pConfig->outputCfg.channels != OUTPUT_CHANNELS 445ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent || pConfig->inputCfg.format != SAMPLE_FORMAT_PCM_S15 446ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent || pConfig->outputCfg.format != SAMPLE_FORMAT_PCM_S15) { 447135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("Reverb_Configure invalid config"); 448135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 449135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 450135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if ((pReverb->m_Aux && (pConfig->inputCfg.channels != CHANNEL_MONO)) || 451135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent (!pReverb->m_Aux && (pConfig->inputCfg.channels != CHANNEL_STEREO))) { 452135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("Reverb_Configure invalid config"); 453135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 454135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 455135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 456135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent memcpy(&pRvbModule->config, pConfig, sizeof(effect_config_t)); 457135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 458135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nSamplingRate = pRvbModule->config.outputCfg.samplingRate; 459135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 460135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent switch (pReverb->m_nSamplingRate) { 461135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case 8000: 462135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nUpdatePeriodInBits = 5; 463135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent bufferSizeInSamples = 4096; 464135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nCosWT_5KHz = -23170; 465135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 466135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case 16000: 467135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nUpdatePeriodInBits = 6; 468135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent bufferSizeInSamples = 8192; 469135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nCosWT_5KHz = -12540; 470135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 471135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case 22050: 472135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nUpdatePeriodInBits = 7; 473135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent bufferSizeInSamples = 8192; 474135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nCosWT_5KHz = 4768; 475135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 476135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case 32000: 477135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nUpdatePeriodInBits = 7; 478135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent bufferSizeInSamples = 16384; 479135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nCosWT_5KHz = 18205; 480135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 481135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case 44100: 482135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nUpdatePeriodInBits = 8; 483135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent bufferSizeInSamples = 16384; 484135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nCosWT_5KHz = 24799; 485135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 486135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case 48000: 487135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nUpdatePeriodInBits = 8; 488135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent bufferSizeInSamples = 16384; 489135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nCosWT_5KHz = 25997; 490135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 491135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent default: 492135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("Reverb_Configure invalid sampling rate %d", pReverb->m_nSamplingRate); 493135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 494135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 495135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 496135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // Define a mask for circular addressing, so that array index 497135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // can wraparound and stay in array boundary of 0, 1, ..., (buffer size -1) 498135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // The buffer size MUST be a power of two 499135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nBufferMask = (int32_t) (bufferSizeInSamples - 1); 500135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent /* reverb parameters are updated every 2^(pReverb->m_nUpdatePeriodInBits) samples */ 501135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent updatePeriodInSamples = (int32_t) (0x1L << pReverb->m_nUpdatePeriodInBits); 502135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent /* 503135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent calculate the update counter by bitwise ANDING with this value to 504135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent generate a 2^n modulo value 505135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent */ 506135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nUpdatePeriodInSamples = (int32_t) updatePeriodInSamples; 507135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 508135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent xfadePeriodInSamples = (int32_t) (REVERB_XFADE_PERIOD_IN_SECONDS 509135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * (double) pReverb->m_nSamplingRate); 510135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 511135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // set xfade parameters 512135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nPhaseIncrement 513135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent = (int16_t) (65536 / ((int16_t) xfadePeriodInSamples 514135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent / (int16_t) updatePeriodInSamples)); 515135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 516135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (init) { 517135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent ReverbReadInPresets(pReverb); 518135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 519135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // for debugging purposes, allow noise generator 520135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_bUseNoise = true; 521135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 522135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // for debugging purposes, allow bypass 523135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_bBypass = false; 524135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 525135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nNextRoom = 1; 526135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 527135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nNoise = (int16_t) 0xABCD; 528135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 529135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 530135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent Reverb_Reset(pReverb, init); 531135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 532135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return 0; 533135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} 534135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 535135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/*---------------------------------------------------------------------------- 536135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Reverb_Reset() 537135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *---------------------------------------------------------------------------- 538135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Purpose: 539135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Reset internal states and clear delay lines. 540135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * 541135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Inputs: 542135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * pReverb - pointer to reverb context 543135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * init - true if called from init function 544135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * 545135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Outputs: 546135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * 547135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Side Effects: 548135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * 549135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *---------------------------------------------------------------------------- 550135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent */ 551135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 552135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentvoid Reverb_Reset(reverb_object_t *pReverb, bool init) { 553135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int bufferSizeInSamples = (int32_t) (pReverb->m_nBufferMask + 1); 554135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int maxApSamples; 555135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int maxDelaySamples; 556135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int maxEarlySamples; 557135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int ap1In; 558135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int delay0In; 559135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int delay1In; 560135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int32_t i; 561135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent uint16_t nOffset; 562135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 563135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent maxApSamples = ((int32_t) (MAX_AP_TIME * pReverb->m_nSamplingRate) >> 16); 564135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent maxDelaySamples = ((int32_t) (MAX_DELAY_TIME * pReverb->m_nSamplingRate) 565135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent >> 16); 566135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent maxEarlySamples = ((int32_t) (MAX_EARLY_TIME * pReverb->m_nSamplingRate) 567135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent >> 16); 568135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 569135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent ap1In = (AP0_IN + maxApSamples + GUARD); 570135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent delay0In = (ap1In + maxApSamples + GUARD); 571135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent delay1In = (delay0In + maxDelaySamples + GUARD); 572135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // Define the max offsets for the end points of each section 573135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // i.e., we don't expect a given section's taps to go beyond 574135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // the following limits 575135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 576135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nEarly0in = (delay1In + maxDelaySamples + GUARD); 577135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nEarly1in = (pReverb->m_nEarly0in + maxEarlySamples + GUARD); 578135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 579135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_sAp0.m_zApIn = AP0_IN; 580135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 581135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_zD0In = delay0In; 582135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 583135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_sAp1.m_zApIn = ap1In; 584135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 585135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_zD1In = delay1In; 586135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 587135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_zOutLpfL = 0; 588135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_zOutLpfR = 0; 589135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 590135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nRevFbkR = 0; 591135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nRevFbkL = 0; 592135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 593135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // set base index into circular buffer 594135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nBaseIndex = 0; 595135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 596135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // clear the reverb delay line 597135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent for (i = 0; i < bufferSizeInSamples; i++) { 598135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nDelayLine[i] = 0; 599135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 600135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 601135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent ReverbUpdateRoom(pReverb, init); 602135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 603135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nUpdateCounter = 0; 604135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 605135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nPhase = -32768; 606135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 607135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nSin = 0; 608135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nCos = 0; 609135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nSinIncrement = 0; 610135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nCosIncrement = 0; 611135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 612135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // set delay tap lengths 613135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nOffset = ReverbCalculateNoise(pReverb); 614135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 615135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_zD1Cross = pReverb->m_nDelay1Out - pReverb->m_nMaxExcursion 616135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent + nOffset; 617135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 618135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nOffset = ReverbCalculateNoise(pReverb); 619135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 620135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_zD0Cross = pReverb->m_nDelay0Out - pReverb->m_nMaxExcursion 621135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent - nOffset; 622135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 623135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nOffset = ReverbCalculateNoise(pReverb); 624135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 625135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_zD0Self = pReverb->m_nDelay0Out - pReverb->m_nMaxExcursion 626135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent - nOffset; 627135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 628135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nOffset = ReverbCalculateNoise(pReverb); 629135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 630135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_zD1Self = pReverb->m_nDelay1Out - pReverb->m_nMaxExcursion 631135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent + nOffset; 632135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} 633135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 634135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/*---------------------------------------------------------------------------- 635135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Reverb_getParameter() 636135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *---------------------------------------------------------------------------- 637135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Purpose: 638135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Get a Reverb parameter 639135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * 640135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Inputs: 641135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * pReverb - handle to instance data 642135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * param - parameter 643135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * pValue - pointer to variable to hold retrieved value 644135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * pSize - pointer to value size: maximum size as input 645135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * 646135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Outputs: 647135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * *pValue updated with parameter value 648135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * *pSize updated with actual value size 649135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * 650135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * 651135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Side Effects: 652135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * 653135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *---------------------------------------------------------------------------- 654135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent */ 655135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentint Reverb_getParameter(reverb_object_t *pReverb, int32_t param, size_t *pSize, 656135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent void *pValue) { 657135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int32_t *pValue32; 658135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int16_t *pValue16; 659135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent t_reverb_properties *pProperties; 660135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int32_t i; 661135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int32_t temp; 662135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int32_t temp2; 663135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent size_t size; 664135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 665135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (pReverb->m_Preset && param != REVERB_PARAM_PRESET) { 666135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 667135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 668135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (!pReverb->m_Preset && param == REVERB_PARAM_PRESET) { 669135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 670135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 671135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 672135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent switch (param) { 673135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case REVERB_PARAM_ROOM_LEVEL: 674135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case REVERB_PARAM_ROOM_HF_LEVEL: 675135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case REVERB_PARAM_DECAY_HF_RATIO: 676135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case REVERB_PARAM_REFLECTIONS_LEVEL: 677135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case REVERB_PARAM_REVERB_LEVEL: 678135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case REVERB_PARAM_DIFFUSION: 679135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case REVERB_PARAM_DENSITY: 680135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent size = sizeof(int16_t); 681135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 682135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 683135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case REVERB_PARAM_BYPASS: 684135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case REVERB_PARAM_PRESET: 685135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case REVERB_PARAM_DECAY_TIME: 686135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case REVERB_PARAM_REFLECTIONS_DELAY: 687135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case REVERB_PARAM_REVERB_DELAY: 688135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent size = sizeof(int32_t); 689135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 690135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 691135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case REVERB_PARAM_PROPERTIES: 692135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent size = sizeof(t_reverb_properties); 693135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 694135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 695135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent default: 696135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 697135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 698135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 699135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (*pSize < size) { 700135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 701135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 702135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *pSize = size; 703135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pValue32 = (int32_t *) pValue; 704135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pValue16 = (int16_t *) pValue; 705135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pProperties = (t_reverb_properties *) pValue; 706135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 707135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent switch (param) { 708135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case REVERB_PARAM_BYPASS: 709135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *(int32_t *) pValue = (int32_t) pReverb->m_bBypass; 710135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 711135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case REVERB_PARAM_PRESET: 712135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *(int32_t *) pValue = (int8_t) pReverb->m_nCurrentRoom; 713135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 714135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 715135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case REVERB_PARAM_PROPERTIES: 716135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pValue16 = &pProperties->roomLevel; 717135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent /* FALL THROUGH */ 718135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 719135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case REVERB_PARAM_ROOM_LEVEL: 720135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // Convert m_nRoomLpfFwd to millibels 721135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp = (pReverb->m_nRoomLpfFwd << 15) 722135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent / (32767 - pReverb->m_nRoomLpfFbk); 723135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *pValue16 = Effects_Linear16ToMillibels(temp); 724135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 725135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("get REVERB_PARAM_ROOM_LEVEL %d, gain %d, m_nRoomLpfFwd %d, m_nRoomLpfFbk %d", *pValue16, temp, pReverb->m_nRoomLpfFwd, pReverb->m_nRoomLpfFbk); 726135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 727135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (param == REVERB_PARAM_ROOM_LEVEL) { 728135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 729135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 730135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pValue16 = &pProperties->roomHFLevel; 731135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent /* FALL THROUGH */ 732135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 733135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case REVERB_PARAM_ROOM_HF_LEVEL: 734135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // The ratio between linear gain at 0Hz and at 5000Hz for the room low pass is: 735135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // (1 + a1) / sqrt(a1^2 + 2*C*a1 + 1) where: 736135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // - a1 is minus the LP feedback gain: -pReverb->m_nRoomLpfFbk 737135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // - C is cos(2piWT) @ 5000Hz: pReverb->m_nCosWT_5KHz 738135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 739135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp = MULT_EG1_EG1(pReverb->m_nRoomLpfFbk, pReverb->m_nRoomLpfFbk); 740135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("get REVERB_PARAM_ROOM_HF_LEVEL, a1^2 %d", temp); 741135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp2 = MULT_EG1_EG1(pReverb->m_nRoomLpfFbk, pReverb->m_nCosWT_5KHz) 742135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent << 1; 743135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("get REVERB_PARAM_ROOM_HF_LEVEL, 2 Cos a1 %d", temp2); 744135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp = 32767 + temp - temp2; 745135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("get REVERB_PARAM_ROOM_HF_LEVEL, a1^2 + 2 Cos a1 + 1 %d", temp); 746135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp = Effects_Sqrt(temp) * 181; 747135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("get REVERB_PARAM_ROOM_HF_LEVEL, SQRT(a1^2 + 2 Cos a1 + 1) %d", temp); 748135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp = ((32767 - pReverb->m_nRoomLpfFbk) << 15) / temp; 749135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 750135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("get REVERB_PARAM_ROOM_HF_LEVEL, gain %d, m_nRoomLpfFwd %d, m_nRoomLpfFbk %d", temp, pReverb->m_nRoomLpfFwd, pReverb->m_nRoomLpfFbk); 751135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 752135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *pValue16 = Effects_Linear16ToMillibels(temp); 753135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 754135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (param == REVERB_PARAM_ROOM_HF_LEVEL) { 755135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 756135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 757135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pValue32 = &pProperties->decayTime; 758135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent /* FALL THROUGH */ 759135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 760135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case REVERB_PARAM_DECAY_TIME: 761135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // Calculate reverb feedback path gain 762135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp = (pReverb->m_nRvbLpfFwd << 15) / (32767 - pReverb->m_nRvbLpfFbk); 763135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp = Effects_Linear16ToMillibels(temp); 764135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 765135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // Calculate decay time: g = -6000 d/DT , g gain in millibels, d reverb delay, DT decay time 766135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp = (-6000 * pReverb->m_nLateDelay) / temp; 767135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 768135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // Convert samples to ms 769135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *pValue32 = (temp * 1000) / pReverb->m_nSamplingRate; 770135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 771135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("get REVERB_PARAM_DECAY_TIME, samples %d, ms %d", temp, *pValue32); 772135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 773135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (param == REVERB_PARAM_DECAY_TIME) { 774135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 775135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 776135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pValue16 = &pProperties->decayHFRatio; 777135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent /* FALL THROUGH */ 778135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 779135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case REVERB_PARAM_DECAY_HF_RATIO: 780135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // If r is the decay HF ratio (r = REVERB_PARAM_DECAY_HF_RATIO/1000) we have: 781135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // DT_5000Hz = DT_0Hz * r 782135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // and G_5000Hz = -6000 * d / DT_5000Hz and G_0Hz = -6000 * d / DT_0Hz in millibels so : 783135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // r = G_0Hz/G_5000Hz in millibels 784135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // The linear gain at 5000Hz is b0 / sqrt(a1^2 + 2*C*a1 + 1) where: 785135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // - a1 is minus the LP feedback gain: -pReverb->m_nRvbLpfFbk 786135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // - b0 is the LP forward gain: pReverb->m_nRvbLpfFwd 787135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // - C is cos(2piWT) @ 5000Hz: pReverb->m_nCosWT_5KHz 788135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (pReverb->m_nRvbLpfFbk == 0) { 789135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *pValue16 = 1000; 790135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("get REVERB_PARAM_DECAY_HF_RATIO, pReverb->m_nRvbLpfFbk == 0, ratio %d", *pValue16); 791135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } else { 792135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp = MULT_EG1_EG1(pReverb->m_nRvbLpfFbk, pReverb->m_nRvbLpfFbk); 793135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp2 = MULT_EG1_EG1(pReverb->m_nRvbLpfFbk, pReverb->m_nCosWT_5KHz) 794135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent << 1; 795135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp = 32767 + temp - temp2; 796135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp = Effects_Sqrt(temp) * 181; 797135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp = (pReverb->m_nRvbLpfFwd << 15) / temp; 798135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // The linear gain at 0Hz is b0 / (a1 + 1) 799135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp2 = (pReverb->m_nRvbLpfFwd << 15) / (32767 800135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent - pReverb->m_nRvbLpfFbk); 801135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 802135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp = Effects_Linear16ToMillibels(temp); 803135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp2 = Effects_Linear16ToMillibels(temp2); 804135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("get REVERB_PARAM_DECAY_HF_RATIO, gain 5KHz %d mB, gain DC %d mB", temp, temp2); 805135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 806135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (temp == 0) 807135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp = 1; 808135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp = (int16_t) ((1000 * temp2) / temp); 809135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (temp > 1000) 810135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp = 1000; 811135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 812135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *pValue16 = temp; 813135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("get REVERB_PARAM_DECAY_HF_RATIO, ratio %d", *pValue16); 814135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 815135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 816135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (param == REVERB_PARAM_DECAY_HF_RATIO) { 817135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 818135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 819135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pValue16 = &pProperties->reflectionsLevel; 820135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent /* FALL THROUGH */ 821135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 822135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case REVERB_PARAM_REFLECTIONS_LEVEL: 823135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *pValue16 = Effects_Linear16ToMillibels(pReverb->m_nEarlyGain); 824135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 825135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("get REVERB_PARAM_REFLECTIONS_LEVEL, %d", *pValue16); 826135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (param == REVERB_PARAM_REFLECTIONS_LEVEL) { 827135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 828135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 829135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pValue32 = &pProperties->reflectionsDelay; 830135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent /* FALL THROUGH */ 831135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 832135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case REVERB_PARAM_REFLECTIONS_DELAY: 833135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // convert samples to ms 834135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *pValue32 = (pReverb->m_nEarlyDelay * 1000) / pReverb->m_nSamplingRate; 835135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 836135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("get REVERB_PARAM_REFLECTIONS_DELAY, samples %d, ms %d", pReverb->m_nEarlyDelay, *pValue32); 837135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 838135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (param == REVERB_PARAM_REFLECTIONS_DELAY) { 839135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 840135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 841135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pValue16 = &pProperties->reverbLevel; 842135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent /* FALL THROUGH */ 843135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 844135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case REVERB_PARAM_REVERB_LEVEL: 845135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // Convert linear gain to millibels 846135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *pValue16 = Effects_Linear16ToMillibels(pReverb->m_nLateGain << 2); 847135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 848135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("get REVERB_PARAM_REVERB_LEVEL %d", *pValue16); 849135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 850135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (param == REVERB_PARAM_REVERB_LEVEL) { 851135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 852135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 853135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pValue32 = &pProperties->reverbDelay; 854135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent /* FALL THROUGH */ 855135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 856135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case REVERB_PARAM_REVERB_DELAY: 857135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // convert samples to ms 858135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *pValue32 = (pReverb->m_nLateDelay * 1000) / pReverb->m_nSamplingRate; 859135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 860135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("get REVERB_PARAM_REVERB_DELAY, samples %d, ms %d", pReverb->m_nLateDelay, *pValue32); 861135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 862135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (param == REVERB_PARAM_REVERB_DELAY) { 863135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 864135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 865135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pValue16 = &pProperties->diffusion; 866135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent /* FALL THROUGH */ 867135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 868135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case REVERB_PARAM_DIFFUSION: 869135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp = (int16_t) ((1000 * (pReverb->m_sAp0.m_nApGain - AP0_GAIN_BASE)) 870135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent / AP0_GAIN_RANGE); 871135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 872135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (temp < 0) 873135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp = 0; 874135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (temp > 1000) 875135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp = 1000; 876135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 877135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *pValue16 = temp; 878135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("get REVERB_PARAM_DIFFUSION, %d, AP0 gain %d", *pValue16, pReverb->m_sAp0.m_nApGain); 879135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 880135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (param == REVERB_PARAM_DIFFUSION) { 881135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 882135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 883135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pValue16 = &pProperties->density; 884135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent /* FALL THROUGH */ 885135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 886135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case REVERB_PARAM_DENSITY: 887135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // Calculate AP delay in time units 888135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp = ((pReverb->m_sAp0.m_zApOut - pReverb->m_sAp0.m_zApIn) << 16) 889135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent / pReverb->m_nSamplingRate; 890135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 891135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp = (int16_t) ((1000 * (temp - AP0_TIME_BASE)) / AP0_TIME_RANGE); 892135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 893135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (temp < 0) 894135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp = 0; 895135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (temp > 1000) 896135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp = 1000; 897135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 898135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *pValue16 = temp; 899135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 900135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("get REVERB_PARAM_DENSITY, %d, AP0 delay smps %d", *pValue16, pReverb->m_sAp0.m_zApOut - pReverb->m_sAp0.m_zApIn); 901135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 902135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 903135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent default: 904135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 905135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 906135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 907135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("Reverb_getParameter, context %p, param %d, value %d", 908135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb, param, *(int *)pValue); 909135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 910135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return 0; 911135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} /* end Reverb_getParameter */ 912135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 913135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/*---------------------------------------------------------------------------- 914135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Reverb_setParameter() 915135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *---------------------------------------------------------------------------- 916135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Purpose: 917135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Set a Reverb parameter 918135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * 919135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Inputs: 920135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * pReverb - handle to instance data 921135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * param - parameter 922135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * pValue - pointer to parameter value 923135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * size - value size 924135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * 925135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Outputs: 926135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * 927135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * 928135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Side Effects: 929135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * 930135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *---------------------------------------------------------------------------- 931135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent */ 932135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentint Reverb_setParameter(reverb_object_t *pReverb, int32_t param, size_t size, 933135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent void *pValue) { 934135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int32_t value32; 935135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int16_t value16; 936135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent t_reverb_properties *pProperties; 937135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int32_t i; 938135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int32_t temp; 939135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int32_t temp2; 940135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent reverb_preset_t *pPreset; 941135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int maxSamples; 942135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int32_t averageDelay; 943135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent size_t paramSize; 944135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 945135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("Reverb_setParameter, context %p, param %d, value16 %d, value32 %d", 946135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb, param, *(int16_t *)pValue, *(int32_t *)pValue); 947135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 948135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (pReverb->m_Preset && param != REVERB_PARAM_PRESET) { 949135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 950135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 951135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (!pReverb->m_Preset && param == REVERB_PARAM_PRESET) { 952135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 953135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 954135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 955135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent switch (param) { 956135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case REVERB_PARAM_ROOM_LEVEL: 957135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case REVERB_PARAM_ROOM_HF_LEVEL: 958135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case REVERB_PARAM_DECAY_HF_RATIO: 959135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case REVERB_PARAM_REFLECTIONS_LEVEL: 960135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case REVERB_PARAM_REVERB_LEVEL: 961135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case REVERB_PARAM_DIFFUSION: 962135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case REVERB_PARAM_DENSITY: 963135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent paramSize = sizeof(int16_t); 964135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 965135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 966135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case REVERB_PARAM_BYPASS: 967135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case REVERB_PARAM_PRESET: 968135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case REVERB_PARAM_DECAY_TIME: 969135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case REVERB_PARAM_REFLECTIONS_DELAY: 970135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case REVERB_PARAM_REVERB_DELAY: 971135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent paramSize = sizeof(int32_t); 972135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 973135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 974135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case REVERB_PARAM_PROPERTIES: 975135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent paramSize = sizeof(t_reverb_properties); 976135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 977135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 978135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent default: 979135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 980135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 981135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 982135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (size != paramSize) { 983135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 984135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 985135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 986135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (paramSize == sizeof(int16_t)) { 987135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent value16 = *(int16_t *) pValue; 988135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } else if (paramSize == sizeof(int32_t)) { 989135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent value32 = *(int32_t *) pValue; 990135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } else { 991135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pProperties = (t_reverb_properties *) pValue; 992135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 993135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 994135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset = &pReverb->m_sPreset.m_sPreset[pReverb->m_nCurrentRoom]; 995135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 996135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent switch (param) { 997135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case REVERB_PARAM_BYPASS: 998135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_bBypass = (uint16_t)value32; 999135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 1000135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case REVERB_PARAM_PRESET: 1001135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (value32 != REVERB_PRESET_LARGE_HALL && value32 1002135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent != REVERB_PRESET_HALL && value32 != REVERB_PRESET_CHAMBER 1003135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent && value32 != REVERB_PRESET_ROOM) 1004135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 1005135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nNextRoom = (int16_t) value32; 1006135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 1007135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1008135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case REVERB_PARAM_PROPERTIES: 1009135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent value16 = pProperties->roomLevel; 1010135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent /* FALL THROUGH */ 1011135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1012135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case REVERB_PARAM_ROOM_LEVEL: 1013135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // Convert millibels to linear 16 bit signed => m_nRoomLpfFwd 1014135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (value16 > 0) 1015135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 1016135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1017135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp = Effects_MillibelsToLinear16(value16); 1018135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1019135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nRoomLpfFwd 1020135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent = MULT_EG1_EG1(temp, (32767 - pReverb->m_nRoomLpfFbk)); 1021135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1022135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("REVERB_PARAM_ROOM_LEVEL, gain %d, new m_nRoomLpfFwd %d, m_nRoomLpfFbk %d", temp, pReverb->m_nRoomLpfFwd, pReverb->m_nRoomLpfFbk); 1023135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (param == REVERB_PARAM_ROOM_LEVEL) 1024135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 1025135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent value16 = pProperties->roomHFLevel; 1026135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent /* FALL THROUGH */ 1027135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1028135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case REVERB_PARAM_ROOM_HF_LEVEL: 1029135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1030135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // Limit to 0 , -40dB range because of low pass implementation 1031135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (value16 > 0 || value16 < -4000) 1032135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 1033135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // Convert attenuation @ 5000H expressed in millibels to => m_nRoomLpfFbk 1034135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // m_nRoomLpfFbk is -a1 where a1 is the solution of: 1035135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // a1^2 + 2*(C-dG^2)/(1-dG^2)*a1 + 1 = 0 where: 1036135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // - C is cos(2*pi*5000/Fs) (pReverb->m_nCosWT_5KHz) 1037135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // - dG is G0/Gf (G0 is the linear gain at DC and Gf is the wanted gain at 5000Hz) 1038135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1039135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // Save current DC gain m_nRoomLpfFwd / (32767 - m_nRoomLpfFbk) to keep it unchanged 1040135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // while changing HF level 1041135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp2 = (pReverb->m_nRoomLpfFwd << 15) / (32767 1042135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent - pReverb->m_nRoomLpfFbk); 1043135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (value16 == 0) { 1044135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nRoomLpfFbk = 0; 1045135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } else { 1046135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int32_t dG2, b, delta; 1047135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1048135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // dG^2 1049135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp = Effects_MillibelsToLinear16(value16); 1050135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("REVERB_PARAM_ROOM_HF_LEVEL, HF gain %d", temp); 1051135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp = (1 << 30) / temp; 1052135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("REVERB_PARAM_ROOM_HF_LEVEL, 1/ HF gain %d", temp); 1053135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent dG2 = (int32_t) (((int64_t) temp * (int64_t) temp) >> 15); 1054135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("REVERB_PARAM_ROOM_HF_LEVEL, 1/ HF gain ^ 2 %d", dG2); 1055135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // b = 2*(C-dG^2)/(1-dG^2) 1056135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent b = (int32_t) ((((int64_t) 1 << (15 + 1)) 1057135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * ((int64_t) pReverb->m_nCosWT_5KHz - (int64_t) dG2)) 1058135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent / ((int64_t) 32767 - (int64_t) dG2)); 1059135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1060135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // delta = b^2 - 4 1061135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent delta = (int32_t) ((((int64_t) b * (int64_t) b) >> 15) - (1 << (15 1062135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent + 2))); 1063135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1064135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV_IF(delta > (1<<30), " delta overflow %d", delta); 1065135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1066135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("REVERB_PARAM_ROOM_HF_LEVEL, dG2 %d, b %d, delta %d, m_nCosWT_5KHz %d", dG2, b, delta, pReverb->m_nCosWT_5KHz); 1067135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // m_nRoomLpfFbk = -a1 = - (- b + sqrt(delta)) / 2 1068135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nRoomLpfFbk = (b - Effects_Sqrt(delta) * 181) >> 1; 1069135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 1070135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("REVERB_PARAM_ROOM_HF_LEVEL, olg DC gain %d new m_nRoomLpfFbk %d, old m_nRoomLpfFwd %d", 1071135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp2, pReverb->m_nRoomLpfFbk, pReverb->m_nRoomLpfFwd); 1072135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1073135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nRoomLpfFwd 1074135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent = MULT_EG1_EG1(temp2, (32767 - pReverb->m_nRoomLpfFbk)); 1075135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("REVERB_PARAM_ROOM_HF_LEVEL, new m_nRoomLpfFwd %d", pReverb->m_nRoomLpfFwd); 1076135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1077135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (param == REVERB_PARAM_ROOM_HF_LEVEL) 1078135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 1079135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent value32 = pProperties->decayTime; 1080135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent /* FALL THROUGH */ 1081135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1082135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case REVERB_PARAM_DECAY_TIME: 1083135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1084135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // Convert milliseconds to => m_nRvbLpfFwd (function of m_nRvbLpfFbk) 1085135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // convert ms to samples 1086135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent value32 = (value32 * pReverb->m_nSamplingRate) / 1000; 1087ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent 1088135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // calculate valid decay time range as a function of current reverb delay and 1089135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // max feed back gain. Min value <=> -40dB in one pass, Max value <=> feedback gain = -1 dB 1090135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // Calculate attenuation for each round in late reverb given a total attenuation of -6000 millibels. 1091135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // g = -6000 d/DT , g gain in millibels, d reverb delay, DT decay time 1092135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent averageDelay = pReverb->m_nLateDelay - pReverb->m_nMaxExcursion; 1093135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent averageDelay += ((pReverb->m_sAp0.m_zApOut - pReverb->m_sAp0.m_zApIn) 1094135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent + (pReverb->m_sAp1.m_zApOut - pReverb->m_sAp1.m_zApIn)) >> 1; 1095135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1096135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp = (-6000 * averageDelay) / value32; 1097135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("REVERB_PARAM_DECAY_TIME, delay smps %d, DT smps %d, gain mB %d",averageDelay, value32, temp); 1098135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (temp < -4000 || temp > -100) 1099135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 1100135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1101135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // calculate low pass gain by adding reverb input attenuation (pReverb->m_nLateGain) and substrating output 1102135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // xfade and sum gain (max +9dB) 1103135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp -= Effects_Linear16ToMillibels(pReverb->m_nLateGain) + 900; 1104135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp = Effects_MillibelsToLinear16(temp); 1105135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1106135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // DC gain (temp) = b0 / (1 + a1) = pReverb->m_nRvbLpfFwd / (32767 - pReverb->m_nRvbLpfFbk) 1107135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nRvbLpfFwd 1108135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent = MULT_EG1_EG1(temp, (32767 - pReverb->m_nRvbLpfFbk)); 1109135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1110135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("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)); 1111135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1112135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (param == REVERB_PARAM_DECAY_TIME) 1113135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 1114135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent value16 = pProperties->decayHFRatio; 1115135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent /* FALL THROUGH */ 1116135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1117135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case REVERB_PARAM_DECAY_HF_RATIO: 1118135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1119135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // We limit max value to 1000 because reverb filter is lowpass only 1120135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (value16 < 100 || value16 > 1000) 1121135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 1122135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // Convert per mille to => m_nLpfFwd, m_nLpfFbk 1123135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1124135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // Save current DC gain m_nRoomLpfFwd / (32767 - m_nRoomLpfFbk) to keep it unchanged 1125135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // while changing HF level 1126135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp2 = (pReverb->m_nRvbLpfFwd << 15) / (32767 - pReverb->m_nRvbLpfFbk); 1127135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1128135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (value16 == 1000) { 1129135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nRvbLpfFbk = 0; 1130135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } else { 1131135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int32_t dG2, b, delta; 1132135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1133135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp = Effects_Linear16ToMillibels(temp2); 1134135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // G_5000Hz = G_DC * (1000/REVERB_PARAM_DECAY_HF_RATIO) in millibels 1135135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1136135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent value32 = ((int32_t) 1000 << 15) / (int32_t) value16; 1137135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("REVERB_PARAM_DECAY_HF_RATIO, DC gain %d, DC gain mB %d, 1000/R %d", temp2, temp, value32); 1138135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1139135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp = (int32_t) (((int64_t) temp * (int64_t) value32) >> 15); 1140135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1141135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (temp < -4000) { 1142135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("REVERB_PARAM_DECAY_HF_RATIO HF gain overflow %d mB", temp); 1143135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp = -4000; 1144135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 1145135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1146135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp = Effects_MillibelsToLinear16(temp); 1147135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("REVERB_PARAM_DECAY_HF_RATIO, HF gain %d", temp); 1148135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // dG^2 1149135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp = (temp2 << 15) / temp; 1150135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent dG2 = (int32_t) (((int64_t) temp * (int64_t) temp) >> 15); 1151135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1152135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // b = 2*(C-dG^2)/(1-dG^2) 1153135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent b = (int32_t) ((((int64_t) 1 << (15 + 1)) 1154135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * ((int64_t) pReverb->m_nCosWT_5KHz - (int64_t) dG2)) 1155135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent / ((int64_t) 32767 - (int64_t) dG2)); 1156135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1157135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // delta = b^2 - 4 1158135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent delta = (int32_t) ((((int64_t) b * (int64_t) b) >> 15) - (1 << (15 1159135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent + 2))); 1160135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1161135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // m_nRoomLpfFbk = -a1 = - (- b + sqrt(delta)) / 2 1162135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nRvbLpfFbk = (b - Effects_Sqrt(delta) * 181) >> 1; 1163135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1164135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("REVERB_PARAM_DECAY_HF_RATIO, dG2 %d, b %d, delta %d", dG2, b, delta); 1165135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1166135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 1167135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1168135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("REVERB_PARAM_DECAY_HF_RATIO, gain %d, m_nRvbLpfFbk %d, m_nRvbLpfFwd %d", temp2, pReverb->m_nRvbLpfFbk, pReverb->m_nRvbLpfFwd); 1169135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1170135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nRvbLpfFwd 1171135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent = MULT_EG1_EG1(temp2, (32767 - pReverb->m_nRvbLpfFbk)); 1172135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1173135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (param == REVERB_PARAM_DECAY_HF_RATIO) 1174135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 1175135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent value16 = pProperties->reflectionsLevel; 1176135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent /* FALL THROUGH */ 1177135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1178135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case REVERB_PARAM_REFLECTIONS_LEVEL: 1179135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // We limit max value to 0 because gain is limited to 0dB 1180135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (value16 > 0 || value16 < -6000) 1181135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 1182135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1183135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // Convert millibels to linear 16 bit signed and recompute m_sEarlyL.m_nGain[i] and m_sEarlyR.m_nGain[i]. 1184135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent value16 = Effects_MillibelsToLinear16(value16); 1185135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent for (i = 0; i < REVERB_MAX_NUM_REFLECTIONS; i++) { 1186135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_sEarlyL.m_nGain[i] 1187135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent = MULT_EG1_EG1(pPreset->m_sEarlyL.m_nGain[i],value16); 1188135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_sEarlyR.m_nGain[i] 1189135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent = MULT_EG1_EG1(pPreset->m_sEarlyR.m_nGain[i],value16); 1190135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 1191135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nEarlyGain = value16; 1192135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("REVERB_PARAM_REFLECTIONS_LEVEL, m_nEarlyGain %d", pReverb->m_nEarlyGain); 1193135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1194135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (param == REVERB_PARAM_REFLECTIONS_LEVEL) 1195135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 1196135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent value32 = pProperties->reflectionsDelay; 1197135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent /* FALL THROUGH */ 1198135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1199135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case REVERB_PARAM_REFLECTIONS_DELAY: 1200135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // We limit max value MAX_EARLY_TIME 1201135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // convert ms to time units 1202135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp = (value32 * 65536) / 1000; 1203135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (temp < 0 || temp > MAX_EARLY_TIME) 1204135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 1205135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1206135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent maxSamples = (int32_t) (MAX_EARLY_TIME * pReverb->m_nSamplingRate) 1207135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent >> 16; 1208135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp = (temp * pReverb->m_nSamplingRate) >> 16; 1209135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent for (i = 0; i < REVERB_MAX_NUM_REFLECTIONS; i++) { 1210135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp2 = temp + (((int32_t) pPreset->m_sEarlyL.m_zDelay[i] 1211135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * pReverb->m_nSamplingRate) >> 16); 1212135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (temp2 > maxSamples) 1213135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp2 = maxSamples; 1214135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_sEarlyL.m_zDelay[i] = pReverb->m_nEarly0in + temp2; 1215135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp2 = temp + (((int32_t) pPreset->m_sEarlyR.m_zDelay[i] 1216135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * pReverb->m_nSamplingRate) >> 16); 1217135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (temp2 > maxSamples) 1218135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp2 = maxSamples; 1219135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_sEarlyR.m_zDelay[i] = pReverb->m_nEarly1in + temp2; 1220135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 1221135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nEarlyDelay = temp; 1222135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1223135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("REVERB_PARAM_REFLECTIONS_DELAY, m_nEarlyDelay smps %d max smp delay %d", pReverb->m_nEarlyDelay, maxSamples); 1224135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1225135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // Convert milliseconds to sample count => m_nEarlyDelay 1226135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (param == REVERB_PARAM_REFLECTIONS_DELAY) 1227135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 1228135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent value16 = pProperties->reverbLevel; 1229135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent /* FALL THROUGH */ 1230135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1231135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case REVERB_PARAM_REVERB_LEVEL: 1232135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // We limit max value to 0 because gain is limited to 0dB 1233135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (value16 > 0 || value16 < -6000) 1234135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 1235135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // Convert millibels to linear 16 bits (gange 0 - 8191) => m_nLateGain. 1236135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nLateGain = Effects_MillibelsToLinear16(value16) >> 2; 1237135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1238135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("REVERB_PARAM_REVERB_LEVEL, m_nLateGain %d", pReverb->m_nLateGain); 1239135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1240135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (param == REVERB_PARAM_REVERB_LEVEL) 1241135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 1242135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent value32 = pProperties->reverbDelay; 1243135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent /* FALL THROUGH */ 1244135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1245135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case REVERB_PARAM_REVERB_DELAY: 1246135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // We limit max value to MAX_DELAY_TIME 1247135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // convert ms to time units 1248135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp = (value32 * 65536) / 1000; 1249135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (temp < 0 || temp > MAX_DELAY_TIME) 1250135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 1251135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1252135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent maxSamples = (int32_t) (MAX_DELAY_TIME * pReverb->m_nSamplingRate) 1253135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent >> 16; 1254135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp = (temp * pReverb->m_nSamplingRate) >> 16; 1255135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if ((temp + pReverb->m_nMaxExcursion) > maxSamples) { 1256135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp = maxSamples - pReverb->m_nMaxExcursion; 1257135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 1258135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (temp < pReverb->m_nMaxExcursion) { 1259135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp = pReverb->m_nMaxExcursion; 1260135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 1261135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1262135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp -= pReverb->m_nLateDelay; 1263135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nDelay0Out += temp; 1264135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nDelay1Out += temp; 1265135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nLateDelay += temp; 1266135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1267135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("REVERB_PARAM_REVERB_DELAY, m_nLateDelay smps %d max smp delay %d", pReverb->m_nLateDelay, maxSamples); 1268135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1269135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // Convert milliseconds to sample count => m_nDelay1Out + m_nMaxExcursion 1270135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (param == REVERB_PARAM_REVERB_DELAY) 1271135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 1272135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1273135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent value16 = pProperties->diffusion; 1274135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent /* FALL THROUGH */ 1275135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1276135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case REVERB_PARAM_DIFFUSION: 1277135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (value16 < 0 || value16 > 1000) 1278135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 1279135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1280135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // Convert per mille to m_sAp0.m_nApGain, m_sAp1.m_nApGain 1281135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_sAp0.m_nApGain = AP0_GAIN_BASE + ((int32_t) value16 1282135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * AP0_GAIN_RANGE) / 1000; 1283135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_sAp1.m_nApGain = AP1_GAIN_BASE + ((int32_t) value16 1284135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * AP1_GAIN_RANGE) / 1000; 1285135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1286135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("REVERB_PARAM_DIFFUSION, m_sAp0.m_nApGain %d m_sAp1.m_nApGain %d", pReverb->m_sAp0.m_nApGain, pReverb->m_sAp1.m_nApGain); 1287135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1288135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (param == REVERB_PARAM_DIFFUSION) 1289135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 1290135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1291135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent value16 = pProperties->density; 1292135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent /* FALL THROUGH */ 1293135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1294135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case REVERB_PARAM_DENSITY: 1295135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (value16 < 0 || value16 > 1000) 1296135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 1297135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1298135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // Convert per mille to m_sAp0.m_zApOut, m_sAp1.m_zApOut 1299135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent maxSamples = (int32_t) (MAX_AP_TIME * pReverb->m_nSamplingRate) >> 16; 1300135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1301135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp = AP0_TIME_BASE + ((int32_t) value16 * AP0_TIME_RANGE) / 1000; 1302135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent /*lint -e{702} shift for performance */ 1303135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp = (temp * pReverb->m_nSamplingRate) >> 16; 1304135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (temp > maxSamples) 1305135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp = maxSamples; 1306135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_sAp0.m_zApOut = (uint16_t) (pReverb->m_sAp0.m_zApIn + temp); 1307135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1308135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("REVERB_PARAM_DENSITY, Ap0 delay smps %d", temp); 1309135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1310135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp = AP1_TIME_BASE + ((int32_t) value16 * AP1_TIME_RANGE) / 1000; 1311135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent /*lint -e{702} shift for performance */ 1312135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp = (temp * pReverb->m_nSamplingRate) >> 16; 1313135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (temp > maxSamples) 1314135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp = maxSamples; 1315135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_sAp1.m_zApOut = (uint16_t) (pReverb->m_sAp1.m_zApIn + temp); 1316135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1317135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("Ap1 delay smps %d", temp); 1318135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1319135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 1320135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1321135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent default: 1322135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 1323135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 1324135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return 0; 1325135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} /* end Reverb_setParameter */ 1326135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1327135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/*---------------------------------------------------------------------------- 1328135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * ReverbUpdateXfade 1329135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *---------------------------------------------------------------------------- 1330135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Purpose: 1331135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Update the xfade parameters as required 1332135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * 1333135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Inputs: 1334135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * nNumSamplesToAdd - number of samples to write to buffer 1335135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * 1336135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Outputs: 1337135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * 1338135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * 1339135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Side Effects: 1340135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * - xfade parameters will be changed 1341135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * 1342135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *---------------------------------------------------------------------------- 1343135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent */ 1344135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentstatic int ReverbUpdateXfade(reverb_object_t *pReverb, int nNumSamplesToAdd) { 1345135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent uint16_t nOffset; 1346135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int16_t tempCos; 1347135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int16_t tempSin; 1348135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1349135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (pReverb->m_nXfadeCounter >= pReverb->m_nXfadeInterval) { 1350135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent /* update interval has elapsed, so reset counter */ 1351135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nXfadeCounter = 0; 1352135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1353135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // Pin the sin,cos values to min / max values to ensure that the 1354135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // modulated taps' coefs are zero (thus no clicks) 1355135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (pReverb->m_nPhaseIncrement > 0) { 1356135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // if phase increment > 0, then sin -> 1, cos -> 0 1357135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nSin = 32767; 1358135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nCos = 0; 1359135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1360135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // reset the phase to match the sin, cos values 1361135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nPhase = 32767; 1362135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1363135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // modulate the cross taps because their tap coefs are zero 1364135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nOffset = ReverbCalculateNoise(pReverb); 1365135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1366135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_zD1Cross = pReverb->m_nDelay1Out 1367135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent - pReverb->m_nMaxExcursion + nOffset; 1368135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1369135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nOffset = ReverbCalculateNoise(pReverb); 1370135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1371135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_zD0Cross = pReverb->m_nDelay0Out 1372135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent - pReverb->m_nMaxExcursion - nOffset; 1373135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } else { 1374135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // if phase increment < 0, then sin -> 0, cos -> 1 1375135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nSin = 0; 1376135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nCos = 32767; 1377135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1378135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // reset the phase to match the sin, cos values 1379135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nPhase = -32768; 1380135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1381135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // modulate the self taps because their tap coefs are zero 1382135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nOffset = ReverbCalculateNoise(pReverb); 1383135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1384135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_zD0Self = pReverb->m_nDelay0Out 1385135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent - pReverb->m_nMaxExcursion - nOffset; 1386135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1387135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nOffset = ReverbCalculateNoise(pReverb); 1388135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1389135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_zD1Self = pReverb->m_nDelay1Out 1390135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent - pReverb->m_nMaxExcursion + nOffset; 1391135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1392135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } // end if-else (pReverb->m_nPhaseIncrement > 0) 1393135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1394135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // Reverse the direction of the sin,cos so that the 1395135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // tap whose coef was previously increasing now decreases 1396135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // and vice versa 1397135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nPhaseIncrement = -pReverb->m_nPhaseIncrement; 1398135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1399135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } // end if counter >= update interval 1400135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1401135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent //compute what phase will be next time 1402135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nPhase += pReverb->m_nPhaseIncrement; 1403135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1404135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent //calculate what the new sin and cos need to reach by the next update 1405135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent ReverbCalculateSinCos(pReverb->m_nPhase, &tempSin, &tempCos); 1406135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1407135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent //calculate the per-sample increment required to get there by the next update 1408135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent /*lint -e{702} shift for performance */ 1409135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nSinIncrement = (tempSin - pReverb->m_nSin) 1410135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent >> pReverb->m_nUpdatePeriodInBits; 1411135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1412135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent /*lint -e{702} shift for performance */ 1413135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nCosIncrement = (tempCos - pReverb->m_nCos) 1414135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent >> pReverb->m_nUpdatePeriodInBits; 1415135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1416135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent /* increment update counter */ 1417135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nXfadeCounter += (uint16_t) nNumSamplesToAdd; 1418135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1419135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return 0; 1420135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1421135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} /* end ReverbUpdateXfade */ 1422135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1423135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/*---------------------------------------------------------------------------- 1424135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * ReverbCalculateNoise 1425135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *---------------------------------------------------------------------------- 1426135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Purpose: 1427135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Calculate a noise sample and limit its value 1428135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * 1429135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Inputs: 1430135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * nMaxExcursion - noise value is limited to this value 1431135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * pnNoise - return new noise sample in this (not limited) 1432135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * 1433135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Outputs: 1434135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * new limited noise value 1435135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * 1436135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Side Effects: 1437135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * - *pnNoise noise value is updated 1438135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * 1439135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *---------------------------------------------------------------------------- 1440135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent */ 1441135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentstatic uint16_t ReverbCalculateNoise(reverb_object_t *pReverb) { 1442135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int16_t nNoise = pReverb->m_nNoise; 1443135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1444135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // calculate new noise value 1445135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (pReverb->m_bUseNoise) { 1446135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nNoise = (int16_t) (nNoise * 5 + 1); 1447135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } else { 1448135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nNoise = 0; 1449135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 1450135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1451135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nNoise = nNoise; 1452135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // return the limited noise value 1453135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return (pReverb->m_nMaxExcursion & nNoise); 1454135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1455135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} /* end ReverbCalculateNoise */ 1456135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1457135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/*---------------------------------------------------------------------------- 1458135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * ReverbCalculateSinCos 1459135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *---------------------------------------------------------------------------- 1460135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Purpose: 1461135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Calculate a new sin and cosine value based on the given phase 1462135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * 1463135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Inputs: 1464135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * nPhase - phase angle 1465135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * pnSin - input old value, output new value 1466135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * pnCos - input old value, output new value 1467135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * 1468135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Outputs: 1469135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * 1470135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Side Effects: 1471135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * - *pnSin, *pnCos are updated 1472135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * 1473135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *---------------------------------------------------------------------------- 1474135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent */ 1475135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentstatic int ReverbCalculateSinCos(int16_t nPhase, int16_t *pnSin, int16_t *pnCos) { 1476135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int32_t nTemp; 1477135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int32_t nNetAngle; 1478135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1479135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // -1 <= nPhase < 1 1480135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // However, for the calculation, we need a value 1481135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // that ranges from -1/2 to +1/2, so divide the phase by 2 1482135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent /*lint -e{702} shift for performance */ 1483135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nNetAngle = nPhase >> 1; 1484135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1485135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent /* 1486135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent Implement the following 1487135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent sin(x) = (2-4*c)*x^2 + c + x 1488135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent cos(x) = (2-4*c)*x^2 + c - x 1489135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1490135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent where c = 1/sqrt(2) 1491135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent using the a0 + x*(a1 + x*a2) approach 1492135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent */ 1493135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1494135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent /* limit the input "angle" to be between -0.5 and +0.5 */ 1495135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (nNetAngle > EG1_HALF) { 1496135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nNetAngle = EG1_HALF; 1497135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } else if (nNetAngle < EG1_MINUS_HALF) { 1498135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nNetAngle = EG1_MINUS_HALF; 1499135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 1500135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1501135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent /* calculate sin */ 1502135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nTemp = EG1_ONE + MULT_EG1_EG1(REVERB_PAN_G2, nNetAngle); 1503135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nTemp = REVERB_PAN_G0 + MULT_EG1_EG1(nTemp, nNetAngle); 1504135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *pnSin = (int16_t) SATURATE_EG1(nTemp); 1505135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1506135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent /* calculate cos */ 1507135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nTemp = -EG1_ONE + MULT_EG1_EG1(REVERB_PAN_G2, nNetAngle); 1508135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nTemp = REVERB_PAN_G0 + MULT_EG1_EG1(nTemp, nNetAngle); 1509135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *pnCos = (int16_t) SATURATE_EG1(nTemp); 1510135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1511135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return 0; 1512135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} /* end ReverbCalculateSinCos */ 1513135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1514135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/*---------------------------------------------------------------------------- 1515135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Reverb 1516135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *---------------------------------------------------------------------------- 1517135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Purpose: 1518135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * apply reverb to the given signal 1519135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * 1520135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Inputs: 1521135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * nNu 1522135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * pnSin - input old value, output new value 1523135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * pnCos - input old value, output new value 1524135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * 1525135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Outputs: 1526135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * number of samples actually reverberated 1527135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * 1528135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Side Effects: 1529135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * 1530135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *---------------------------------------------------------------------------- 1531135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent */ 1532135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentstatic int Reverb(reverb_object_t *pReverb, int nNumSamplesToAdd, 1533135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent short *pOutputBuffer, short *pInputBuffer) { 1534135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int32_t i; 1535135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int32_t nDelayOut0; 1536135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int32_t nDelayOut1; 1537135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent uint16_t nBase; 1538135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1539135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent uint32_t nAddr; 1540135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int32_t nTemp1; 1541135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int32_t nTemp2; 1542135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int32_t nApIn; 1543135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int32_t nApOut; 1544135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1545135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int32_t j; 1546135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int32_t nEarlyOut; 1547135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1548135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int32_t tempValue; 1549135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1550135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // get the base address 1551135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nBase = pReverb->m_nBaseIndex; 1552135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1553135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent for (i = 0; i < nNumSamplesToAdd; i++) { 1554135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // ********** Left Allpass - start 1555135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nApIn = *pInputBuffer; 1556135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (!pReverb->m_Aux) { 1557135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pInputBuffer++; 1558135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 1559135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // store to early delay line 1560135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nAddr = CIRCULAR(nBase, pReverb->m_nEarly0in, pReverb->m_nBufferMask); 1561135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nDelayLine[nAddr] = (short) nApIn; 1562135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1563135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // left input = (left dry * m_nLateGain) + right feedback from previous period 1564135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1565135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nApIn = SATURATE(nApIn + pReverb->m_nRevFbkR); 1566135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nApIn = MULT_EG1_EG1(nApIn, pReverb->m_nLateGain); 1567135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1568135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // fetch allpass delay line out 1569135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent //nAddr = CIRCULAR(nBase, psAp0->m_zApOut, pReverb->m_nBufferMask); 1570135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nAddr 1571135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent = CIRCULAR(nBase, pReverb->m_sAp0.m_zApOut, pReverb->m_nBufferMask); 1572135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nDelayOut0 = pReverb->m_nDelayLine[nAddr]; 1573135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1574135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // calculate allpass feedforward; subtract the feedforward result 1575135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nTemp1 = MULT_EG1_EG1(nApIn, pReverb->m_sAp0.m_nApGain); 1576135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nApOut = SATURATE(nDelayOut0 - nTemp1); // allpass output 1577135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1578135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // calculate allpass feedback; add the feedback result 1579135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nTemp1 = MULT_EG1_EG1(nApOut, pReverb->m_sAp0.m_nApGain); 1580135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nTemp1 = SATURATE(nApIn + nTemp1); 1581135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1582135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // inject into allpass delay 1583135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nAddr 1584135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent = CIRCULAR(nBase, pReverb->m_sAp0.m_zApIn, pReverb->m_nBufferMask); 1585135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nDelayLine[nAddr] = (short) nTemp1; 1586135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1587135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // inject allpass output into delay line 1588135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nAddr = CIRCULAR(nBase, pReverb->m_zD0In, pReverb->m_nBufferMask); 1589135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nDelayLine[nAddr] = (short) nApOut; 1590135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1591135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // ********** Left Allpass - end 1592135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1593135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // ********** Right Allpass - start 1594135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nApIn = (*pInputBuffer++); 1595135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // store to early delay line 1596135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nAddr = CIRCULAR(nBase, pReverb->m_nEarly1in, pReverb->m_nBufferMask); 1597135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nDelayLine[nAddr] = (short) nApIn; 1598135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1599135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // right input = (right dry * m_nLateGain) + left feedback from previous period 1600135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent /*lint -e{702} use shift for performance */ 1601135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nApIn = SATURATE(nApIn + pReverb->m_nRevFbkL); 1602135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nApIn = MULT_EG1_EG1(nApIn, pReverb->m_nLateGain); 1603135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1604135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // fetch allpass delay line out 1605135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nAddr 1606135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent = CIRCULAR(nBase, pReverb->m_sAp1.m_zApOut, pReverb->m_nBufferMask); 1607135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nDelayOut1 = pReverb->m_nDelayLine[nAddr]; 1608135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1609135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // calculate allpass feedforward; subtract the feedforward result 1610135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nTemp1 = MULT_EG1_EG1(nApIn, pReverb->m_sAp1.m_nApGain); 1611135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nApOut = SATURATE(nDelayOut1 - nTemp1); // allpass output 1612135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1613135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // calculate allpass feedback; add the feedback result 1614135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nTemp1 = MULT_EG1_EG1(nApOut, pReverb->m_sAp1.m_nApGain); 1615135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nTemp1 = SATURATE(nApIn + nTemp1); 1616135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1617135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // inject into allpass delay 1618135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nAddr 1619135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent = CIRCULAR(nBase, pReverb->m_sAp1.m_zApIn, pReverb->m_nBufferMask); 1620135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nDelayLine[nAddr] = (short) nTemp1; 1621135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1622135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // inject allpass output into delay line 1623135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nAddr = CIRCULAR(nBase, pReverb->m_zD1In, pReverb->m_nBufferMask); 1624135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nDelayLine[nAddr] = (short) nApOut; 1625135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1626135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // ********** Right Allpass - end 1627135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1628135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // ********** D0 output - start 1629135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // fetch delay line self out 1630135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nAddr = CIRCULAR(nBase, pReverb->m_zD0Self, pReverb->m_nBufferMask); 1631135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nDelayOut0 = pReverb->m_nDelayLine[nAddr]; 1632135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1633135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // calculate delay line self out 1634135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nTemp1 = MULT_EG1_EG1(nDelayOut0, pReverb->m_nSin); 1635135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1636135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // fetch delay line cross out 1637135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nAddr = CIRCULAR(nBase, pReverb->m_zD1Cross, pReverb->m_nBufferMask); 1638135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nDelayOut0 = pReverb->m_nDelayLine[nAddr]; 1639135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1640135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // calculate delay line self out 1641135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nTemp2 = MULT_EG1_EG1(nDelayOut0, pReverb->m_nCos); 1642135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1643135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // calculate unfiltered delay out 1644135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nDelayOut0 = SATURATE(nTemp1 + nTemp2); 1645135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1646135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // ********** D0 output - end 1647135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1648135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // ********** D1 output - start 1649135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // fetch delay line self out 1650135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nAddr = CIRCULAR(nBase, pReverb->m_zD1Self, pReverb->m_nBufferMask); 1651135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nDelayOut1 = pReverb->m_nDelayLine[nAddr]; 1652135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1653135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // calculate delay line self out 1654135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nTemp1 = MULT_EG1_EG1(nDelayOut1, pReverb->m_nSin); 1655135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1656135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // fetch delay line cross out 1657135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nAddr = CIRCULAR(nBase, pReverb->m_zD0Cross, pReverb->m_nBufferMask); 1658135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nDelayOut1 = pReverb->m_nDelayLine[nAddr]; 1659135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1660135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // calculate delay line self out 1661135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nTemp2 = MULT_EG1_EG1(nDelayOut1, pReverb->m_nCos); 1662135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1663135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // calculate unfiltered delay out 1664135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nDelayOut1 = SATURATE(nTemp1 + nTemp2); 1665135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1666135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // ********** D1 output - end 1667135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1668135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // ********** mixer and feedback - start 1669135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // sum is fedback to right input (R + L) 1670135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nDelayOut0 = (short) SATURATE(nDelayOut0 + nDelayOut1); 1671135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1672135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // difference is feedback to left input (R - L) 1673135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent /*lint -e{685} lint complains that it can't saturate negative */ 1674135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nDelayOut1 = (short) SATURATE(nDelayOut1 - nDelayOut0); 1675135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1676135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // ********** mixer and feedback - end 1677135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1678135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // calculate lowpass filter (mixer scale factor included in LPF feedforward) 1679135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nTemp1 = MULT_EG1_EG1(nDelayOut0, pReverb->m_nRvbLpfFwd); 1680135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1681135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nTemp2 = MULT_EG1_EG1(pReverb->m_nRevFbkL, pReverb->m_nRvbLpfFbk); 1682135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1683135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // calculate filtered delay out and simultaneously update LPF state variable 1684135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // filtered delay output is stored in m_nRevFbkL 1685135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nRevFbkL = (short) SATURATE(nTemp1 + nTemp2); 1686135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1687135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // calculate lowpass filter (mixer scale factor included in LPF feedforward) 1688135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nTemp1 = MULT_EG1_EG1(nDelayOut1, pReverb->m_nRvbLpfFwd); 1689135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1690135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nTemp2 = MULT_EG1_EG1(pReverb->m_nRevFbkR, pReverb->m_nRvbLpfFbk); 1691135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1692135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // calculate filtered delay out and simultaneously update LPF state variable 1693135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // filtered delay output is stored in m_nRevFbkR 1694135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nRevFbkR = (short) SATURATE(nTemp1 + nTemp2); 1695135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1696135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // ********** start early reflection generator, left 1697135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent //psEarly = &(pReverb->m_sEarlyL); 1698135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1699135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1700135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent for (j = 0; j < REVERB_MAX_NUM_REFLECTIONS; j++) { 1701135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // fetch delay line out 1702135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent //nAddr = CIRCULAR(nBase, psEarly->m_zDelay[j], pReverb->m_nBufferMask); 1703135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nAddr 1704135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent = CIRCULAR(nBase, pReverb->m_sEarlyL.m_zDelay[j], pReverb->m_nBufferMask); 1705135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1706135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nTemp1 = pReverb->m_nDelayLine[nAddr]; 1707135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1708135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // calculate reflection 1709135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent //nTemp1 = MULT_EG1_EG1(nDelayOut0, psEarly->m_nGain[j]); 1710135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nTemp1 = MULT_EG1_EG1(nTemp1, pReverb->m_sEarlyL.m_nGain[j]); 1711135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1712135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nDelayOut0 = SATURATE(nDelayOut0 + nTemp1); 1713135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1714135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } // end for (j=0; j < REVERB_MAX_NUM_REFLECTIONS; j++) 1715135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1716135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // apply lowpass to early reflections and reverb output 1717135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent //nTemp1 = MULT_EG1_EG1(nEarlyOut, psEarly->m_nRvbLpfFwd); 1718135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nTemp1 = MULT_EG1_EG1(nDelayOut0, pReverb->m_nRoomLpfFwd); 1719135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1720135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent //nTemp2 = MULT_EG1_EG1(psEarly->m_zLpf, psEarly->m_nLpfFbk); 1721135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nTemp2 = MULT_EG1_EG1(pReverb->m_zOutLpfL, pReverb->m_nRoomLpfFbk); 1722135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1723135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // calculate filtered out and simultaneously update LPF state variable 1724135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // filtered output is stored in m_zOutLpfL 1725135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_zOutLpfL = (short) SATURATE(nTemp1 + nTemp2); 1726135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1727135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent //sum with output buffer 1728135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent tempValue = *pOutputBuffer; 1729135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *pOutputBuffer++ = (short) SATURATE(tempValue+pReverb->m_zOutLpfL); 1730135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1731135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // ********** end early reflection generator, left 1732135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1733135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // ********** start early reflection generator, right 1734135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent //psEarly = &(pReverb->m_sEarlyR); 1735135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1736135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent for (j = 0; j < REVERB_MAX_NUM_REFLECTIONS; j++) { 1737135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // fetch delay line out 1738135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nAddr 1739135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent = CIRCULAR(nBase, pReverb->m_sEarlyR.m_zDelay[j], pReverb->m_nBufferMask); 1740135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nTemp1 = pReverb->m_nDelayLine[nAddr]; 1741135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1742135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // calculate reflection 1743135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nTemp1 = MULT_EG1_EG1(nTemp1, pReverb->m_sEarlyR.m_nGain[j]); 1744135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1745135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nDelayOut1 = SATURATE(nDelayOut1 + nTemp1); 1746135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1747135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } // end for (j=0; j < REVERB_MAX_NUM_REFLECTIONS; j++) 1748135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1749135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // apply lowpass to early reflections 1750135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nTemp1 = MULT_EG1_EG1(nDelayOut1, pReverb->m_nRoomLpfFwd); 1751135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1752135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nTemp2 = MULT_EG1_EG1(pReverb->m_zOutLpfR, pReverb->m_nRoomLpfFbk); 1753135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1754135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // calculate filtered out and simultaneously update LPF state variable 1755135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // filtered output is stored in m_zOutLpfR 1756135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_zOutLpfR = (short) SATURATE(nTemp1 + nTemp2); 1757135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1758135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent //sum with output buffer 1759135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent tempValue = *pOutputBuffer; 1760135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *pOutputBuffer++ = (short) SATURATE(tempValue + pReverb->m_zOutLpfR); 1761135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1762135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // ********** end early reflection generator, right 1763135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1764135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // decrement base addr for next sample period 1765135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent nBase--; 1766135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1767135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nSin += pReverb->m_nSinIncrement; 1768135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nCos += pReverb->m_nCosIncrement; 1769135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1770135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } // end for (i=0; i < nNumSamplesToAdd; i++) 1771135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1772135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // store the most up to date version 1773135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nBaseIndex = nBase; 1774135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1775135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return 0; 1776135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} /* end Reverb */ 1777135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1778135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/*---------------------------------------------------------------------------- 1779135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * ReverbUpdateRoom 1780135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *---------------------------------------------------------------------------- 1781135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Purpose: 1782135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Update the room's preset parameters as required 1783135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * 1784135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Inputs: 1785135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * 1786135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Outputs: 1787135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * 1788135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * 1789135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Side Effects: 1790135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * - reverb paramters (fbk, fwd, etc) will be changed 1791135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * - m_nCurrentRoom := m_nNextRoom 1792135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *---------------------------------------------------------------------------- 1793135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent */ 1794135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentstatic int ReverbUpdateRoom(reverb_object_t *pReverb, bool fullUpdate) { 1795135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int temp; 1796135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int i; 1797135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int maxSamples; 1798135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int earlyDelay; 1799135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int earlyGain; 1800135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1801135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent reverb_preset_t *pPreset = 1802135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent &pReverb->m_sPreset.m_sPreset[pReverb->m_nNextRoom]; 1803135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1804135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (fullUpdate) { 1805135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nRvbLpfFwd = pPreset->m_nRvbLpfFwd; 1806135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nRvbLpfFbk = pPreset->m_nRvbLpfFbk; 1807135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1808135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nEarlyGain = pPreset->m_nEarlyGain; 1809135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent //stored as time based, convert to sample based 1810135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nLateGain = pPreset->m_nLateGain; 1811135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nRoomLpfFbk = pPreset->m_nRoomLpfFbk; 1812135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nRoomLpfFwd = pPreset->m_nRoomLpfFwd; 1813135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1814135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // set the early reflections gains 1815135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent earlyGain = pPreset->m_nEarlyGain; 1816135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent for (i = 0; i < REVERB_MAX_NUM_REFLECTIONS; i++) { 1817135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_sEarlyL.m_nGain[i] 1818135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent = MULT_EG1_EG1(pPreset->m_sEarlyL.m_nGain[i],earlyGain); 1819135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_sEarlyR.m_nGain[i] 1820135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent = MULT_EG1_EG1(pPreset->m_sEarlyR.m_nGain[i],earlyGain); 1821135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 1822135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1823135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nMaxExcursion = pPreset->m_nMaxExcursion; 1824135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1825135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_sAp0.m_nApGain = pPreset->m_nAp0_ApGain; 1826135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_sAp1.m_nApGain = pPreset->m_nAp1_ApGain; 1827135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1828135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent // set the early reflections delay 1829135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent earlyDelay = ((int) pPreset->m_nEarlyDelay * pReverb->m_nSamplingRate) 1830135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent >> 16; 1831135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nEarlyDelay = earlyDelay; 1832135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent maxSamples = (int32_t) (MAX_EARLY_TIME * pReverb->m_nSamplingRate) 1833135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent >> 16; 1834135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent for (i = 0; i < REVERB_MAX_NUM_REFLECTIONS; i++) { 1835135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent //stored as time based, convert to sample based 1836135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp = earlyDelay + (((int) pPreset->m_sEarlyL.m_zDelay[i] 1837135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * pReverb->m_nSamplingRate) >> 16); 1838135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (temp > maxSamples) 1839135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp = maxSamples; 1840135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_sEarlyL.m_zDelay[i] = pReverb->m_nEarly0in + temp; 1841135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent //stored as time based, convert to sample based 1842135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp = earlyDelay + (((int) pPreset->m_sEarlyR.m_zDelay[i] 1843135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * pReverb->m_nSamplingRate) >> 16); 1844135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (temp > maxSamples) 1845135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp = maxSamples; 1846135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_sEarlyR.m_zDelay[i] = pReverb->m_nEarly1in + temp; 1847135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 1848135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1849135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent maxSamples = (int32_t) (MAX_DELAY_TIME * pReverb->m_nSamplingRate) 1850135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent >> 16; 1851135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent //stored as time based, convert to sample based 1852135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent /*lint -e{702} shift for performance */ 1853135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp = (pPreset->m_nLateDelay * pReverb->m_nSamplingRate) >> 16; 1854135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if ((temp + pReverb->m_nMaxExcursion) > maxSamples) { 1855135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp = maxSamples - pReverb->m_nMaxExcursion; 1856135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 1857135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp -= pReverb->m_nLateDelay; 1858135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nDelay0Out += temp; 1859135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nDelay1Out += temp; 1860135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nLateDelay += temp; 1861135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1862135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent maxSamples = (int32_t) (MAX_AP_TIME * pReverb->m_nSamplingRate) >> 16; 1863135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent //stored as time based, convert to absolute sample value 1864135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp = pPreset->m_nAp0_ApOut; 1865135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent /*lint -e{702} shift for performance */ 1866135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp = (temp * pReverb->m_nSamplingRate) >> 16; 1867135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (temp > maxSamples) 1868135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp = maxSamples; 1869135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_sAp0.m_zApOut = (uint16_t) (pReverb->m_sAp0.m_zApIn + temp); 1870135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1871135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent //stored as time based, convert to absolute sample value 1872135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp = pPreset->m_nAp1_ApOut; 1873135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent /*lint -e{702} shift for performance */ 1874135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp = (temp * pReverb->m_nSamplingRate) >> 16; 1875135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (temp > maxSamples) 1876135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp = maxSamples; 1877135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_sAp1.m_zApOut = (uint16_t) (pReverb->m_sAp1.m_zApIn + temp); 1878135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent //gpsReverbObject->m_sAp1.m_zApOut = pPreset->m_nAp1_ApOut; 1879135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 1880135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1881135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent //stored as time based, convert to sample based 1882135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp = pPreset->m_nXfadeInterval; 1883135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent /*lint -e{702} shift for performance */ 1884135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent temp = (temp * pReverb->m_nSamplingRate) >> 16; 1885135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nXfadeInterval = (uint16_t) temp; 1886135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent //gsReverbObject.m_nXfadeInterval = pPreset->m_nXfadeInterval; 1887135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nXfadeCounter = pReverb->m_nXfadeInterval + 1; // force update on first iteration 1888135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1889135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReverb->m_nCurrentRoom = pReverb->m_nNextRoom; 1890135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1891135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return 0; 1892135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1893135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} /* end ReverbUpdateRoom */ 1894135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1895135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/*---------------------------------------------------------------------------- 1896135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * ReverbReadInPresets() 1897135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *---------------------------------------------------------------------------- 1898135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Purpose: sets global reverb preset bank to defaults 1899135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * 1900135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Inputs: 1901135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * 1902135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Outputs: 1903135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * 1904135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *---------------------------------------------------------------------------- 1905135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent */ 1906135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentstatic int ReverbReadInPresets(reverb_object_t *pReverb) { 1907135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1908135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int preset = 0; 1909135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int defaultPreset = 0; 1910135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1911135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent //now init any remaining presets to defaults 1912135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent for (defaultPreset = preset; defaultPreset < REVERB_MAX_ROOM_TYPE; defaultPreset++) { 1913135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent reverb_preset_t *pPreset = &pReverb->m_sPreset.m_sPreset[defaultPreset]; 1914135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (defaultPreset == 0 || defaultPreset > REVERB_MAX_ROOM_TYPE - 1) { 1915135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_nRvbLpfFbk = 8307; 1916135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_nRvbLpfFwd = 14768; 1917135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_nEarlyGain = 27690; 1918135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_nEarlyDelay = 1311; 1919135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_nLateGain = 8191; 1920135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_nLateDelay = 3932; 1921135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_nRoomLpfFbk = 3692; 1922135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_nRoomLpfFwd = 24569; 1923135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyL.m_zDelay[0] = 1376; 1924135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyL.m_nGain[0] = 22152; 1925135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyL.m_zDelay[1] = 2163; 1926135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyL.m_nGain[1] = 17537; 1927135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyL.m_zDelay[2] = 0; 1928135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyL.m_nGain[2] = 14768; 1929135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyL.m_zDelay[3] = 1835; 1930135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyL.m_nGain[3] = 14307; 1931135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyL.m_zDelay[4] = 0; 1932135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyL.m_nGain[4] = 13384; 1933135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyR.m_zDelay[0] = 721; 1934135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyR.m_nGain[0] = 20306; 1935135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyR.m_zDelay[1] = 2621; 1936135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyR.m_nGain[1] = 17537; 1937135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyR.m_zDelay[2] = 0; 1938135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyR.m_nGain[2] = 14768; 1939135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyR.m_zDelay[3] = 0; 1940135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyR.m_nGain[3] = 16153; 1941135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyR.m_zDelay[4] = 0; 1942135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyR.m_nGain[4] = 13384; 1943135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_nMaxExcursion = 127; 1944135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_nXfadeInterval = 6388; 1945135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_nAp0_ApGain = 15691; 1946135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_nAp0_ApOut = 711; 1947135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_nAp1_ApGain = 16317; 1948135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_nAp1_ApOut = 1029; 1949135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_rfu4 = 0; 1950135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_rfu5 = 0; 1951135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_rfu6 = 0; 1952135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_rfu7 = 0; 1953135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_rfu8 = 0; 1954135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_rfu9 = 0; 1955135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_rfu10 = 0; 1956135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } else if (defaultPreset == 1) { 1957135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_nRvbLpfFbk = 6461; 1958135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_nRvbLpfFwd = 14307; 1959135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_nEarlyGain = 27690; 1960135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_nEarlyDelay = 1311; 1961135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_nLateGain = 8191; 1962135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_nLateDelay = 3932; 1963135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_nRoomLpfFbk = 3692; 1964135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_nRoomLpfFwd = 24569; 1965135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyL.m_zDelay[0] = 1376; 1966135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyL.m_nGain[0] = 22152; 1967135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyL.m_zDelay[1] = 1462; 1968135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyL.m_nGain[1] = 17537; 1969135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyL.m_zDelay[2] = 0; 1970135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyL.m_nGain[2] = 14768; 1971135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyL.m_zDelay[3] = 1835; 1972135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyL.m_nGain[3] = 14307; 1973135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyL.m_zDelay[4] = 0; 1974135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyL.m_nGain[4] = 13384; 1975135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyR.m_zDelay[0] = 721; 1976135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyR.m_nGain[0] = 20306; 1977135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyR.m_zDelay[1] = 2621; 1978135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyR.m_nGain[1] = 17537; 1979135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyR.m_zDelay[2] = 0; 1980135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyR.m_nGain[2] = 14768; 1981135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyR.m_zDelay[3] = 0; 1982135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyR.m_nGain[3] = 16153; 1983135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyR.m_zDelay[4] = 0; 1984135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyR.m_nGain[4] = 13384; 1985135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_nMaxExcursion = 127; 1986135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_nXfadeInterval = 6391; 1987135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_nAp0_ApGain = 15230; 1988135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_nAp0_ApOut = 708; 1989135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_nAp1_ApGain = 15547; 1990135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_nAp1_ApOut = 1023; 1991135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_rfu4 = 0; 1992135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_rfu5 = 0; 1993135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_rfu6 = 0; 1994135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_rfu7 = 0; 1995135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_rfu8 = 0; 1996135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_rfu9 = 0; 1997135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_rfu10 = 0; 1998135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } else if (defaultPreset == 2) { 1999135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_nRvbLpfFbk = 5077; 2000135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_nRvbLpfFwd = 12922; 2001135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_nEarlyGain = 27690; 2002135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_nEarlyDelay = 1311; 2003135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_nLateGain = 8191; 2004135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_nLateDelay = 3932; 2005135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_nRoomLpfFbk = 3692; 2006135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_nRoomLpfFwd = 21703; 2007135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyL.m_zDelay[0] = 1376; 2008135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyL.m_nGain[0] = 22152; 2009135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyL.m_zDelay[1] = 1462; 2010135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyL.m_nGain[1] = 17537; 2011135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyL.m_zDelay[2] = 0; 2012135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyL.m_nGain[2] = 14768; 2013135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyL.m_zDelay[3] = 1835; 2014135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyL.m_nGain[3] = 14307; 2015135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyL.m_zDelay[4] = 0; 2016135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyL.m_nGain[4] = 13384; 2017135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyR.m_zDelay[0] = 721; 2018135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyR.m_nGain[0] = 20306; 2019135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyR.m_zDelay[1] = 2621; 2020135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyR.m_nGain[1] = 17537; 2021135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyR.m_zDelay[2] = 0; 2022135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyR.m_nGain[2] = 14768; 2023135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyR.m_zDelay[3] = 0; 2024135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyR.m_nGain[3] = 16153; 2025135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyR.m_zDelay[4] = 0; 2026135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyR.m_nGain[4] = 13384; 2027135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_nMaxExcursion = 127; 2028135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_nXfadeInterval = 6449; 2029135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_nAp0_ApGain = 15691; 2030135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_nAp0_ApOut = 774; 2031135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_nAp1_ApGain = 16317; 2032135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_nAp1_ApOut = 1155; 2033135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_rfu4 = 0; 2034135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_rfu5 = 0; 2035135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_rfu6 = 0; 2036135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_rfu7 = 0; 2037135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_rfu8 = 0; 2038135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_rfu9 = 0; 2039135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_rfu10 = 0; 2040135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } else if (defaultPreset == 3) { 2041135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_nRvbLpfFbk = 5077; 2042135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_nRvbLpfFwd = 11076; 2043135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_nEarlyGain = 27690; 2044135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_nEarlyDelay = 1311; 2045135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_nLateGain = 8191; 2046135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_nLateDelay = 3932; 2047135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_nRoomLpfFbk = 3692; 2048135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_nRoomLpfFwd = 20474; 2049135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyL.m_zDelay[0] = 1376; 2050135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyL.m_nGain[0] = 22152; 2051135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyL.m_zDelay[1] = 1462; 2052135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyL.m_nGain[1] = 17537; 2053135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyL.m_zDelay[2] = 0; 2054135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyL.m_nGain[2] = 14768; 2055135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyL.m_zDelay[3] = 1835; 2056135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyL.m_nGain[3] = 14307; 2057135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyL.m_zDelay[4] = 0; 2058135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyL.m_nGain[4] = 13384; 2059135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyR.m_zDelay[0] = 721; 2060135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyR.m_nGain[0] = 20306; 2061135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyR.m_zDelay[1] = 2621; 2062135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyR.m_nGain[1] = 17537; 2063135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyR.m_zDelay[2] = 0; 2064135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyR.m_nGain[2] = 14768; 2065135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyR.m_zDelay[3] = 0; 2066135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyR.m_nGain[3] = 16153; 2067135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyR.m_zDelay[4] = 0; 2068135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_sEarlyR.m_nGain[4] = 13384; 2069135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_nMaxExcursion = 127; 2070135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_nXfadeInterval = 6470; //6483; 2071135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_nAp0_ApGain = 14768; 2072135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_nAp0_ApOut = 792; 2073135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_nAp1_ApGain = 14777; 2074135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_nAp1_ApOut = 1191; 2075135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_rfu4 = 0; 2076135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_rfu5 = 0; 2077135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_rfu6 = 0; 2078135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_rfu7 = 0; 2079135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_rfu8 = 0; 2080135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_rfu9 = 0; 2081135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pPreset->m_rfu10 = 0; 2082135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 2083135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 2084135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 2085135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return 0; 2086135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} 2087