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]) 192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent// 202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#define LOG_NDEBUG 0 21135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#include <cutils/log.h> 22135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#include <assert.h> 23135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#include <stdlib.h> 2417217ab46e12fbdaad9e1d7460c48937f76fa0e2Eric Laurent#include <string.h> 25135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#include <new> 26135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#include "AudioEqualizer.h" 27135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#include "AudioBiquadFilter.h" 28135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#include "AudioFormatAdapter.h" 296d8b694d999e9be7d5dcc336535832a80fb6f61fEric Laurent#include <audio_effects/effect_equalizer.h> 306d8b694d999e9be7d5dcc336535832a80fb6f61fEric Laurent 31135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 32e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent// effect_handle_t interface implementation for equalizer effect 33135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentextern "C" const struct effect_interface_s gEqualizerInterface; 34135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 35e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurentenum equalizer_state_e { 36e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent EQUALIZER_STATE_UNINITIALIZED, 37e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent EQUALIZER_STATE_INITIALIZED, 38e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent EQUALIZER_STATE_ACTIVE, 39e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent}; 40e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent 41135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentnamespace android { 42135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentnamespace { 43135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 44135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Google Graphic Equalizer UUID: e25aa840-543b-11df-98a5-0002a5d5c51b 45135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentconst effect_descriptor_t gEqualizerDescriptor = { 46135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent {0x0bed4300, 0xddd6, 0x11db, 0x8f34, {0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}}, // type 47135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent {0xe25aa840, 0x543b, 0x11df, 0x98a5, {0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}}, // uuid 48e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent EFFECT_CONTROL_API_VERSION, 49135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent (EFFECT_FLAG_TYPE_INSERT | EFFECT_FLAG_INSERT_LAST), 50ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent 0, // TODO 51ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent 1, 52135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent "Graphic Equalizer", 53e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent "The Android Open Source Project", 54135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent}; 55135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 56135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/////////////////// BEGIN EQ PRESETS /////////////////////////////////////////// 57135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentconst int kNumBands = 5; 58135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentconst uint32_t gFreqs[kNumBands] = { 50000, 125000, 900000, 3200000, 6300000 }; 59135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentconst uint32_t gBandwidths[kNumBands] = { 0, 3600, 3600, 2400, 0 }; 60135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 61135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentconst AudioEqualizer::BandConfig gBandsClassic[kNumBands] = { 62135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { 300, gFreqs[0], gBandwidths[0] }, 63135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { 400, gFreqs[1], gBandwidths[1] }, 64135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { 0, gFreqs[2], gBandwidths[2] }, 65135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { 200, gFreqs[3], gBandwidths[3] }, 66135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { -300, gFreqs[4], gBandwidths[4] } 67135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent}; 68135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 69135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentconst AudioEqualizer::BandConfig gBandsJazz[kNumBands] = { 70135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { -600, gFreqs[0], gBandwidths[0] }, 71135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { 200, gFreqs[1], gBandwidths[1] }, 72135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { 400, 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 gBandsPop[kNumBands] = { 78135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { 400, gFreqs[0], gBandwidths[0] }, 79135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { -400, gFreqs[1], gBandwidths[1] }, 80135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { 300, gFreqs[2], gBandwidths[2] }, 81135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { -400, gFreqs[3], gBandwidths[3] }, 82135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { 600, gFreqs[4], gBandwidths[4] } 83135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent}; 84135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 85135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentconst AudioEqualizer::BandConfig gBandsRock[kNumBands] = { 86135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { 700, gFreqs[0], gBandwidths[0] }, 87135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { 400, gFreqs[1], gBandwidths[1] }, 88135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { -400, gFreqs[2], gBandwidths[2] }, 89135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { 400, gFreqs[3], gBandwidths[3] }, 90135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { 200, gFreqs[4], gBandwidths[4] } 91135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent}; 92135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 93135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentconst AudioEqualizer::PresetConfig gEqualizerPresets[] = { 94135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { "Classic", gBandsClassic }, 95135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { "Jazz", gBandsJazz }, 96135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { "Pop", gBandsPop }, 97135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { "Rock", gBandsRock } 98135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent}; 99135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 100135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/////////////////// END EQ PRESETS ///////////////////////////////////////////// 101135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 102135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentstatic const size_t kBufferSize = 32; 103135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 104135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurenttypedef AudioFormatAdapter<AudioEqualizer, kBufferSize> FormatAdapter; 105135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 106135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentstruct EqualizerContext { 107135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent const struct effect_interface_s *itfe; 108135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent effect_config_t config; 109135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent FormatAdapter adapter; 110135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent AudioEqualizer * pEqualizer; 111e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent uint32_t state; 112135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent}; 113135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 114135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent//--- local function prototypes 115135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 116135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentint Equalizer_init(EqualizerContext *pContext); 1173d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurentint Equalizer_setConfig(EqualizerContext *pContext, effect_config_t *pConfig); 118b302bd5d288be2d3363b80053ca2392560b00b25Ashok Bhatint Equalizer_getParameter(AudioEqualizer * pEqualizer, int32_t *pParam, uint32_t *pValueSize, void *pValue); 119135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentint Equalizer_setParameter(AudioEqualizer * pEqualizer, int32_t *pParam, void *pValue); 120135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 121135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 122135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 123135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent//--- Effect Library Interface Implementation 124135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 125135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1265e92a7861196ddae14638d4b7a63fc4892b7ef59Glenn Kastenextern "C" int EffectCreate(const effect_uuid_t *uuid, 127e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent int32_t sessionId, 128e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent int32_t ioId, 129e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent effect_handle_t *pHandle) { 130135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int ret; 131135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int i; 132135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1333856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("EffectLibCreateEffect start"); 134135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 135e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent if (pHandle == NULL || uuid == NULL) { 136135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 137135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 138135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 139135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (memcmp(uuid, &gEqualizerDescriptor.uuid, sizeof(effect_uuid_t)) != 0) { 140135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 141135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 142135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 143135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent EqualizerContext *pContext = new EqualizerContext; 144135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 145135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->itfe = &gEqualizerInterface; 146135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->pEqualizer = NULL; 147e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent pContext->state = EQUALIZER_STATE_UNINITIALIZED; 148135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 149135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent ret = Equalizer_init(pContext); 150135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (ret < 0) { 1515ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("EffectLibCreateEffect() init failed"); 152135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent delete pContext; 153135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return ret; 154135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 155135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 156e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent *pHandle = (effect_handle_t)pContext; 157e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent pContext->state = EQUALIZER_STATE_INITIALIZED; 158135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1593856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("EffectLibCreateEffect %p, size %d", 160e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent pContext, AudioEqualizer::GetInstanceSize(kNumBands)+sizeof(EqualizerContext)); 161135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 162135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return 0; 163135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 164135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} /* end EffectCreate */ 165135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 166e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurentextern "C" int EffectRelease(effect_handle_t handle) { 167e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent EqualizerContext * pContext = (EqualizerContext *)handle; 168135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1693856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("EffectLibReleaseEffect %p", handle); 170135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (pContext == NULL) { 171135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 172135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 173135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 174e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent pContext->state = EQUALIZER_STATE_UNINITIALIZED; 175135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->pEqualizer->free(); 176135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent delete pContext; 177135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 178135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return 0; 179135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} /* end EffectRelease */ 180135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1815e92a7861196ddae14638d4b7a63fc4892b7ef59Glenn Kastenextern "C" int EffectGetDescriptor(const effect_uuid_t *uuid, 182e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent effect_descriptor_t *pDescriptor) { 183e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent 184e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent if (pDescriptor == NULL || uuid == NULL){ 1853856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("EffectGetDescriptor() called with NULL pointer"); 186e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent return -EINVAL; 187e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent } 188e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent 189e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent if (memcmp(uuid, &gEqualizerDescriptor.uuid, sizeof(effect_uuid_t)) == 0) { 190a189a6883ee55cf62da1d7bf5bf5a8ab501938a4Glenn Kasten *pDescriptor = gEqualizerDescriptor; 191e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent return 0; 192e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent } 193e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent 194e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent return -EINVAL; 195e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent} /* end EffectGetDescriptor */ 196e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent 197135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 198135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 199135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent//--- local functions 200135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 201135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 202135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define CHECK_ARG(cond) { \ 203135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (!(cond)) { \ 2043856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Invalid argument: "#cond); \ 205135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; \ 206135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } \ 207135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} 208135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 209135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent//---------------------------------------------------------------------------- 2103d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent// Equalizer_setConfig() 211135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent//---------------------------------------------------------------------------- 212135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Purpose: Set input and output audio configuration. 213135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 214135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Inputs: 215135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// pContext: effect engine context 216135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// pConfig: pointer to effect_config_t structure holding input and output 217135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// configuration parameters 218135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 219135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Outputs: 220135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 221135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent//---------------------------------------------------------------------------- 222135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 2233d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurentint Equalizer_setConfig(EqualizerContext *pContext, effect_config_t *pConfig) 224135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent{ 2253d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent ALOGV("Equalizer_setConfig start"); 226135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 227135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent CHECK_ARG(pContext != NULL); 228135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent CHECK_ARG(pConfig != NULL); 229135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 230135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent CHECK_ARG(pConfig->inputCfg.samplingRate == pConfig->outputCfg.samplingRate); 231135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent CHECK_ARG(pConfig->inputCfg.channels == pConfig->outputCfg.channels); 232135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent CHECK_ARG(pConfig->inputCfg.format == pConfig->outputCfg.format); 233e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent CHECK_ARG((pConfig->inputCfg.channels == AUDIO_CHANNEL_OUT_MONO) || 234e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent (pConfig->inputCfg.channels == AUDIO_CHANNEL_OUT_STEREO)); 235135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent CHECK_ARG(pConfig->outputCfg.accessMode == EFFECT_BUFFER_ACCESS_WRITE 236135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent || pConfig->outputCfg.accessMode == EFFECT_BUFFER_ACCESS_ACCUMULATE); 237b7f08d386f2bddb8f3c87858f9204754b7fdb857Glenn Kasten CHECK_ARG(pConfig->inputCfg.format == AUDIO_FORMAT_PCM_16_BIT); 238135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 239135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int channelCount; 240e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent if (pConfig->inputCfg.channels == AUDIO_CHANNEL_OUT_MONO) { 241135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent channelCount = 1; 242135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } else { 243135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent channelCount = 2; 244135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 245135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent CHECK_ARG(channelCount <= AudioBiquadFilter::MAX_CHANNELS); 246135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 247a189a6883ee55cf62da1d7bf5bf5a8ab501938a4Glenn Kasten pContext->config = *pConfig; 248ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent 249135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->pEqualizer->configure(channelCount, 250135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pConfig->inputCfg.samplingRate); 251135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 252135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->adapter.configure(*pContext->pEqualizer, channelCount, 253135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pConfig->inputCfg.format, 254135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pConfig->outputCfg.accessMode); 255135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 256135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return 0; 2573d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent} // end Equalizer_setConfig 2583d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent 2593d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent//---------------------------------------------------------------------------- 2603d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent// Equalizer_getConfig() 2613d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent//---------------------------------------------------------------------------- 2623d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent// Purpose: Get input and output audio configuration. 2633d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent// 2643d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent// Inputs: 2653d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent// pContext: effect engine context 2663d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent// pConfig: pointer to effect_config_t structure holding input and output 2673d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent// configuration parameters 2683d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent// 2693d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent// Outputs: 2703d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent// 2713d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent//---------------------------------------------------------------------------- 2723d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent 2733d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurentvoid Equalizer_getConfig(EqualizerContext *pContext, effect_config_t *pConfig) 2743d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent{ 275a189a6883ee55cf62da1d7bf5bf5a8ab501938a4Glenn Kasten *pConfig = pContext->config; 2763d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent} // end Equalizer_getConfig 277135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 278135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 279135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent//---------------------------------------------------------------------------- 280135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Equalizer_init() 281135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent//---------------------------------------------------------------------------- 282135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Purpose: Initialize engine with default configuration and creates 283135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// AudioEqualizer instance. 284135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 285135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Inputs: 286135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// pContext: effect engine context 287135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 288135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Outputs: 289135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 290135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent//---------------------------------------------------------------------------- 291135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 292135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentint Equalizer_init(EqualizerContext *pContext) 293135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent{ 294135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int status; 295135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 2963856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Equalizer_init start"); 297135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 298135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent CHECK_ARG(pContext != NULL); 299135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 300135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (pContext->pEqualizer != NULL) { 301135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->pEqualizer->free(); 302135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 303135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 304135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->config.inputCfg.accessMode = EFFECT_BUFFER_ACCESS_READ; 305e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent pContext->config.inputCfg.channels = AUDIO_CHANNEL_OUT_STEREO; 306e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent pContext->config.inputCfg.format = AUDIO_FORMAT_PCM_16_BIT; 307135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->config.inputCfg.samplingRate = 44100; 308135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->config.inputCfg.bufferProvider.getBuffer = NULL; 309135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->config.inputCfg.bufferProvider.releaseBuffer = NULL; 310135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->config.inputCfg.bufferProvider.cookie = NULL; 311135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->config.inputCfg.mask = EFFECT_CONFIG_ALL; 312135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->config.outputCfg.accessMode = EFFECT_BUFFER_ACCESS_ACCUMULATE; 313e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent pContext->config.outputCfg.channels = AUDIO_CHANNEL_OUT_STEREO; 314e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent pContext->config.outputCfg.format = AUDIO_FORMAT_PCM_16_BIT; 315135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->config.outputCfg.samplingRate = 44100; 316135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->config.outputCfg.bufferProvider.getBuffer = NULL; 317135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->config.outputCfg.bufferProvider.releaseBuffer = NULL; 318135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->config.outputCfg.bufferProvider.cookie = NULL; 319135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->config.outputCfg.mask = EFFECT_CONFIG_ALL; 320135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 321135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->pEqualizer = AudioEqualizer::CreateInstance( 322135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent NULL, 323135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent kNumBands, 324135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent AudioBiquadFilter::MAX_CHANNELS, 325135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 44100, 326135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent gEqualizerPresets, 327135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent ARRAY_SIZE(gEqualizerPresets)); 328135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 329135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent for (int i = 0; i < kNumBands; ++i) { 330135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->pEqualizer->setFrequency(i, gFreqs[i]); 331135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->pEqualizer->setBandwidth(i, gBandwidths[i]); 332135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 333135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 334135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->pEqualizer->enable(true); 335135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 3363d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent Equalizer_setConfig(pContext, &pContext->config); 337135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 338135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return 0; 339135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} // end Equalizer_init 340135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 341135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 342135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent//---------------------------------------------------------------------------- 343135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Equalizer_getParameter() 344135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent//---------------------------------------------------------------------------- 345135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Purpose: 346135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Get a Equalizer parameter 347135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 348135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Inputs: 349135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// pEqualizer - handle to instance data 350135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// pParam - pointer to parameter 351135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// pValue - pointer to variable to hold retrieved value 352135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// pValueSize - pointer to value size: maximum size as input 353135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 354135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Outputs: 355135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// *pValue updated with parameter value 356135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// *pValueSize updated with actual value size 357135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 358135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 359135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Side Effects: 360135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 361135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent//---------------------------------------------------------------------------- 362135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 363b302bd5d288be2d3363b80053ca2392560b00b25Ashok Bhatint Equalizer_getParameter(AudioEqualizer * pEqualizer, int32_t *pParam, uint32_t *pValueSize, void *pValue) 364135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent{ 365135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int status = 0; 366135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int32_t param = *pParam++; 367135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int32_t param2; 368135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent char *name; 369135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 370135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent switch (param) { 371135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_NUM_BANDS: 372135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_CUR_PRESET: 373135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_GET_NUM_OF_PRESETS: 3743be9523784cc4038f601e510faee595117cdacb3Eric Laurent case EQ_PARAM_BAND_LEVEL: 3753be9523784cc4038f601e510faee595117cdacb3Eric Laurent case EQ_PARAM_GET_BAND: 376135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (*pValueSize < sizeof(int16_t)) { 377135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 378135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 379135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *pValueSize = sizeof(int16_t); 380135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 381135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 382135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_LEVEL_RANGE: 3833be9523784cc4038f601e510faee595117cdacb3Eric Laurent if (*pValueSize < 2 * sizeof(int16_t)) { 3843be9523784cc4038f601e510faee595117cdacb3Eric Laurent return -EINVAL; 3853be9523784cc4038f601e510faee595117cdacb3Eric Laurent } 3863be9523784cc4038f601e510faee595117cdacb3Eric Laurent *pValueSize = 2 * sizeof(int16_t); 3873be9523784cc4038f601e510faee595117cdacb3Eric Laurent break; 3883be9523784cc4038f601e510faee595117cdacb3Eric Laurent 389135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_BAND_FREQ_RANGE: 390135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (*pValueSize < 2 * sizeof(int32_t)) { 391135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 392135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 393135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *pValueSize = 2 * sizeof(int32_t); 394135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 3953be9523784cc4038f601e510faee595117cdacb3Eric Laurent 396135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_CENTER_FREQ: 397135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (*pValueSize < sizeof(int32_t)) { 398135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 399135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 400135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *pValueSize = sizeof(int32_t); 401135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 402135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 403135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_GET_PRESET_NAME: 404135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 405135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 4063be9523784cc4038f601e510faee595117cdacb3Eric Laurent case EQ_PARAM_PROPERTIES: 4073be9523784cc4038f601e510faee595117cdacb3Eric Laurent if (*pValueSize < (2 + kNumBands) * sizeof(uint16_t)) { 4083be9523784cc4038f601e510faee595117cdacb3Eric Laurent return -EINVAL; 4093be9523784cc4038f601e510faee595117cdacb3Eric Laurent } 4103be9523784cc4038f601e510faee595117cdacb3Eric Laurent *pValueSize = (2 + kNumBands) * sizeof(uint16_t); 4113be9523784cc4038f601e510faee595117cdacb3Eric Laurent break; 4123be9523784cc4038f601e510faee595117cdacb3Eric Laurent 413135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent default: 414135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 415135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 416135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 417135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent switch (param) { 418135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_NUM_BANDS: 4193be9523784cc4038f601e510faee595117cdacb3Eric Laurent *(uint16_t *)pValue = (uint16_t)kNumBands; 4203856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Equalizer_getParameter() EQ_PARAM_NUM_BANDS %d", *(int16_t *)pValue); 421135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 422135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 423135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_LEVEL_RANGE: 4243be9523784cc4038f601e510faee595117cdacb3Eric Laurent *(int16_t *)pValue = -9600; 4253be9523784cc4038f601e510faee595117cdacb3Eric Laurent *((int16_t *)pValue + 1) = 4800; 4263856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Equalizer_getParameter() EQ_PARAM_LEVEL_RANGE min %d, max %d", 427e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent *(int32_t *)pValue, *((int32_t *)pValue + 1)); 428135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 429135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 430135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_BAND_LEVEL: 431135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent param2 = *pParam; 432135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (param2 >= kNumBands) { 433135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent status = -EINVAL; 434135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 435135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 4363be9523784cc4038f601e510faee595117cdacb3Eric Laurent *(int16_t *)pValue = (int16_t)pEqualizer->getGain(param2); 4373856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Equalizer_getParameter() EQ_PARAM_BAND_LEVEL band %d, level %d", 438e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent param2, *(int32_t *)pValue); 439135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 440135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 441135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_CENTER_FREQ: 442135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent param2 = *pParam; 443135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (param2 >= kNumBands) { 444135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent status = -EINVAL; 445135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 446135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 447135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *(int32_t *)pValue = pEqualizer->getFrequency(param2); 4483856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Equalizer_getParameter() EQ_PARAM_CENTER_FREQ band %d, frequency %d", 449e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent param2, *(int32_t *)pValue); 450135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 451135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 452135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_BAND_FREQ_RANGE: 453135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent param2 = *pParam; 454135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (param2 >= kNumBands) { 455135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent status = -EINVAL; 456135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 457135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 458135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pEqualizer->getBandRange(param2, *(uint32_t *)pValue, *((uint32_t *)pValue + 1)); 4593856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Equalizer_getParameter() EQ_PARAM_BAND_FREQ_RANGE band %d, min %d, max %d", 460e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent param2, *(int32_t *)pValue, *((int32_t *)pValue + 1)); 461135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 462135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 463135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_GET_BAND: 464135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent param2 = *pParam; 4653be9523784cc4038f601e510faee595117cdacb3Eric Laurent *(uint16_t *)pValue = (uint16_t)pEqualizer->getMostRelevantBand(param2); 4663856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Equalizer_getParameter() EQ_PARAM_GET_BAND frequency %d, band %d", 467e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent param2, *(int32_t *)pValue); 468135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 469135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 470135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_CUR_PRESET: 4713be9523784cc4038f601e510faee595117cdacb3Eric Laurent *(uint16_t *)pValue = (uint16_t)pEqualizer->getPreset(); 4723856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Equalizer_getParameter() EQ_PARAM_CUR_PRESET %d", *(int32_t *)pValue); 473135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 474135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 475135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_GET_NUM_OF_PRESETS: 4763be9523784cc4038f601e510faee595117cdacb3Eric Laurent *(uint16_t *)pValue = (uint16_t)pEqualizer->getNumPresets(); 4773856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Equalizer_getParameter() EQ_PARAM_GET_NUM_OF_PRESETS %d", *(int16_t *)pValue); 478135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 479135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 480135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_GET_PRESET_NAME: 481135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent param2 = *pParam; 482135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (param2 >= pEqualizer->getNumPresets()) { 483135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent status = -EINVAL; 484135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 485135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 486135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent name = (char *)pValue; 487135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent strncpy(name, pEqualizer->getPresetName(param2), *pValueSize - 1); 488135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent name[*pValueSize - 1] = 0; 489135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *pValueSize = strlen(name) + 1; 4903856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Equalizer_getParameter() EQ_PARAM_GET_PRESET_NAME preset %d, name %s len %d", 491e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent param2, gEqualizerPresets[param2].name, *pValueSize); 492135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 493135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 4943be9523784cc4038f601e510faee595117cdacb3Eric Laurent case EQ_PARAM_PROPERTIES: { 4953be9523784cc4038f601e510faee595117cdacb3Eric Laurent int16_t *p = (int16_t *)pValue; 4963856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Equalizer_getParameter() EQ_PARAM_PROPERTIES"); 4973be9523784cc4038f601e510faee595117cdacb3Eric Laurent p[0] = (int16_t)pEqualizer->getPreset(); 4983be9523784cc4038f601e510faee595117cdacb3Eric Laurent p[1] = (int16_t)kNumBands; 4993be9523784cc4038f601e510faee595117cdacb3Eric Laurent for (int i = 0; i < kNumBands; i++) { 5003be9523784cc4038f601e510faee595117cdacb3Eric Laurent p[2 + i] = (int16_t)pEqualizer->getGain(i); 5013be9523784cc4038f601e510faee595117cdacb3Eric Laurent } 5023be9523784cc4038f601e510faee595117cdacb3Eric Laurent } break; 5033be9523784cc4038f601e510faee595117cdacb3Eric Laurent 504135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent default: 5053856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Equalizer_getParameter() invalid param %d", param); 506135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent status = -EINVAL; 507135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 508135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 509135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 510135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return status; 511135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} // end Equalizer_getParameter 512135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 513135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 514135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent//---------------------------------------------------------------------------- 515135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Equalizer_setParameter() 516135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent//---------------------------------------------------------------------------- 517135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Purpose: 518135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Set a Equalizer parameter 519135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 520135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Inputs: 521135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// pEqualizer - handle to instance data 522135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// pParam - pointer to parameter 523135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// pValue - pointer to value 524135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 525135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Outputs: 526135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 527135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 528135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Side Effects: 529135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 530135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent//---------------------------------------------------------------------------- 531135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 532135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentint Equalizer_setParameter (AudioEqualizer * pEqualizer, int32_t *pParam, void *pValue) 533135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent{ 534135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int status = 0; 535135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int32_t preset; 536135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int32_t band; 537135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int32_t level; 538135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int32_t param = *pParam++; 539135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 540135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 541135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent switch (param) { 542135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_CUR_PRESET: 5433be9523784cc4038f601e510faee595117cdacb3Eric Laurent preset = (int32_t)(*(uint16_t *)pValue); 544135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 5453856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("setParameter() EQ_PARAM_CUR_PRESET %d", preset); 5463be9523784cc4038f601e510faee595117cdacb3Eric Laurent if (preset < 0 || preset >= pEqualizer->getNumPresets()) { 547135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent status = -EINVAL; 548135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 549135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 550135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pEqualizer->setPreset(preset); 551135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pEqualizer->commit(true); 552135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 553135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_BAND_LEVEL: 554135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent band = *pParam; 5553be9523784cc4038f601e510faee595117cdacb3Eric Laurent level = (int32_t)(*(int16_t *)pValue); 5563856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("setParameter() EQ_PARAM_BAND_LEVEL band %d, level %d", band, level); 557135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (band >= kNumBands) { 558135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent status = -EINVAL; 559135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 560135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 561135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pEqualizer->setGain(band, level); 562135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pEqualizer->commit(true); 563135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 5643be9523784cc4038f601e510faee595117cdacb3Eric Laurent case EQ_PARAM_PROPERTIES: { 5653856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("setParameter() EQ_PARAM_PROPERTIES"); 5663be9523784cc4038f601e510faee595117cdacb3Eric Laurent int16_t *p = (int16_t *)pValue; 5673be9523784cc4038f601e510faee595117cdacb3Eric Laurent if ((int)p[0] >= pEqualizer->getNumPresets()) { 5683be9523784cc4038f601e510faee595117cdacb3Eric Laurent status = -EINVAL; 5693be9523784cc4038f601e510faee595117cdacb3Eric Laurent break; 5703be9523784cc4038f601e510faee595117cdacb3Eric Laurent } 5713be9523784cc4038f601e510faee595117cdacb3Eric Laurent if (p[0] >= 0) { 5723be9523784cc4038f601e510faee595117cdacb3Eric Laurent pEqualizer->setPreset((int)p[0]); 5733be9523784cc4038f601e510faee595117cdacb3Eric Laurent } else { 5743be9523784cc4038f601e510faee595117cdacb3Eric Laurent if ((int)p[1] != kNumBands) { 5753be9523784cc4038f601e510faee595117cdacb3Eric Laurent status = -EINVAL; 5763be9523784cc4038f601e510faee595117cdacb3Eric Laurent break; 5773be9523784cc4038f601e510faee595117cdacb3Eric Laurent } 5783be9523784cc4038f601e510faee595117cdacb3Eric Laurent for (int i = 0; i < kNumBands; i++) { 5793be9523784cc4038f601e510faee595117cdacb3Eric Laurent pEqualizer->setGain(i, (int32_t)p[2 + i]); 5803be9523784cc4038f601e510faee595117cdacb3Eric Laurent } 5813be9523784cc4038f601e510faee595117cdacb3Eric Laurent } 5823be9523784cc4038f601e510faee595117cdacb3Eric Laurent pEqualizer->commit(true); 5833be9523784cc4038f601e510faee595117cdacb3Eric Laurent } break; 584135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent default: 5853856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("setParameter() invalid param %d", param); 5863be9523784cc4038f601e510faee595117cdacb3Eric Laurent status = -EINVAL; 587135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 588135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 589135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 590135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return status; 591135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} // end Equalizer_setParameter 592135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 593135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} // namespace 594135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} // namespace 595135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 596135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 597135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 598135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent//--- Effect Control Interface Implementation 599135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 600135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 601e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurentextern "C" int Equalizer_process(effect_handle_t self, audio_buffer_t *inBuffer, audio_buffer_t *outBuffer) 602135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent{ 603135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent android::EqualizerContext * pContext = (android::EqualizerContext *) self; 604135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 605135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (pContext == NULL) { 606135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 607135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 608135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (inBuffer == NULL || inBuffer->raw == NULL || 609135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent outBuffer == NULL || outBuffer->raw == NULL || 610135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent inBuffer->frameCount != outBuffer->frameCount) { 611135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 612135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 613135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 614e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent if (pContext->state == EQUALIZER_STATE_UNINITIALIZED) { 615e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent return -EINVAL; 616e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent } 617e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent if (pContext->state == EQUALIZER_STATE_INITIALIZED) { 618e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent return -ENODATA; 619e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent } 620e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent 621135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->adapter.process(inBuffer->raw, outBuffer->raw, outBuffer->frameCount); 622ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent 623135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return 0; 624135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} // end Equalizer_process 625135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 626e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurentextern "C" int Equalizer_command(effect_handle_t self, uint32_t cmdCode, uint32_t cmdSize, 62725f4395b932fa9859a6e91ba77c5d20d009da64aEric Laurent void *pCmdData, uint32_t *replySize, void *pReplyData) { 628135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 629135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent android::EqualizerContext * pContext = (android::EqualizerContext *) self; 630135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int retsize; 631135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 632e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent if (pContext == NULL || pContext->state == EQUALIZER_STATE_UNINITIALIZED) { 633135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 634135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 635135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 636135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent android::AudioEqualizer * pEqualizer = pContext->pEqualizer; 637135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 6383856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Equalizer_command command %d cmdSize %d",cmdCode, cmdSize); 639135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 640135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent switch (cmdCode) { 641135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EFFECT_CMD_INIT: 642135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (pReplyData == NULL || *replySize != sizeof(int)) { 643135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 644135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 645135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *(int *) pReplyData = Equalizer_init(pContext); 646135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 6473d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent case EFFECT_CMD_SET_CONFIG: 648135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (pCmdData == NULL || cmdSize != sizeof(effect_config_t) 649135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent || pReplyData == NULL || *replySize != sizeof(int)) { 650135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 651135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 6523d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent *(int *) pReplyData = Equalizer_setConfig(pContext, 653135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent (effect_config_t *) pCmdData); 654135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 6553d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent case EFFECT_CMD_GET_CONFIG: 6563d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent if (pReplyData == NULL || *replySize != sizeof(effect_config_t)) { 6573d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent return -EINVAL; 6583d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent } 6593d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent Equalizer_getConfig(pContext, (effect_config_t *) pCmdData); 6603d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent break; 661135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EFFECT_CMD_RESET: 6623d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent Equalizer_setConfig(pContext, &pContext->config); 663135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 664135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EFFECT_CMD_GET_PARAM: { 665b302bd5d288be2d3363b80053ca2392560b00b25Ashok Bhat if (pCmdData == NULL || cmdSize < (sizeof(effect_param_t) + sizeof(int32_t)) || 666b302bd5d288be2d3363b80053ca2392560b00b25Ashok Bhat pReplyData == NULL || *replySize < (sizeof(effect_param_t) + sizeof(int32_t))) { 667135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 668135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 669135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent effect_param_t *p = (effect_param_t *)pCmdData; 670135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent memcpy(pReplyData, pCmdData, sizeof(effect_param_t) + p->psize); 671135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent p = (effect_param_t *)pReplyData; 672135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int voffset = ((p->psize - 1) / sizeof(int32_t) + 1) * sizeof(int32_t); 673135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent p->status = android::Equalizer_getParameter(pEqualizer, (int32_t *)p->data, &p->vsize, 674135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent p->data + voffset); 675135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *replySize = sizeof(effect_param_t) + voffset + p->vsize; 6763856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Equalizer_command EFFECT_CMD_GET_PARAM *pCmdData %d, *replySize %d, *pReplyData %08x %08x", 677135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *(int32_t *)((char *)pCmdData + sizeof(effect_param_t)), *replySize, 678135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *(int32_t *)((char *)pReplyData + sizeof(effect_param_t) + voffset), 679135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *(int32_t *)((char *)pReplyData + sizeof(effect_param_t) + voffset + sizeof(int32_t))); 680135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 681135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } break; 682135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EFFECT_CMD_SET_PARAM: { 6833856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Equalizer_command EFFECT_CMD_SET_PARAM cmdSize %d pCmdData %p, *replySize %d, pReplyData %p", 684e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent cmdSize, pCmdData, *replySize, pReplyData); 685b302bd5d288be2d3363b80053ca2392560b00b25Ashok Bhat if (pCmdData == NULL || cmdSize < (sizeof(effect_param_t) + sizeof(int32_t)) || 686135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReplyData == NULL || *replySize != sizeof(int32_t)) { 687135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 688135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 689135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent effect_param_t *p = (effect_param_t *) pCmdData; 690135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *(int *)pReplyData = android::Equalizer_setParameter(pEqualizer, (int32_t *)p->data, 691135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent p->data + p->psize); 692135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } break; 693ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent case EFFECT_CMD_ENABLE: 694e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent if (pReplyData == NULL || *replySize != sizeof(int)) { 695e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent return -EINVAL; 696e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent } 697e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent if (pContext->state != EQUALIZER_STATE_INITIALIZED) { 698e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent return -ENOSYS; 699e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent } 700e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent pContext->state = EQUALIZER_STATE_ACTIVE; 7013856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("EFFECT_CMD_ENABLE() OK"); 702e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent *(int *)pReplyData = 0; 703e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent break; 704ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent case EFFECT_CMD_DISABLE: 705ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent if (pReplyData == NULL || *replySize != sizeof(int)) { 706ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent return -EINVAL; 707ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent } 708e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent if (pContext->state != EQUALIZER_STATE_ACTIVE) { 709e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent return -ENOSYS; 710e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent } 711e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent pContext->state = EQUALIZER_STATE_INITIALIZED; 7123856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("EFFECT_CMD_DISABLE() OK"); 713ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent *(int *)pReplyData = 0; 714ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent break; 715ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent case EFFECT_CMD_SET_DEVICE: 716ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent case EFFECT_CMD_SET_VOLUME: 717ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent case EFFECT_CMD_SET_AUDIO_MODE: 718ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent break; 719135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent default: 7205ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("Equalizer_command invalid command %d",cmdCode); 721135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 722135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 723135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 724135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return 0; 725135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} 726135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 727e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurentextern "C" int Equalizer_getDescriptor(effect_handle_t self, 728e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent effect_descriptor_t *pDescriptor) 729e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent{ 730e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent android::EqualizerContext * pContext = (android::EqualizerContext *) self; 731e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent 732e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent if (pContext == NULL || pDescriptor == NULL) { 7333856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Equalizer_getDescriptor() invalid param"); 734e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent return -EINVAL; 735e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent } 736e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent 737a189a6883ee55cf62da1d7bf5bf5a8ab501938a4Glenn Kasten *pDescriptor = android::gEqualizerDescriptor; 738e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent 739e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent return 0; 740e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent} 741e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent 742e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent// effect_handle_t interface implementation for equalizer effect 743135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentconst struct effect_interface_s gEqualizerInterface = { 744135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent Equalizer_process, 745e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent Equalizer_command, 746ba7b8f881a9b6b21803752326d2932a3bd42d7cfEric Laurent Equalizer_getDescriptor, 747ba7b8f881a9b6b21803752326d2932a3bd42d7cfEric Laurent NULL 748135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent}; 749135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 750135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 751e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurentaudio_effect_library_t AUDIO_EFFECT_LIBRARY_INFO_SYM = { 752e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent tag : AUDIO_EFFECT_LIBRARY_TAG, 753e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent version : EFFECT_LIBRARY_API_VERSION, 754e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent name : "Test Equalizer Library", 755e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent implementor : "The Android Open Source Project", 756e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent create_effect : android::EffectCreate, 757e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent release_effect : android::EffectRelease, 758e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent get_descriptor : android::EffectGetDescriptor, 759e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent}; 760