EffectEqualizer.cpp revision ffe9c25ce85e1af55d58ec025adc6367d70db7e8
1135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/* 2135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent * Copyright (C) 2009 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 "Equalizer" 18135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define ARRAY_SIZE(array) (sizeof array / sizeof array[0]) 19135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent//#define LOG_NDEBUG 0 20135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#include <cutils/log.h> 21135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#include <assert.h> 22135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#include <stdlib.h> 2317217ab46e12fbdaad9e1d7460c48937f76fa0e2Eric Laurent#include <string.h> 24135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#include <new> 25135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#include "AudioEqualizer.h" 26135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#include "AudioBiquadFilter.h" 27135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#include "AudioFormatAdapter.h" 28135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#include <media/EffectEqualizerApi.h> 29135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 30135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// effect_interface_t interface implementation for equalizer effect 31135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentextern "C" const struct effect_interface_s gEqualizerInterface; 32135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 33135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentnamespace android { 34135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentnamespace { 35135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 36135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Google Graphic Equalizer UUID: e25aa840-543b-11df-98a5-0002a5d5c51b 37135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentconst effect_descriptor_t gEqualizerDescriptor = { 38135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent {0x0bed4300, 0xddd6, 0x11db, 0x8f34, {0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}}, // type 39135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent {0xe25aa840, 0x543b, 0x11df, 0x98a5, {0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}}, // uuid 40135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent EFFECT_API_VERSION, 41135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent (EFFECT_FLAG_TYPE_INSERT | EFFECT_FLAG_INSERT_LAST), 42ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent 0, // TODO 43ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent 1, 44135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent "Graphic Equalizer", 45135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent "Google Inc.", 46135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent}; 47135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 48135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/////////////////// BEGIN EQ PRESETS /////////////////////////////////////////// 49135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentconst int kNumBands = 5; 50135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentconst uint32_t gFreqs[kNumBands] = { 50000, 125000, 900000, 3200000, 6300000 }; 51135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentconst uint32_t gBandwidths[kNumBands] = { 0, 3600, 3600, 2400, 0 }; 52135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 53135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentconst AudioEqualizer::BandConfig gBandsClassic[kNumBands] = { 54135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { 300, gFreqs[0], gBandwidths[0] }, 55135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { 400, gFreqs[1], gBandwidths[1] }, 56135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { 0, gFreqs[2], gBandwidths[2] }, 57135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { 200, gFreqs[3], gBandwidths[3] }, 58135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { -300, gFreqs[4], gBandwidths[4] } 59135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent}; 60135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 61135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentconst AudioEqualizer::BandConfig gBandsJazz[kNumBands] = { 62135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { -600, gFreqs[0], gBandwidths[0] }, 63135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { 200, gFreqs[1], gBandwidths[1] }, 64135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { 400, gFreqs[2], gBandwidths[2] }, 65135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { -400, gFreqs[3], gBandwidths[3] }, 66135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { -600, gFreqs[4], gBandwidths[4] } 67135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent}; 68135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 69135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentconst AudioEqualizer::BandConfig gBandsPop[kNumBands] = { 70135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { 400, gFreqs[0], gBandwidths[0] }, 71135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { -400, gFreqs[1], gBandwidths[1] }, 72135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { 300, gFreqs[2], gBandwidths[2] }, 73135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { -400, gFreqs[3], gBandwidths[3] }, 74135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { 600, gFreqs[4], gBandwidths[4] } 75135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent}; 76135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 77135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentconst AudioEqualizer::BandConfig gBandsRock[kNumBands] = { 78135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { 700, gFreqs[0], gBandwidths[0] }, 79135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { 400, gFreqs[1], gBandwidths[1] }, 80135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { -400, gFreqs[2], gBandwidths[2] }, 81135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { 400, gFreqs[3], gBandwidths[3] }, 82135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { 200, gFreqs[4], gBandwidths[4] } 83135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent}; 84135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 85135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentconst AudioEqualizer::PresetConfig gEqualizerPresets[] = { 86135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { "Classic", gBandsClassic }, 87135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { "Jazz", gBandsJazz }, 88135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { "Pop", gBandsPop }, 89135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { "Rock", gBandsRock } 90135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent}; 91135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 92135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/////////////////// END EQ PRESETS ///////////////////////////////////////////// 93135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 94135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentstatic const size_t kBufferSize = 32; 95135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 96135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurenttypedef AudioFormatAdapter<AudioEqualizer, kBufferSize> FormatAdapter; 97135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 98135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentstruct EqualizerContext { 99135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent const struct effect_interface_s *itfe; 100135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent effect_config_t config; 101135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent FormatAdapter adapter; 102135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent AudioEqualizer * pEqualizer; 103135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent}; 104135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 105135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent//--- local function prototypes 106135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 107135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentint Equalizer_init(EqualizerContext *pContext); 108135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentint Equalizer_configure(EqualizerContext *pContext, effect_config_t *pConfig); 109135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentint Equalizer_getParameter(AudioEqualizer * pEqualizer, int32_t *pParam, size_t *pValueSize, void *pValue); 110135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentint Equalizer_setParameter(AudioEqualizer * pEqualizer, int32_t *pParam, void *pValue); 111135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 112135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 113135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 114135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent//--- Effect Library Interface Implementation 115135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 116135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 117be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurentextern "C" int EffectQueryNumberEffects(uint32_t *pNumEffects) { 118135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *pNumEffects = 1; 119135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return 0; 120135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} /* end EffectQueryNumberEffects */ 121135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 122ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurentextern "C" int EffectQueryEffect(uint32_t index, effect_descriptor_t *pDescriptor) { 123135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (pDescriptor == NULL) { 124135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 125135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 126ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent if (index > 0) { 127ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent return -EINVAL; 128135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 129135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent memcpy(pDescriptor, &gEqualizerDescriptor, sizeof(effect_descriptor_t)); 130135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return 0; 131135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} /* end EffectQueryNext */ 132135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 133135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentextern "C" int EffectCreate(effect_uuid_t *uuid, 134ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent int32_t sessionId, 135ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent int32_t ioId, 136135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent effect_interface_t *pInterface) { 137135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int ret; 138135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int i; 139135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 140135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("EffectLibCreateEffect start"); 141135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 142135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (pInterface == NULL || uuid == NULL) { 143135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 144135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 145135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 146135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (memcmp(uuid, &gEqualizerDescriptor.uuid, sizeof(effect_uuid_t)) != 0) { 147135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 148135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 149135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 150135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent EqualizerContext *pContext = new EqualizerContext; 151135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 152135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->itfe = &gEqualizerInterface; 153135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->pEqualizer = NULL; 154135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 155135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent ret = Equalizer_init(pContext); 156135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (ret < 0) { 157135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGW("EffectLibCreateEffect() init failed"); 158135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent delete pContext; 159135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return ret; 160135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 161135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 162135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *pInterface = (effect_interface_t)pContext; 163135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 164ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent LOGV("EffectLibCreateEffect %p, size %d", pContext, AudioEqualizer::GetInstanceSize(kNumBands)+sizeof(EqualizerContext)); 165135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 166135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return 0; 167135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 168135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} /* end EffectCreate */ 169135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 170135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentextern "C" int EffectRelease(effect_interface_t interface) { 171135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent EqualizerContext * pContext = (EqualizerContext *)interface; 172135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 173135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("EffectLibReleaseEffect %p", interface); 174135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (pContext == NULL) { 175135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 176135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 177135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 178135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->pEqualizer->free(); 179135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent delete pContext; 180135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 181135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return 0; 182135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} /* end EffectRelease */ 183135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 184135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 185135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 186135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent//--- local functions 187135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 188135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 189135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define CHECK_ARG(cond) { \ 190135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (!(cond)) { \ 191135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("Invalid argument: "#cond); \ 192135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; \ 193135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } \ 194135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} 195135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 196135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent//---------------------------------------------------------------------------- 197135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Equalizer_configure() 198135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent//---------------------------------------------------------------------------- 199135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Purpose: Set input and output audio configuration. 200135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 201135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Inputs: 202135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// pContext: effect engine context 203135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// pConfig: pointer to effect_config_t structure holding input and output 204135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// configuration parameters 205135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 206135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Outputs: 207135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 208135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent//---------------------------------------------------------------------------- 209135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 210135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentint Equalizer_configure(EqualizerContext *pContext, effect_config_t *pConfig) 211135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent{ 212135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("Equalizer_configure start"); 213135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 214135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent CHECK_ARG(pContext != NULL); 215135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent CHECK_ARG(pConfig != NULL); 216135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 217135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent CHECK_ARG(pConfig->inputCfg.samplingRate == pConfig->outputCfg.samplingRate); 218135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent CHECK_ARG(pConfig->inputCfg.channels == pConfig->outputCfg.channels); 219135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent CHECK_ARG(pConfig->inputCfg.format == pConfig->outputCfg.format); 220135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent CHECK_ARG((pConfig->inputCfg.channels == CHANNEL_MONO) || (pConfig->inputCfg.channels == CHANNEL_STEREO)); 221135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent CHECK_ARG(pConfig->outputCfg.accessMode == EFFECT_BUFFER_ACCESS_WRITE 222135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent || pConfig->outputCfg.accessMode == EFFECT_BUFFER_ACCESS_ACCUMULATE); 223ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent CHECK_ARG(pConfig->inputCfg.format == SAMPLE_FORMAT_PCM_S7_24 224ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent || pConfig->inputCfg.format == SAMPLE_FORMAT_PCM_S15); 225135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 226135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int channelCount; 227135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (pConfig->inputCfg.channels == CHANNEL_MONO) { 228135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent channelCount = 1; 229135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } else { 230135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent channelCount = 2; 231135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 232135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent CHECK_ARG(channelCount <= AudioBiquadFilter::MAX_CHANNELS); 233135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 234ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent memcpy(&pContext->config, pConfig, sizeof(effect_config_t)); 235ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent 236135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->pEqualizer->configure(channelCount, 237135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pConfig->inputCfg.samplingRate); 238135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 239135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->adapter.configure(*pContext->pEqualizer, channelCount, 240135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pConfig->inputCfg.format, 241135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pConfig->outputCfg.accessMode); 242135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 243135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return 0; 244135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} // end Equalizer_configure 245135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 246135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 247135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent//---------------------------------------------------------------------------- 248135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Equalizer_init() 249135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent//---------------------------------------------------------------------------- 250135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Purpose: Initialize engine with default configuration and creates 251135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// AudioEqualizer instance. 252135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 253135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Inputs: 254135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// pContext: effect engine context 255135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 256135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Outputs: 257135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 258135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent//---------------------------------------------------------------------------- 259135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 260135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentint Equalizer_init(EqualizerContext *pContext) 261135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent{ 262135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int status; 263135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 264135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("Equalizer_init start"); 265135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 266135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent CHECK_ARG(pContext != NULL); 267135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 268135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (pContext->pEqualizer != NULL) { 269135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->pEqualizer->free(); 270135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 271135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 272135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->config.inputCfg.accessMode = EFFECT_BUFFER_ACCESS_READ; 273135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->config.inputCfg.channels = CHANNEL_STEREO; 274ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent pContext->config.inputCfg.format = SAMPLE_FORMAT_PCM_S15; 275135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->config.inputCfg.samplingRate = 44100; 276135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->config.inputCfg.bufferProvider.getBuffer = NULL; 277135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->config.inputCfg.bufferProvider.releaseBuffer = NULL; 278135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->config.inputCfg.bufferProvider.cookie = NULL; 279135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->config.inputCfg.mask = EFFECT_CONFIG_ALL; 280135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->config.outputCfg.accessMode = EFFECT_BUFFER_ACCESS_ACCUMULATE; 281135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->config.outputCfg.channels = CHANNEL_STEREO; 282ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent pContext->config.outputCfg.format = SAMPLE_FORMAT_PCM_S15; 283135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->config.outputCfg.samplingRate = 44100; 284135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->config.outputCfg.bufferProvider.getBuffer = NULL; 285135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->config.outputCfg.bufferProvider.releaseBuffer = NULL; 286135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->config.outputCfg.bufferProvider.cookie = NULL; 287135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->config.outputCfg.mask = EFFECT_CONFIG_ALL; 288135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 289135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->pEqualizer = AudioEqualizer::CreateInstance( 290135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent NULL, 291135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent kNumBands, 292135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent AudioBiquadFilter::MAX_CHANNELS, 293135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 44100, 294135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent gEqualizerPresets, 295135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent ARRAY_SIZE(gEqualizerPresets)); 296135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 297135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent for (int i = 0; i < kNumBands; ++i) { 298135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->pEqualizer->setFrequency(i, gFreqs[i]); 299135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->pEqualizer->setBandwidth(i, gBandwidths[i]); 300135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 301135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 302135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->pEqualizer->enable(true); 303135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 304135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent Equalizer_configure(pContext, &pContext->config); 305135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 306135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return 0; 307135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} // end Equalizer_init 308135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 309135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 310135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent//---------------------------------------------------------------------------- 311135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Equalizer_getParameter() 312135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent//---------------------------------------------------------------------------- 313135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Purpose: 314135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Get a Equalizer parameter 315135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 316135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Inputs: 317135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// pEqualizer - handle to instance data 318135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// pParam - pointer to parameter 319135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// pValue - pointer to variable to hold retrieved value 320135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// pValueSize - pointer to value size: maximum size as input 321135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 322135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Outputs: 323135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// *pValue updated with parameter value 324135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// *pValueSize updated with actual value size 325135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 326135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 327135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Side Effects: 328135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 329135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent//---------------------------------------------------------------------------- 330135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 331135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentint Equalizer_getParameter(AudioEqualizer * pEqualizer, int32_t *pParam, size_t *pValueSize, void *pValue) 332135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent{ 333135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int status = 0; 334135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int32_t param = *pParam++; 335135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int32_t param2; 336135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent char *name; 337135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 338135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent switch (param) { 339135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_NUM_BANDS: 340135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_CUR_PRESET: 341135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_GET_NUM_OF_PRESETS: 342135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (*pValueSize < sizeof(int16_t)) { 343135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 344135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 345135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *pValueSize = sizeof(int16_t); 346135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 347135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 348135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_LEVEL_RANGE: 349135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_BAND_FREQ_RANGE: 350135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (*pValueSize < 2 * sizeof(int32_t)) { 351135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 352135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 353135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *pValueSize = 2 * sizeof(int32_t); 354135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 355135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_BAND_LEVEL: 356135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_GET_BAND: 357135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_CENTER_FREQ: 358135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (*pValueSize < sizeof(int32_t)) { 359135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 360135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 361135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *pValueSize = sizeof(int32_t); 362135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 363135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 364135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_GET_PRESET_NAME: 365135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 366135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 367135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent default: 368135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 369135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 370135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 371135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent switch (param) { 372135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_NUM_BANDS: 373135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *(int16_t *)pValue = kNumBands; 374135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("Equalizer_getParameter() EQ_PARAM_NUM_BANDS %d", *(int16_t *)pValue); 375135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 376135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 377135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_LEVEL_RANGE: 378135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *(int32_t *)pValue = -9600; 379135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *((int32_t *)pValue + 1) = 4800; 380135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("Equalizer_getParameter() EQ_PARAM_LEVEL_RANGE min %d, max %d", *(int32_t *)pValue, *((int32_t *)pValue + 1)); 381135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 382135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 383135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_BAND_LEVEL: 384135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent param2 = *pParam; 385135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (param2 >= kNumBands) { 386135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent status = -EINVAL; 387135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 388135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 389135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *(int32_t *)pValue = pEqualizer->getGain(param2); 390135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("Equalizer_getParameter() EQ_PARAM_BAND_LEVEL band %d, level %d", param2, *(int32_t *)pValue); 391135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 392135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 393135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_CENTER_FREQ: 394135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent param2 = *pParam; 395135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (param2 >= kNumBands) { 396135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent status = -EINVAL; 397135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 398135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 399135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *(int32_t *)pValue = pEqualizer->getFrequency(param2); 400135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("Equalizer_getParameter() EQ_PARAM_CENTER_FREQ band %d, frequency %d", param2, *(int32_t *)pValue); 401135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 402135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 403135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_BAND_FREQ_RANGE: 404135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent param2 = *pParam; 405135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (param2 >= kNumBands) { 406135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent status = -EINVAL; 407135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 408135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 409135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pEqualizer->getBandRange(param2, *(uint32_t *)pValue, *((uint32_t *)pValue + 1)); 410135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("Equalizer_getParameter() EQ_PARAM_BAND_FREQ_RANGE band %d, min %d, max %d", param2, *(int32_t *)pValue, *((int32_t *)pValue + 1)); 411135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 412135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 413135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_GET_BAND: 414135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent param2 = *pParam; 415135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *(int32_t *)pValue = pEqualizer->getMostRelevantBand(param2); 416135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("Equalizer_getParameter() EQ_PARAM_GET_BAND frequency %d, band %d", param2, *(int32_t *)pValue); 417135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 418135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 419135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_CUR_PRESET: 420135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *(int16_t *)pValue = pEqualizer->getPreset(); 421135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("Equalizer_getParameter() EQ_PARAM_CUR_PRESET %d", *(int32_t *)pValue); 422135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 423135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 424135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_GET_NUM_OF_PRESETS: 425135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *(int16_t *)pValue = pEqualizer->getNumPresets(); 426135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("Equalizer_getParameter() EQ_PARAM_GET_NUM_OF_PRESETS %d", *(int16_t *)pValue); 427135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 428135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 429135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_GET_PRESET_NAME: 430135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent param2 = *pParam; 431135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (param2 >= pEqualizer->getNumPresets()) { 432135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent status = -EINVAL; 433135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 434135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 435135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent name = (char *)pValue; 436135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent strncpy(name, pEqualizer->getPresetName(param2), *pValueSize - 1); 437135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent name[*pValueSize - 1] = 0; 438135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *pValueSize = strlen(name) + 1; 439135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("Equalizer_getParameter() EQ_PARAM_GET_PRESET_NAME preset %d, name %s len %d", param2, gEqualizerPresets[param2].name, *pValueSize); 440135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 441135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 442135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent default: 443135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("Equalizer_getParameter() invalid param %d", param); 444135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent status = -EINVAL; 445135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 446135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 447135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 448135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return status; 449135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} // end Equalizer_getParameter 450135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 451135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 452135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent//---------------------------------------------------------------------------- 453135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Equalizer_setParameter() 454135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent//---------------------------------------------------------------------------- 455135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Purpose: 456135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Set a Equalizer parameter 457135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 458135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Inputs: 459135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// pEqualizer - handle to instance data 460135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// pParam - pointer to parameter 461135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// pValue - pointer to value 462135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 463135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Outputs: 464135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 465135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 466135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Side Effects: 467135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 468135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent//---------------------------------------------------------------------------- 469135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 470135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentint Equalizer_setParameter (AudioEqualizer * pEqualizer, int32_t *pParam, void *pValue) 471135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent{ 472135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int status = 0; 473135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int32_t preset; 474135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int32_t band; 475135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int32_t level; 476135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int32_t param = *pParam++; 477135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 478135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 479135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent switch (param) { 480135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_CUR_PRESET: 481135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent preset = *(int16_t *)pValue; 482135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 483135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("setParameter() EQ_PARAM_CUR_PRESET %d", preset); 484135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (preset >= pEqualizer->getNumPresets()) { 485135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent status = -EINVAL; 486135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 487135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 488135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pEqualizer->setPreset(preset); 489135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pEqualizer->commit(true); 490135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 491135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_BAND_LEVEL: 492135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent band = *pParam; 493135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent level = *(int32_t *)pValue; 494135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("setParameter() EQ_PARAM_BAND_LEVEL band %d, level %d", band, level); 495135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (band >= kNumBands) { 496135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent status = -EINVAL; 497135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 498135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 499135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pEqualizer->setGain(band, level); 500135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pEqualizer->commit(true); 501135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 502135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent default: 503135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("setParameter() invalid param %d", param); 504135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 505135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 506135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 507135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return status; 508135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} // end Equalizer_setParameter 509135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 510135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} // namespace 511135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} // namespace 512135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 513135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 514135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 515135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent//--- Effect Control Interface Implementation 516135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 517135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 518135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentextern "C" int Equalizer_process(effect_interface_t self, audio_buffer_t *inBuffer, audio_buffer_t *outBuffer) 519135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent{ 520135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent android::EqualizerContext * pContext = (android::EqualizerContext *) self; 521135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 522135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (pContext == NULL) { 523135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 524135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 525135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (inBuffer == NULL || inBuffer->raw == NULL || 526135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent outBuffer == NULL || outBuffer->raw == NULL || 527135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent inBuffer->frameCount != outBuffer->frameCount) { 528135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 529135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 530135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 531135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->adapter.process(inBuffer->raw, outBuffer->raw, outBuffer->frameCount); 532ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent 533135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return 0; 534135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} // end Equalizer_process 535135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 536135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentextern "C" int Equalizer_command(effect_interface_t self, int cmdCode, int cmdSize, 537135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent void *pCmdData, int *replySize, void *pReplyData) { 538135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 539135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent android::EqualizerContext * pContext = (android::EqualizerContext *) self; 540135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int retsize; 541135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 542135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (pContext == NULL) { 543135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 544135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 545135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 546135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent android::AudioEqualizer * pEqualizer = pContext->pEqualizer; 547135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 548135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("Equalizer_command command %d cmdSize %d",cmdCode, cmdSize); 549135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 550135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent switch (cmdCode) { 551135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EFFECT_CMD_INIT: 552135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (pReplyData == NULL || *replySize != sizeof(int)) { 553135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 554135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 555135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *(int *) pReplyData = Equalizer_init(pContext); 556135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 557135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EFFECT_CMD_CONFIGURE: 558135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (pCmdData == NULL || cmdSize != sizeof(effect_config_t) 559135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent || pReplyData == NULL || *replySize != sizeof(int)) { 560135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 561135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 562135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *(int *) pReplyData = Equalizer_configure(pContext, 563135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent (effect_config_t *) pCmdData); 564135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 565135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EFFECT_CMD_RESET: 566135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent Equalizer_configure(pContext, &pContext->config); 567135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 568135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EFFECT_CMD_GET_PARAM: { 569135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (pCmdData == NULL || cmdSize < (int)(sizeof(effect_param_t) + sizeof(int32_t)) || 570135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReplyData == NULL || *replySize < (int) (sizeof(effect_param_t) + sizeof(int32_t))) { 571135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 572135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 573135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent effect_param_t *p = (effect_param_t *)pCmdData; 574135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent memcpy(pReplyData, pCmdData, sizeof(effect_param_t) + p->psize); 575135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent p = (effect_param_t *)pReplyData; 576135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int voffset = ((p->psize - 1) / sizeof(int32_t) + 1) * sizeof(int32_t); 577135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent p->status = android::Equalizer_getParameter(pEqualizer, (int32_t *)p->data, &p->vsize, 578135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent p->data + voffset); 579135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *replySize = sizeof(effect_param_t) + voffset + p->vsize; 580135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("Equalizer_command EFFECT_CMD_GET_PARAM *pCmdData %d, *replySize %d, *pReplyData %08x %08x", 581135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *(int32_t *)((char *)pCmdData + sizeof(effect_param_t)), *replySize, 582135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *(int32_t *)((char *)pReplyData + sizeof(effect_param_t) + voffset), 583135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *(int32_t *)((char *)pReplyData + sizeof(effect_param_t) + voffset + sizeof(int32_t))); 584135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 585135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } break; 586135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EFFECT_CMD_SET_PARAM: { 587135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("Equalizer_command EFFECT_CMD_SET_PARAM cmdSize %d pCmdData %p, *replySize %d, pReplyData %p", cmdSize, pCmdData, *replySize, pReplyData); 588135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (pCmdData == NULL || cmdSize < (int)(sizeof(effect_param_t) + sizeof(int32_t)) || 589135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReplyData == NULL || *replySize != sizeof(int32_t)) { 590135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 591135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 592135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent effect_param_t *p = (effect_param_t *) pCmdData; 593135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *(int *)pReplyData = android::Equalizer_setParameter(pEqualizer, (int32_t *)p->data, 594135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent p->data + p->psize); 595135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } break; 596ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent case EFFECT_CMD_ENABLE: 597ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent case EFFECT_CMD_DISABLE: 598ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent if (pReplyData == NULL || *replySize != sizeof(int)) { 599ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent return -EINVAL; 600ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent } 601ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent *(int *)pReplyData = 0; 602ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent break; 603ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent case EFFECT_CMD_SET_DEVICE: 604ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent case EFFECT_CMD_SET_VOLUME: 605ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent case EFFECT_CMD_SET_AUDIO_MODE: 606ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent break; 607135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent default: 608135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGW("Equalizer_command invalid command %d",cmdCode); 609135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 610135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 611135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 612135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return 0; 613135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} 614135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 615135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// effect_interface_t interface implementation for equalizer effect 616135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentconst struct effect_interface_s gEqualizerInterface = { 617135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent Equalizer_process, 618135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent Equalizer_command 619135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent}; 620135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 621135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 622