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