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_reverb"
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_environmentalreverb.h>
2541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George#include <audio_effects/effect_presetreverb.h>
2641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
2741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George#include "effect_api.h"
2841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George#include "reverb.h"
2941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
3041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George/* Offload auxiliary environmental reverb UUID: 79a18026-18fd-4185-8233-0002a5d5c51b */
3141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgeconst effect_descriptor_t aux_env_reverb_descriptor = {
3241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        { 0xc2e5d5f0, 0x94bd, 0x4763, 0x9cac, { 0x4e, 0x23, 0x4d, 0x06, 0x83, 0x9e } },
3341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        { 0x79a18026, 0x18fd, 0x4185, 0x8233, { 0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b } },
3441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        EFFECT_CONTROL_API_VERSION,
3541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        (EFFECT_FLAG_TYPE_AUXILIARY | EFFECT_FLAG_HW_ACC_TUNNEL),
3641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        0, /* TODO */
3741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        1,
3841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        "MSM offload Auxiliary Environmental Reverb",
3941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        "The Android Open Source Project",
4041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George};
4141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
4241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George/* Offload insert environmental reverb UUID: eb64ea04-973b-43d2-8f5e-0002a5d5c51b */
4341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgeconst effect_descriptor_t ins_env_reverb_descriptor = {
4441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        {0xc2e5d5f0, 0x94bd, 0x4763, 0x9cac, {0x4e, 0x23, 0x4d, 0x06, 0x83, 0x9e}},
4541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        {0xeb64ea04, 0x973b, 0x43d2, 0x8f5e, {0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}},
4641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        EFFECT_CONTROL_API_VERSION,
4741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        (EFFECT_FLAG_TYPE_INSERT | EFFECT_FLAG_INSERT_FIRST | EFFECT_FLAG_HW_ACC_TUNNEL),
4841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        0, /* TODO */
4941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        1,
5041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        "MSM offload Insert Environmental Reverb",
5141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        "The Android Open Source Project",
5241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George};
5341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
5441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George// Offload auxiliary preset reverb UUID: 6987be09-b142-4b41-9056-0002a5d5c51b */
5541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgeconst effect_descriptor_t aux_preset_reverb_descriptor = {
5641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        {0x47382d60, 0xddd8, 0x11db, 0xbf3a, {0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}},
5741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        {0x6987be09, 0xb142, 0x4b41, 0x9056, {0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}},
5841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        EFFECT_CONTROL_API_VERSION,
5941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        (EFFECT_FLAG_TYPE_AUXILIARY | EFFECT_FLAG_HW_ACC_TUNNEL),
6041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        0, /* TODO */
6141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        1,
6241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        "MSM offload Auxiliary Preset Reverb",
6341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        "The Android Open Source Project",
6441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George};
6541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
6641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George// Offload insert preset reverb UUID: aa2bebf6-47cf-4613-9bca-0002a5d5c51b */
6741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgeconst effect_descriptor_t ins_preset_reverb_descriptor = {
6841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        {0x47382d60, 0xddd8, 0x11db, 0xbf3a, {0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}},
6941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        {0xaa2bebf6, 0x47cf, 0x4613, 0x9bca, {0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}},
7041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        EFFECT_CONTROL_API_VERSION,
7141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        (EFFECT_FLAG_TYPE_INSERT | EFFECT_FLAG_INSERT_FIRST | EFFECT_FLAG_HW_ACC_TUNNEL),
7241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        0, /* TODO */
7341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        1,
7441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        "MSM offload Insert Preset Reverb",
7541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        "The Android Open Source Project",
7641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George};
7741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
7841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgestatic const reverb_settings_t reverb_presets[] = {
7941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        // REVERB_PRESET_NONE: values are unused
8041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
8141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        // REVERB_PRESET_SMALLROOM
8241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        {-400, -600, 1100, 830, -400, 5, 500, 10, 1000, 1000},
8341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        // REVERB_PRESET_MEDIUMROOM
8441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        {-400, -600, 1300, 830, -1000, 20, -200, 20, 1000, 1000},
8541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        // REVERB_PRESET_LARGEROOM
8641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        {-400, -600, 1500, 830, -1600, 5, -1000, 40, 1000, 1000},
8741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        // REVERB_PRESET_MEDIUMHALL
8841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        {-400, -600, 1800, 700, -1300, 15, -800, 30, 1000, 1000},
8941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        // REVERB_PRESET_LARGEHALL
9041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        {-400, -600, 1800, 700, -2000, 30, -1400, 60, 1000, 1000},
9141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        // REVERB_PRESET_PLATE
9241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        {-400, -200, 1300, 900, 0, 2, 0, 10, 1000, 750},
9341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George};
9441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
9541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
9641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgevoid reverb_auxiliary_init(reverb_context_t *context)
9741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
9841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    context->auxiliary = true;
9941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    context->preset = false;
10041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
10141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
10241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgevoid reverb_insert_init(reverb_context_t *context)
10341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
10441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    context->auxiliary = false;
10541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    context->preset = true;
10641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    context->cur_preset = REVERB_PRESET_LAST + 1;
10741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    context->next_preset = REVERB_DEFAULT_PRESET;
10841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
10941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
11041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgevoid reverb_preset_init(reverb_context_t *context)
11141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
11241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    context->auxiliary = false;
11341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    context->preset = true;
11441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    context->cur_preset = REVERB_PRESET_LAST + 1;
11541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    context->next_preset = REVERB_DEFAULT_PRESET;
11641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
11741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
11841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George/*
11941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George * Reverb operations
12041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George */
12141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgeint16_t reverb_get_room_level(reverb_context_t *context)
12241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
12341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s: room level: %d", __func__, context->reverb_settings.roomLevel);
12441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    return context->reverb_settings.roomLevel;
12541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
12641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
12741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgevoid reverb_set_room_level(reverb_context_t *context, int16_t room_level)
12841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
12941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s: room level: %d", __func__, room_level);
13041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    context->reverb_settings.roomLevel = room_level;
13141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    offload_reverb_set_room_level(&(context->offload_reverb), room_level);
13241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    if (context->ctl)
13341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        offload_reverb_send_params(context->ctl, &context->offload_reverb,
13441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                   OFFLOAD_SEND_REVERB_ENABLE_FLAG |
13541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                   OFFLOAD_SEND_REVERB_ROOM_LEVEL);
13641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
13741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
13841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgeint16_t reverb_get_room_hf_level(reverb_context_t *context)
13941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
14041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s: room hf level: %d", __func__,
14141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George          context->reverb_settings.roomHFLevel);
14241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    return context->reverb_settings.roomHFLevel;
14341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
14441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
14541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgevoid reverb_set_room_hf_level(reverb_context_t *context, int16_t room_hf_level)
14641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
14741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s: room hf level: %d", __func__, room_hf_level);
14841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    context->reverb_settings.roomHFLevel = room_hf_level;
14941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    offload_reverb_set_room_hf_level(&(context->offload_reverb), room_hf_level);
15041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    if (context->ctl)
15141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        offload_reverb_send_params(context->ctl, &context->offload_reverb,
15241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                   OFFLOAD_SEND_REVERB_ENABLE_FLAG |
15341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                   OFFLOAD_SEND_REVERB_ROOM_HF_LEVEL);
15441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
15541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
15641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgeuint32_t reverb_get_decay_time(reverb_context_t *context)
15741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
15841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s: decay time: %d", __func__, context->reverb_settings.decayTime);
15941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    return context->reverb_settings.decayTime;
16041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
16141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
16241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgevoid reverb_set_decay_time(reverb_context_t *context, uint32_t decay_time)
16341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
16441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s: decay_time: %d", __func__, decay_time);
16541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    context->reverb_settings.decayTime = decay_time;
16641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    offload_reverb_set_decay_time(&(context->offload_reverb), decay_time);
16741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    if (context->ctl)
16841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        offload_reverb_send_params(context->ctl, &context->offload_reverb,
16941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                   OFFLOAD_SEND_REVERB_ENABLE_FLAG |
17041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                   OFFLOAD_SEND_REVERB_DECAY_TIME);
17141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
17241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
17341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgeint16_t reverb_get_decay_hf_ratio(reverb_context_t *context)
17441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
17541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s: decay hf ratio: %d", __func__,
17641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George          context->reverb_settings.decayHFRatio);
17741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    return context->reverb_settings.decayHFRatio;
17841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
17941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
18041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgevoid reverb_set_decay_hf_ratio(reverb_context_t *context, int16_t decay_hf_ratio)
18141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
18241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s: decay_hf_ratio: %d", __func__, decay_hf_ratio);
18341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    context->reverb_settings.decayHFRatio = decay_hf_ratio;
18441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    offload_reverb_set_decay_hf_ratio(&(context->offload_reverb), decay_hf_ratio);
18541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    if (context->ctl)
18641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        offload_reverb_send_params(context->ctl, &context->offload_reverb,
18741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                   OFFLOAD_SEND_REVERB_ENABLE_FLAG |
18841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                   OFFLOAD_SEND_REVERB_DECAY_HF_RATIO);
18941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
19041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
19141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgeint16_t reverb_get_reverb_level(reverb_context_t *context)
19241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
19341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s: reverb level: %d", __func__, context->reverb_settings.reverbLevel);
19441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    return context->reverb_settings.reverbLevel;
19541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
19641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
19741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgevoid reverb_set_reverb_level(reverb_context_t *context, int16_t reverb_level)
19841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
19941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s: reverb level: %d", __func__, reverb_level);
20041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    context->reverb_settings.reverbLevel = reverb_level;
20141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    offload_reverb_set_reverb_level(&(context->offload_reverb), reverb_level);
20241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    if (context->ctl)
20341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        offload_reverb_send_params(context->ctl, &context->offload_reverb,
20441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                   OFFLOAD_SEND_REVERB_ENABLE_FLAG |
20541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                   OFFLOAD_SEND_REVERB_LEVEL);
20641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
20741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
20841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgeint16_t reverb_get_diffusion(reverb_context_t *context)
20941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
21041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s: diffusion: %d", __func__, context->reverb_settings.diffusion);
21141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    return context->reverb_settings.diffusion;
21241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
21341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
21441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgevoid reverb_set_diffusion(reverb_context_t *context, int16_t diffusion)
21541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
21641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s: diffusion: %d", __func__, diffusion);
21741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    context->reverb_settings.diffusion = diffusion;
21841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    offload_reverb_set_diffusion(&(context->offload_reverb), diffusion);
21941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    if (context->ctl)
22041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        offload_reverb_send_params(context->ctl, &context->offload_reverb,
22141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                   OFFLOAD_SEND_REVERB_ENABLE_FLAG |
22241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                   OFFLOAD_SEND_REVERB_DIFFUSION);
22341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
22441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
22541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgeint16_t reverb_get_density(reverb_context_t *context)
22641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
22741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s: density: %d", __func__, context->reverb_settings.density);
22841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    return context->reverb_settings.density;
22941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
23041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
23141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgevoid reverb_set_density(reverb_context_t *context, int16_t density)
23241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
23341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s: density: %d", __func__, density);
23441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    context->reverb_settings.density = density;
23541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    offload_reverb_set_density(&(context->offload_reverb), density);
23641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    if (context->ctl)
23741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        offload_reverb_send_params(context->ctl, &context->offload_reverb,
23841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                   OFFLOAD_SEND_REVERB_ENABLE_FLAG |
23941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                   OFFLOAD_SEND_REVERB_DENSITY);
24041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
24141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
24241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgevoid reverb_set_preset(reverb_context_t *context, int16_t preset)
24341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
24441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    bool enable;
24541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s: preset: %d", __func__, preset);
24641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    context->next_preset = preset;
24741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    offload_reverb_set_preset(&(context->offload_reverb), preset);
24841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
24941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    enable = (preset == REVERB_PRESET_NONE) ? false: true;
25041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    offload_reverb_set_enable_flag(&(context->offload_reverb), enable);
25141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
25241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    if (context->ctl)
25341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        offload_reverb_send_params(context->ctl, &context->offload_reverb,
25441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                   OFFLOAD_SEND_REVERB_ENABLE_FLAG |
25541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                   OFFLOAD_SEND_REVERB_PRESET);
25641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
25741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
25841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgevoid reverb_set_all_properties(reverb_context_t *context,
25941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                               reverb_settings_t *reverb_settings)
26041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
26141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s", __func__);
26241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    context->reverb_settings.roomLevel = reverb_settings->roomLevel;
26341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    context->reverb_settings.roomHFLevel = reverb_settings->roomHFLevel;
26441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    context->reverb_settings.decayTime = reverb_settings->decayTime;
26541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    context->reverb_settings.decayHFRatio = reverb_settings->decayHFRatio;
26641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    context->reverb_settings.reverbLevel = reverb_settings->reverbLevel;
26741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    context->reverb_settings.diffusion = reverb_settings->diffusion;
26841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    context->reverb_settings.density = reverb_settings->density;
26941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    if (context->ctl)
27041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        offload_reverb_send_params(context->ctl, &context->offload_reverb,
27141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                   OFFLOAD_SEND_REVERB_ENABLE_FLAG |
27241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                   OFFLOAD_SEND_REVERB_ROOM_LEVEL |
27341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                   OFFLOAD_SEND_REVERB_ROOM_HF_LEVEL |
27441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                   OFFLOAD_SEND_REVERB_DECAY_TIME |
27541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                   OFFLOAD_SEND_REVERB_DECAY_HF_RATIO |
27641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                   OFFLOAD_SEND_REVERB_LEVEL |
27741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                   OFFLOAD_SEND_REVERB_DIFFUSION |
27841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                   OFFLOAD_SEND_REVERB_DENSITY);
27941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
28041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
28141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgevoid reverb_load_preset(reverb_context_t *context)
28241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
28341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    context->cur_preset = context->next_preset;
28441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
28541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    if (context->cur_preset != REVERB_PRESET_NONE) {
28641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        const reverb_settings_t *preset = &reverb_presets[context->cur_preset];
28741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        reverb_set_room_level(context, preset->roomLevel);
28841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        reverb_set_room_hf_level(context, preset->roomHFLevel);
28941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        reverb_set_decay_time(context, preset->decayTime);
29041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        reverb_set_decay_hf_ratio(context, preset->decayHFRatio);
29141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        reverb_set_reverb_level(context, preset->reverbLevel);
29241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        reverb_set_diffusion(context, preset->diffusion);
29341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        reverb_set_density(context, preset->density);
29441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    }
29541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
29641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
29741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgeint reverb_get_parameter(effect_context_t *context, effect_param_t *p,
29841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                         uint32_t *size)
29941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
30041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    reverb_context_t *reverb_ctxt = (reverb_context_t *)context;
30141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    int voffset = ((p->psize - 1) / sizeof(int32_t) + 1) * sizeof(int32_t);
30241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    int32_t *param_tmp = (int32_t *)p->data;
30341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    int32_t param = *param_tmp++;
30441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    void *value = p->data + voffset;
30541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    reverb_settings_t *reverb_settings;
30641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    int i;
30741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
30841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s", __func__);
30941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
31041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    p->status = 0;
31141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
31241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    if (reverb_ctxt->preset) {
31341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        if (param != REVERB_PARAM_PRESET || p->vsize < sizeof(uint16_t))
31441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George            return -EINVAL;
31541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *(uint16_t *)value = reverb_ctxt->next_preset;
31641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        ALOGV("get REVERB_PARAM_PRESET, preset %d", reverb_ctxt->next_preset);
31741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        return 0;
31841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    }
31941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    switch (param) {
32041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    case REVERB_PARAM_ROOM_LEVEL:
32141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        if (p->vsize < sizeof(uint16_t))
32241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George           p->status = -EINVAL;
32341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        p->vsize = sizeof(uint16_t);
32441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        break;
32541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    case REVERB_PARAM_ROOM_HF_LEVEL:
32641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        if (p->vsize < sizeof(uint16_t))
32741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George           p->status = -EINVAL;
32841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        p->vsize = sizeof(uint16_t);
32941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        break;
33041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    case REVERB_PARAM_DECAY_TIME:
33141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        if (p->vsize < sizeof(uint32_t))
33241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George           p->status = -EINVAL;
33341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        p->vsize = sizeof(uint32_t);
33441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        break;
33541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    case REVERB_PARAM_DECAY_HF_RATIO:
33641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        if (p->vsize < sizeof(uint16_t))
33741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George           p->status = -EINVAL;
33841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        p->vsize = sizeof(uint16_t);
33941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        break;
34041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    case REVERB_PARAM_REFLECTIONS_LEVEL:
34141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        if (p->vsize < sizeof(uint16_t))
34241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George           p->status = -EINVAL;
34341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        p->vsize = sizeof(uint16_t);
34441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        break;
34541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    case REVERB_PARAM_REFLECTIONS_DELAY:
34641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        if (p->vsize < sizeof(uint32_t))
34741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George           p->status = -EINVAL;
34841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        p->vsize = sizeof(uint32_t);
34941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        break;
35041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    case REVERB_PARAM_REVERB_LEVEL:
35141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        if (p->vsize < sizeof(uint16_t))
35241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George           p->status = -EINVAL;
35341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        p->vsize = sizeof(uint16_t);
35441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        break;
35541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    case REVERB_PARAM_REVERB_DELAY:
35641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        if (p->vsize < sizeof(uint32_t))
35741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George           p->status = -EINVAL;
35841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        p->vsize = sizeof(uint32_t);
35941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        break;
36041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    case REVERB_PARAM_DIFFUSION:
36141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        if (p->vsize < sizeof(uint16_t))
36241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George           p->status = -EINVAL;
36341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        p->vsize = sizeof(uint16_t);
36441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        break;
36541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    case REVERB_PARAM_DENSITY:
36641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        if (p->vsize < sizeof(uint16_t))
36741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George           p->status = -EINVAL;
36841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        p->vsize = sizeof(uint16_t);
36941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        break;
37041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    case REVERB_PARAM_PROPERTIES:
37141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        if (p->vsize < sizeof(reverb_settings_t))
37241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George           p->status = -EINVAL;
37341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        p->vsize = sizeof(reverb_settings_t);
37441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        break;
37541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    default:
37641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        p->status = -EINVAL;
37741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    }
37841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
37941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    *size = sizeof(effect_param_t) + voffset + p->vsize;
38041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
38141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    if (p->status != 0)
38241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        return 0;
38341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
38441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    switch (param) {
38541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    case REVERB_PARAM_PROPERTIES:
38641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George	ALOGV("%s: REVERB_PARAM_PROPERTIES", __func__);
38741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        reverb_settings = (reverb_settings_t *)value;
38841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        reverb_settings->roomLevel = reverb_get_room_level(reverb_ctxt);
38941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        reverb_settings->roomHFLevel = reverb_get_room_hf_level(reverb_ctxt);
39041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        reverb_settings->decayTime = reverb_get_decay_time(reverb_ctxt);
39141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        reverb_settings->decayHFRatio = reverb_get_decay_hf_ratio(reverb_ctxt);
39241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        reverb_settings->reflectionsLevel = 0;
39341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        reverb_settings->reflectionsDelay = 0;
39441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        reverb_settings->reverbDelay = 0;
39541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        reverb_settings->reverbLevel = reverb_get_reverb_level(reverb_ctxt);
39641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        reverb_settings->diffusion = reverb_get_diffusion(reverb_ctxt);
39741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        reverb_settings->density = reverb_get_density(reverb_ctxt);
39841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        break;
39941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    case REVERB_PARAM_ROOM_LEVEL:
40041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George	ALOGV("%s: REVERB_PARAM_ROOM_LEVEL", __func__);
40141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *(int16_t *)value = reverb_get_room_level(reverb_ctxt);
40241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        break;
40341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    case REVERB_PARAM_ROOM_HF_LEVEL:
40441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George	ALOGV("%s: REVERB_PARAM_ROOM_HF_LEVEL", __func__);
40541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *(int16_t *)value = reverb_get_room_hf_level(reverb_ctxt);
40641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        break;
40741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    case REVERB_PARAM_DECAY_TIME:
40841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George	ALOGV("%s: REVERB_PARAM_DECAY_TIME", __func__);
40941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *(uint32_t *)value = reverb_get_decay_time(reverb_ctxt);
41041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        break;
41141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    case REVERB_PARAM_DECAY_HF_RATIO:
41241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George	ALOGV("%s: REVERB_PARAM_DECAY_HF_RATIO", __func__);
41341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *(int16_t *)value = reverb_get_decay_hf_ratio(reverb_ctxt);
41441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        break;
41541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    case REVERB_PARAM_REVERB_LEVEL:
41641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George	ALOGV("%s: REVERB_PARAM_REVERB_LEVEL", __func__);
41741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *(int16_t *)value = reverb_get_reverb_level(reverb_ctxt);
41841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        break;
41941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    case REVERB_PARAM_DIFFUSION:
42041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George	ALOGV("%s: REVERB_PARAM_DIFFUSION", __func__);
42141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *(int16_t *)value = reverb_get_diffusion(reverb_ctxt);
42241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        break;
42341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    case REVERB_PARAM_DENSITY:
42441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George	ALOGV("%s: REVERB_PARAM_DENSITY", __func__);
42541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *(int16_t *)value = reverb_get_density(reverb_ctxt);
42641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        break;
42741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    case REVERB_PARAM_REFLECTIONS_LEVEL:
42841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George	ALOGV("%s: REVERB_PARAM_REFLECTIONS_LEVEL", __func__);
42941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *(uint16_t *)value = 0;
43041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        break;
43141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    case REVERB_PARAM_REFLECTIONS_DELAY:
43241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George	ALOGV("%s: REVERB_PARAM_REFLECTIONS_DELAY", __func__);
43341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *(uint32_t *)value = 0;
43441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        break;
43541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    case REVERB_PARAM_REVERB_DELAY:
43641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George	ALOGV("%s: REVERB_PARAM_REVERB_DELAY", __func__);
43741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        *(uint32_t *)value = 0;
43841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        break;
43941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    default:
44041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        p->status = -EINVAL;
44141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        break;
44241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    }
44341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
44441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    return 0;
44541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
44641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
44741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgeint reverb_set_parameter(effect_context_t *context, effect_param_t *p,
44897a1059da4d3aa8bfb0883d5f932f86b95876512Haynes Mathew George                         uint32_t size __unused)
44941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
45041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    reverb_context_t *reverb_ctxt = (reverb_context_t *)context;
45141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    int voffset = ((p->psize - 1) / sizeof(int32_t) + 1) * sizeof(int32_t);
45241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    void *value = p->data + voffset;
45341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    int32_t *param_tmp = (int32_t *)p->data;
45441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    int32_t param = *param_tmp++;
45541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    reverb_settings_t *reverb_settings;
45641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    int16_t level;
45741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    int16_t ratio;
45841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    uint32_t time;
45941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
46041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s", __func__);
46141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
46241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    p->status = 0;
46341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
46441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    if (reverb_ctxt->preset) {
46541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        if (param != REVERB_PARAM_PRESET)
46641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George            return -EINVAL;
46741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        uint16_t preset = *(uint16_t *)value;
46841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        ALOGV("set REVERB_PARAM_PRESET, preset %d", preset);
46941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        if (preset > REVERB_PRESET_LAST) {
47041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George            return -EINVAL;
47141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        }
47241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        reverb_set_preset(reverb_ctxt, preset);
47341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        return 0;
47441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    }
47541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    switch (param) {
47641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    case REVERB_PARAM_PROPERTIES:
47741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George	ALOGV("%s: REVERB_PARAM_PROPERTIES", __func__);
47841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        reverb_settings = (reverb_settings_t *)value;
47941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        break;
48041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    case REVERB_PARAM_ROOM_LEVEL:
48141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George	ALOGV("%s: REVERB_PARAM_ROOM_LEVEL", __func__);
48241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        level = *(int16_t *)value;
48341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        reverb_set_room_level(reverb_ctxt, level);
48441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        break;
48541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    case REVERB_PARAM_ROOM_HF_LEVEL:
48641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George	ALOGV("%s: REVERB_PARAM_ROOM_HF_LEVEL", __func__);
48741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        level = *(int16_t *)value;
48841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        reverb_set_room_hf_level(reverb_ctxt, level);
48941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        break;
49041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    case REVERB_PARAM_DECAY_TIME:
49141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George	ALOGV("%s: REVERB_PARAM_DECAY_TIME", __func__);
49241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        time = *(uint32_t *)value;
49341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        reverb_set_decay_time(reverb_ctxt, time);
49441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        break;
49541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    case REVERB_PARAM_DECAY_HF_RATIO:
49641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George	ALOGV("%s: REVERB_PARAM_DECAY_HF_RATIO", __func__);
49741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        ratio = *(int16_t *)value;
49841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        reverb_set_decay_hf_ratio(reverb_ctxt, ratio);
49941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        break;
50041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    case REVERB_PARAM_REVERB_LEVEL:
50141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George	ALOGV("%s: REVERB_PARAM_REVERB_LEVEL", __func__);
50241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        level = *(int16_t *)value;
50341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        reverb_set_reverb_level(reverb_ctxt, level);
50441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        break;
50541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    case REVERB_PARAM_DIFFUSION:
50641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George	ALOGV("%s: REVERB_PARAM_DIFFUSION", __func__);
50741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        ratio = *(int16_t *)value;
50841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        reverb_set_diffusion(reverb_ctxt, ratio);
50941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        break;
51041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    case REVERB_PARAM_DENSITY:
51141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George	ALOGV("%s: REVERB_PARAM_DENSITY", __func__);
51241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        ratio = *(int16_t *)value;
51341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        reverb_set_density(reverb_ctxt, ratio);
51441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        break;
51541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    case REVERB_PARAM_REFLECTIONS_LEVEL:
51641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    case REVERB_PARAM_REFLECTIONS_DELAY:
51741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    case REVERB_PARAM_REVERB_DELAY:
51841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        break;
51941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    default:
52041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        p->status = -EINVAL;
52141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        break;
52241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    }
52341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
52441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    return 0;
52541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
52641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
52741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgeint reverb_set_device(effect_context_t *context, uint32_t device)
52841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
52941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    reverb_context_t *reverb_ctxt = (reverb_context_t *)context;
53041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
53141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s: device: %d", __func__, device);
53241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    reverb_ctxt->device = device;
53341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    offload_reverb_set_device(&(reverb_ctxt->offload_reverb), device);
53441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    return 0;
53541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
53641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
53741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgeint reverb_reset(effect_context_t *context)
53841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
53941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    reverb_context_t *reverb_ctxt = (reverb_context_t *)context;
54041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
54141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    return 0;
54241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
54341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
54441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgeint reverb_init(effect_context_t *context)
54541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
54641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    reverb_context_t *reverb_ctxt = (reverb_context_t *)context;
54741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
54841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    context->config.inputCfg.accessMode = EFFECT_BUFFER_ACCESS_READ;
54941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    /*
55041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George       FIXME: channel mode is mono for auxiliary. is it needed for offload ?
55141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George              If so, this set config needs to be updated accordingly
55241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    */
55341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    context->config.inputCfg.channels = AUDIO_CHANNEL_OUT_STEREO;
55441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    context->config.inputCfg.format = AUDIO_FORMAT_PCM_16_BIT;
55541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    context->config.inputCfg.samplingRate = 44100;
55641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    context->config.inputCfg.bufferProvider.getBuffer = NULL;
55741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    context->config.inputCfg.bufferProvider.releaseBuffer = NULL;
55841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    context->config.inputCfg.bufferProvider.cookie = NULL;
55941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    context->config.inputCfg.mask = EFFECT_CONFIG_ALL;
56041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    context->config.outputCfg.accessMode = EFFECT_BUFFER_ACCESS_ACCUMULATE;
56141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    context->config.outputCfg.channels = AUDIO_CHANNEL_OUT_STEREO;
56241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    context->config.outputCfg.format = AUDIO_FORMAT_PCM_16_BIT;
56341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    context->config.outputCfg.samplingRate = 44100;
56441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    context->config.outputCfg.bufferProvider.getBuffer = NULL;
56541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    context->config.outputCfg.bufferProvider.releaseBuffer = NULL;
56641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    context->config.outputCfg.bufferProvider.cookie = NULL;
56741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    context->config.outputCfg.mask = EFFECT_CONFIG_ALL;
56841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
56941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    set_config(context, &context->config);
57041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
57141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    memset(&(reverb_ctxt->reverb_settings), 0, sizeof(reverb_settings_t));
57241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    memset(&(reverb_ctxt->offload_reverb), 0, sizeof(struct reverb_params));
57341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
57441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    if (reverb_ctxt->preset &&
57541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        reverb_ctxt->next_preset != reverb_ctxt->cur_preset)
57641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        reverb_load_preset(reverb_ctxt);
57741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
57841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    return 0;
57941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
58041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
58141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgeint reverb_enable(effect_context_t *context)
58241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
58341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    reverb_context_t *reverb_ctxt = (reverb_context_t *)context;
58441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
58541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s", __func__);
58641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
58741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    if (!offload_reverb_get_enable_flag(&(reverb_ctxt->offload_reverb)))
58841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        offload_reverb_set_enable_flag(&(reverb_ctxt->offload_reverb), true);
58941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    return 0;
59041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
59141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
59241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgeint reverb_disable(effect_context_t *context)
59341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
59441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    reverb_context_t *reverb_ctxt = (reverb_context_t *)context;
59541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
59641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s", __func__);
59741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    if (offload_reverb_get_enable_flag(&(reverb_ctxt->offload_reverb))) {
59841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        offload_reverb_set_enable_flag(&(reverb_ctxt->offload_reverb), false);
59941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        if (reverb_ctxt->ctl)
60041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George            offload_reverb_send_params(reverb_ctxt->ctl,
60141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                       &reverb_ctxt->offload_reverb,
60241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                       OFFLOAD_SEND_REVERB_ENABLE_FLAG);
60341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    }
60441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    return 0;
60541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
60641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
60741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew Georgeint reverb_start(effect_context_t *context, output_context_t *output)
60841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
60941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    reverb_context_t *reverb_ctxt = (reverb_context_t *)context;
61041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
61141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s", __func__);
61241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    reverb_ctxt->ctl = output->ctl;
61341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    if (offload_reverb_get_enable_flag(&(reverb_ctxt->offload_reverb))) {
61441f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        if (reverb_ctxt->ctl && reverb_ctxt->preset) {
61541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George            offload_reverb_send_params(reverb_ctxt->ctl, &reverb_ctxt->offload_reverb,
61641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                       OFFLOAD_SEND_REVERB_ENABLE_FLAG |
61741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George                                       OFFLOAD_SEND_REVERB_PRESET);
61841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George        }
61941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    }
62041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
62141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    return 0;
62241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
62341f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
62497a1059da4d3aa8bfb0883d5f932f86b95876512Haynes Mathew Georgeint reverb_stop(effect_context_t *context, output_context_t *output __unused)
62541f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George{
62641f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    reverb_context_t *reverb_ctxt = (reverb_context_t *)context;
62741f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
62841f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    ALOGV("%s", __func__);
62941f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    reverb_ctxt->ctl = NULL;
63041f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George    return 0;
63141f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George}
63241f86651e362abc62d9d03f5c612c986bf15298fHaynes Mathew George
633