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 2160d02077d86d2d1092443519290101f503aa6f7aMark Salyzyn 22135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#include <assert.h> 23135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#include <stdlib.h> 2417217ab46e12fbdaad9e1d7460c48937f76fa0e2Eric Laurent#include <string.h> 25e74bbf18a6595a914d3c771be08a72077465c51fMark Salyzyn 26135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#include <new> 2760d02077d86d2d1092443519290101f503aa6f7aMark Salyzyn 28e74bbf18a6595a914d3c771be08a72077465c51fMark Salyzyn#include <log/log.h> 2960d02077d86d2d1092443519290101f503aa6f7aMark Salyzyn 30135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#include "AudioEqualizer.h" 31135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#include "AudioBiquadFilter.h" 32135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#include "AudioFormatAdapter.h" 336d8b694d999e9be7d5dcc336535832a80fb6f61fEric Laurent#include <audio_effects/effect_equalizer.h> 346d8b694d999e9be7d5dcc336535832a80fb6f61fEric Laurent 35e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent// effect_handle_t interface implementation for equalizer effect 36135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentextern "C" const struct effect_interface_s gEqualizerInterface; 37135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 38e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurentenum equalizer_state_e { 39e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent EQUALIZER_STATE_UNINITIALIZED, 40e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent EQUALIZER_STATE_INITIALIZED, 41e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent EQUALIZER_STATE_ACTIVE, 42e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent}; 43e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent 44135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentnamespace android { 45135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentnamespace { 46135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 47135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Google Graphic Equalizer UUID: e25aa840-543b-11df-98a5-0002a5d5c51b 48135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentconst effect_descriptor_t gEqualizerDescriptor = { 49135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent {0x0bed4300, 0xddd6, 0x11db, 0x8f34, {0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}}, // type 50135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent {0xe25aa840, 0x543b, 0x11df, 0x98a5, {0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}}, // uuid 51e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent EFFECT_CONTROL_API_VERSION, 52135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent (EFFECT_FLAG_TYPE_INSERT | EFFECT_FLAG_INSERT_LAST), 53ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent 0, // TODO 54ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent 1, 55135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent "Graphic Equalizer", 56e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent "The Android Open Source Project", 57135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent}; 58135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 59135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/////////////////// BEGIN EQ PRESETS /////////////////////////////////////////// 60135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentconst int kNumBands = 5; 61135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentconst uint32_t gFreqs[kNumBands] = { 50000, 125000, 900000, 3200000, 6300000 }; 62135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentconst uint32_t gBandwidths[kNumBands] = { 0, 3600, 3600, 2400, 0 }; 63135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 64135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentconst AudioEqualizer::BandConfig gBandsClassic[kNumBands] = { 65135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { 300, gFreqs[0], gBandwidths[0] }, 66135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { 400, gFreqs[1], gBandwidths[1] }, 67135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { 0, gFreqs[2], gBandwidths[2] }, 68135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { 200, gFreqs[3], gBandwidths[3] }, 69135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { -300, gFreqs[4], gBandwidths[4] } 70135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent}; 71135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 72135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentconst AudioEqualizer::BandConfig gBandsJazz[kNumBands] = { 73135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { -600, gFreqs[0], gBandwidths[0] }, 74135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { 200, gFreqs[1], gBandwidths[1] }, 75135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { 400, gFreqs[2], gBandwidths[2] }, 76135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { -400, gFreqs[3], gBandwidths[3] }, 77135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { -600, gFreqs[4], gBandwidths[4] } 78135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent}; 79135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 80135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentconst AudioEqualizer::BandConfig gBandsPop[kNumBands] = { 81135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { 400, gFreqs[0], gBandwidths[0] }, 82135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { -400, gFreqs[1], gBandwidths[1] }, 83135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { 300, gFreqs[2], gBandwidths[2] }, 84135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { -400, gFreqs[3], gBandwidths[3] }, 85135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { 600, gFreqs[4], gBandwidths[4] } 86135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent}; 87135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 88135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentconst AudioEqualizer::BandConfig gBandsRock[kNumBands] = { 89135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { 700, gFreqs[0], gBandwidths[0] }, 90135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { 400, gFreqs[1], gBandwidths[1] }, 91135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { -400, gFreqs[2], gBandwidths[2] }, 92135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { 400, gFreqs[3], gBandwidths[3] }, 93135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { 200, gFreqs[4], gBandwidths[4] } 94135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent}; 95135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 96135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentconst AudioEqualizer::PresetConfig gEqualizerPresets[] = { 97135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { "Classic", gBandsClassic }, 98135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { "Jazz", gBandsJazz }, 99135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { "Pop", gBandsPop }, 100135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { "Rock", gBandsRock } 101135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent}; 102135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 103135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/////////////////// END EQ PRESETS ///////////////////////////////////////////// 104135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 105135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentstatic const size_t kBufferSize = 32; 106135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 107135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurenttypedef AudioFormatAdapter<AudioEqualizer, kBufferSize> FormatAdapter; 108135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 109135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentstruct EqualizerContext { 110135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent const struct effect_interface_s *itfe; 111135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent effect_config_t config; 112135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent FormatAdapter adapter; 113135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent AudioEqualizer * pEqualizer; 114e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent uint32_t state; 115135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent}; 116135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 117135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent//--- local function prototypes 118135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 119135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentint Equalizer_init(EqualizerContext *pContext); 1203d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurentint Equalizer_setConfig(EqualizerContext *pContext, effect_config_t *pConfig); 121b302bd5d288be2d3363b80053ca2392560b00b25Ashok Bhatint Equalizer_getParameter(AudioEqualizer * pEqualizer, int32_t *pParam, uint32_t *pValueSize, void *pValue); 122135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentint Equalizer_setParameter(AudioEqualizer * pEqualizer, int32_t *pParam, void *pValue); 123135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 124135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 125135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 126135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent//--- Effect Library Interface Implementation 127135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 128135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1295e92a7861196ddae14638d4b7a63fc4892b7ef59Glenn Kastenextern "C" int EffectCreate(const effect_uuid_t *uuid, 130e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent int32_t sessionId, 131e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent int32_t ioId, 132e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent effect_handle_t *pHandle) { 133135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int ret; 134135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int i; 135135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1363856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("EffectLibCreateEffect start"); 137135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 138e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent if (pHandle == NULL || uuid == NULL) { 139135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 140135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 141135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 142135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (memcmp(uuid, &gEqualizerDescriptor.uuid, sizeof(effect_uuid_t)) != 0) { 143135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 144135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 145135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 146135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent EqualizerContext *pContext = new EqualizerContext; 147135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 148135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->itfe = &gEqualizerInterface; 149135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->pEqualizer = NULL; 150e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent pContext->state = EQUALIZER_STATE_UNINITIALIZED; 151135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 152135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent ret = Equalizer_init(pContext); 153135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (ret < 0) { 1545ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("EffectLibCreateEffect() init failed"); 155135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent delete pContext; 156135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return ret; 157135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 158135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 159e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent *pHandle = (effect_handle_t)pContext; 160e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent pContext->state = EQUALIZER_STATE_INITIALIZED; 161135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1623856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("EffectLibCreateEffect %p, size %d", 163e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent pContext, AudioEqualizer::GetInstanceSize(kNumBands)+sizeof(EqualizerContext)); 164135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 165135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return 0; 166135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 167135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} /* end EffectCreate */ 168135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 169e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurentextern "C" int EffectRelease(effect_handle_t handle) { 170e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent EqualizerContext * pContext = (EqualizerContext *)handle; 171135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1723856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("EffectLibReleaseEffect %p", handle); 173135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (pContext == NULL) { 174135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 175135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 176135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 177e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent pContext->state = EQUALIZER_STATE_UNINITIALIZED; 178135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->pEqualizer->free(); 179135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent delete pContext; 180135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 181135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return 0; 182135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} /* end EffectRelease */ 183135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 1845e92a7861196ddae14638d4b7a63fc4892b7ef59Glenn Kastenextern "C" int EffectGetDescriptor(const effect_uuid_t *uuid, 185e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent effect_descriptor_t *pDescriptor) { 186e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent 187e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent if (pDescriptor == NULL || uuid == NULL){ 1883856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("EffectGetDescriptor() called with NULL pointer"); 189e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent return -EINVAL; 190e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent } 191e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent 192e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent if (memcmp(uuid, &gEqualizerDescriptor.uuid, sizeof(effect_uuid_t)) == 0) { 193a189a6883ee55cf62da1d7bf5bf5a8ab501938a4Glenn Kasten *pDescriptor = gEqualizerDescriptor; 194e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent return 0; 195e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent } 196e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent 197e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent return -EINVAL; 198e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent} /* end EffectGetDescriptor */ 199e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent 200135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 201135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 202135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent//--- local functions 203135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 204135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 205135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define CHECK_ARG(cond) { \ 206135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (!(cond)) { \ 2073856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Invalid argument: "#cond); \ 208135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; \ 209135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } \ 210135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} 211135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 212135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent//---------------------------------------------------------------------------- 2133d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent// Equalizer_setConfig() 214135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent//---------------------------------------------------------------------------- 215135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Purpose: Set input and output audio configuration. 216135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 217135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Inputs: 218135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// pContext: effect engine context 219135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// pConfig: pointer to effect_config_t structure holding input and output 220135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// configuration parameters 221135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 222135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Outputs: 223135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 224135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent//---------------------------------------------------------------------------- 225135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 2263d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurentint Equalizer_setConfig(EqualizerContext *pContext, effect_config_t *pConfig) 227135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent{ 2283d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent ALOGV("Equalizer_setConfig start"); 229135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 230135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent CHECK_ARG(pContext != NULL); 231135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent CHECK_ARG(pConfig != NULL); 232135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 233135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent CHECK_ARG(pConfig->inputCfg.samplingRate == pConfig->outputCfg.samplingRate); 234135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent CHECK_ARG(pConfig->inputCfg.channels == pConfig->outputCfg.channels); 235135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent CHECK_ARG(pConfig->inputCfg.format == pConfig->outputCfg.format); 236e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent CHECK_ARG((pConfig->inputCfg.channels == AUDIO_CHANNEL_OUT_MONO) || 237e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent (pConfig->inputCfg.channels == AUDIO_CHANNEL_OUT_STEREO)); 238135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent CHECK_ARG(pConfig->outputCfg.accessMode == EFFECT_BUFFER_ACCESS_WRITE 239135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent || pConfig->outputCfg.accessMode == EFFECT_BUFFER_ACCESS_ACCUMULATE); 240b7f08d386f2bddb8f3c87858f9204754b7fdb857Glenn Kasten CHECK_ARG(pConfig->inputCfg.format == AUDIO_FORMAT_PCM_16_BIT); 241135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 242135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int channelCount; 243e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent if (pConfig->inputCfg.channels == AUDIO_CHANNEL_OUT_MONO) { 244135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent channelCount = 1; 245135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } else { 246135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent channelCount = 2; 247135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 248135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent CHECK_ARG(channelCount <= AudioBiquadFilter::MAX_CHANNELS); 249135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 250a189a6883ee55cf62da1d7bf5bf5a8ab501938a4Glenn Kasten pContext->config = *pConfig; 251ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent 252135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->pEqualizer->configure(channelCount, 253135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pConfig->inputCfg.samplingRate); 254135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 255135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->adapter.configure(*pContext->pEqualizer, channelCount, 256135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pConfig->inputCfg.format, 257135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pConfig->outputCfg.accessMode); 258135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 259135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return 0; 2603d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent} // end Equalizer_setConfig 2613d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent 2623d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent//---------------------------------------------------------------------------- 2633d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent// Equalizer_getConfig() 2643d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent//---------------------------------------------------------------------------- 2653d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent// Purpose: Get input and output audio configuration. 2663d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent// 2673d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent// Inputs: 2683d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent// pContext: effect engine context 2693d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent// pConfig: pointer to effect_config_t structure holding input and output 2703d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent// configuration parameters 2713d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent// 2723d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent// Outputs: 2733d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent// 2743d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent//---------------------------------------------------------------------------- 2753d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent 2763d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurentvoid Equalizer_getConfig(EqualizerContext *pContext, effect_config_t *pConfig) 2773d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent{ 278a189a6883ee55cf62da1d7bf5bf5a8ab501938a4Glenn Kasten *pConfig = pContext->config; 2793d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent} // end Equalizer_getConfig 280135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 281135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 282135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent//---------------------------------------------------------------------------- 283135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Equalizer_init() 284135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent//---------------------------------------------------------------------------- 285135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Purpose: Initialize engine with default configuration and creates 286135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// AudioEqualizer instance. 287135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 288135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Inputs: 289135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// pContext: effect engine context 290135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 291135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Outputs: 292135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 293135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent//---------------------------------------------------------------------------- 294135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 295135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentint Equalizer_init(EqualizerContext *pContext) 296135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent{ 297135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int status; 298135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 2993856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Equalizer_init start"); 300135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 301135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent CHECK_ARG(pContext != NULL); 302135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 303135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (pContext->pEqualizer != NULL) { 304135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->pEqualizer->free(); 305135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 306135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 307135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->config.inputCfg.accessMode = EFFECT_BUFFER_ACCESS_READ; 308e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent pContext->config.inputCfg.channels = AUDIO_CHANNEL_OUT_STEREO; 309e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent pContext->config.inputCfg.format = AUDIO_FORMAT_PCM_16_BIT; 310135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->config.inputCfg.samplingRate = 44100; 311135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->config.inputCfg.bufferProvider.getBuffer = NULL; 312135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->config.inputCfg.bufferProvider.releaseBuffer = NULL; 313135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->config.inputCfg.bufferProvider.cookie = NULL; 314135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->config.inputCfg.mask = EFFECT_CONFIG_ALL; 315135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->config.outputCfg.accessMode = EFFECT_BUFFER_ACCESS_ACCUMULATE; 316e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent pContext->config.outputCfg.channels = AUDIO_CHANNEL_OUT_STEREO; 317e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent pContext->config.outputCfg.format = AUDIO_FORMAT_PCM_16_BIT; 318135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->config.outputCfg.samplingRate = 44100; 319135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->config.outputCfg.bufferProvider.getBuffer = NULL; 320135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->config.outputCfg.bufferProvider.releaseBuffer = NULL; 321135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->config.outputCfg.bufferProvider.cookie = NULL; 322135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->config.outputCfg.mask = EFFECT_CONFIG_ALL; 323135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 324135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->pEqualizer = AudioEqualizer::CreateInstance( 325135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent NULL, 326135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent kNumBands, 327135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent AudioBiquadFilter::MAX_CHANNELS, 328135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 44100, 329135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent gEqualizerPresets, 330135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent ARRAY_SIZE(gEqualizerPresets)); 331135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 332135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent for (int i = 0; i < kNumBands; ++i) { 333135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->pEqualizer->setFrequency(i, gFreqs[i]); 334135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->pEqualizer->setBandwidth(i, gBandwidths[i]); 335135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 336135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 337135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->pEqualizer->enable(true); 338135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 3393d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent Equalizer_setConfig(pContext, &pContext->config); 340135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 341135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return 0; 342135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} // end Equalizer_init 343135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 344135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 345135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent//---------------------------------------------------------------------------- 346135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Equalizer_getParameter() 347135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent//---------------------------------------------------------------------------- 348135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Purpose: 349135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Get a Equalizer parameter 350135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 351135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Inputs: 352135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// pEqualizer - handle to instance data 353135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// pParam - pointer to parameter 354135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// pValue - pointer to variable to hold retrieved value 355135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// pValueSize - pointer to value size: maximum size as input 356135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 357135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Outputs: 358135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// *pValue updated with parameter value 359135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// *pValueSize updated with actual value size 360135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 361135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 362135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Side Effects: 363135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 364135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent//---------------------------------------------------------------------------- 365135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 366b302bd5d288be2d3363b80053ca2392560b00b25Ashok Bhatint Equalizer_getParameter(AudioEqualizer * pEqualizer, int32_t *pParam, uint32_t *pValueSize, void *pValue) 367135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent{ 368135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int status = 0; 369135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int32_t param = *pParam++; 370135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int32_t param2; 371135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent char *name; 372135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 373135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent switch (param) { 374135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_NUM_BANDS: 375135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_CUR_PRESET: 376135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_GET_NUM_OF_PRESETS: 3773be9523784cc4038f601e510faee595117cdacb3Eric Laurent case EQ_PARAM_BAND_LEVEL: 3783be9523784cc4038f601e510faee595117cdacb3Eric Laurent case EQ_PARAM_GET_BAND: 379135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (*pValueSize < sizeof(int16_t)) { 380135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 381135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 382135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *pValueSize = sizeof(int16_t); 383135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 384135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 385135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_LEVEL_RANGE: 3863be9523784cc4038f601e510faee595117cdacb3Eric Laurent if (*pValueSize < 2 * sizeof(int16_t)) { 3873be9523784cc4038f601e510faee595117cdacb3Eric Laurent return -EINVAL; 3883be9523784cc4038f601e510faee595117cdacb3Eric Laurent } 3893be9523784cc4038f601e510faee595117cdacb3Eric Laurent *pValueSize = 2 * sizeof(int16_t); 3903be9523784cc4038f601e510faee595117cdacb3Eric Laurent break; 3913be9523784cc4038f601e510faee595117cdacb3Eric Laurent 392135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_BAND_FREQ_RANGE: 393135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (*pValueSize < 2 * sizeof(int32_t)) { 394135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 395135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 396135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *pValueSize = 2 * sizeof(int32_t); 397135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 3983be9523784cc4038f601e510faee595117cdacb3Eric Laurent 399135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_CENTER_FREQ: 400135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (*pValueSize < sizeof(int32_t)) { 401135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 402135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 403135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *pValueSize = sizeof(int32_t); 404135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 405135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 406135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_GET_PRESET_NAME: 407135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 408135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 4093be9523784cc4038f601e510faee595117cdacb3Eric Laurent case EQ_PARAM_PROPERTIES: 4103be9523784cc4038f601e510faee595117cdacb3Eric Laurent if (*pValueSize < (2 + kNumBands) * sizeof(uint16_t)) { 4113be9523784cc4038f601e510faee595117cdacb3Eric Laurent return -EINVAL; 4123be9523784cc4038f601e510faee595117cdacb3Eric Laurent } 4133be9523784cc4038f601e510faee595117cdacb3Eric Laurent *pValueSize = (2 + kNumBands) * sizeof(uint16_t); 4143be9523784cc4038f601e510faee595117cdacb3Eric Laurent break; 4153be9523784cc4038f601e510faee595117cdacb3Eric Laurent 416135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent default: 417135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 418135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 419135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 420135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent switch (param) { 421135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_NUM_BANDS: 4223be9523784cc4038f601e510faee595117cdacb3Eric Laurent *(uint16_t *)pValue = (uint16_t)kNumBands; 4233856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Equalizer_getParameter() EQ_PARAM_NUM_BANDS %d", *(int16_t *)pValue); 424135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 425135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 426135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_LEVEL_RANGE: 4273be9523784cc4038f601e510faee595117cdacb3Eric Laurent *(int16_t *)pValue = -9600; 4283be9523784cc4038f601e510faee595117cdacb3Eric Laurent *((int16_t *)pValue + 1) = 4800; 4293856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Equalizer_getParameter() EQ_PARAM_LEVEL_RANGE min %d, max %d", 430e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent *(int32_t *)pValue, *((int32_t *)pValue + 1)); 431135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 432135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 433135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_BAND_LEVEL: 434135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent param2 = *pParam; 435135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (param2 >= kNumBands) { 436135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent status = -EINVAL; 437135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 438135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 4393be9523784cc4038f601e510faee595117cdacb3Eric Laurent *(int16_t *)pValue = (int16_t)pEqualizer->getGain(param2); 4403856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Equalizer_getParameter() EQ_PARAM_BAND_LEVEL band %d, level %d", 441e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent param2, *(int32_t *)pValue); 442135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 443135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 444135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_CENTER_FREQ: 445135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent param2 = *pParam; 446135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (param2 >= kNumBands) { 447135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent status = -EINVAL; 448135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 449135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 450135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *(int32_t *)pValue = pEqualizer->getFrequency(param2); 4513856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Equalizer_getParameter() EQ_PARAM_CENTER_FREQ band %d, frequency %d", 452e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent param2, *(int32_t *)pValue); 453135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 454135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 455135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_BAND_FREQ_RANGE: 456135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent param2 = *pParam; 457135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (param2 >= kNumBands) { 458135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent status = -EINVAL; 459135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 460135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 461135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pEqualizer->getBandRange(param2, *(uint32_t *)pValue, *((uint32_t *)pValue + 1)); 4623856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Equalizer_getParameter() EQ_PARAM_BAND_FREQ_RANGE band %d, min %d, max %d", 463e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent param2, *(int32_t *)pValue, *((int32_t *)pValue + 1)); 464135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 465135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 466135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_GET_BAND: 467135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent param2 = *pParam; 4683be9523784cc4038f601e510faee595117cdacb3Eric Laurent *(uint16_t *)pValue = (uint16_t)pEqualizer->getMostRelevantBand(param2); 4693856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Equalizer_getParameter() EQ_PARAM_GET_BAND frequency %d, band %d", 470e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent param2, *(int32_t *)pValue); 471135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 472135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 473135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_CUR_PRESET: 4743be9523784cc4038f601e510faee595117cdacb3Eric Laurent *(uint16_t *)pValue = (uint16_t)pEqualizer->getPreset(); 4753856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Equalizer_getParameter() EQ_PARAM_CUR_PRESET %d", *(int32_t *)pValue); 476135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 477135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 478135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_GET_NUM_OF_PRESETS: 4793be9523784cc4038f601e510faee595117cdacb3Eric Laurent *(uint16_t *)pValue = (uint16_t)pEqualizer->getNumPresets(); 4803856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Equalizer_getParameter() EQ_PARAM_GET_NUM_OF_PRESETS %d", *(int16_t *)pValue); 481135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 482135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 483135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_GET_PRESET_NAME: 484135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent param2 = *pParam; 485135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (param2 >= pEqualizer->getNumPresets()) { 486135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent status = -EINVAL; 487135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 488135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 489135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent name = (char *)pValue; 490135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent strncpy(name, pEqualizer->getPresetName(param2), *pValueSize - 1); 491135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent name[*pValueSize - 1] = 0; 492135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *pValueSize = strlen(name) + 1; 4933856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Equalizer_getParameter() EQ_PARAM_GET_PRESET_NAME preset %d, name %s len %d", 494e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent param2, gEqualizerPresets[param2].name, *pValueSize); 495135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 496135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 4973be9523784cc4038f601e510faee595117cdacb3Eric Laurent case EQ_PARAM_PROPERTIES: { 4983be9523784cc4038f601e510faee595117cdacb3Eric Laurent int16_t *p = (int16_t *)pValue; 4993856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Equalizer_getParameter() EQ_PARAM_PROPERTIES"); 5003be9523784cc4038f601e510faee595117cdacb3Eric Laurent p[0] = (int16_t)pEqualizer->getPreset(); 5013be9523784cc4038f601e510faee595117cdacb3Eric Laurent p[1] = (int16_t)kNumBands; 5023be9523784cc4038f601e510faee595117cdacb3Eric Laurent for (int i = 0; i < kNumBands; i++) { 5033be9523784cc4038f601e510faee595117cdacb3Eric Laurent p[2 + i] = (int16_t)pEqualizer->getGain(i); 5043be9523784cc4038f601e510faee595117cdacb3Eric Laurent } 5053be9523784cc4038f601e510faee595117cdacb3Eric Laurent } break; 5063be9523784cc4038f601e510faee595117cdacb3Eric Laurent 507135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent default: 5083856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Equalizer_getParameter() invalid param %d", param); 509135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent status = -EINVAL; 510135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 511135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 512135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 513135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return status; 514135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} // end Equalizer_getParameter 515135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 516135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 517135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent//---------------------------------------------------------------------------- 518135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Equalizer_setParameter() 519135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent//---------------------------------------------------------------------------- 520135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Purpose: 521135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Set a Equalizer parameter 522135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 523135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Inputs: 524135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// pEqualizer - handle to instance data 525135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// pParam - pointer to parameter 526135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// pValue - pointer to value 527135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 528135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Outputs: 529135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 530135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 531135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Side Effects: 532135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 533135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent//---------------------------------------------------------------------------- 534135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 535135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentint Equalizer_setParameter (AudioEqualizer * pEqualizer, int32_t *pParam, void *pValue) 536135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent{ 537135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int status = 0; 538135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int32_t preset; 539135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int32_t band; 540135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int32_t level; 541135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int32_t param = *pParam++; 542135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 543135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 544135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent switch (param) { 545135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_CUR_PRESET: 5463be9523784cc4038f601e510faee595117cdacb3Eric Laurent preset = (int32_t)(*(uint16_t *)pValue); 547135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 5483856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("setParameter() EQ_PARAM_CUR_PRESET %d", preset); 5493be9523784cc4038f601e510faee595117cdacb3Eric Laurent if (preset < 0 || preset >= pEqualizer->getNumPresets()) { 550135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent status = -EINVAL; 551135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 552135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 553135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pEqualizer->setPreset(preset); 554135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pEqualizer->commit(true); 555135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 556135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_BAND_LEVEL: 557135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent band = *pParam; 5583be9523784cc4038f601e510faee595117cdacb3Eric Laurent level = (int32_t)(*(int16_t *)pValue); 5593856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("setParameter() EQ_PARAM_BAND_LEVEL band %d, level %d", band, level); 560135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (band >= kNumBands) { 561135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent status = -EINVAL; 562135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 563135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 564135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pEqualizer->setGain(band, level); 565135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pEqualizer->commit(true); 566135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 5673be9523784cc4038f601e510faee595117cdacb3Eric Laurent case EQ_PARAM_PROPERTIES: { 5683856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("setParameter() EQ_PARAM_PROPERTIES"); 5693be9523784cc4038f601e510faee595117cdacb3Eric Laurent int16_t *p = (int16_t *)pValue; 5703be9523784cc4038f601e510faee595117cdacb3Eric Laurent if ((int)p[0] >= pEqualizer->getNumPresets()) { 5713be9523784cc4038f601e510faee595117cdacb3Eric Laurent status = -EINVAL; 5723be9523784cc4038f601e510faee595117cdacb3Eric Laurent break; 5733be9523784cc4038f601e510faee595117cdacb3Eric Laurent } 5743be9523784cc4038f601e510faee595117cdacb3Eric Laurent if (p[0] >= 0) { 5753be9523784cc4038f601e510faee595117cdacb3Eric Laurent pEqualizer->setPreset((int)p[0]); 5763be9523784cc4038f601e510faee595117cdacb3Eric Laurent } else { 5773be9523784cc4038f601e510faee595117cdacb3Eric Laurent if ((int)p[1] != kNumBands) { 5783be9523784cc4038f601e510faee595117cdacb3Eric Laurent status = -EINVAL; 5793be9523784cc4038f601e510faee595117cdacb3Eric Laurent break; 5803be9523784cc4038f601e510faee595117cdacb3Eric Laurent } 5813be9523784cc4038f601e510faee595117cdacb3Eric Laurent for (int i = 0; i < kNumBands; i++) { 5823be9523784cc4038f601e510faee595117cdacb3Eric Laurent pEqualizer->setGain(i, (int32_t)p[2 + i]); 5833be9523784cc4038f601e510faee595117cdacb3Eric Laurent } 5843be9523784cc4038f601e510faee595117cdacb3Eric Laurent } 5853be9523784cc4038f601e510faee595117cdacb3Eric Laurent pEqualizer->commit(true); 5863be9523784cc4038f601e510faee595117cdacb3Eric Laurent } break; 587135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent default: 5883856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("setParameter() invalid param %d", param); 5893be9523784cc4038f601e510faee595117cdacb3Eric Laurent status = -EINVAL; 590135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 591135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 592135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 593135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return status; 594135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} // end Equalizer_setParameter 595135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 596135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} // namespace 597135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} // namespace 598135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 599135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 600135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 601135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent//--- Effect Control Interface Implementation 602135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 603135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 604e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurentextern "C" int Equalizer_process(effect_handle_t self, audio_buffer_t *inBuffer, audio_buffer_t *outBuffer) 605135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent{ 606135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent android::EqualizerContext * pContext = (android::EqualizerContext *) self; 607135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 608135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (pContext == NULL) { 609135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 610135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 611135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (inBuffer == NULL || inBuffer->raw == NULL || 612135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent outBuffer == NULL || outBuffer->raw == NULL || 613135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent inBuffer->frameCount != outBuffer->frameCount) { 614135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 615135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 616135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 617e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent if (pContext->state == EQUALIZER_STATE_UNINITIALIZED) { 618e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent return -EINVAL; 619e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent } 620e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent if (pContext->state == EQUALIZER_STATE_INITIALIZED) { 621e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent return -ENODATA; 622e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent } 623e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent 624135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->adapter.process(inBuffer->raw, outBuffer->raw, outBuffer->frameCount); 625ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent 626135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return 0; 627135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} // end Equalizer_process 628135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 629e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurentextern "C" int Equalizer_command(effect_handle_t self, uint32_t cmdCode, uint32_t cmdSize, 63025f4395b932fa9859a6e91ba77c5d20d009da64aEric Laurent void *pCmdData, uint32_t *replySize, void *pReplyData) { 631135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 632135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent android::EqualizerContext * pContext = (android::EqualizerContext *) self; 633135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int retsize; 634135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 635e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent if (pContext == NULL || pContext->state == EQUALIZER_STATE_UNINITIALIZED) { 636135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 637135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 638135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 639135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent android::AudioEqualizer * pEqualizer = pContext->pEqualizer; 640135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 6413856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Equalizer_command command %d cmdSize %d",cmdCode, cmdSize); 642135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 643135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent switch (cmdCode) { 644135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EFFECT_CMD_INIT: 645135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (pReplyData == NULL || *replySize != sizeof(int)) { 646135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 647135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 648135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *(int *) pReplyData = Equalizer_init(pContext); 649135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 6503d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent case EFFECT_CMD_SET_CONFIG: 651135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (pCmdData == NULL || cmdSize != sizeof(effect_config_t) 652135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent || pReplyData == NULL || *replySize != sizeof(int)) { 653135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 654135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 6553d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent *(int *) pReplyData = Equalizer_setConfig(pContext, 656135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent (effect_config_t *) pCmdData); 657135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 6583d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent case EFFECT_CMD_GET_CONFIG: 6593d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent if (pReplyData == NULL || *replySize != sizeof(effect_config_t)) { 6603d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent return -EINVAL; 6613d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent } 6623d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent Equalizer_getConfig(pContext, (effect_config_t *) pCmdData); 6633d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent break; 664135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EFFECT_CMD_RESET: 6653d5188bd6abe55898f10a0edf3c05aff8aa2ef67Eric Laurent Equalizer_setConfig(pContext, &pContext->config); 666135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 667135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EFFECT_CMD_GET_PARAM: { 668b302bd5d288be2d3363b80053ca2392560b00b25Ashok Bhat if (pCmdData == NULL || cmdSize < (sizeof(effect_param_t) + sizeof(int32_t)) || 669b302bd5d288be2d3363b80053ca2392560b00b25Ashok Bhat pReplyData == NULL || *replySize < (sizeof(effect_param_t) + sizeof(int32_t))) { 670135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 671135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 672135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent effect_param_t *p = (effect_param_t *)pCmdData; 673135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent memcpy(pReplyData, pCmdData, sizeof(effect_param_t) + p->psize); 674135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent p = (effect_param_t *)pReplyData; 675135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int voffset = ((p->psize - 1) / sizeof(int32_t) + 1) * sizeof(int32_t); 676135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent p->status = android::Equalizer_getParameter(pEqualizer, (int32_t *)p->data, &p->vsize, 677135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent p->data + voffset); 678135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *replySize = sizeof(effect_param_t) + voffset + p->vsize; 6793856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Equalizer_command EFFECT_CMD_GET_PARAM *pCmdData %d, *replySize %d, *pReplyData %08x %08x", 680135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *(int32_t *)((char *)pCmdData + sizeof(effect_param_t)), *replySize, 681135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *(int32_t *)((char *)pReplyData + sizeof(effect_param_t) + voffset), 682135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *(int32_t *)((char *)pReplyData + sizeof(effect_param_t) + voffset + sizeof(int32_t))); 683135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 684135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } break; 685135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EFFECT_CMD_SET_PARAM: { 6863856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Equalizer_command EFFECT_CMD_SET_PARAM cmdSize %d pCmdData %p, *replySize %d, pReplyData %p", 687e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent cmdSize, pCmdData, *replySize, pReplyData); 688b302bd5d288be2d3363b80053ca2392560b00b25Ashok Bhat if (pCmdData == NULL || cmdSize < (sizeof(effect_param_t) + sizeof(int32_t)) || 689135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReplyData == NULL || *replySize != sizeof(int32_t)) { 690135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 691135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 692135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent effect_param_t *p = (effect_param_t *) pCmdData; 693135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *(int *)pReplyData = android::Equalizer_setParameter(pEqualizer, (int32_t *)p->data, 694135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent p->data + p->psize); 695135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } break; 696ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent case EFFECT_CMD_ENABLE: 697e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent if (pReplyData == NULL || *replySize != sizeof(int)) { 698e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent return -EINVAL; 699e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent } 700e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent if (pContext->state != EQUALIZER_STATE_INITIALIZED) { 701e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent return -ENOSYS; 702e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent } 703e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent pContext->state = EQUALIZER_STATE_ACTIVE; 7043856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("EFFECT_CMD_ENABLE() OK"); 705e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent *(int *)pReplyData = 0; 706e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent break; 707ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent case EFFECT_CMD_DISABLE: 708ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent if (pReplyData == NULL || *replySize != sizeof(int)) { 709ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent return -EINVAL; 710ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent } 711e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent if (pContext->state != EQUALIZER_STATE_ACTIVE) { 712e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent return -ENOSYS; 713e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent } 714e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent pContext->state = EQUALIZER_STATE_INITIALIZED; 7153856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("EFFECT_CMD_DISABLE() OK"); 716ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent *(int *)pReplyData = 0; 717ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent break; 718ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent case EFFECT_CMD_SET_DEVICE: 719ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent case EFFECT_CMD_SET_VOLUME: 720ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent case EFFECT_CMD_SET_AUDIO_MODE: 721ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent break; 722135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent default: 7235ff1dd576bb93c45b44088a51544a18fc43ebf58Steve Block ALOGW("Equalizer_command invalid command %d",cmdCode); 724135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 725135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 726135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 727135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return 0; 728135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} 729135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 730e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurentextern "C" int Equalizer_getDescriptor(effect_handle_t self, 731e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent effect_descriptor_t *pDescriptor) 732e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent{ 733e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent android::EqualizerContext * pContext = (android::EqualizerContext *) self; 734e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent 735e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent if (pContext == NULL || pDescriptor == NULL) { 7363856b090cd04ba5dd4a59a12430ed724d5995909Steve Block ALOGV("Equalizer_getDescriptor() invalid param"); 737e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent return -EINVAL; 738e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent } 739e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent 740a189a6883ee55cf62da1d7bf5bf5a8ab501938a4Glenn Kasten *pDescriptor = android::gEqualizerDescriptor; 741e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent 742e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent return 0; 743e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent} 744e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent 745e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent// effect_handle_t interface implementation for equalizer effect 746135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentconst struct effect_interface_s gEqualizerInterface = { 747135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent Equalizer_process, 748e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent Equalizer_command, 749ba7b8f881a9b6b21803752326d2932a3bd42d7cfEric Laurent Equalizer_getDescriptor, 750ba7b8f881a9b6b21803752326d2932a3bd42d7cfEric Laurent NULL 751135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent}; 752135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 753135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 754e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurentaudio_effect_library_t AUDIO_EFFECT_LIBRARY_INFO_SYM = { 755e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent tag : AUDIO_EFFECT_LIBRARY_TAG, 756e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent version : EFFECT_LIBRARY_API_VERSION, 757e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent name : "Test Equalizer Library", 758e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent implementor : "The Android Open Source Project", 759e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent create_effect : android::EffectCreate, 760e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent release_effect : android::EffectRelease, 761e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent get_descriptor : android::EffectGetDescriptor, 762e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent}; 763