android_Effect.cpp revision 00667fcca51d62236b538e6857b7e6b923453569
14be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi/*
24be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi * Copyright (C) 2010 The Android Open Source Project
34be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi *
44be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi * Licensed under the Apache License, Version 2.0 (the "License");
54be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi * you may not use this file except in compliance with the License.
64be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi * You may obtain a copy of the License at
74be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi *
84be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi *      http://www.apache.org/licenses/LICENSE-2.0
94be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi *
104be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi * Unless required by applicable law or agreed to in writing, software
114be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi * distributed under the License is distributed on an "AS IS" BASIS,
124be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
134be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi * See the License for the specific language governing permissions and
144be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi * limitations under the License.
154be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi */
164be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
174be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
184be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#include "sles_allinclusive.h"
194be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#include "math.h"
204be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#include "utils/RefBase.h"
214be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
224be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
234be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivistatic const int EQUALIZER_PARAM_SIZE_MAX = sizeof(effect_param_t) + 2 * sizeof(int32_t)
244be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        + EFFECT_STRING_LEN_MAX;
254be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
269cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivistatic const int BASSBOOST_PARAM_SIZE_MAX = sizeof(effect_param_t) + 2 * sizeof(int32_t);
279cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi
28f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivistatic const int VIRTUALIZER_PARAM_SIZE_MAX = sizeof(effect_param_t) + 2 * sizeof(int32_t);
29f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi
30f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivistatic const int ENVREVERB_PARAM_SIZE_MAX_SINGLE = sizeof(effect_param_t) + 2 * sizeof(int32_t);
31f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi
32f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivistatic const int ENVREVERB_PARAM_SIZE_MAX_ALL = sizeof(effect_param_t) + sizeof(int32_t)
33f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi        + sizeof(s_reverb_settings);
34f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi
355b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivistatic inline SLuint32 KEY_FROM_GUID(SLInterfaceID pUuid) {
365b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi    return pUuid->time_low;
375b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi}
385b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi
394be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
404be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi//-----------------------------------------------------------------------------
419cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Triviuint32_t eq_paramSize(int32_t param) {
424be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    uint32_t size;
434be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
444be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    switch (param) {
454be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    case EQ_PARAM_NUM_BANDS:
464be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    case EQ_PARAM_LEVEL_RANGE:
474be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    case EQ_PARAM_CUR_PRESET:
484be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    case EQ_PARAM_GET_NUM_OF_PRESETS:
494be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        size = sizeof(int32_t);
504be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        break;
514be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    case EQ_PARAM_BAND_LEVEL:
524be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    case EQ_PARAM_CENTER_FREQ:
534be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    case EQ_PARAM_BAND_FREQ_RANGE:
544be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    case EQ_PARAM_GET_BAND:
554be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    case EQ_PARAM_GET_PRESET_NAME:
564be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        size = 2 * sizeof(int32_t);
574be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        break;
584be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    default:
594be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        size = 2 * sizeof(int32_t);
604be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        SL_LOGE("Trying to use an unknown EQ parameter %d", param);
614be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        break;
624be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    }
634be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    return size;
644be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi}
654be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
669cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Triviuint32_t eq_valueSize(int32_t param) {
674be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    uint32_t size;
684be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
694be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    switch (param) {
704be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    case EQ_PARAM_NUM_BANDS:
714be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    case EQ_PARAM_CUR_PRESET:
724be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    case EQ_PARAM_GET_NUM_OF_PRESETS:
734be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    case EQ_PARAM_BAND_LEVEL:
744be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    case EQ_PARAM_GET_BAND:
75b3b757daa7d162b6f66590d917c1f84f3ba73c70Eric Laurent        size = sizeof(int16_t);
76b3b757daa7d162b6f66590d917c1f84f3ba73c70Eric Laurent        break;
77b3b757daa7d162b6f66590d917c1f84f3ba73c70Eric Laurent    case EQ_PARAM_LEVEL_RANGE:
78b3b757daa7d162b6f66590d917c1f84f3ba73c70Eric Laurent        size = 2 * sizeof(int16_t);
79b3b757daa7d162b6f66590d917c1f84f3ba73c70Eric Laurent        break;
804be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    case EQ_PARAM_CENTER_FREQ:
814be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        size = sizeof(int32_t);
824be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        break;
834be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    case EQ_PARAM_BAND_FREQ_RANGE:
844be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        size = 2 * sizeof(int32_t);
854be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        break;
864be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    case EQ_PARAM_GET_PRESET_NAME:
874be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        size = EFFECT_STRING_LEN_MAX;
884be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        break;
894be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    default:
904be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        size = sizeof(int32_t);
914be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        SL_LOGE("Trying to access an unknown EQ parameter %d", param);
924be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        break;
934be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    }
944be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    return size;
954be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi}
964be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
979cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi//-----------------------------------------------------------------------------
989cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi/**
99f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi * returns the size in bytes of the value of each bass boost parameter
1009cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi */
101f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Triviuint32_t bb_valueSize(int32_t param) {
1029cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    uint32_t size;
1039cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi
1049cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    switch (param) {
1059cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    case BASSBOOST_PARAM_STRENGTH_SUPPORTED:
1069cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        size = sizeof(int32_t);
1079cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        break;
108f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    case BASSBOOST_PARAM_STRENGTH:
109f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi        size = sizeof(int16_t);
110f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi        break;
1119cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    default:
1129cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        size = sizeof(int32_t);
113f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi        SL_LOGE("Trying to access an unknown BassBoost parameter %d", param);
1149cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        break;
1159cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    }
1169cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi
1179cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    return size;
1189cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi}
1199cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi
120f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi//-----------------------------------------------------------------------------
1219cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi/**
122f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi * returns the size in bytes of the value of each virtualizer parameter
1239cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi */
124f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Triviuint32_t virt_valueSize(int32_t param) {
1259cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    uint32_t size;
1269cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi
1279cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    switch (param) {
128f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    case VIRTUALIZER_PARAM_STRENGTH_SUPPORTED:
1299cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        size = sizeof(int32_t);
1309cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        break;
131f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    case VIRTUALIZER_PARAM_STRENGTH:
1329cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        size = sizeof(int16_t);
1339cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        break;
1349cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    default:
1359cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        size = sizeof(int32_t);
136f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi        SL_LOGE("Trying to access an unknown Virtualizer parameter %d", param);
1379cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        break;
1389cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    }
1399cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi
1409cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    return size;
1419cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi}
1429cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi
1434be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi//-----------------------------------------------------------------------------
144f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi/**
145f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi * returns the size in bytes of the value of each environmental reverb parameter
146f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi */
147f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Triviuint32_t erev_valueSize(int32_t param) {
148f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi    uint32_t size;
149f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi
150f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi    switch (param) {
151f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi    case REVERB_PARAM_ROOM_LEVEL:
152f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi    case REVERB_PARAM_ROOM_HF_LEVEL:
153f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi    case REVERB_PARAM_REFLECTIONS_LEVEL:
154f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi    case REVERB_PARAM_REVERB_LEVEL:
155f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi        size = sizeof(int16_t); // millibel
156f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi        break;
157f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi    case REVERB_PARAM_DECAY_TIME:
158f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi    case REVERB_PARAM_REFLECTIONS_DELAY:
159f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi    case REVERB_PARAM_REVERB_DELAY:
160f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi        size = sizeof(uint32_t); // milliseconds
161f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi        break;
162f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi    case REVERB_PARAM_DECAY_HF_RATIO:
163f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi    case REVERB_PARAM_DIFFUSION:
164f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi    case REVERB_PARAM_DENSITY:
165f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi        size = sizeof(int16_t); // permille
166f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi        break;
167f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi    case REVERB_PARAM_PROPERTIES:
168f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi        size = sizeof(s_reverb_settings); // struct of all reverb properties
169f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi        break;
170f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi    default:
171f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi        size = sizeof(int32_t);
172f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi        SL_LOGE("Trying to access an unknown Environmental Reverb parameter %d", param);
173f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi        break;
174f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi    }
175f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi
176f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi    return size;
177f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi}
178f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi
179f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi//-----------------------------------------------------------------------------
1804be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Triviandroid::status_t android_eq_getParam(android::sp<android::AudioEffect> pFx,
1814be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        int32_t param, int32_t param2, void *pValue)
1824be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi{
1834be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi     android::status_t status;
1844be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi     uint32_t buf32[(EQUALIZER_PARAM_SIZE_MAX - 1) / sizeof(uint32_t) + 1];
1854be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi     effect_param_t *p = (effect_param_t *)buf32;
1864be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
1874be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi     p->psize = eq_paramSize(param);
1884be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi     *(int32_t *)p->data = param;
1894be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi     if (p->psize == 2 * sizeof(int32_t)) {
1904be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi         *((int32_t *)p->data + 1) = param2;
1914be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi     }
1924be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi     p->vsize = eq_valueSize(param);
1934be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi     status = pFx->getParameter(p);
1944be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi     if (android::NO_ERROR == status) {
1954be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi         status = p->status;
1964be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi         if (android::NO_ERROR == status) {
1974be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi             memcpy(pValue, p->data + p->psize, p->vsize);
1984be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi         }
1994be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi     }
2004be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
2014be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi     return status;
2024be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi }
2034be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
2044be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
2054be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi//-----------------------------------------------------------------------------
2064be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Triviandroid::status_t android_eq_setParam(android::sp<android::AudioEffect> pFx,
2074be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        int32_t param, int32_t param2, void *pValue)
2084be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi{
2094be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    android::status_t status;
2104be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    uint32_t buf32[(EQUALIZER_PARAM_SIZE_MAX - 1) / sizeof(uint32_t) + 1];
2114be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    effect_param_t *p = (effect_param_t *)buf32;
2124be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
2134be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    p->psize = eq_paramSize(param);
2144be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    *(int32_t *)p->data = param;
2154be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    if (p->psize == 2 * sizeof(int32_t)) {
2164be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        *((int32_t *)p->data + 1) = param2;
2174be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    }
2184be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    p->vsize = eq_valueSize(param);
2194be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    memcpy(p->data + p->psize, pValue, p->vsize);
2204be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    status = pFx->setParameter(p);
2214be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    if (android::NO_ERROR == status) {
2224be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        status = p->status;
2234be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    }
2244be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
2254be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    return status;
2264be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi}
2274be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
2289cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi//-----------------------------------------------------------------------------
2299cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Triviandroid::status_t android_bb_setParam(android::sp<android::AudioEffect> pFx,
2309cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        int32_t param, void *pValue) {
2319cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi
232f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    return android_fx_setParam(pFx, param, BASSBOOST_PARAM_SIZE_MAX,
233f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi            pValue, bb_valueSize(param));
2349cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi}
2359cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi
2369cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi//-----------------------------------------------------------------------------
2379cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Triviandroid::status_t android_bb_getParam(android::sp<android::AudioEffect> pFx,
2389cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        int32_t param, void *pValue) {
2399cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi
240f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    return android_fx_getParam(pFx, param, BASSBOOST_PARAM_SIZE_MAX,
241f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi            pValue, bb_valueSize(param));
2429cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi}
2439cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi
2449cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi//-----------------------------------------------------------------------------
245172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivivoid android_bb_init(int sessionId, IBassBoost* ibb) {
2469cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    SL_LOGV("session %d", sessionId);
2479cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi
248172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi    if (!android_fx_initEffectObj(sessionId, ibb->mBassBoostEffect,
24900667fcca51d62236b538e6857b7e6b923453569Jean-Michel Trivi            &ibb->mBassBoostDescriptor.type))
250f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    {
251f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi        SL_LOGE("BassBoost effect initialization failed");
2529cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        return;
2539cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    }
2549cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi
255f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    // initialize strength
2569cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    int16_t strength;
257172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi    if (android::NO_ERROR == android_bb_getParam(ibb->mBassBoostEffect,
2589cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi            BASSBOOST_PARAM_STRENGTH, &strength)) {
259172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi        ibb->mStrength = (SLpermille) strength;
2609cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    }
2619cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi}
2624be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
2637e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi
2644be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi//-----------------------------------------------------------------------------
2657e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivivoid android_eq_init(int sessionId, IEqualizer* ieq) {
2669cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    SL_LOGV("session %d", sessionId);
2674be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
26800667fcca51d62236b538e6857b7e6b923453569Jean-Michel Trivi    if (!android_fx_initEffectObj(sessionId, ieq->mEqEffect, &ieq->mEqDescriptor.type)) {
269f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi        SL_LOGE("Equalizer effect initialization failed");
2704be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        return;
2714be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    }
2724be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
2737e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi    // initialize number of bands, band level range, and number of presets
274b3b757daa7d162b6f66590d917c1f84f3ba73c70Eric Laurent    uint16_t num = 0;
2757e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi    if (android::NO_ERROR == android_eq_getParam(ieq->mEqEffect, EQ_PARAM_NUM_BANDS, 0, &num)) {
2767e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi        ieq->mNumBands = num;
2774be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    }
278b3b757daa7d162b6f66590d917c1f84f3ba73c70Eric Laurent    int16_t range[2] = {0, 0};
2797e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi    if (android::NO_ERROR == android_eq_getParam(ieq->mEqEffect, EQ_PARAM_LEVEL_RANGE, 0, range)) {
2807e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi        ieq->mBandLevelRangeMin = range[0];
2817e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi        ieq->mBandLevelRangeMax = range[1];
2824be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    }
2834be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
2847e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi    SL_LOGV(" EQ init: num bands = %u, band range=[%d %d]mB", num, range[0], range[1]);
2854be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
2867e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi    // FIXME don't store presets names, they can be queried each time they're needed
2874be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    // initialize preset number and names, store in IEngine
288b3b757daa7d162b6f66590d917c1f84f3ba73c70Eric Laurent    uint16_t numPresets = 0;
2897e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi    if (android::NO_ERROR == android_eq_getParam(ieq->mEqEffect,
2904be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi            EQ_PARAM_GET_NUM_OF_PRESETS, 0, &numPresets)) {
2917e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi        ieq->mThis->mEngine->mEqNumPresets = numPresets;
2927e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi        ieq->mNumPresets = numPresets;
2934be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    }
2947e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi
2957e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi    interface_lock_exclusive(ieq->mThis->mEngine);
2964be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    char name[EFFECT_STRING_LEN_MAX];
2977e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi    if ((0 < numPresets) && (NULL == ieq->mThis->mEngine->mEqPresetNames)) {
2987e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi        ieq->mThis->mEngine->mEqPresetNames = (char **)new char *[numPresets];
2994be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        for(uint32_t i = 0 ; i < numPresets ; i++) {
3007e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi            if (android::NO_ERROR == android_eq_getParam(ieq->mEqEffect,
3014be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi                    EQ_PARAM_GET_PRESET_NAME, i, name)) {
3027e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi                ieq->mThis->mEngine->mEqPresetNames[i] = new char[strlen(name) + 1];
3037e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi                strcpy(ieq->mThis->mEngine->mEqPresetNames[i], name);
3047e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi                SL_LOGV(" EQ init: presets = %u is %s", i, ieq->mThis->mEngine->mEqPresetNames[i]);
3054be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi            }
3064be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        }
3074be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    }
3087e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi    interface_unlock_exclusive(ieq->mThis->mEngine);
3097e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi
3104be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#if 0
3114be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    // configure the EQ so it can easily be heard, for test only
3124be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    uint32_t freq = 1977;
3134be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    uint32_t frange[2];
314b3b757daa7d162b6f66590d917c1f84f3ba73c70Eric Laurent    int16_t value = ap->mEqualizer.mBandLevelRangeMin;
3154be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    for(int32_t i=0 ; i< ap->mEqualizer.mNumBands ; i++) {
3164be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        android_eq_setParam(ap->mEqualizer.mEqEffect, EQ_PARAM_BAND_LEVEL, i, &value);
3174be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        // display EQ characteristics
3184be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        android_eq_getParam(ap->mEqualizer.mEqEffect, EQ_PARAM_CENTER_FREQ, i, &freq);
3194be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        android_eq_getParam(ap->mEqualizer.mEqEffect, EQ_PARAM_BAND_FREQ_RANGE, i, frange);
32049e4076e940559bc204d0f0aa7ab412986445bfaGlenn Kasten        SL_LOGV(" EQ init: band %d = %d - %d - %dHz", i, frange[0]/1000, freq/1000,
3214be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi                frange[1]/1000);
3224be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    }
3234be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    value = ap->mEqualizer.mBandLevelRangeMax;
3244be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    if (ap->mEqualizer.mNumBands > 2) {
3254be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        android_eq_setParam(ap->mEqualizer.mEqEffect, EQ_PARAM_BAND_LEVEL, 2, &value);
3264be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    }
3274be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    if (ap->mEqualizer.mNumBands > 3) {
3284be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        android_eq_setParam(ap->mEqualizer.mEqEffect, EQ_PARAM_BAND_LEVEL, 3, &value);
3294be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    }
3304be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
3314be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    ap->mEqualizer.mEqEffect->setEnabled(true);
3324be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#endif
3334be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi}
3344be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
335f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi
336f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi//-----------------------------------------------------------------------------
337172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivivoid android_virt_init(int sessionId, IVirtualizer* ivi) {
338f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    SL_LOGV("session %d", sessionId);
339f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi
340172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi    if (!android_fx_initEffectObj(sessionId, ivi->mVirtualizerEffect,
34100667fcca51d62236b538e6857b7e6b923453569Jean-Michel Trivi            &ivi->mVirtualizerDescriptor.type)) {
342f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi        SL_LOGE("Virtualizer effect initialization failed");
343f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi        return;
344f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    }
345f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi
346f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    // initialize strength
347f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    int16_t strength;
348172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi    if (android::NO_ERROR == android_virt_getParam(ivi->mVirtualizerEffect,
349f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi            VIRTUALIZER_PARAM_STRENGTH, &strength)) {
350172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi        ivi->mStrength = (SLpermille) strength;
351f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    }
352f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi}
353f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi
354f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi//-----------------------------------------------------------------------------
355f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Triviandroid::status_t android_virt_setParam(android::sp<android::AudioEffect> pFx,
356f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi        int32_t param, void *pValue) {
357f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi
358f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    return android_fx_setParam(pFx, param, VIRTUALIZER_PARAM_SIZE_MAX,
359f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi            pValue, virt_valueSize(param));
360f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi}
361f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi
362f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi//-----------------------------------------------------------------------------
363f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Triviandroid::status_t android_virt_getParam(android::sp<android::AudioEffect> pFx,
364f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi        int32_t param, void *pValue) {
365f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi
366f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    return android_fx_getParam(pFx, param, VIRTUALIZER_PARAM_SIZE_MAX,
367f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi            pValue, virt_valueSize(param));
368f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi}
369f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi
370172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi
371172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi//-----------------------------------------------------------------------------
372172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivivoid android_prev_init(IPresetReverb* ipr) {
3733ff2bc607e5de281df3d8b54eb89a0ec56317102Jean-Michel Trivi    SL_LOGV("session is implicitly %d (aux effect)", android::AudioSystem::SESSION_OUTPUT_MIX);
374172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi
3753ff2bc607e5de281df3d8b54eb89a0ec56317102Jean-Michel Trivi    if (!android_fx_initEffectObj(android::AudioSystem::SESSION_OUTPUT_MIX /*sessionId*/,
37600667fcca51d62236b538e6857b7e6b923453569Jean-Michel Trivi            ipr->mPresetReverbEffect, &ipr->mPresetReverbDescriptor.type)) {
377172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi        SL_LOGE("PresetReverb effect initialization failed");
378172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi        return;
379172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi    }
380172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi
381172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi    // initialize preset
382172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi    uint16_t preset;
383172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi    if (android::NO_ERROR == android_prev_getPreset(ipr->mPresetReverbEffect, &preset)) {
384172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi        ipr->mPreset = preset;
38500667fcca51d62236b538e6857b7e6b923453569Jean-Michel Trivi        // enable the effect is it has a effective preset loaded
38600667fcca51d62236b538e6857b7e6b923453569Jean-Michel Trivi        ipr->mPresetReverbEffect->setEnabled(SL_REVERBPRESET_NONE != preset);
387172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi    }
388172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi}
389172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi
390172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi//-----------------------------------------------------------------------------
391172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Triviandroid::status_t android_prev_setPreset(android::sp<android::AudioEffect> pFx, uint16_t preset) {
39200667fcca51d62236b538e6857b7e6b923453569Jean-Michel Trivi    android::status_t status = android_fx_setParam(pFx, REVERB_PARAM_PRESET, sizeof(uint16_t),
39300667fcca51d62236b538e6857b7e6b923453569Jean-Michel Trivi            &preset, sizeof(uint16_t));
39400667fcca51d62236b538e6857b7e6b923453569Jean-Michel Trivi    // enable the effect if the preset is different from SL_REVERBPRESET_NONE
39500667fcca51d62236b538e6857b7e6b923453569Jean-Michel Trivi    pFx->setEnabled(SL_REVERBPRESET_NONE != preset);
39600667fcca51d62236b538e6857b7e6b923453569Jean-Michel Trivi    return status;
397172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi}
398172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi
399172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi//-----------------------------------------------------------------------------
400172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Triviandroid::status_t android_prev_getPreset(android::sp<android::AudioEffect> pFx, uint16_t* preset) {
401172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi    return android_fx_getParam(pFx, REVERB_PARAM_PRESET, sizeof(uint16_t), preset,
402172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi            sizeof(uint16_t));
403172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi}
404172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi
405172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi
406172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi//-----------------------------------------------------------------------------
407172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivivoid android_erev_init(IEnvironmentalReverb* ier) {
4083ff2bc607e5de281df3d8b54eb89a0ec56317102Jean-Michel Trivi    SL_LOGV("session is implicitly %d (aux effect)", android::AudioSystem::SESSION_OUTPUT_MIX);
409172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi
4103ff2bc607e5de281df3d8b54eb89a0ec56317102Jean-Michel Trivi    if (!android_fx_initEffectObj(android::AudioSystem::SESSION_OUTPUT_MIX /*sessionId*/,
41100667fcca51d62236b538e6857b7e6b923453569Jean-Michel Trivi            ier->mEnvironmentalReverbEffect, &ier->mEnvironmentalReverbDescriptor.type)) {
412172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi        SL_LOGE("EnvironmentalReverb effect initialization failed");
413172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi        return;
414172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi    }
415172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi
41600667fcca51d62236b538e6857b7e6b923453569Jean-Michel Trivi    // enable env reverb: other SL ES effects have an explicit SetEnabled() function, and the
41700667fcca51d62236b538e6857b7e6b923453569Jean-Michel Trivi    //  preset reverb state depends on the selected preset.
41800667fcca51d62236b538e6857b7e6b923453569Jean-Michel Trivi    ier->mEnvironmentalReverbEffect->setEnabled(true);
41900667fcca51d62236b538e6857b7e6b923453569Jean-Michel Trivi
420172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi    // initialize reverb properties
421f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi    SLEnvironmentalReverbSettings properties;
422f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi    if (android::NO_ERROR == android_erev_getParam(ier->mEnvironmentalReverbEffect,
423f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi            REVERB_PARAM_PROPERTIES, &properties)) {
424f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi        ier->mProperties = properties;
425f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi    }
426f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi}
427f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi
428f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi//-----------------------------------------------------------------------------
429f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Triviandroid::status_t android_erev_setParam(android::sp<android::AudioEffect> pFx,
430f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi        int32_t param, void *pValue) {
431f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi
432f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi    // given the size difference between a single reverb property and the whole set of reverb
433f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi    // properties, select which max size to pass to avoid allocating too much memory
434f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi    if (param == REVERB_PARAM_PROPERTIES) {
435f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi        return android_fx_setParam(pFx, param, ENVREVERB_PARAM_SIZE_MAX_ALL,
436f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi                pValue, erev_valueSize(param));
437f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi    } else {
438f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi        return android_fx_setParam(pFx, param, ENVREVERB_PARAM_SIZE_MAX_SINGLE,
439f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi                pValue, erev_valueSize(param));
440f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi    }
441f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi}
442172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi
443f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi//-----------------------------------------------------------------------------
444f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Triviandroid::status_t android_erev_getParam(android::sp<android::AudioEffect> pFx,
445f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi        int32_t param, void *pValue) {
446f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi
447f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi    // given the size difference between a single reverb property and the whole set of reverb
448f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi    // properties, select which max size to pass to avoid allocating too much memory
449f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi    if (param == REVERB_PARAM_PROPERTIES) {
450f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi        return android_fx_getParam(pFx, param, ENVREVERB_PARAM_SIZE_MAX_ALL,
451f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi                pValue, erev_valueSize(param));
452f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi    } else {
453f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi        return android_fx_getParam(pFx, param, ENVREVERB_PARAM_SIZE_MAX_SINGLE,
454f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi                pValue, erev_valueSize(param));
455f5afeef3bb2aafba9b4e7c25ab3b9dcf42ee8d65Jean-Michel Trivi    }
456172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi}
457172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi
458172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi
459172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi//-----------------------------------------------------------------------------
460172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Triviandroid::status_t android_fxSend_attach(CAudioPlayer* ap, bool attach,
461172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi        android::sp<android::AudioEffect> pFx, SLmillibel sendLevel) {
46200667fcca51d62236b538e6857b7e6b923453569Jean-Michel Trivi
463172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi    if ((NULL == ap->mAudioTrack) || (pFx == 0)) {
464172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi        return android::INVALID_OPERATION;
465172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi    }
466172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi
467172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi    if (attach) {
468172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi        android::status_t status = ap->mAudioTrack->attachAuxEffect(pFx->id());
46900667fcca51d62236b538e6857b7e6b923453569Jean-Michel Trivi        //SL_LOGV("attachAuxEffect(%d) returned %d", pFx->id(), status);
470172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi        if (android::NO_ERROR == status) {
471172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi            status =
472172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi                ap->mAudioTrack->setAuxEffectSendLevel( sles_to_android_amplification(sendLevel) );
473172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi        }
474172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi        return status;
475172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi    } else {
476172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi        return ap->mAudioTrack->attachAuxEffect(0);
477172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi    }
478172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi}
479172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi
480172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi//-----------------------------------------------------------------------------
481172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Triviandroid::status_t android_fxSend_setSendLevel(CAudioPlayer* ap, SLmillibel sendLevel) {
482172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi    if (NULL == ap->mAudioTrack) {
483172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi        return android::INVALID_OPERATION;
484172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi    }
485172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi
486172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi    return ap->mAudioTrack->setAuxEffectSendLevel( sles_to_android_amplification(sendLevel) );
487172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi}
488172e4da556ad3cb1d2a06cfa019903310aa291d5Jean-Michel Trivi
489f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi//-----------------------------------------------------------------------------
490f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Triviandroid::status_t android_fx_setParam(android::sp<android::AudioEffect> pFx,
491f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi        int32_t param, uint32_t paramSizeMax, void *pValue, uint32_t valueSize)
492f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi{
493f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi
494f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    android::status_t status;
495f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    uint32_t buf32[(paramSizeMax - 1) / sizeof(uint32_t) + 1];
496f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    effect_param_t *p = (effect_param_t *)buf32;
497f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi
498f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    p->psize = sizeof(int32_t);
499f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    *(int32_t *)p->data = param;
500f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    p->vsize = valueSize;
501f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    memcpy(p->data + p->psize, pValue, p->vsize);
502f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    status = pFx->setParameter(p);
503f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    if (android::NO_ERROR == status) {
504f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi        status = p->status;
505f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    }
506f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    return status;
507f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi}
508f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi
509f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi
510f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi//-----------------------------------------------------------------------------
511f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Triviandroid::status_t android_fx_getParam(android::sp<android::AudioEffect> pFx,
512f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi        int32_t param, uint32_t paramSizeMax, void *pValue, uint32_t valueSize)
513f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi{
514f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    android::status_t status;
515f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    uint32_t buf32[(paramSizeMax - 1) / sizeof(uint32_t) + 1];
516f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    effect_param_t *p = (effect_param_t *)buf32;
517f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi
518f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    p->psize = sizeof(int32_t);
519f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    *(int32_t *)p->data = param;
520f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    p->vsize = valueSize;
521f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    status = pFx->getParameter(p);
522f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    if (android::NO_ERROR == status) {
523f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi        status = p->status;
524f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi        if (android::NO_ERROR == status) {
525f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi            memcpy(pValue, p->data + p->psize, p->vsize);
526f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi        }
527f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    }
528f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi
529f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    return status;
530f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi}
531f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi
532f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi
5334be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi//-----------------------------------------------------------------------------
5344be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel TriviSLresult android_fx_statusToResult(android::status_t status) {
5354be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
5364be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    if ((android::INVALID_OPERATION == status) || (android::DEAD_OBJECT == status)) {
5374be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        return SL_RESULT_CONTROL_LOST;
5384be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    } else {
5394be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        return SL_RESULT_SUCCESS;
5404be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    }
5414be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi}
5424be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
54367bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
54467bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi//-----------------------------------------------------------------------------
545f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivibool android_fx_initEffectObj(int sessionId, android::sp<android::AudioEffect>& effect,
54600667fcca51d62236b538e6857b7e6b923453569Jean-Michel Trivi        const effect_uuid_t *type) {
547f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    SL_LOGV("session %d", sessionId);
548f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi
54900667fcca51d62236b538e6857b7e6b923453569Jean-Michel Trivi    effect = new android::AudioEffect(type, EFFECT_UUID_NULL,
550f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi            0,// priority
551f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi            0,// effect callback
552f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi            0,// callback data
553f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi            sessionId,// session ID
554f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi            0 );// output
555f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi
556f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    android::status_t status = effect->initCheck();
557f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    if (android::NO_ERROR != status) {
558f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi        effect.clear();
559f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi        SL_LOGE("Effect initCheck() returned %d", status);
560f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi        return false;
561f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    }
562f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi
563f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    return true;
564f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi}
565f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi
566f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi
567f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi//-----------------------------------------------------------------------------
568f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivibool android_fx_initEffectDescriptor(const SLInterfaceID effectId,
569f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi        effect_descriptor_t* fxDescrLoc) {
570f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi    uint32_t numEffects = 0;
571f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi    effect_descriptor_t descriptor;
572f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi    bool foundEffect = false;
573f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi
574f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi    // any effects?
575f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi    android::status_t res = android::AudioEffect::queryNumberEffects(&numEffects);
576f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi    if (android::NO_ERROR != res) {
577f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi        SL_LOGE("unable to find any effects.");
578f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi        goto effectError;
579f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi    }
580f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi
581f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi    // request effect in the effects?
582f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi    for (uint32_t i=0 ; i < numEffects ; i++) {
583f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi        res = android::AudioEffect::queryEffect(i, &descriptor);
584f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi        if ((android::NO_ERROR == res) &&
585f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi                (0 == memcmp(effectId, &descriptor.type, sizeof(effect_uuid_t)))) {
586f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi            SL_LOGV("found effect %d %s", i, descriptor.name);
587f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi            foundEffect = true;
588f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi            break;
589f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi        }
590f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi    }
591f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi    if (foundEffect) {
592f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi        memcpy(fxDescrLoc, &descriptor, sizeof(effect_descriptor_t));
593f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi    } else {
594f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi        SL_LOGE("unable to find an implementation for the requested effect.");
595f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi        goto effectError;
596f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi    }
597f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi
598f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi    return true;
599f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi
600f5fce95f98037ea4ab341b416c82444af595313dJean-Michel TrivieffectError:
601f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi    // the requested effect wasn't found
602f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi    memset(fxDescrLoc, 0, sizeof(effect_descriptor_t));
603f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi
604f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi    return false;
605f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi}
606f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi
607f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi//-----------------------------------------------------------------------------
60867bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel TriviSLresult android_genericFx_queryNumEffects(SLuint32 *pNumSupportedAudioEffects) {
60967bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
61067bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    if (NULL == pNumSupportedAudioEffects) {
61167bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi        return SL_RESULT_PARAMETER_INVALID;
61267bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    }
61367bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
61467bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    android::status_t status =
61567bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            android::AudioEffect::queryNumberEffects((uint32_t*)pNumSupportedAudioEffects);
61667bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
61767bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    SLresult result = SL_RESULT_SUCCESS;
61867bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    switch(status) {
61967bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi        case android::NO_ERROR:
62067bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            result = SL_RESULT_SUCCESS;
62167bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            break;
62267bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi        case android::PERMISSION_DENIED:
62367bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            result = SL_RESULT_PERMISSION_DENIED;
62467bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            break;
62567bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi        case android::NO_INIT:
62667bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            result = SL_RESULT_RESOURCE_ERROR;
62767bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            break;
62867bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi        case android::BAD_VALUE:
62967bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            result = SL_RESULT_PARAMETER_INVALID;
63067bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            break;
63167bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi        default:
63267bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            result = SL_RESULT_INTERNAL_ERROR;
63367bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            SL_LOGE("received invalid status %d from AudioEffect::queryNumberEffects()", status);
63467bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            break;
63567bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    }
63667bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    return result;
63767bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi}
63867bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
63967bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
64067bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi//-----------------------------------------------------------------------------
6415b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel TriviSLresult android_genericFx_queryEffect(SLuint32 index, effect_descriptor_t* pDescriptor) {
64267bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
6435b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi    if (NULL == pDescriptor) {
64467bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi        return SL_RESULT_PARAMETER_INVALID;
64567bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    }
64667bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
64767bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    android::status_t status =
6485b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi                android::AudioEffect::queryEffect(index, pDescriptor);
64967bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
65067bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    SLresult result = SL_RESULT_SUCCESS;
6515b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi    if (android::NO_ERROR != status) {
6525b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi        switch(status) {
65367bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi        case android::PERMISSION_DENIED:
65467bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            result = SL_RESULT_PERMISSION_DENIED;
65567bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            break;
65667bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi        case android::NO_INIT:
65767bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi        case android::INVALID_OPERATION:
65867bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            result = SL_RESULT_RESOURCE_ERROR;
65967bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            break;
66067bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi        case android::BAD_VALUE:
66167bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            result = SL_RESULT_PARAMETER_INVALID;
66267bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            break;
66367bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi        default:
66467bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            result = SL_RESULT_INTERNAL_ERROR;
66567bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            SL_LOGE("received invalid status %d from AudioEffect::queryNumberEffects()", status);
66667bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            break;
6675b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi        }
6685b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi        // an error occurred, reset the effect descriptor
6695b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi        memset(pDescriptor, 0, sizeof(effect_descriptor_t));
67067bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    }
6715b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi
67267bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    return result;
67367bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi}
67467bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
67567bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
67667bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi//-----------------------------------------------------------------------------
6775b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel TriviSLresult android_genericFx_createEffect(IAndroidEffect* iae, SLInterfaceID pUuid, int sessionId) {
67867bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
67967bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    SLresult result = SL_RESULT_SUCCESS;
68067bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
6815b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi    // does this effect already exist?
6825b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi    if (0 <= iae->mEffects.indexOfKey(KEY_FROM_GUID(pUuid))) {
6835b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi        return result;
6845b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi    }
6855b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi
6865b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi    // create new effect
6875b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi    android::AudioEffect* pFx = new android::AudioEffect(
68867bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            NULL, // not using type to create effect
68967bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            (const effect_uuid_t*)pUuid,
69067bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            0,// priority
69167bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            0,// effect callback
69267bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            0,// callback data
69367bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            sessionId,
69467bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            0 );// output
69567bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
6965b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi    // verify effect was successfully created before storing it
6975b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi    android::status_t status = pFx->initCheck();
69867bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    if (android::NO_ERROR != status) {
6995b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi        SL_LOGE("AudioEffect initCheck() returned %d, effect will not be stored", status);
7005b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi        delete pFx;
70167bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi        result = SL_RESULT_RESOURCE_ERROR;
7025b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi    } else {
7035b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi        SL_LOGV("AudioEffect successfully created on session %d", sessionId);
7045b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi        iae->mEffects.add(KEY_FROM_GUID(pUuid), pFx);
70567bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    }
70667bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
70767bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    return result;
70867bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi}
70967bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
71067bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
71167bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi//-----------------------------------------------------------------------------
7125b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel TriviSLresult android_genericFx_releaseEffect(IAndroidEffect* iae, SLInterfaceID pUuid) {
71367bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
7145b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi    ssize_t index = iae->mEffects.indexOfKey(KEY_FROM_GUID(pUuid));
7155b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi
7165b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi    if (0 > index) {
71767bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi        return SL_RESULT_PARAMETER_INVALID;
7185b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi    } else {
7195b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi        android::AudioEffect* pFx = iae->mEffects.valueAt(index);
7205b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi        delete pFx;
7215b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi        iae->mEffects.removeItem(index);
7225b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi        return SL_RESULT_SUCCESS;
72367bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    }
72467bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi}
72567bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
72667bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
72767bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi//-----------------------------------------------------------------------------
7285b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel TriviSLresult android_genericFx_setEnabled(IAndroidEffect* iae, SLInterfaceID pUuid, SLboolean enabled) {
7295b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi
7305b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi    ssize_t index = iae->mEffects.indexOfKey(KEY_FROM_GUID(pUuid));
73167bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
7325b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi    if (0 > index) {
73367bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi        return SL_RESULT_PARAMETER_INVALID;
7345b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi    } else {
7355b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi        android::AudioEffect* pFx = iae->mEffects.valueAt(index);
7365b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi        android::status_t status = pFx->setEnabled(SL_BOOLEAN_TRUE == enabled);
7375b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi        return android_fx_statusToResult(status);
73867bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    }
73967bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi}
74067bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
74167bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
74267bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi//-----------------------------------------------------------------------------
7435b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel TriviSLresult android_genericFx_isEnabled(IAndroidEffect* iae, SLInterfaceID pUuid, SLboolean *pEnabled)
7445b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi{
7455b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi    ssize_t index = iae->mEffects.indexOfKey(KEY_FROM_GUID(pUuid));
74667bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
7475b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi    if (0 > index) {
74867bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi        return SL_RESULT_PARAMETER_INVALID;
7495b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi    } else {
7505b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi        android::AudioEffect* pFx = iae->mEffects.valueAt(index);
7515b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi        *pEnabled = (SLboolean) pFx->getEnabled();
7525b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi        return SL_RESULT_SUCCESS;
75367bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    }
75467bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi}
75567bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
75667bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
75767bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi//-----------------------------------------------------------------------------
7585b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel TriviSLresult android_genericFx_sendCommand(IAndroidEffect* iae, SLInterfaceID pUuid,
7595b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi        SLuint32 command, SLuint32 commandSize, void* pCommandData,
7605b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi        SLuint32 *replySize, void *pReplyData) {
76167bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
7625b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi    ssize_t index = iae->mEffects.indexOfKey(KEY_FROM_GUID(pUuid));
76367bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
7645b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi    if (0 > index) {
76567bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi        return SL_RESULT_PARAMETER_INVALID;
7665b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi    } else {
7675b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi        android::AudioEffect* pFx = iae->mEffects.valueAt(index);
7685b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi        android::status_t status = pFx->command(
7695b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi                (uint32_t) command,
7705b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi                (uint32_t) commandSize,
7715b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi                pCommandData,
7725b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi                (uint32_t*)replySize,
7735b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi                pReplyData);
7745b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi        if (android::BAD_VALUE == status) {
7755b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi                return SL_RESULT_PARAMETER_INVALID;
7765b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi        } else {
7775b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi            return SL_RESULT_SUCCESS;
7785b09aa864215690580b18eb802927e8cc7eb4861Jean-Michel Trivi        }
77967bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    }
78067bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi}
78167bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
78267bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
783