141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George/*
241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George * Copyright (C) 2014 The Android Open Source Project
341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George *
441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George * Licensed under the Apache License, Version 2.0 (the "License");
541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George * you may not use this file except in compliance with the License.
641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George * You may obtain a copy of the License at
741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George *
841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George *      http://www.apache.org/licenses/LICENSE-2.0
941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George *
1041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George * Unless required by applicable law or agreed to in writing, software
1141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George * distributed under the License is distributed on an "AS IS" BASIS,
1241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George * See the License for the specific language governing permissions and
1441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George * limitations under the License.
1541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George */
1641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
1741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George#define LOG_TAG "offload_effect_equalizer"
1841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George//#define LOG_NDEBUG 0
1941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
2041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George#include <cutils/list.h>
2141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George#include <cutils/log.h>
2241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George#include <tinyalsa/asoundlib.h>
2341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George#include <sound/audio_effects.h>
2441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George#include <audio_effects/effect_equalizer.h>
2541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
2641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George#include "effect_api.h"
2741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George#include "equalizer.h"
2841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
2941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George/* Offload equalizer UUID: a0dac280-401c-11e3-9379-0002a5d5c51b */
3041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgeconst effect_descriptor_t equalizer_descriptor = {
3141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        {0x0bed4300, 0xddd6, 0x11db, 0x8f34, {0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}}, // type
3241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        {0xa0dac280, 0x401c, 0x11e3, 0x9379, {0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}}, // uuid
3341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        EFFECT_CONTROL_API_VERSION,
3441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        (EFFECT_FLAG_TYPE_INSERT | EFFECT_FLAG_HW_ACC_TUNNEL),
3541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        0, /* TODO */
3641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        1,
3741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        "MSM offload equalizer",
3841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        "The Android Open Source Project",
3941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George};
4041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
4141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgestatic const char *equalizer_preset_names[] = {
4241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                        "Normal",
4341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                        "Classical",
4441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                        "Dance",
4541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                        "Flat",
4641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                        "Folk",
4741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                        "Heavy Metal",
4841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                        "Hip Hop",
4941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                        "Jazz",
5041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                        "Pop",
5141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                        "Rock"
5241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George					};
5341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
5441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgestatic const uint32_t equalizer_band_freq_range[NUM_EQ_BANDS][2] = {
5541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                       {30000, 120000},
5641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                       {120001, 460000},
5741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                       {460001, 1800000},
5841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                       {1800001, 7000000},
5941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                       {7000001, 20000000}};
6041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
6141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgestatic const int16_t equalizer_band_presets_level[] = {
6241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                        3, 0, 0, 0, 3,      /* Normal Preset */
6341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                        5, 3, -2, 4, 4,     /* Classical Preset */
6441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                        6, 0, 2, 4, 1,      /* Dance Preset */
6541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                        0, 0, 0, 0, 0,      /* Flat Preset */
6641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                        3, 0, 0, 2, -1,     /* Folk Preset */
6741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                        4, 1, 9, 3, 0,      /* Heavy Metal Preset */
6841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                        5, 3, 0, 1, 3,      /* Hip Hop Preset */
6941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                        4, 2, -2, 2, 5,     /* Jazz Preset */
7041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                       -1, 2, 5, 1, -2,     /* Pop Preset */
7141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                        5, 3, -1, 3, 5};    /* Rock Preset */
7241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
7341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgeconst uint16_t equalizer_band_presets_freq[NUM_EQ_BANDS] = {
7441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                        60,      /* Frequencies in Hz */
7541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                        230,
7641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                        910,
7741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                        3600,
7841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                        14000
7941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George};
8041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
8141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George/*
8241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George * Equalizer operations
8341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George */
8441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
8541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgeint equalizer_get_band_level(equalizer_context_t *context, int32_t band)
8641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
8741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s: band: %d level: %d", __func__, band,
8841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George           context->band_levels[band] * 100);
8941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    return context->band_levels[band] * 100;
9041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
9141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
9241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgeint equalizer_set_band_level(equalizer_context_t *context, int32_t band,
9341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                             int32_t level)
9441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
9541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s: band: %d, level: %d", __func__, band, level);
9641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    if (level > 0) {
9741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        level = (int)((level+50)/100);
9841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    } else {
9941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        level = (int)((level-50)/100);
10041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    }
10141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    context->band_levels[band] = level;
10241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    context->preset = PRESET_CUSTOM;
10341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
10441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    offload_eq_set_preset(&(context->offload_eq), PRESET_CUSTOM);
10541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    offload_eq_set_bands_level(&(context->offload_eq),
10641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                               NUM_EQ_BANDS,
10741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                               equalizer_band_presets_freq,
10841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                               context->band_levels);
10941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    if (context->ctl)
11041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        offload_eq_send_params(context->ctl, &context->offload_eq,
11141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                               OFFLOAD_SEND_EQ_ENABLE_FLAG |
11241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                               OFFLOAD_SEND_EQ_BANDS_LEVEL);
11341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    return 0;
11441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
11541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
11697a1059da4d3aa8bfb0883d5f932f86b95876512Haynes Mathew Georgeint equalizer_get_center_frequency(equalizer_context_t *context __unused, int32_t band)
11741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
11841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s: band: %d", __func__, band);
11941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    return (equalizer_band_freq_range[band][0] +
12041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George            equalizer_band_freq_range[band][1]) / 2;
12141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
12241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
12397a1059da4d3aa8bfb0883d5f932f86b95876512Haynes Mathew Georgeint equalizer_get_band_freq_range(equalizer_context_t *context __unused, int32_t band,
12441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                  uint32_t *low, uint32_t *high)
12541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
12641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s: band: %d", __func__, band);
12741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    *low = equalizer_band_freq_range[band][0];
12841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    *high = equalizer_band_freq_range[band][1];
12941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George   return 0;
13041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
13141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
13297a1059da4d3aa8bfb0883d5f932f86b95876512Haynes Mathew Georgeint equalizer_get_band(equalizer_context_t *context __unused, uint32_t freq)
13341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
13441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    int i;
13541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
13641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s: freq: %d", __func__, freq);
13741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    for (i = 0; i < NUM_EQ_BANDS; i++) {
13841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        if (freq <= equalizer_band_freq_range[i][1]) {
13941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George            return i;
14041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        }
14141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    }
14241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    return NUM_EQ_BANDS - 1;
14341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
14441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
14541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgeint equalizer_get_preset(equalizer_context_t *context)
14641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
14741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s: preset: %d", __func__, context->preset);
14841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    return context->preset;
14941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
15041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
15141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgeint equalizer_set_preset(equalizer_context_t *context, int preset)
15241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
15341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    int i;
15441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
15541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s: preset: %d", __func__, preset);
15641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    context->preset = preset;
15741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    for (i=0; i<NUM_EQ_BANDS; i++)
15841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        context->band_levels[i] =
15941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                 equalizer_band_presets_level[i + preset * NUM_EQ_BANDS];
16041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
16141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    offload_eq_set_preset(&(context->offload_eq), preset);
16241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    offload_eq_set_bands_level(&(context->offload_eq),
16341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                               NUM_EQ_BANDS,
16441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                               equalizer_band_presets_freq,
16541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                               context->band_levels);
16641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    if(context->ctl)
16741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        offload_eq_send_params(context->ctl, &context->offload_eq,
16841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                               OFFLOAD_SEND_EQ_ENABLE_FLAG |
16941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                               OFFLOAD_SEND_EQ_PRESET);
17041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    return 0;
17141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
17241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
17397a1059da4d3aa8bfb0883d5f932f86b95876512Haynes Mathew Georgeconst char * equalizer_get_preset_name(equalizer_context_t *context __unused,
17441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                       int32_t preset)
17541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
17641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s: preset: %s", __func__, equalizer_preset_names[preset]);
17741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    if (preset == PRESET_CUSTOM) {
17841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        return "Custom";
17941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    } else {
18041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        return equalizer_preset_names[preset];
18141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    }
18241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
18341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
18497a1059da4d3aa8bfb0883d5f932f86b95876512Haynes Mathew Georgeint equalizer_get_num_presets(equalizer_context_t *context __unused)
18541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
18641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s: presets_num: %d", __func__,
18741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George           sizeof(equalizer_preset_names)/sizeof(char *));
18841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    return sizeof(equalizer_preset_names)/sizeof(char *);
18941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
19041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
19141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgeint equalizer_get_parameter(effect_context_t *context, effect_param_t *p,
19241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                            uint32_t *size)
19341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
19441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    equalizer_context_t *eq_ctxt = (equalizer_context_t *)context;
19541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    int voffset = ((p->psize - 1) / sizeof(int32_t) + 1) * sizeof(int32_t);
19641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    int32_t *param_tmp = (int32_t *)p->data;
19741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    int32_t param = *param_tmp++;
19841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    int32_t param2;
19941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    char *name;
20041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    void *value = p->data + voffset;
20141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    int i;
20241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
20341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s", __func__);
20441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
20541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    p->status = 0;
20641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
20741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    switch (param) {
20841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    case EQ_PARAM_NUM_BANDS:
20941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    case EQ_PARAM_CUR_PRESET:
21041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    case EQ_PARAM_GET_NUM_OF_PRESETS:
21141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    case EQ_PARAM_BAND_LEVEL:
21241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    case EQ_PARAM_GET_BAND:
21341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        if (p->vsize < sizeof(int16_t))
21441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George           p->status = -EINVAL;
21541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        p->vsize = sizeof(int16_t);
21641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        break;
21741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
21841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    case EQ_PARAM_LEVEL_RANGE:
21941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        if (p->vsize < 2 * sizeof(int16_t))
22041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George            p->status = -EINVAL;
22141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        p->vsize = 2 * sizeof(int16_t);
22241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        break;
22341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    case EQ_PARAM_BAND_FREQ_RANGE:
22441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George       if (p->vsize < 2 * sizeof(int32_t))
22541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George            p->status = -EINVAL;
22641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        p->vsize = 2 * sizeof(int32_t);
22741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        break;
22841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
22941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George   case EQ_PARAM_CENTER_FREQ:
23041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        if (p->vsize < sizeof(int32_t))
23141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George            p->status = -EINVAL;
23241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        p->vsize = sizeof(int32_t);
23341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        break;
23441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
23541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    case EQ_PARAM_GET_PRESET_NAME:
23641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        break;
23741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
23841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    case EQ_PARAM_PROPERTIES:
23941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        if (p->vsize < (2 + NUM_EQ_BANDS) * sizeof(uint16_t))
24041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George            p->status = -EINVAL;
24141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        p->vsize = (2 + NUM_EQ_BANDS) * sizeof(uint16_t);
24241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        break;
24341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
24441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    default:
24541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        p->status = -EINVAL;
24641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    }
24741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
24841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    *size = sizeof(effect_param_t) + voffset + p->vsize;
24941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
25041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    if (p->status != 0)
25141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        return 0;
25241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
25341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    switch (param) {
25441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    case EQ_PARAM_NUM_BANDS:
25541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George	ALOGV("%s: EQ_PARAM_NUM_BANDS", __func__);
25641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *(uint16_t *)value = (uint16_t)NUM_EQ_BANDS;
25741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        break;
25841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
25941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    case EQ_PARAM_LEVEL_RANGE:
26041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George	ALOGV("%s: EQ_PARAM_LEVEL_RANGE", __func__);
26141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *(int16_t *)value = -1500;
26241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *((int16_t *)value + 1) = 1500;
26341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        break;
26441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
26541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    case EQ_PARAM_BAND_LEVEL:
26641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George	ALOGV("%s: EQ_PARAM_BAND_LEVEL", __func__);
26741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        param2 = *param_tmp;
26841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        if (param2 >= NUM_EQ_BANDS) {
26941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George            p->status = -EINVAL;
27041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George            break;
27141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        }
27241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *(int16_t *)value = (int16_t)equalizer_get_band_level(eq_ctxt, param2);
27341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        break;
27441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
27541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    case EQ_PARAM_CENTER_FREQ:
27641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George	ALOGV("%s: EQ_PARAM_CENTER_FREQ", __func__);
27741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        param2 = *param_tmp;
27841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        if (param2 >= NUM_EQ_BANDS) {
27941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George           p->status = -EINVAL;
28041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George            break;
28141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        }
28241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *(int32_t *)value = equalizer_get_center_frequency(eq_ctxt, param2);
28341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        break;
28441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
28541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    case EQ_PARAM_BAND_FREQ_RANGE:
28641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George	ALOGV("%s: EQ_PARAM_BAND_FREQ_RANGE", __func__);
28741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        param2 = *param_tmp;
28841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        if (param2 >= NUM_EQ_BANDS) {
28941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George            p->status = -EINVAL;
29041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George           break;
29141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        }
29241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George       equalizer_get_band_freq_range(eq_ctxt, param2, (uint32_t *)value,
29341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                     ((uint32_t *)value + 1));
29441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        break;
29541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
29641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    case EQ_PARAM_GET_BAND:
29741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George	ALOGV("%s: EQ_PARAM_GET_BAND", __func__);
29841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        param2 = *param_tmp;
29941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *(uint16_t *)value = (uint16_t)equalizer_get_band(eq_ctxt, param2);
30041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        break;
30141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
30241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    case EQ_PARAM_CUR_PRESET:
30341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George	ALOGV("%s: EQ_PARAM_CUR_PRESET", __func__);
30441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *(uint16_t *)value = (uint16_t)equalizer_get_preset(eq_ctxt);
30541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        break;
30641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
30741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    case EQ_PARAM_GET_NUM_OF_PRESETS:
30841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George	ALOGV("%s: EQ_PARAM_GET_NUM_OF_PRESETS", __func__);
30941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *(uint16_t *)value = (uint16_t)equalizer_get_num_presets(eq_ctxt);
31041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        break;
31141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
31241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    case EQ_PARAM_GET_PRESET_NAME:
31341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George	ALOGV("%s: EQ_PARAM_GET_PRESET_NAME", __func__);
31441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        param2 = *param_tmp;
31541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George	ALOGV("param2: %d", param2);
31641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        if (param2 >= equalizer_get_num_presets(eq_ctxt)) {
31741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George            p->status = -EINVAL;
31841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George            break;
31941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        }
32041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        name = (char *)value;
32141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        strlcpy(name, equalizer_get_preset_name(eq_ctxt, param2), p->vsize - 1);
32241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        name[p->vsize - 1] = 0;
32341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        p->vsize = strlen(name) + 1;
32441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        break;
32541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
32641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    case EQ_PARAM_PROPERTIES: {
32741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George	ALOGV("%s: EQ_PARAM_PROPERTIES", __func__);
32841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        int16_t *prop = (int16_t *)value;
32941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        prop[0] = (int16_t)equalizer_get_preset(eq_ctxt);
33041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        prop[1] = (int16_t)NUM_EQ_BANDS;
33141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        for (i = 0; i < NUM_EQ_BANDS; i++) {
33241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George            prop[2 + i] = (int16_t)equalizer_get_band_level(eq_ctxt, i);
33341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        }
33441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    } break;
33541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
33641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    default:
33741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        p->status = -EINVAL;
33841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        break;
33941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    }
34041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
34141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    return 0;
34241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
34341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
34441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgeint equalizer_set_parameter(effect_context_t *context, effect_param_t *p,
34597a1059da4d3aa8bfb0883d5f932f86b95876512Haynes Mathew George                            uint32_t size __unused)
34641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
34741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    equalizer_context_t *eq_ctxt = (equalizer_context_t *)context;
34841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    int voffset = ((p->psize - 1) / sizeof(int32_t) + 1) * sizeof(int32_t);
34941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    void *value = p->data + voffset;
35041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    int32_t *param_tmp = (int32_t *)p->data;
35141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    int32_t param = *param_tmp++;
35241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    int32_t preset;
35341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    int32_t band;
35441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    int32_t level;
35541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    int i;
35641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
35741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s", __func__);
35841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
35941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    p->status = 0;
36041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
36141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    switch (param) {
36241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    case EQ_PARAM_CUR_PRESET:
36341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George	ALOGV("EQ_PARAM_CUR_PRESET");
36441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        preset = (int32_t)(*(uint16_t *)value);
36541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
36641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        if ((preset >= equalizer_get_num_presets(eq_ctxt)) || (preset < 0)) {
36741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George           p->status = -EINVAL;
36841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George            break;
36941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        }
37041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        equalizer_set_preset(eq_ctxt, preset);
37141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        break;
37241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    case EQ_PARAM_BAND_LEVEL:
37341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George	ALOGV("EQ_PARAM_BAND_LEVEL");
37441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        band =  *param_tmp;
37541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        level = (int32_t)(*(int16_t *)value);
37641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        if (band >= NUM_EQ_BANDS) {
37741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George           p->status = -EINVAL;
37841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George            break;
37941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        }
38041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        equalizer_set_band_level(eq_ctxt, band, level);
38141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        break;
38241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    case EQ_PARAM_PROPERTIES: {
38341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George	ALOGV("EQ_PARAM_PROPERTIES");
38441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        int16_t *prop = (int16_t *)value;
38541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        if ((int)prop[0] >= equalizer_get_num_presets(eq_ctxt)) {
38641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George            p->status = -EINVAL;
38741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George            break;
38841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        }
38941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        if (prop[0] >= 0) {
39041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George            equalizer_set_preset(eq_ctxt, (int)prop[0]);
39141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        } else {
39241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George            if ((int)prop[1] != NUM_EQ_BANDS) {
39341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                p->status = -EINVAL;
39441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                break;
39541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George            }
39641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George            for (i = 0; i < NUM_EQ_BANDS; i++) {
39741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George               equalizer_set_band_level(eq_ctxt, i, (int)prop[2 + i]);
39841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George            }
39941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        }
40041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    } break;
40141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    default:
40241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        p->status = -EINVAL;
40341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        break;
40441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    }
40541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
40641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    return 0;
40741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
40841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
40941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgeint equalizer_set_device(effect_context_t *context,  uint32_t device)
41041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
41141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s: device: %d", __func__, device);
41241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    equalizer_context_t *eq_ctxt = (equalizer_context_t *)context;
41341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    eq_ctxt->device = device;
41441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    offload_eq_set_device(&(eq_ctxt->offload_eq), device);
41541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    return 0;
41641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
41741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
41841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgeint equalizer_reset(effect_context_t *context)
41941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
42041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    equalizer_context_t *eq_ctxt = (equalizer_context_t *)context;
42141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
42241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    return 0;
42341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
42441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
42541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgeint equalizer_init(effect_context_t *context)
42641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
42741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s", __func__);
42841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    equalizer_context_t *eq_ctxt = (equalizer_context_t *)context;
42941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
43041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    context->config.inputCfg.accessMode = EFFECT_BUFFER_ACCESS_READ;
43141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    context->config.inputCfg.channels = AUDIO_CHANNEL_OUT_STEREO;
43241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    context->config.inputCfg.format = AUDIO_FORMAT_PCM_16_BIT;
43341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    context->config.inputCfg.samplingRate = 44100;
43441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    context->config.inputCfg.bufferProvider.getBuffer = NULL;
43541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    context->config.inputCfg.bufferProvider.releaseBuffer = NULL;
43641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    context->config.inputCfg.bufferProvider.cookie = NULL;
43741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    context->config.inputCfg.mask = EFFECT_CONFIG_ALL;
43841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    context->config.outputCfg.accessMode = EFFECT_BUFFER_ACCESS_ACCUMULATE;
43941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    context->config.outputCfg.channels = AUDIO_CHANNEL_OUT_STEREO;
44041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    context->config.outputCfg.format = AUDIO_FORMAT_PCM_16_BIT;
44141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    context->config.outputCfg.samplingRate = 44100;
44241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    context->config.outputCfg.bufferProvider.getBuffer = NULL;
44341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    context->config.outputCfg.bufferProvider.releaseBuffer = NULL;
44441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    context->config.outputCfg.bufferProvider.cookie = NULL;
44541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    context->config.outputCfg.mask = EFFECT_CONFIG_ALL;
44641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
44741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    set_config(context, &context->config);
44841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
44941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    memset(&(eq_ctxt->offload_eq), 0, sizeof(struct eq_params));
45041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    offload_eq_set_preset(&(eq_ctxt->offload_eq), INVALID_PRESET);
45141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
45241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    return 0;
45341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
45441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
45541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgeint equalizer_enable(effect_context_t *context)
45641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
45741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    equalizer_context_t *eq_ctxt = (equalizer_context_t *)context;
45841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
45941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s", __func__);
46041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
46141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    if (!offload_eq_get_enable_flag(&(eq_ctxt->offload_eq))) {
46241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        offload_eq_set_enable_flag(&(eq_ctxt->offload_eq), true);
46341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        if (eq_ctxt->ctl)
46441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George            offload_eq_send_params(eq_ctxt->ctl, &eq_ctxt->offload_eq,
46541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                   OFFLOAD_SEND_EQ_ENABLE_FLAG |
46641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                   OFFLOAD_SEND_EQ_BANDS_LEVEL);
46741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    }
46841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    return 0;
46941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
47041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
47141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgeint equalizer_disable(effect_context_t *context)
47241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
47341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    equalizer_context_t *eq_ctxt = (equalizer_context_t *)context;
47441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
47541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s", __func__);
47641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    if (offload_eq_get_enable_flag(&(eq_ctxt->offload_eq))) {
47741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        offload_eq_set_enable_flag(&(eq_ctxt->offload_eq), false);
47841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        if (eq_ctxt->ctl)
47941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George            offload_eq_send_params(eq_ctxt->ctl, &eq_ctxt->offload_eq,
48041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                   OFFLOAD_SEND_EQ_ENABLE_FLAG);
48141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    }
48241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    return 0;
48341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
48441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
48541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgeint equalizer_start(effect_context_t *context, output_context_t *output)
48641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
48741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    equalizer_context_t *eq_ctxt = (equalizer_context_t *)context;
48841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
48941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s: %p", __func__, output->ctl);
49041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    eq_ctxt->ctl = output->ctl;
49141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    if (offload_eq_get_enable_flag(&(eq_ctxt->offload_eq)))
49241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        if (eq_ctxt->ctl)
49341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George            offload_eq_send_params(eq_ctxt->ctl, &eq_ctxt->offload_eq,
49441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                   OFFLOAD_SEND_EQ_ENABLE_FLAG |
49541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                   OFFLOAD_SEND_EQ_BANDS_LEVEL);
49641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    return 0;
49741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
49841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
49997a1059da4d3aa8bfb0883d5f932f86b95876512Haynes Mathew Georgeint equalizer_stop(effect_context_t *context, output_context_t *output __unused)
50041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
50141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    equalizer_context_t *eq_ctxt = (equalizer_context_t *)context;
50241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
50341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s", __func__);
50441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    eq_ctxt->ctl = NULL;
50541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    return 0;
50641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
507