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_api"
1841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George//#define LOG_NDEBUG 0
1941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
20122574f94d145974ab3468a2c33f3a02b982912fElliott Hughes#include <errno.h>
2141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George#include <stdbool.h>
2241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George#include <cutils/log.h>
2341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George#include <tinyalsa/asoundlib.h>
2441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George#include <sound/audio_effects.h>
2541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
2641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George#include "effect_api.h"
2741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
2841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George#define ARRAY_SIZE(array) (sizeof array / sizeof array[0])
2941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
3041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George#define OFFLOAD_PRESET_START_OFFSET_FOR_OPENSL 19
3141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgeconst int map_eq_opensl_preset_2_offload_preset[] = {
3241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    OFFLOAD_PRESET_START_OFFSET_FOR_OPENSL,   /* Normal Preset */
3341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    OFFLOAD_PRESET_START_OFFSET_FOR_OPENSL+1, /* Classical Preset */
3441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    OFFLOAD_PRESET_START_OFFSET_FOR_OPENSL+2, /* Dance Preset */
3541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    OFFLOAD_PRESET_START_OFFSET_FOR_OPENSL+3, /* Flat Preset */
3641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    OFFLOAD_PRESET_START_OFFSET_FOR_OPENSL+4, /* Folk Preset */
3741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    OFFLOAD_PRESET_START_OFFSET_FOR_OPENSL+5, /* Heavy Metal Preset */
3841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    OFFLOAD_PRESET_START_OFFSET_FOR_OPENSL+6, /* Hip Hop Preset */
3941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    OFFLOAD_PRESET_START_OFFSET_FOR_OPENSL+7, /* Jazz Preset */
4041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    OFFLOAD_PRESET_START_OFFSET_FOR_OPENSL+8, /* Pop Preset */
4141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    OFFLOAD_PRESET_START_OFFSET_FOR_OPENSL+9, /* Rock Preset */
4241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    OFFLOAD_PRESET_START_OFFSET_FOR_OPENSL+10 /* FX Booster */
4341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George};
4441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
4541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgeconst int map_reverb_opensl_preset_2_offload_preset
4641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                  [NUM_OSL_REVERB_PRESETS_SUPPORTED][2] = {
4741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    {1, 15},
4841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    {2, 16},
4941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    {3, 17},
5041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    {4, 18},
5141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    {5, 3},
5241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    {6, 20}
5341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George};
5441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
5541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgeint offload_update_mixer_and_effects_ctl(int card, int device_id,
5641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                         struct mixer *mixer,
5741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                         struct mixer_ctl *ctl)
5841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
5941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    char mixer_string[128];
6041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
6141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    snprintf(mixer_string, sizeof(mixer_string),
6241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George             "%s %d", "Audio Effects Config", device_id);
6341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s: mixer_string: %s", __func__, mixer_string);
6441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    mixer = mixer_open(card);
6541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    if (!mixer) {
6641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        ALOGE("Failed to open mixer");
6741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        ctl = NULL;
6841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        return -EINVAL;
6941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    } else {
7041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        ctl = mixer_get_ctl_by_name(mixer, mixer_string);
7141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        if (!ctl) {
7241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George            ALOGE("mixer_get_ctl_by_name failed");
7341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George            mixer_close(mixer);
7441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George            mixer = NULL;
7541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George            return -EINVAL;
7641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        }
7741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    }
7841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("mixer: %p, ctl: %p", mixer, ctl);
7941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    return 0;
8041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
8141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
8241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgevoid offload_close_mixer(struct mixer *mixer)
8341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
8441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    mixer_close(mixer);
8541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
8641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
8741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgevoid offload_bassboost_set_device(struct bass_boost_params *bassboost,
8841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                  uint32_t device)
8941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
9041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s", __func__);
9141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    bassboost->device = device;
9241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
9341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
9441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgevoid offload_bassboost_set_enable_flag(struct bass_boost_params *bassboost,
9541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                       bool enable)
9641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
9741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s", __func__);
9841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    bassboost->enable_flag = enable;
9941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
10041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
10141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgeint offload_bassboost_get_enable_flag(struct bass_boost_params *bassboost)
10241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
10341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s", __func__);
10441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    return bassboost->enable_flag;
10541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
10641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
10741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgevoid offload_bassboost_set_strength(struct bass_boost_params *bassboost,
10841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                    int strength)
10941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
11041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s", __func__);
11141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    bassboost->strength = strength;
11241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
11341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
11441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgevoid offload_bassboost_set_mode(struct bass_boost_params *bassboost,
11541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                int mode)
11641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
11741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s", __func__);
11841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    bassboost->mode = mode;
11941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
12041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
12141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgeint offload_bassboost_send_params(struct mixer_ctl *ctl,
12241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                  struct bass_boost_params *bassboost,
12341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                  unsigned param_send_flags)
12441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
12541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    int param_values[128] = {0};
12641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    int *p_param_values = param_values;
12741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
12841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s", __func__);
12941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    *p_param_values++ = BASS_BOOST_MODULE;
13041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    *p_param_values++ = bassboost->device;
13141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    *p_param_values++ = 0; /* num of commands*/
13241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    if (param_send_flags & OFFLOAD_SEND_BASSBOOST_ENABLE_FLAG) {
13341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = BASS_BOOST_ENABLE;
13441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = CONFIG_SET;
13541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = 0; /* start offset if param size if greater than 128  */
13641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = BASS_BOOST_ENABLE_PARAM_LEN;
13741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = bassboost->enable_flag;
13841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        param_values[2] += 1;
13941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    }
14041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    if (param_send_flags & OFFLOAD_SEND_BASSBOOST_STRENGTH) {
14141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = BASS_BOOST_STRENGTH;
14241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = CONFIG_SET;
14341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = 0; /* start offset if param size if greater than 128  */
14441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = BASS_BOOST_STRENGTH_PARAM_LEN;
14541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = bassboost->strength;
14641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        param_values[2] += 1;
14741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    }
14841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    if (param_send_flags & OFFLOAD_SEND_BASSBOOST_MODE) {
14941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = BASS_BOOST_MODE;
15041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = CONFIG_SET;
15141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = 0; /* start offset if param size if greater than 128  */
15241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = BASS_BOOST_MODE_PARAM_LEN;
15341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = bassboost->mode;
15441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        param_values[2] += 1;
15541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    }
15641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
15741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    if (param_values[2] && ctl)
15841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        mixer_ctl_set_array(ctl, param_values, ARRAY_SIZE(param_values));
15941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
16041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    return 0;
16141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
16241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
16341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgevoid offload_virtualizer_set_device(struct virtualizer_params *virtualizer,
16441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                    uint32_t device)
16541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
16641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s", __func__);
16741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    virtualizer->device = device;
16841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
16941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
17041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgevoid offload_virtualizer_set_enable_flag(struct virtualizer_params *virtualizer,
17141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                         bool enable)
17241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
17341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s", __func__);
17441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    virtualizer->enable_flag = enable;
17541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
17641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
17741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgeint offload_virtualizer_get_enable_flag(struct virtualizer_params *virtualizer)
17841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
17941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s", __func__);
18041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    return virtualizer->enable_flag;
18141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
18241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
18341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgevoid offload_virtualizer_set_strength(struct virtualizer_params *virtualizer,
18441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                      int strength)
18541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
18641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s", __func__);
18741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    virtualizer->strength = strength;
18841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
18941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
19041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgevoid offload_virtualizer_set_out_type(struct virtualizer_params *virtualizer,
19141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                      int out_type)
19241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
19341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s", __func__);
19441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    virtualizer->out_type = out_type;
19541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
19641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
19741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgevoid offload_virtualizer_set_gain_adjust(struct virtualizer_params *virtualizer,
19841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                         int gain_adjust)
19941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
20041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s", __func__);
20141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    virtualizer->gain_adjust = gain_adjust;
20241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
20341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
20441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgeint offload_virtualizer_send_params(struct mixer_ctl *ctl,
20541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                    struct virtualizer_params *virtualizer,
20641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                    unsigned param_send_flags)
20741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
20841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    int param_values[128] = {0};
20941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    int *p_param_values = param_values;
21041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
21141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s", __func__);
21241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    *p_param_values++ = VIRTUALIZER_MODULE;
21341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    *p_param_values++ = virtualizer->device;
21441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    *p_param_values++ = 0; /* num of commands*/
21541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    if (param_send_flags & OFFLOAD_SEND_VIRTUALIZER_ENABLE_FLAG) {
21641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = VIRTUALIZER_ENABLE;
21741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = CONFIG_SET;
21841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = 0; /* start offset if param size if greater than 128  */
21941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = VIRTUALIZER_ENABLE_PARAM_LEN;
22041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = virtualizer->enable_flag;
22141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        param_values[2] += 1;
22241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    }
22341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    if (param_send_flags & OFFLOAD_SEND_VIRTUALIZER_STRENGTH) {
22441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = VIRTUALIZER_STRENGTH;
22541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = CONFIG_SET;
22641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = 0; /* start offset if param size if greater than 128  */
22741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = VIRTUALIZER_STRENGTH_PARAM_LEN;
22841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = virtualizer->strength;
22941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        param_values[2] += 1;
23041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    }
23141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    if (param_send_flags & OFFLOAD_SEND_VIRTUALIZER_OUT_TYPE) {
23241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = VIRTUALIZER_OUT_TYPE;
23341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = CONFIG_SET;
23441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = 0; /* start offset if param size if greater than 128  */
23541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = VIRTUALIZER_OUT_TYPE_PARAM_LEN;
23641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = virtualizer->out_type;
23741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        param_values[2] += 1;
23841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    }
23941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    if (param_send_flags & OFFLOAD_SEND_VIRTUALIZER_GAIN_ADJUST) {
24041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = VIRTUALIZER_GAIN_ADJUST;
24141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = CONFIG_SET;
24241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = 0; /* start offset if param size if greater than 128  */
24341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = VIRTUALIZER_GAIN_ADJUST_PARAM_LEN;
24441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = virtualizer->gain_adjust;
24541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        param_values[2] += 1;
24641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    }
24741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
24841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    if (param_values[2] && ctl)
24941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        mixer_ctl_set_array(ctl, param_values, ARRAY_SIZE(param_values));
25041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
25141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    return 0;
25241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
25341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
25441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgevoid offload_eq_set_device(struct eq_params *eq, uint32_t device)
25541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
25641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s", __func__);
25741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    eq->device = device;
25841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
25941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
26041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgevoid offload_eq_set_enable_flag(struct eq_params *eq, bool enable)
26141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
26241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s", __func__);
26341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    eq->enable_flag = enable;
26441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
26541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
26641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgeint offload_eq_get_enable_flag(struct eq_params *eq)
26741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
26841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s", __func__);
26941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    return eq->enable_flag;
27041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
27141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
27241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgevoid offload_eq_set_preset(struct eq_params *eq, int preset)
27341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
27441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s", __func__);
27541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    eq->config.preset_id = preset;
27641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    eq->config.eq_pregain = Q27_UNITY;
27741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
27841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
27941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgevoid offload_eq_set_bands_level(struct eq_params *eq, int num_bands,
28041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                const uint16_t *band_freq_list,
28141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                int *band_gain_list)
28241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
28341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    int i;
28441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s", __func__);
28541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    eq->config.num_bands = num_bands;
28641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    for (i=0; i<num_bands; i++) {
28741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        eq->per_band_cfg[i].band_idx = i;
28841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        eq->per_band_cfg[i].filter_type = EQ_BAND_BOOST;
28941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        eq->per_band_cfg[i].freq_millihertz = band_freq_list[i] * 1000;
29041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        eq->per_band_cfg[i].gain_millibels = band_gain_list[i] * 100;
29141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        eq->per_band_cfg[i].quality_factor = Q8_UNITY;
29241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    }
29341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
29441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
29541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgeint offload_eq_send_params(struct mixer_ctl *ctl, struct eq_params *eq,
29641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                           unsigned param_send_flags)
29741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
29841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    int param_values[128] = {0};
29941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    int *p_param_values = param_values;
30041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    uint32_t i;
30141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
30241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s", __func__);
30341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    if (eq->config.preset_id < -1 ) {
30441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        ALOGV("No Valid preset to set");
30541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        return 0;
30641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    }
30741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    *p_param_values++ = EQ_MODULE;
30841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    *p_param_values++ = eq->device;
30941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    *p_param_values++ = 0; /* num of commands*/
31041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    if (param_send_flags & OFFLOAD_SEND_EQ_ENABLE_FLAG) {
31141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = EQ_ENABLE;
31241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = CONFIG_SET;
31341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = 0; /* start offset if param size if greater than 128  */
31441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = EQ_ENABLE_PARAM_LEN;
31541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = eq->enable_flag;
31641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        param_values[2] += 1;
31741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    }
31841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    if (param_send_flags & OFFLOAD_SEND_EQ_PRESET) {
31941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = EQ_CONFIG;
32041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = CONFIG_SET;
32141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = 0; /* start offset if param size if greater than 128  */
32241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = EQ_CONFIG_PARAM_LEN;
32341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = eq->config.eq_pregain;
32441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ =
32541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                     map_eq_opensl_preset_2_offload_preset[eq->config.preset_id];
32641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = 0;
32741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        param_values[2] += 1;
32841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    }
32941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    if (param_send_flags & OFFLOAD_SEND_EQ_BANDS_LEVEL) {
33041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = EQ_CONFIG;
33141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = CONFIG_SET;
33241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = 0; /* start offset if param size if greater than 128  */
33341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = EQ_CONFIG_PARAM_LEN +
33441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                            eq->config.num_bands * EQ_CONFIG_PER_BAND_PARAM_LEN;
33541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = eq->config.eq_pregain;
33641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = CUSTOM_OPENSL_PRESET;
33741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = eq->config.num_bands;
33841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        for (i=0; i<eq->config.num_bands; i++) {
33941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George            *p_param_values++ = eq->per_band_cfg[i].band_idx;
34041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George            *p_param_values++ = eq->per_band_cfg[i].filter_type;
34141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George	    *p_param_values++ = eq->per_band_cfg[i].freq_millihertz;
34241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George            *p_param_values++ = eq->per_band_cfg[i].gain_millibels;
34341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George            *p_param_values++ = eq->per_band_cfg[i].quality_factor;
34441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        }
34541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        param_values[2] += 1;
34641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    }
34741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
34841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    if (param_values[2] && ctl)
34941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        mixer_ctl_set_array(ctl, param_values, ARRAY_SIZE(param_values));
35041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
35141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    return 0;
35241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
35341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
35441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgevoid offload_reverb_set_device(struct reverb_params *reverb, uint32_t device)
35541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
35641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s", __func__);
35741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    reverb->device = device;
35841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
35941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
36041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgevoid offload_reverb_set_enable_flag(struct reverb_params *reverb, bool enable)
36141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
36241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s", __func__);
36341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    reverb->enable_flag = enable;
36441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
36541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
36641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgeint offload_reverb_get_enable_flag(struct reverb_params *reverb)
36741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
36841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s", __func__);
36941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    return reverb->enable_flag;
37041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
37141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
37241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgevoid offload_reverb_set_mode(struct reverb_params *reverb, int mode)
37341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
37441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s", __func__);
37541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    reverb->mode = mode;
37641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
37741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
37841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgevoid offload_reverb_set_preset(struct reverb_params *reverb, int preset)
37941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
38041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s", __func__);
38141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    if (preset && (preset <= NUM_OSL_REVERB_PRESETS_SUPPORTED))
38241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        reverb->preset = map_reverb_opensl_preset_2_offload_preset[preset-1][1];
38341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
38441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
38541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgevoid offload_reverb_set_wet_mix(struct reverb_params *reverb, int wet_mix)
38641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
38741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s", __func__);
38841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    reverb->wet_mix = wet_mix;
38941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
39041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
39141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgevoid offload_reverb_set_gain_adjust(struct reverb_params *reverb,
39241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                    int gain_adjust)
39341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
39441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s", __func__);
39541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    reverb->gain_adjust = gain_adjust;
39641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
39741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
39841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgevoid offload_reverb_set_room_level(struct reverb_params *reverb, int room_level)
39941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
40041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s", __func__);
40141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    reverb->room_level = room_level;
40241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
40341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
40441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgevoid offload_reverb_set_room_hf_level(struct reverb_params *reverb,
40541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                      int room_hf_level)
40641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
40741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s", __func__);
40841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    reverb->room_hf_level = room_hf_level;
40941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
41041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
41141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgevoid offload_reverb_set_decay_time(struct reverb_params *reverb, int decay_time)
41241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
41341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s", __func__);
41441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    reverb->decay_time = decay_time;
41541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
41641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
41741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgevoid offload_reverb_set_decay_hf_ratio(struct reverb_params *reverb,
41841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                       int decay_hf_ratio)
41941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
42041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s", __func__);
42141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    reverb->decay_hf_ratio = decay_hf_ratio;
42241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
42341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
42441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgevoid offload_reverb_set_reflections_level(struct reverb_params *reverb,
42541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                          int reflections_level)
42641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
42741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s", __func__);
42841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    reverb->reflections_level = reflections_level;
42941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
43041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
43141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgevoid offload_reverb_set_reflections_delay(struct reverb_params *reverb,
43241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                          int reflections_delay)
43341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
43441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s", __func__);
43541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    reverb->reflections_delay = reflections_delay;
43641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
43741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
43841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgevoid offload_reverb_set_reverb_level(struct reverb_params *reverb,
43941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                     int reverb_level)
44041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
44141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s", __func__);
44241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    reverb->level = reverb_level;
44341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
44441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
44541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgevoid offload_reverb_set_delay(struct reverb_params *reverb, int delay)
44641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
44741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s", __func__);
44841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    reverb->delay = delay;
44941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
45041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
45141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgevoid offload_reverb_set_diffusion(struct reverb_params *reverb, int diffusion)
45241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
45341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s", __func__);
45441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    reverb->diffusion = diffusion;
45541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
45641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
45741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgevoid offload_reverb_set_density(struct reverb_params *reverb, int density)
45841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
45941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s", __func__);
46041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    reverb->density = density;
46141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
46241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
46341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgeint offload_reverb_send_params(struct mixer_ctl *ctl,
46441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                               struct reverb_params *reverb,
46541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                               unsigned param_send_flags)
46641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
46741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    int param_values[128] = {0};
46841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    int *p_param_values = param_values;
46941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
47041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s", __func__);
47141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    *p_param_values++ = REVERB_MODULE;
47241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    *p_param_values++ = reverb->device;
47341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    *p_param_values++ = 0; /* num of commands*/
47441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
47541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    if (param_send_flags & OFFLOAD_SEND_REVERB_ENABLE_FLAG) {
47641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = REVERB_ENABLE;
47741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = CONFIG_SET;
47841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = 0; /* start offset if param size if greater than 128  */
47941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = REVERB_ENABLE_PARAM_LEN;
48041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = reverb->enable_flag;
48141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        param_values[2] += 1;
48241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    }
48341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    if (param_send_flags & OFFLOAD_SEND_REVERB_MODE) {
48441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = REVERB_MODE;
48541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = CONFIG_SET;
48641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = 0; /* start offset if param size if greater than 128  */
48741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = REVERB_MODE_PARAM_LEN;
48841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = reverb->mode;
48941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        param_values[2] += 1;
49041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    }
49141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    if (param_send_flags & OFFLOAD_SEND_REVERB_PRESET) {
49241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = REVERB_PRESET;
49341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = CONFIG_SET;
49441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = 0; /* start offset if param size if greater than 128  */
49541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = REVERB_PRESET_PARAM_LEN;
49641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = reverb->preset;
49741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        param_values[2] += 1;
49841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    }
49941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    if (param_send_flags & OFFLOAD_SEND_REVERB_WET_MIX) {
50041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = REVERB_WET_MIX;
50141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = CONFIG_SET;
50241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = 0; /* start offset if param size if greater than 128  */
50341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = REVERB_WET_MIX_PARAM_LEN;
50441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = reverb->wet_mix;
50541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        param_values[2] += 1;
50641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    }
50741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    if (param_send_flags & OFFLOAD_SEND_REVERB_GAIN_ADJUST) {
50841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = REVERB_GAIN_ADJUST;
50941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = CONFIG_SET;
51041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = 0; /* start offset if param size if greater than 128  */
51141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = REVERB_GAIN_ADJUST_PARAM_LEN;
51241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = reverb->gain_adjust;
51341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        param_values[2] += 1;
51441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    }
51541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    if (param_send_flags & OFFLOAD_SEND_REVERB_ROOM_LEVEL) {
51641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = REVERB_ROOM_LEVEL;
51741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = CONFIG_SET;
51841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = 0; /* start offset if param size if greater than 128  */
51941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = REVERB_ROOM_LEVEL_PARAM_LEN;
52041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = reverb->room_level;
52141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        param_values[2] += 1;
52241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    }
52341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    if (param_send_flags & OFFLOAD_SEND_REVERB_ROOM_HF_LEVEL) {
52441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = REVERB_ROOM_HF_LEVEL;
52541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = CONFIG_SET;
52641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = 0; /* start offset if param size if greater than 128  */
52741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = REVERB_ROOM_HF_LEVEL_PARAM_LEN;
52841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = reverb->room_hf_level;
52941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        param_values[2] += 1;
53041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    }
53141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    if (param_send_flags & OFFLOAD_SEND_REVERB_DECAY_TIME) {
53241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = REVERB_DECAY_TIME;
53341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = CONFIG_SET;
53441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = 0; /* start offset if param size if greater than 128  */
53541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = REVERB_DECAY_TIME_PARAM_LEN;
53641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = reverb->decay_time;
53741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        param_values[2] += 1;
53841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    }
53941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    if (param_send_flags & OFFLOAD_SEND_REVERB_DECAY_HF_RATIO) {
54041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = REVERB_DECAY_HF_RATIO;
54141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = CONFIG_SET;
54241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = 0; /* start offset if param size if greater than 128  */
54341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = REVERB_DECAY_HF_RATIO_PARAM_LEN;
54441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = reverb->decay_hf_ratio;
54541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        param_values[2] += 1;
54641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    }
54741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    if (param_send_flags & OFFLOAD_SEND_REVERB_REFLECTIONS_LEVEL) {
54841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = REVERB_REFLECTIONS_LEVEL;
54941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = CONFIG_SET;
55041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = 0; /* start offset if param size if greater than 128  */
55141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = REVERB_REFLECTIONS_LEVEL_PARAM_LEN;
55241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = reverb->reflections_level;
55341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        param_values[2] += 1;
55441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    }
55541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    if (param_send_flags & OFFLOAD_SEND_REVERB_REFLECTIONS_DELAY) {
55641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = REVERB_REFLECTIONS_DELAY;
55741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = CONFIG_SET;
55841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = 0; /* start offset if param size if greater than 128  */
55941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = REVERB_REFLECTIONS_DELAY_PARAM_LEN;
56041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = reverb->reflections_delay;
56141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        param_values[2] += 1;
56241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    }
56341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    if (param_send_flags & OFFLOAD_SEND_REVERB_LEVEL) {
56441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = REVERB_LEVEL;
56541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = CONFIG_SET;
56641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = 0; /* start offset if param size if greater than 128  */
56741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = REVERB_LEVEL_PARAM_LEN;
56841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = reverb->level;
56941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        param_values[2] += 1;
57041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    }
57141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    if (param_send_flags & OFFLOAD_SEND_REVERB_DELAY) {
57241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = REVERB_DELAY;
57341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = CONFIG_SET;
57441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = 0; /* start offset if param size if greater than 128  */
57541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = REVERB_DELAY_PARAM_LEN;
57641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = reverb->delay;
57741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        param_values[2] += 1;
57841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    }
57941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    if (param_send_flags & OFFLOAD_SEND_REVERB_DIFFUSION) {
58041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = REVERB_DIFFUSION;
58141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = CONFIG_SET;
58241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = 0; /* start offset if param size if greater than 128  */
58341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = REVERB_DIFFUSION_PARAM_LEN;
58441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = reverb->diffusion;
58541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        param_values[2] += 1;
58641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    }
58741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    if (param_send_flags & OFFLOAD_SEND_REVERB_DENSITY) {
58841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = REVERB_DENSITY;
58941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = CONFIG_SET;
59041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = 0; /* start offset if param size if greater than 128  */
59141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = REVERB_DENSITY_PARAM_LEN;
59241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *p_param_values++ = reverb->density;
59341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        param_values[2] += 1;
59441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    }
59541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
59641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    if (param_values[2] && ctl)
59741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        mixer_ctl_set_array(ctl, param_values, ARRAY_SIZE(param_values));
59841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
59941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    return 0;
60041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
601