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