EffectEqualizer.cpp revision e1315cf0b63b4c14a77046519e6b01f6f60d74b0
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" 29135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#include <media/EffectEqualizerApi.h> 30135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 31e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent// effect_handle_t interface implementation for equalizer effect 32135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentextern "C" const struct effect_interface_s gEqualizerInterface; 33135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 34e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurentenum equalizer_state_e { 35e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent EQUALIZER_STATE_UNINITIALIZED, 36e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent EQUALIZER_STATE_INITIALIZED, 37e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent EQUALIZER_STATE_ACTIVE, 38e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent}; 39e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent 40135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentnamespace android { 41135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentnamespace { 42135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 43135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Google Graphic Equalizer UUID: e25aa840-543b-11df-98a5-0002a5d5c51b 44135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentconst effect_descriptor_t gEqualizerDescriptor = { 45135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent {0x0bed4300, 0xddd6, 0x11db, 0x8f34, {0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}}, // type 46135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent {0xe25aa840, 0x543b, 0x11df, 0x98a5, {0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}}, // uuid 47e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent EFFECT_CONTROL_API_VERSION, 48135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent (EFFECT_FLAG_TYPE_INSERT | EFFECT_FLAG_INSERT_LAST), 49ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent 0, // TODO 50ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent 1, 51135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent "Graphic Equalizer", 52e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent "The Android Open Source Project", 53135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent}; 54135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 55135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/////////////////// BEGIN EQ PRESETS /////////////////////////////////////////// 56135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentconst int kNumBands = 5; 57135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentconst uint32_t gFreqs[kNumBands] = { 50000, 125000, 900000, 3200000, 6300000 }; 58135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentconst uint32_t gBandwidths[kNumBands] = { 0, 3600, 3600, 2400, 0 }; 59135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 60135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentconst AudioEqualizer::BandConfig gBandsClassic[kNumBands] = { 61135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { 300, gFreqs[0], gBandwidths[0] }, 62135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { 400, gFreqs[1], gBandwidths[1] }, 63135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { 0, gFreqs[2], gBandwidths[2] }, 64135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { 200, gFreqs[3], gBandwidths[3] }, 65135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { -300, gFreqs[4], gBandwidths[4] } 66135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent}; 67135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 68135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentconst AudioEqualizer::BandConfig gBandsJazz[kNumBands] = { 69135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { -600, gFreqs[0], gBandwidths[0] }, 70135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { 200, gFreqs[1], gBandwidths[1] }, 71135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { 400, gFreqs[2], gBandwidths[2] }, 72135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { -400, gFreqs[3], gBandwidths[3] }, 73135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { -600, gFreqs[4], gBandwidths[4] } 74135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent}; 75135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 76135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentconst AudioEqualizer::BandConfig gBandsPop[kNumBands] = { 77135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { 400, gFreqs[0], gBandwidths[0] }, 78135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { -400, gFreqs[1], gBandwidths[1] }, 79135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { 300, gFreqs[2], gBandwidths[2] }, 80135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { -400, gFreqs[3], gBandwidths[3] }, 81135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { 600, gFreqs[4], gBandwidths[4] } 82135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent}; 83135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 84135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentconst AudioEqualizer::BandConfig gBandsRock[kNumBands] = { 85135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { 700, gFreqs[0], gBandwidths[0] }, 86135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { 400, gFreqs[1], gBandwidths[1] }, 87135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { -400, gFreqs[2], gBandwidths[2] }, 88135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { 400, gFreqs[3], gBandwidths[3] }, 89135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { 200, gFreqs[4], gBandwidths[4] } 90135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent}; 91135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 92135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentconst AudioEqualizer::PresetConfig gEqualizerPresets[] = { 93135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { "Classic", gBandsClassic }, 94135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { "Jazz", gBandsJazz }, 95135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { "Pop", gBandsPop }, 96135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent { "Rock", gBandsRock } 97135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent}; 98135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 99135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent/////////////////// END EQ PRESETS ///////////////////////////////////////////// 100135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 101135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentstatic const size_t kBufferSize = 32; 102135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 103135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurenttypedef AudioFormatAdapter<AudioEqualizer, kBufferSize> FormatAdapter; 104135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 105135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentstruct EqualizerContext { 106135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent const struct effect_interface_s *itfe; 107135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent effect_config_t config; 108135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent FormatAdapter adapter; 109135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent AudioEqualizer * pEqualizer; 110e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent uint32_t state; 111135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent}; 112135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 113135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent//--- local function prototypes 114135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 115135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentint Equalizer_init(EqualizerContext *pContext); 116135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentint Equalizer_configure(EqualizerContext *pContext, effect_config_t *pConfig); 117135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentint Equalizer_getParameter(AudioEqualizer * pEqualizer, int32_t *pParam, size_t *pValueSize, void *pValue); 118135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentint Equalizer_setParameter(AudioEqualizer * pEqualizer, int32_t *pParam, void *pValue); 119135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 120135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 121135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 122135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent//--- Effect Library Interface Implementation 123135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 124135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 125be916aa1267e2e6b1c148f51d11bcbbc79cb864cEric Laurentextern "C" int EffectQueryNumberEffects(uint32_t *pNumEffects) { 126135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *pNumEffects = 1; 127135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return 0; 128135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} /* end EffectQueryNumberEffects */ 129135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 130e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurentextern "C" int EffectQueryEffect(uint32_t index, 131e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent effect_descriptor_t *pDescriptor) { 132135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (pDescriptor == NULL) { 133135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 134135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 135ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent if (index > 0) { 136ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent return -EINVAL; 137135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 138135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent memcpy(pDescriptor, &gEqualizerDescriptor, sizeof(effect_descriptor_t)); 139135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return 0; 140135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} /* end EffectQueryNext */ 141135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 142135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentextern "C" int EffectCreate(effect_uuid_t *uuid, 143e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent int32_t sessionId, 144e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent int32_t ioId, 145e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent effect_handle_t *pHandle) { 146135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int ret; 147135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int i; 148135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 149135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("EffectLibCreateEffect start"); 150135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 151e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent if (pHandle == NULL || uuid == NULL) { 152135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 153135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 154135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 155135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (memcmp(uuid, &gEqualizerDescriptor.uuid, sizeof(effect_uuid_t)) != 0) { 156135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 157135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 158135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 159135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent EqualizerContext *pContext = new EqualizerContext; 160135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 161135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->itfe = &gEqualizerInterface; 162135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->pEqualizer = NULL; 163e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent pContext->state = EQUALIZER_STATE_UNINITIALIZED; 164135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 165135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent ret = Equalizer_init(pContext); 166135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (ret < 0) { 167135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGW("EffectLibCreateEffect() init failed"); 168135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent delete pContext; 169135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return ret; 170135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 171135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 172e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent *pHandle = (effect_handle_t)pContext; 173e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent pContext->state = EQUALIZER_STATE_INITIALIZED; 174135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 175e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent LOGV("EffectLibCreateEffect %p, size %d", 176e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent pContext, AudioEqualizer::GetInstanceSize(kNumBands)+sizeof(EqualizerContext)); 177135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 178135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return 0; 179135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 180135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} /* end EffectCreate */ 181135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 182e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurentextern "C" int EffectRelease(effect_handle_t handle) { 183e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent EqualizerContext * pContext = (EqualizerContext *)handle; 184135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 185e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent LOGV("EffectLibReleaseEffect %p", handle); 186135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (pContext == NULL) { 187135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 188135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 189135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 190e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent pContext->state = EQUALIZER_STATE_UNINITIALIZED; 191135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->pEqualizer->free(); 192135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent delete pContext; 193135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 194135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return 0; 195135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} /* end EffectRelease */ 196135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 197e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurentextern "C" int EffectGetDescriptor(effect_uuid_t *uuid, 198e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent effect_descriptor_t *pDescriptor) { 199e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent 200e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent if (pDescriptor == NULL || uuid == NULL){ 201e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent LOGV("EffectGetDescriptor() called with NULL pointer"); 202e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent return -EINVAL; 203e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent } 204e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent 205e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent if (memcmp(uuid, &gEqualizerDescriptor.uuid, sizeof(effect_uuid_t)) == 0) { 206e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent memcpy(pDescriptor, &gEqualizerDescriptor, sizeof(effect_descriptor_t)); 207e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent return 0; 208e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent } 209e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent 210e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent return -EINVAL; 211e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent} /* end EffectGetDescriptor */ 212e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent 213135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 214135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 215135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent//--- local functions 216135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 217135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 218135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent#define CHECK_ARG(cond) { \ 219135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (!(cond)) { \ 220135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("Invalid argument: "#cond); \ 221135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; \ 222135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } \ 223135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} 224135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 225135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent//---------------------------------------------------------------------------- 226135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Equalizer_configure() 227135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent//---------------------------------------------------------------------------- 228135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Purpose: Set input and output audio configuration. 229135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 230135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Inputs: 231135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// pContext: effect engine context 232135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// pConfig: pointer to effect_config_t structure holding input and output 233135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// configuration parameters 234135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 235135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Outputs: 236135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 237135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent//---------------------------------------------------------------------------- 238135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 239135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentint Equalizer_configure(EqualizerContext *pContext, effect_config_t *pConfig) 240135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent{ 241135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("Equalizer_configure start"); 242135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 243135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent CHECK_ARG(pContext != NULL); 244135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent CHECK_ARG(pConfig != NULL); 245135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 246135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent CHECK_ARG(pConfig->inputCfg.samplingRate == pConfig->outputCfg.samplingRate); 247135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent CHECK_ARG(pConfig->inputCfg.channels == pConfig->outputCfg.channels); 248135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent CHECK_ARG(pConfig->inputCfg.format == pConfig->outputCfg.format); 249e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent CHECK_ARG((pConfig->inputCfg.channels == AUDIO_CHANNEL_OUT_MONO) || 250e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent (pConfig->inputCfg.channels == AUDIO_CHANNEL_OUT_STEREO)); 251135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent CHECK_ARG(pConfig->outputCfg.accessMode == EFFECT_BUFFER_ACCESS_WRITE 252135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent || pConfig->outputCfg.accessMode == EFFECT_BUFFER_ACCESS_ACCUMULATE); 253e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent CHECK_ARG(pConfig->inputCfg.format == AUDIO_FORMAT_PCM_8_24_BIT 254e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent || pConfig->inputCfg.format == AUDIO_FORMAT_PCM_16_BIT); 255135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 256135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int channelCount; 257e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent if (pConfig->inputCfg.channels == AUDIO_CHANNEL_OUT_MONO) { 258135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent channelCount = 1; 259135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } else { 260135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent channelCount = 2; 261135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 262135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent CHECK_ARG(channelCount <= AudioBiquadFilter::MAX_CHANNELS); 263135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 264ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent memcpy(&pContext->config, pConfig, sizeof(effect_config_t)); 265ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent 266135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->pEqualizer->configure(channelCount, 267135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pConfig->inputCfg.samplingRate); 268135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 269135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->adapter.configure(*pContext->pEqualizer, channelCount, 270135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pConfig->inputCfg.format, 271135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pConfig->outputCfg.accessMode); 272135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 273135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return 0; 274135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} // end Equalizer_configure 275135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 276135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 277135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent//---------------------------------------------------------------------------- 278135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Equalizer_init() 279135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent//---------------------------------------------------------------------------- 280135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Purpose: Initialize engine with default configuration and creates 281135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// AudioEqualizer instance. 282135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 283135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Inputs: 284135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// pContext: effect engine context 285135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 286135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Outputs: 287135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 288135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent//---------------------------------------------------------------------------- 289135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 290135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentint Equalizer_init(EqualizerContext *pContext) 291135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent{ 292135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int status; 293135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 294135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("Equalizer_init start"); 295135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 296135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent CHECK_ARG(pContext != NULL); 297135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 298135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (pContext->pEqualizer != NULL) { 299135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->pEqualizer->free(); 300135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 301135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 302135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->config.inputCfg.accessMode = EFFECT_BUFFER_ACCESS_READ; 303e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent pContext->config.inputCfg.channels = AUDIO_CHANNEL_OUT_STEREO; 304e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent pContext->config.inputCfg.format = AUDIO_FORMAT_PCM_16_BIT; 305135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->config.inputCfg.samplingRate = 44100; 306135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->config.inputCfg.bufferProvider.getBuffer = NULL; 307135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->config.inputCfg.bufferProvider.releaseBuffer = NULL; 308135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->config.inputCfg.bufferProvider.cookie = NULL; 309135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->config.inputCfg.mask = EFFECT_CONFIG_ALL; 310135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->config.outputCfg.accessMode = EFFECT_BUFFER_ACCESS_ACCUMULATE; 311e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent pContext->config.outputCfg.channels = AUDIO_CHANNEL_OUT_STEREO; 312e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent pContext->config.outputCfg.format = AUDIO_FORMAT_PCM_16_BIT; 313135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->config.outputCfg.samplingRate = 44100; 314135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->config.outputCfg.bufferProvider.getBuffer = NULL; 315135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->config.outputCfg.bufferProvider.releaseBuffer = NULL; 316135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->config.outputCfg.bufferProvider.cookie = NULL; 317135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->config.outputCfg.mask = EFFECT_CONFIG_ALL; 318135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 319135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->pEqualizer = AudioEqualizer::CreateInstance( 320135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent NULL, 321135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent kNumBands, 322135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent AudioBiquadFilter::MAX_CHANNELS, 323135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 44100, 324135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent gEqualizerPresets, 325135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent ARRAY_SIZE(gEqualizerPresets)); 326135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 327135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent for (int i = 0; i < kNumBands; ++i) { 328135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->pEqualizer->setFrequency(i, gFreqs[i]); 329135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->pEqualizer->setBandwidth(i, gBandwidths[i]); 330135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 331135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 332135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->pEqualizer->enable(true); 333135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 334135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent Equalizer_configure(pContext, &pContext->config); 335135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 336135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return 0; 337135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} // end Equalizer_init 338135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 339135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 340135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent//---------------------------------------------------------------------------- 341135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Equalizer_getParameter() 342135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent//---------------------------------------------------------------------------- 343135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Purpose: 344135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Get a Equalizer parameter 345135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 346135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Inputs: 347135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// pEqualizer - handle to instance data 348135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// pParam - pointer to parameter 349135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// pValue - pointer to variable to hold retrieved value 350135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// pValueSize - pointer to value size: maximum size as input 351135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 352135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Outputs: 353135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// *pValue updated with parameter value 354135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// *pValueSize updated with actual value size 355135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 356135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 357135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Side Effects: 358135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 359135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent//---------------------------------------------------------------------------- 360135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 361135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentint Equalizer_getParameter(AudioEqualizer * pEqualizer, int32_t *pParam, size_t *pValueSize, void *pValue) 362135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent{ 363135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int status = 0; 364135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int32_t param = *pParam++; 365135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int32_t param2; 366135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent char *name; 367135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 368135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent switch (param) { 369135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_NUM_BANDS: 370135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_CUR_PRESET: 371135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_GET_NUM_OF_PRESETS: 3723be9523784cc4038f601e510faee595117cdacb3Eric Laurent case EQ_PARAM_BAND_LEVEL: 3733be9523784cc4038f601e510faee595117cdacb3Eric Laurent case EQ_PARAM_GET_BAND: 374135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (*pValueSize < sizeof(int16_t)) { 375135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 376135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 377135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *pValueSize = sizeof(int16_t); 378135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 379135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 380135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_LEVEL_RANGE: 3813be9523784cc4038f601e510faee595117cdacb3Eric Laurent if (*pValueSize < 2 * sizeof(int16_t)) { 3823be9523784cc4038f601e510faee595117cdacb3Eric Laurent return -EINVAL; 3833be9523784cc4038f601e510faee595117cdacb3Eric Laurent } 3843be9523784cc4038f601e510faee595117cdacb3Eric Laurent *pValueSize = 2 * sizeof(int16_t); 3853be9523784cc4038f601e510faee595117cdacb3Eric Laurent break; 3863be9523784cc4038f601e510faee595117cdacb3Eric Laurent 387135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_BAND_FREQ_RANGE: 388135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (*pValueSize < 2 * sizeof(int32_t)) { 389135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 390135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 391135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *pValueSize = 2 * sizeof(int32_t); 392135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 3933be9523784cc4038f601e510faee595117cdacb3Eric Laurent 394135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_CENTER_FREQ: 395135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (*pValueSize < sizeof(int32_t)) { 396135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 397135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 398135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *pValueSize = sizeof(int32_t); 399135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 400135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 401135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_GET_PRESET_NAME: 402135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 403135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 4043be9523784cc4038f601e510faee595117cdacb3Eric Laurent case EQ_PARAM_PROPERTIES: 4053be9523784cc4038f601e510faee595117cdacb3Eric Laurent if (*pValueSize < (2 + kNumBands) * sizeof(uint16_t)) { 4063be9523784cc4038f601e510faee595117cdacb3Eric Laurent return -EINVAL; 4073be9523784cc4038f601e510faee595117cdacb3Eric Laurent } 4083be9523784cc4038f601e510faee595117cdacb3Eric Laurent *pValueSize = (2 + kNumBands) * sizeof(uint16_t); 4093be9523784cc4038f601e510faee595117cdacb3Eric Laurent break; 4103be9523784cc4038f601e510faee595117cdacb3Eric Laurent 411135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent default: 412135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 413135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 414135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 415135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent switch (param) { 416135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_NUM_BANDS: 4173be9523784cc4038f601e510faee595117cdacb3Eric Laurent *(uint16_t *)pValue = (uint16_t)kNumBands; 418135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("Equalizer_getParameter() EQ_PARAM_NUM_BANDS %d", *(int16_t *)pValue); 419135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 420135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 421135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_LEVEL_RANGE: 4223be9523784cc4038f601e510faee595117cdacb3Eric Laurent *(int16_t *)pValue = -9600; 4233be9523784cc4038f601e510faee595117cdacb3Eric Laurent *((int16_t *)pValue + 1) = 4800; 424e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent LOGV("Equalizer_getParameter() EQ_PARAM_LEVEL_RANGE min %d, max %d", 425e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent *(int32_t *)pValue, *((int32_t *)pValue + 1)); 426135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 427135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 428135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_BAND_LEVEL: 429135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent param2 = *pParam; 430135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (param2 >= kNumBands) { 431135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent status = -EINVAL; 432135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 433135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 4343be9523784cc4038f601e510faee595117cdacb3Eric Laurent *(int16_t *)pValue = (int16_t)pEqualizer->getGain(param2); 435e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent LOGV("Equalizer_getParameter() EQ_PARAM_BAND_LEVEL band %d, level %d", 436e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent param2, *(int32_t *)pValue); 437135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 438135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 439135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_CENTER_FREQ: 440135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent param2 = *pParam; 441135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (param2 >= kNumBands) { 442135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent status = -EINVAL; 443135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 444135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 445135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *(int32_t *)pValue = pEqualizer->getFrequency(param2); 446e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent LOGV("Equalizer_getParameter() EQ_PARAM_CENTER_FREQ band %d, frequency %d", 447e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent param2, *(int32_t *)pValue); 448135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 449135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 450135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_BAND_FREQ_RANGE: 451135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent param2 = *pParam; 452135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (param2 >= kNumBands) { 453135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent status = -EINVAL; 454135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 455135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 456135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pEqualizer->getBandRange(param2, *(uint32_t *)pValue, *((uint32_t *)pValue + 1)); 457e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent LOGV("Equalizer_getParameter() EQ_PARAM_BAND_FREQ_RANGE band %d, min %d, max %d", 458e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent param2, *(int32_t *)pValue, *((int32_t *)pValue + 1)); 459135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 460135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 461135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_GET_BAND: 462135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent param2 = *pParam; 4633be9523784cc4038f601e510faee595117cdacb3Eric Laurent *(uint16_t *)pValue = (uint16_t)pEqualizer->getMostRelevantBand(param2); 464e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent LOGV("Equalizer_getParameter() EQ_PARAM_GET_BAND frequency %d, band %d", 465e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent param2, *(int32_t *)pValue); 466135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 467135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 468135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_CUR_PRESET: 4693be9523784cc4038f601e510faee595117cdacb3Eric Laurent *(uint16_t *)pValue = (uint16_t)pEqualizer->getPreset(); 470135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("Equalizer_getParameter() EQ_PARAM_CUR_PRESET %d", *(int32_t *)pValue); 471135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 472135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 473135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_GET_NUM_OF_PRESETS: 4743be9523784cc4038f601e510faee595117cdacb3Eric Laurent *(uint16_t *)pValue = (uint16_t)pEqualizer->getNumPresets(); 475135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("Equalizer_getParameter() EQ_PARAM_GET_NUM_OF_PRESETS %d", *(int16_t *)pValue); 476135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 477135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 478135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_GET_PRESET_NAME: 479135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent param2 = *pParam; 480135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (param2 >= pEqualizer->getNumPresets()) { 481135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent status = -EINVAL; 482135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 483135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 484135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent name = (char *)pValue; 485135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent strncpy(name, pEqualizer->getPresetName(param2), *pValueSize - 1); 486135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent name[*pValueSize - 1] = 0; 487135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *pValueSize = strlen(name) + 1; 488e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent LOGV("Equalizer_getParameter() EQ_PARAM_GET_PRESET_NAME preset %d, name %s len %d", 489e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent param2, gEqualizerPresets[param2].name, *pValueSize); 490135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 491135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 4923be9523784cc4038f601e510faee595117cdacb3Eric Laurent case EQ_PARAM_PROPERTIES: { 4933be9523784cc4038f601e510faee595117cdacb3Eric Laurent int16_t *p = (int16_t *)pValue; 4943be9523784cc4038f601e510faee595117cdacb3Eric Laurent LOGV("Equalizer_getParameter() EQ_PARAM_PROPERTIES"); 4953be9523784cc4038f601e510faee595117cdacb3Eric Laurent p[0] = (int16_t)pEqualizer->getPreset(); 4963be9523784cc4038f601e510faee595117cdacb3Eric Laurent p[1] = (int16_t)kNumBands; 4973be9523784cc4038f601e510faee595117cdacb3Eric Laurent for (int i = 0; i < kNumBands; i++) { 4983be9523784cc4038f601e510faee595117cdacb3Eric Laurent p[2 + i] = (int16_t)pEqualizer->getGain(i); 4993be9523784cc4038f601e510faee595117cdacb3Eric Laurent } 5003be9523784cc4038f601e510faee595117cdacb3Eric Laurent } break; 5013be9523784cc4038f601e510faee595117cdacb3Eric Laurent 502135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent default: 503135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("Equalizer_getParameter() invalid param %d", param); 504135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent status = -EINVAL; 505135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 506135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 507135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 508135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return status; 509135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} // end Equalizer_getParameter 510135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 511135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 512135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent//---------------------------------------------------------------------------- 513135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Equalizer_setParameter() 514135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent//---------------------------------------------------------------------------- 515135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Purpose: 516135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Set a Equalizer parameter 517135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 518135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Inputs: 519135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// pEqualizer - handle to instance data 520135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// pParam - pointer to parameter 521135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// pValue - pointer to value 522135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 523135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Outputs: 524135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 525135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 526135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// Side Effects: 527135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 528135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent//---------------------------------------------------------------------------- 529135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 530135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentint Equalizer_setParameter (AudioEqualizer * pEqualizer, int32_t *pParam, void *pValue) 531135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent{ 532135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int status = 0; 533135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int32_t preset; 534135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int32_t band; 535135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int32_t level; 536135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int32_t param = *pParam++; 537135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 538135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 539135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent switch (param) { 540135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_CUR_PRESET: 5413be9523784cc4038f601e510faee595117cdacb3Eric Laurent preset = (int32_t)(*(uint16_t *)pValue); 542135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 543135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("setParameter() EQ_PARAM_CUR_PRESET %d", preset); 5443be9523784cc4038f601e510faee595117cdacb3Eric Laurent if (preset < 0 || preset >= pEqualizer->getNumPresets()) { 545135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent status = -EINVAL; 546135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 547135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 548135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pEqualizer->setPreset(preset); 549135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pEqualizer->commit(true); 550135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 551135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EQ_PARAM_BAND_LEVEL: 552135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent band = *pParam; 5533be9523784cc4038f601e510faee595117cdacb3Eric Laurent level = (int32_t)(*(int16_t *)pValue); 554135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("setParameter() EQ_PARAM_BAND_LEVEL band %d, level %d", band, level); 555135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (band >= kNumBands) { 556135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent status = -EINVAL; 557135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 558135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 559135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pEqualizer->setGain(band, level); 560135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pEqualizer->commit(true); 561135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 5623be9523784cc4038f601e510faee595117cdacb3Eric Laurent case EQ_PARAM_PROPERTIES: { 5633be9523784cc4038f601e510faee595117cdacb3Eric Laurent LOGV("setParameter() EQ_PARAM_PROPERTIES"); 5643be9523784cc4038f601e510faee595117cdacb3Eric Laurent int16_t *p = (int16_t *)pValue; 5653be9523784cc4038f601e510faee595117cdacb3Eric Laurent if ((int)p[0] >= pEqualizer->getNumPresets()) { 5663be9523784cc4038f601e510faee595117cdacb3Eric Laurent status = -EINVAL; 5673be9523784cc4038f601e510faee595117cdacb3Eric Laurent break; 5683be9523784cc4038f601e510faee595117cdacb3Eric Laurent } 5693be9523784cc4038f601e510faee595117cdacb3Eric Laurent if (p[0] >= 0) { 5703be9523784cc4038f601e510faee595117cdacb3Eric Laurent pEqualizer->setPreset((int)p[0]); 5713be9523784cc4038f601e510faee595117cdacb3Eric Laurent } else { 5723be9523784cc4038f601e510faee595117cdacb3Eric Laurent if ((int)p[1] != kNumBands) { 5733be9523784cc4038f601e510faee595117cdacb3Eric Laurent status = -EINVAL; 5743be9523784cc4038f601e510faee595117cdacb3Eric Laurent break; 5753be9523784cc4038f601e510faee595117cdacb3Eric Laurent } 5763be9523784cc4038f601e510faee595117cdacb3Eric Laurent for (int i = 0; i < kNumBands; i++) { 5773be9523784cc4038f601e510faee595117cdacb3Eric Laurent pEqualizer->setGain(i, (int32_t)p[2 + i]); 5783be9523784cc4038f601e510faee595117cdacb3Eric Laurent } 5793be9523784cc4038f601e510faee595117cdacb3Eric Laurent } 5803be9523784cc4038f601e510faee595117cdacb3Eric Laurent pEqualizer->commit(true); 5813be9523784cc4038f601e510faee595117cdacb3Eric Laurent } break; 582135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent default: 583135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("setParameter() invalid param %d", param); 5843be9523784cc4038f601e510faee595117cdacb3Eric Laurent status = -EINVAL; 585135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 586135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 587135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 588135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return status; 589135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} // end Equalizer_setParameter 590135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 591135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} // namespace 592135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} // namespace 593135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 594135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 595135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 596135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent//--- Effect Control Interface Implementation 597135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent// 598135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 599e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurentextern "C" int Equalizer_process(effect_handle_t self, audio_buffer_t *inBuffer, audio_buffer_t *outBuffer) 600135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent{ 601135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent android::EqualizerContext * pContext = (android::EqualizerContext *) self; 602135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 603135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (pContext == NULL) { 604135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 605135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 606135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (inBuffer == NULL || inBuffer->raw == NULL || 607135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent outBuffer == NULL || outBuffer->raw == NULL || 608135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent inBuffer->frameCount != outBuffer->frameCount) { 609135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 610135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 611135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 612e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent if (pContext->state == EQUALIZER_STATE_UNINITIALIZED) { 613e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent return -EINVAL; 614e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent } 615e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent if (pContext->state == EQUALIZER_STATE_INITIALIZED) { 616e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent return -ENODATA; 617e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent } 618e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent 619135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pContext->adapter.process(inBuffer->raw, outBuffer->raw, outBuffer->frameCount); 620ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent 621135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return 0; 622135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} // end Equalizer_process 623135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 624e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurentextern "C" int Equalizer_command(effect_handle_t self, uint32_t cmdCode, uint32_t cmdSize, 62525f4395b932fa9859a6e91ba77c5d20d009da64aEric Laurent void *pCmdData, uint32_t *replySize, void *pReplyData) { 626135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 627135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent android::EqualizerContext * pContext = (android::EqualizerContext *) self; 628135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int retsize; 629135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 630e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent if (pContext == NULL || pContext->state == EQUALIZER_STATE_UNINITIALIZED) { 631135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 632135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 633135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 634135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent android::AudioEqualizer * pEqualizer = pContext->pEqualizer; 635135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 636135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("Equalizer_command command %d cmdSize %d",cmdCode, cmdSize); 637135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 638135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent switch (cmdCode) { 639135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EFFECT_CMD_INIT: 640135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (pReplyData == NULL || *replySize != sizeof(int)) { 641135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 642135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 643135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *(int *) pReplyData = Equalizer_init(pContext); 644135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 645135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EFFECT_CMD_CONFIGURE: 646135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (pCmdData == NULL || cmdSize != sizeof(effect_config_t) 647135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent || pReplyData == NULL || *replySize != sizeof(int)) { 648135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 649135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 650135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *(int *) pReplyData = Equalizer_configure(pContext, 651135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent (effect_config_t *) pCmdData); 652135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 653135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EFFECT_CMD_RESET: 654135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent Equalizer_configure(pContext, &pContext->config); 655135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent break; 656135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EFFECT_CMD_GET_PARAM: { 657135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (pCmdData == NULL || cmdSize < (int)(sizeof(effect_param_t) + sizeof(int32_t)) || 658135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReplyData == NULL || *replySize < (int) (sizeof(effect_param_t) + sizeof(int32_t))) { 659135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 660135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 661135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent effect_param_t *p = (effect_param_t *)pCmdData; 662135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent memcpy(pReplyData, pCmdData, sizeof(effect_param_t) + p->psize); 663135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent p = (effect_param_t *)pReplyData; 664135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent int voffset = ((p->psize - 1) / sizeof(int32_t) + 1) * sizeof(int32_t); 665135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent p->status = android::Equalizer_getParameter(pEqualizer, (int32_t *)p->data, &p->vsize, 666135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent p->data + voffset); 667135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *replySize = sizeof(effect_param_t) + voffset + p->vsize; 668135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGV("Equalizer_command EFFECT_CMD_GET_PARAM *pCmdData %d, *replySize %d, *pReplyData %08x %08x", 669135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *(int32_t *)((char *)pCmdData + sizeof(effect_param_t)), *replySize, 670135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *(int32_t *)((char *)pReplyData + sizeof(effect_param_t) + voffset), 671135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *(int32_t *)((char *)pReplyData + sizeof(effect_param_t) + voffset + sizeof(int32_t))); 672135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 673135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } break; 674135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent case EFFECT_CMD_SET_PARAM: { 675e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent LOGV("Equalizer_command EFFECT_CMD_SET_PARAM cmdSize %d pCmdData %p, *replySize %d, pReplyData %p", 676e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent cmdSize, pCmdData, *replySize, pReplyData); 677135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent if (pCmdData == NULL || cmdSize < (int)(sizeof(effect_param_t) + sizeof(int32_t)) || 678135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent pReplyData == NULL || *replySize != sizeof(int32_t)) { 679135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 680135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 681135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent effect_param_t *p = (effect_param_t *) pCmdData; 682135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent *(int *)pReplyData = android::Equalizer_setParameter(pEqualizer, (int32_t *)p->data, 683135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent p->data + p->psize); 684135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } break; 685ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent case EFFECT_CMD_ENABLE: 686e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent if (pReplyData == NULL || *replySize != sizeof(int)) { 687e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent return -EINVAL; 688e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent } 689e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent if (pContext->state != EQUALIZER_STATE_INITIALIZED) { 690e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent return -ENOSYS; 691e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent } 692e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent pContext->state = EQUALIZER_STATE_ACTIVE; 693e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent LOGV("EFFECT_CMD_ENABLE() OK"); 694e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent *(int *)pReplyData = 0; 695e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent break; 696ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent case EFFECT_CMD_DISABLE: 697ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent if (pReplyData == NULL || *replySize != sizeof(int)) { 698ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent return -EINVAL; 699ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent } 700e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent if (pContext->state != EQUALIZER_STATE_ACTIVE) { 701e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent return -ENOSYS; 702e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent } 703e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent pContext->state = EQUALIZER_STATE_INITIALIZED; 704e44b1efb293f878d4af8e824a6b3d070167bf2d6Eric Laurent LOGV("EFFECT_CMD_DISABLE() OK"); 705ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent *(int *)pReplyData = 0; 706ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent break; 707ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent case EFFECT_CMD_SET_DEVICE: 708ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent case EFFECT_CMD_SET_VOLUME: 709ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent case EFFECT_CMD_SET_AUDIO_MODE: 710ffe9c25ce85e1af55d58ec025adc6367d70db7e8Eric Laurent break; 711135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent default: 712135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent LOGW("Equalizer_command invalid command %d",cmdCode); 713135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return -EINVAL; 714135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent } 715135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 716135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent return 0; 717135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent} 718135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 719e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurentextern "C" int Equalizer_getDescriptor(effect_handle_t self, 720e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent effect_descriptor_t *pDescriptor) 721e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent{ 722e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent android::EqualizerContext * pContext = (android::EqualizerContext *) self; 723e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent 724e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent if (pContext == NULL || pDescriptor == NULL) { 725e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent LOGV("Equalizer_getDescriptor() invalid param"); 726e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent return -EINVAL; 727e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent } 728e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent 729e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent memcpy(pDescriptor, &android::gEqualizerDescriptor, sizeof(effect_descriptor_t)); 730e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent 731e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent return 0; 732e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent} 733e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent 734e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent// effect_handle_t interface implementation for equalizer effect 735135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurentconst struct effect_interface_s gEqualizerInterface = { 736135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent Equalizer_process, 737e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent Equalizer_command, 738e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent Equalizer_getDescriptor 739135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent}; 740135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 741135ad07e33d30e5202deb21061a0e3ecf0ffad35Eric Laurent 742e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurentaudio_effect_library_t AUDIO_EFFECT_LIBRARY_INFO_SYM = { 743e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent tag : AUDIO_EFFECT_LIBRARY_TAG, 744e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent version : EFFECT_LIBRARY_API_VERSION, 745e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent name : "Test Equalizer Library", 746e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent implementor : "The Android Open Source Project", 747e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent query_num_effects : android::EffectQueryNumberEffects, 748e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent query_effect : android::EffectQueryEffect, 749e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent create_effect : android::EffectCreate, 750e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent release_effect : android::EffectRelease, 751e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent get_descriptor : android::EffectGetDescriptor, 752e1315cf0b63b4c14a77046519e6b01f6f60d74b0Eric Laurent}; 753