android_Effect.cpp revision 7e01bc6208fb5b4a2a0019d67bf74373f8ee9428
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
304be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
314be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi//-----------------------------------------------------------------------------
329cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Triviuint32_t eq_paramSize(int32_t param) {
334be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    uint32_t size;
344be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
354be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    switch (param) {
364be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    case EQ_PARAM_NUM_BANDS:
374be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    case EQ_PARAM_LEVEL_RANGE:
384be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    case EQ_PARAM_CUR_PRESET:
394be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    case EQ_PARAM_GET_NUM_OF_PRESETS:
404be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        size = sizeof(int32_t);
414be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        break;
424be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    case EQ_PARAM_BAND_LEVEL:
434be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    case EQ_PARAM_CENTER_FREQ:
444be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    case EQ_PARAM_BAND_FREQ_RANGE:
454be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    case EQ_PARAM_GET_BAND:
464be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    case EQ_PARAM_GET_PRESET_NAME:
474be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        size = 2 * sizeof(int32_t);
484be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        break;
494be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    default:
504be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        size = 2 * sizeof(int32_t);
514be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        SL_LOGE("Trying to use an unknown EQ parameter %d", param);
524be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        break;
534be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    }
544be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    return size;
554be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi}
564be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
579cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Triviuint32_t eq_valueSize(int32_t param) {
584be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    uint32_t size;
594be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
604be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    switch (param) {
614be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    case EQ_PARAM_NUM_BANDS:
624be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    case EQ_PARAM_CUR_PRESET:
634be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    case EQ_PARAM_GET_NUM_OF_PRESETS:
644be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    case EQ_PARAM_BAND_LEVEL:
654be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    case EQ_PARAM_GET_BAND:
66b3b757daa7d162b6f66590d917c1f84f3ba73c70Eric Laurent        size = sizeof(int16_t);
67b3b757daa7d162b6f66590d917c1f84f3ba73c70Eric Laurent        break;
68b3b757daa7d162b6f66590d917c1f84f3ba73c70Eric Laurent    case EQ_PARAM_LEVEL_RANGE:
69b3b757daa7d162b6f66590d917c1f84f3ba73c70Eric Laurent        size = 2 * sizeof(int16_t);
70b3b757daa7d162b6f66590d917c1f84f3ba73c70Eric Laurent        break;
714be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    case EQ_PARAM_CENTER_FREQ:
724be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        size = sizeof(int32_t);
734be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        break;
744be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    case EQ_PARAM_BAND_FREQ_RANGE:
754be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        size = 2 * sizeof(int32_t);
764be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        break;
774be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    case EQ_PARAM_GET_PRESET_NAME:
784be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        size = EFFECT_STRING_LEN_MAX;
794be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        break;
804be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    default:
814be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        size = sizeof(int32_t);
824be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        SL_LOGE("Trying to access an unknown EQ parameter %d", param);
834be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        break;
844be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    }
854be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    return size;
864be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi}
874be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
889cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi//-----------------------------------------------------------------------------
899cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi/**
90f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi * returns the size in bytes of the value of each bass boost parameter
919cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi */
92f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Triviuint32_t bb_valueSize(int32_t param) {
939cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    uint32_t size;
949cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi
959cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    switch (param) {
969cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    case BASSBOOST_PARAM_STRENGTH_SUPPORTED:
979cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        size = sizeof(int32_t);
989cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        break;
99f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    case BASSBOOST_PARAM_STRENGTH:
100f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi        size = sizeof(int16_t);
101f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi        break;
1029cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    default:
1039cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        size = sizeof(int32_t);
104f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi        SL_LOGE("Trying to access an unknown BassBoost parameter %d", param);
1059cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        break;
1069cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    }
1079cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi
1089cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    return size;
1099cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi}
1109cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi
111f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi//-----------------------------------------------------------------------------
112f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi
1139cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi/**
114f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi * returns the size in bytes of the value of each virtualizer parameter
1159cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi */
116f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Triviuint32_t virt_valueSize(int32_t param) {
1179cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    uint32_t size;
1189cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi
1199cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    switch (param) {
120f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    case VIRTUALIZER_PARAM_STRENGTH_SUPPORTED:
1219cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        size = sizeof(int32_t);
1229cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        break;
123f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    case VIRTUALIZER_PARAM_STRENGTH:
1249cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        size = sizeof(int16_t);
1259cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        break;
1269cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    default:
1279cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        size = sizeof(int32_t);
128f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi        SL_LOGE("Trying to access an unknown Virtualizer parameter %d", param);
1299cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        break;
1309cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    }
1319cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi
1329cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    return size;
1339cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi}
1349cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi
1354be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi//-----------------------------------------------------------------------------
1364be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Triviandroid::status_t android_eq_getParam(android::sp<android::AudioEffect> pFx,
1374be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        int32_t param, int32_t param2, void *pValue)
1384be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi{
1394be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi     android::status_t status;
1404be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi     uint32_t buf32[(EQUALIZER_PARAM_SIZE_MAX - 1) / sizeof(uint32_t) + 1];
1414be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi     effect_param_t *p = (effect_param_t *)buf32;
1424be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
1434be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi     p->psize = eq_paramSize(param);
1444be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi     *(int32_t *)p->data = param;
1454be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi     if (p->psize == 2 * sizeof(int32_t)) {
1464be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi         *((int32_t *)p->data + 1) = param2;
1474be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi     }
1484be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi     p->vsize = eq_valueSize(param);
1494be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi     status = pFx->getParameter(p);
1504be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi     if (android::NO_ERROR == status) {
1514be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi         status = p->status;
1524be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi         if (android::NO_ERROR == status) {
1534be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi             memcpy(pValue, p->data + p->psize, p->vsize);
1544be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi         }
1554be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi     }
1564be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
1574be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi     return status;
1584be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi }
1594be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
1604be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
1614be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi//-----------------------------------------------------------------------------
1624be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Triviandroid::status_t android_eq_setParam(android::sp<android::AudioEffect> pFx,
1634be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        int32_t param, int32_t param2, void *pValue)
1644be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi{
1654be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    android::status_t status;
1664be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    uint32_t buf32[(EQUALIZER_PARAM_SIZE_MAX - 1) / sizeof(uint32_t) + 1];
1674be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    effect_param_t *p = (effect_param_t *)buf32;
1684be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
1694be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    p->psize = eq_paramSize(param);
1704be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    *(int32_t *)p->data = param;
1714be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    if (p->psize == 2 * sizeof(int32_t)) {
1724be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        *((int32_t *)p->data + 1) = param2;
1734be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    }
1744be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    p->vsize = eq_valueSize(param);
1754be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    memcpy(p->data + p->psize, pValue, p->vsize);
1764be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    status = pFx->setParameter(p);
1774be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    if (android::NO_ERROR == status) {
1784be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        status = p->status;
1794be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    }
1804be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
1814be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    return status;
1824be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi}
1834be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
1849cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi//-----------------------------------------------------------------------------
1859cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Triviandroid::status_t android_bb_setParam(android::sp<android::AudioEffect> pFx,
1869cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        int32_t param, void *pValue) {
1879cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi
188f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    return android_fx_setParam(pFx, param, BASSBOOST_PARAM_SIZE_MAX,
189f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi            pValue, bb_valueSize(param));
1909cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi}
1919cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi
1929cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi//-----------------------------------------------------------------------------
1939cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Triviandroid::status_t android_bb_getParam(android::sp<android::AudioEffect> pFx,
1949cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        int32_t param, void *pValue) {
1959cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi
196f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    return android_fx_getParam(pFx, param, BASSBOOST_PARAM_SIZE_MAX,
197f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi            pValue, bb_valueSize(param));
1989cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi}
1999cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi
2009cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi//-----------------------------------------------------------------------------
2019cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivivoid android_bb_init(int sessionId, CAudioPlayer* ap) {
2029cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    SL_LOGV("session %d", sessionId);
2039cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi
204f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    if (!android_fx_initEffectObj(sessionId, ap->mBassBoost.mBassBoostEffect,
205f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi            &ap->mBassBoost.mBassBoostDescriptor.type,  &ap->mBassBoost.mBassBoostDescriptor.uuid))
206f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    {
207f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi        SL_LOGE("BassBoost effect initialization failed");
2089cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        return;
2099cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    }
2109cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi
211f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    // initialize strength
2129cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    int16_t strength;
2139cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    if (android::NO_ERROR == android_bb_getParam(ap->mBassBoost.mBassBoostEffect,
2149cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi            BASSBOOST_PARAM_STRENGTH, &strength)) {
2159cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        ap->mBassBoost.mStrength = (SLpermille) strength;
2169cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    }
2179cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi}
2184be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
2197e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi
2204be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi//-----------------------------------------------------------------------------
2217e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivivoid android_eq_init(int sessionId, IEqualizer* ieq) {
2229cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    SL_LOGV("session %d", sessionId);
2234be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
2247e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi    if (!android_fx_initEffectObj(sessionId, ieq->mEqEffect, &ieq->mEqDescriptor.type,
2257e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi            &ieq->mEqDescriptor.uuid)) {
226f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi        SL_LOGE("Equalizer effect initialization failed");
2274be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        return;
2284be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    }
2294be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
2307e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi    // initialize number of bands, band level range, and number of presets
231b3b757daa7d162b6f66590d917c1f84f3ba73c70Eric Laurent    uint16_t num = 0;
2327e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi    if (android::NO_ERROR == android_eq_getParam(ieq->mEqEffect, EQ_PARAM_NUM_BANDS, 0, &num)) {
2337e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi        ieq->mNumBands = num;
2344be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    }
235b3b757daa7d162b6f66590d917c1f84f3ba73c70Eric Laurent    int16_t range[2] = {0, 0};
2367e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi    if (android::NO_ERROR == android_eq_getParam(ieq->mEqEffect, EQ_PARAM_LEVEL_RANGE, 0, range)) {
2377e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi        ieq->mBandLevelRangeMin = range[0];
2387e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi        ieq->mBandLevelRangeMax = range[1];
2394be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    }
2404be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
2417e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi    SL_LOGV(" EQ init: num bands = %u, band range=[%d %d]mB", num, range[0], range[1]);
2424be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
2437e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi    // FIXME don't store presets names, they can be queried each time they're needed
2444be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    // initialize preset number and names, store in IEngine
245b3b757daa7d162b6f66590d917c1f84f3ba73c70Eric Laurent    uint16_t numPresets = 0;
2467e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi    if (android::NO_ERROR == android_eq_getParam(ieq->mEqEffect,
2474be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi            EQ_PARAM_GET_NUM_OF_PRESETS, 0, &numPresets)) {
2487e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi        ieq->mThis->mEngine->mEqNumPresets = numPresets;
2497e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi        ieq->mNumPresets = numPresets;
2504be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    }
2517e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi
2527e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi    interface_lock_exclusive(ieq->mThis->mEngine);
2534be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    char name[EFFECT_STRING_LEN_MAX];
2547e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi    if ((0 < numPresets) && (NULL == ieq->mThis->mEngine->mEqPresetNames)) {
2557e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi        ieq->mThis->mEngine->mEqPresetNames = (char **)new char *[numPresets];
2564be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        for(uint32_t i = 0 ; i < numPresets ; i++) {
2577e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi            if (android::NO_ERROR == android_eq_getParam(ieq->mEqEffect,
2584be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi                    EQ_PARAM_GET_PRESET_NAME, i, name)) {
2597e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi                ieq->mThis->mEngine->mEqPresetNames[i] = new char[strlen(name) + 1];
2607e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi                strcpy(ieq->mThis->mEngine->mEqPresetNames[i], name);
2617e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi                SL_LOGV(" EQ init: presets = %u is %s", i, ieq->mThis->mEngine->mEqPresetNames[i]);
2624be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi            }
2634be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        }
2644be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    }
2657e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi    interface_unlock_exclusive(ieq->mThis->mEngine);
2667e01bc6208fb5b4a2a0019d67bf74373f8ee9428Jean-Michel Trivi
2674be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#if 0
2684be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    // configure the EQ so it can easily be heard, for test only
2694be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    uint32_t freq = 1977;
2704be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    uint32_t frange[2];
271b3b757daa7d162b6f66590d917c1f84f3ba73c70Eric Laurent    int16_t value = ap->mEqualizer.mBandLevelRangeMin;
2724be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    for(int32_t i=0 ; i< ap->mEqualizer.mNumBands ; i++) {
2734be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        android_eq_setParam(ap->mEqualizer.mEqEffect, EQ_PARAM_BAND_LEVEL, i, &value);
2744be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        // display EQ characteristics
2754be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        android_eq_getParam(ap->mEqualizer.mEqEffect, EQ_PARAM_CENTER_FREQ, i, &freq);
2764be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        android_eq_getParam(ap->mEqualizer.mEqEffect, EQ_PARAM_BAND_FREQ_RANGE, i, frange);
27749e4076e940559bc204d0f0aa7ab412986445bfaGlenn Kasten        SL_LOGV(" EQ init: band %d = %d - %d - %dHz", i, frange[0]/1000, freq/1000,
2784be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi                frange[1]/1000);
2794be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    }
2804be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    value = ap->mEqualizer.mBandLevelRangeMax;
2814be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    if (ap->mEqualizer.mNumBands > 2) {
2824be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        android_eq_setParam(ap->mEqualizer.mEqEffect, EQ_PARAM_BAND_LEVEL, 2, &value);
2834be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    }
2844be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    if (ap->mEqualizer.mNumBands > 3) {
2854be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        android_eq_setParam(ap->mEqualizer.mEqEffect, EQ_PARAM_BAND_LEVEL, 3, &value);
2864be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    }
2874be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
2884be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    ap->mEqualizer.mEqEffect->setEnabled(true);
2894be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#endif
2904be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi}
2914be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
292f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi
293f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi//-----------------------------------------------------------------------------
294f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivivoid android_virt_init(int sessionId, CAudioPlayer* ap) {
295f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    SL_LOGV("session %d", sessionId);
296f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi
297f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    if (!android_fx_initEffectObj(sessionId, ap->mVirtualizer.mVirtualizerEffect,
298f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi            &ap->mVirtualizer.mVirtualizerDescriptor.type,
299f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi            &ap->mVirtualizer.mVirtualizerDescriptor.uuid)) {
300f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi        SL_LOGE("Virtualizer effect initialization failed");
301f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi        return;
302f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    }
303f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi
304f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    // initialize strength
305f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    int16_t strength;
306f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    if (android::NO_ERROR == android_virt_getParam(ap->mVirtualizer.mVirtualizerEffect,
307f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi            VIRTUALIZER_PARAM_STRENGTH, &strength)) {
308f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi        ap->mVirtualizer.mStrength = (SLpermille) strength;
309f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    }
310f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi}
311f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi
312f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi//-----------------------------------------------------------------------------
313f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Triviandroid::status_t android_virt_setParam(android::sp<android::AudioEffect> pFx,
314f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi        int32_t param, void *pValue) {
315f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi
316f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    return android_fx_setParam(pFx, param, VIRTUALIZER_PARAM_SIZE_MAX,
317f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi            pValue, virt_valueSize(param));
318f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi}
319f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi
320f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi//-----------------------------------------------------------------------------
321f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Triviandroid::status_t android_virt_getParam(android::sp<android::AudioEffect> pFx,
322f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi        int32_t param, void *pValue) {
323f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi
324f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    return android_fx_getParam(pFx, param, VIRTUALIZER_PARAM_SIZE_MAX,
325f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi            pValue, virt_valueSize(param));
326f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi}
327f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi
328f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi//-----------------------------------------------------------------------------
329f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Triviandroid::status_t android_fx_setParam(android::sp<android::AudioEffect> pFx,
330f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi        int32_t param, uint32_t paramSizeMax, void *pValue, uint32_t valueSize)
331f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi{
332f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi
333f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    android::status_t status;
334f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    uint32_t buf32[(paramSizeMax - 1) / sizeof(uint32_t) + 1];
335f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    effect_param_t *p = (effect_param_t *)buf32;
336f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi
337f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    p->psize = sizeof(int32_t);
338f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    *(int32_t *)p->data = param;
339f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    p->vsize = valueSize;
340f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    memcpy(p->data + p->psize, pValue, p->vsize);
341f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    status = pFx->setParameter(p);
342f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    if (android::NO_ERROR == status) {
343f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi        status = p->status;
344f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    }
345f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    return status;
346f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi}
347f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi
348f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi
349f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi//-----------------------------------------------------------------------------
350f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Triviandroid::status_t android_fx_getParam(android::sp<android::AudioEffect> pFx,
351f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi        int32_t param, uint32_t paramSizeMax, void *pValue, uint32_t valueSize)
352f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi{
353f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    android::status_t status;
354f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    uint32_t buf32[(paramSizeMax - 1) / sizeof(uint32_t) + 1];
355f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    effect_param_t *p = (effect_param_t *)buf32;
356f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi
357f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    p->psize = sizeof(int32_t);
358f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    *(int32_t *)p->data = param;
359f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    p->vsize = valueSize;
360f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    status = pFx->getParameter(p);
361f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    if (android::NO_ERROR == status) {
362f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi        status = p->status;
363f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi        if (android::NO_ERROR == status) {
364f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi            memcpy(pValue, p->data + p->psize, p->vsize);
365f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi        }
366f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    }
367f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi
368f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    return status;
369f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi}
370f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi
371f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi
3724be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi//-----------------------------------------------------------------------------
3734be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel TriviSLresult android_fx_statusToResult(android::status_t status) {
3744be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
3754be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    if ((android::INVALID_OPERATION == status) || (android::DEAD_OBJECT == status)) {
3764be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        return SL_RESULT_CONTROL_LOST;
3774be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    } else {
3784be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        return SL_RESULT_SUCCESS;
3794be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    }
3804be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi}
3814be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
38267bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
38367bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi//-----------------------------------------------------------------------------
384f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivibool android_fx_initEffectObj(int sessionId, android::sp<android::AudioEffect>& effect,
385f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi        const effect_uuid_t *type,  const effect_uuid_t *uuid) {
386f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    SL_LOGV("session %d", sessionId);
387f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi
388f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    effect = new android::AudioEffect(type, uuid,
389f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi            0,// priority
390f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi            0,// effect callback
391f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi            0,// callback data
392f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi            sessionId,// session ID
393f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi            0 );// output
394f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi
395f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    android::status_t status = effect->initCheck();
396f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    if (android::NO_ERROR != status) {
397f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi        effect.clear();
398f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi        SL_LOGE("Effect initCheck() returned %d", status);
399f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi        return false;
400f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    }
401f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi
402f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi    return true;
403f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi}
404f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi
405f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi
406f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi//-----------------------------------------------------------------------------
407f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivibool android_fx_initEffectDescriptor(const SLInterfaceID effectId,
408f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi        effect_descriptor_t* fxDescrLoc) {
409f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi    uint32_t numEffects = 0;
410f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi    effect_descriptor_t descriptor;
411f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi    bool foundEffect = false;
412f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi
413f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi    // any effects?
414f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi    android::status_t res = android::AudioEffect::queryNumberEffects(&numEffects);
415f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi    if (android::NO_ERROR != res) {
416f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi        SL_LOGE("unable to find any effects.");
417f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi        goto effectError;
418f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi    }
419f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi
420f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi    // request effect in the effects?
421f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi    for (uint32_t i=0 ; i < numEffects ; i++) {
422f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi        res = android::AudioEffect::queryEffect(i, &descriptor);
423f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi        if ((android::NO_ERROR == res) &&
424f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi                (0 == memcmp(effectId, &descriptor.type, sizeof(effect_uuid_t)))) {
425f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi            SL_LOGV("found effect %d %s", i, descriptor.name);
426f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi            foundEffect = true;
427f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi            break;
428f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi        }
429f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi    }
430f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi    if (foundEffect) {
431f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi        memcpy(fxDescrLoc, &descriptor, sizeof(effect_descriptor_t));
432f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi    } else {
433f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi        SL_LOGE("unable to find an implementation for the requested effect.");
434f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi        goto effectError;
435f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi    }
436f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi
437f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi    return true;
438f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi
439f5fce95f98037ea4ab341b416c82444af595313dJean-Michel TrivieffectError:
440f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi    // the requested effect wasn't found
441f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi    memset(fxDescrLoc, 0, sizeof(effect_descriptor_t));
442f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi
443f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi    return false;
444f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi}
445f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi
446f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi//-----------------------------------------------------------------------------
44767bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel TriviSLresult android_genericFx_queryNumEffects(SLuint32 *pNumSupportedAudioEffects) {
44867bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
44967bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    if (NULL == pNumSupportedAudioEffects) {
45067bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi        return SL_RESULT_PARAMETER_INVALID;
45167bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    }
45267bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
45367bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    android::status_t status =
45467bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            android::AudioEffect::queryNumberEffects((uint32_t*)pNumSupportedAudioEffects);
45567bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
45667bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    SLresult result = SL_RESULT_SUCCESS;
45767bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    switch(status) {
45867bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi        case android::NO_ERROR:
45967bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            result = SL_RESULT_SUCCESS;
46067bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            break;
46167bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi        case android::PERMISSION_DENIED:
46267bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            result = SL_RESULT_PERMISSION_DENIED;
46367bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            break;
46467bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi        case android::NO_INIT:
46567bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            result = SL_RESULT_RESOURCE_ERROR;
46667bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            break;
46767bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi        case android::BAD_VALUE:
46867bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            result = SL_RESULT_PARAMETER_INVALID;
46967bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            break;
47067bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi        default:
47167bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            result = SL_RESULT_INTERNAL_ERROR;
47267bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            SL_LOGE("received invalid status %d from AudioEffect::queryNumberEffects()", status);
47367bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            break;
47467bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    }
47567bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    return result;
47667bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi}
47767bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
47867bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
47967bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi//-----------------------------------------------------------------------------
48067bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel TriviSLresult android_genericFx_queryEffect(SLuint32 index, SLInterfaceID *pAudioEffectId) {
48167bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
48267bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    if (NULL == pAudioEffectId) {
48367bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi        return SL_RESULT_PARAMETER_INVALID;
48467bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    }
48567bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
48667bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    effect_descriptor_t descriptor;
48767bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    android::status_t status =
48867bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi                android::AudioEffect::queryEffect(index, &descriptor);
48967bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
49067bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    SLresult result = SL_RESULT_SUCCESS;
49167bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    switch(status) {
49267bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi        case android::NO_ERROR:
49367bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            // FIXME this function will move to an engine interface where we will store the
49467bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            //       audio effect IDs and we only return references to those, as SLInterfaceID
49567bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            //       is a pointer to the struct where a uuid is stored.
49667bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            //*pAudioEffectId = some global reference to where we keep a copy of the effect uuid
49767bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            result = SL_RESULT_SUCCESS;
49867bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            break;
49967bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi        case android::PERMISSION_DENIED:
50067bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            result = SL_RESULT_PERMISSION_DENIED;
50167bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            break;
50267bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi        case android::NO_INIT:
50367bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi        case android::INVALID_OPERATION:
50467bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            result = SL_RESULT_RESOURCE_ERROR;
50567bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            break;
50667bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi        case android::BAD_VALUE:
50767bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            result = SL_RESULT_PARAMETER_INVALID;
50867bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            break;
50967bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi        default:
51067bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            result = SL_RESULT_INTERNAL_ERROR;
51167bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            SL_LOGE("received invalid status %d from AudioEffect::queryNumberEffects()", status);
51267bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            break;
51367bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    }
51467bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    return result;
51567bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi}
51667bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
51767bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
51867bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi//-----------------------------------------------------------------------------
51967bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel TriviSLresult android_genericFx_createEffect(int sessionId, SLInterfaceID pUuid, void **ppAudioEffect) {
52067bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
52167bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    android::AudioEffect* af = NULL;
52267bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    SLresult result = SL_RESULT_SUCCESS;
52367bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
52467bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    af = new android::AudioEffect(
52567bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            NULL, // not using type to create effect
52667bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            (const effect_uuid_t*)pUuid,
52767bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            0,// priority
52867bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            0,// effect callback
52967bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            0,// callback data
53067bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            sessionId,
53167bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            0 );// output
53267bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    android::status_t status = af->initCheck();
53367bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
53467bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    if (android::NO_ERROR != status) {
53567bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi        SL_LOGE("AudioEffect initCheck() returned %d", status);
53667bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi        result = SL_RESULT_RESOURCE_ERROR;
53767bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    }
53867bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
53967bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    *ppAudioEffect = af;
54067bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    return result;
54167bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi}
54267bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
54367bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
54467bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi//-----------------------------------------------------------------------------
54567bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel TriviSLresult android_genericFx_releaseEffect(void *pAudioEffect) {
54667bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
54767bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    if (NULL != pAudioEffect) {
54867bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi        delete ((android::AudioEffect*)pAudioEffect);
54967bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi        return SL_RESULT_SUCCESS;
55067bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    } else {
55167bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi        return SL_RESULT_PARAMETER_INVALID;
55267bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    }
55367bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi}
55467bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
55567bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
55667bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi//-----------------------------------------------------------------------------
55767bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel TriviSLresult android_genericFx_setEnabled(void *pAudioEffect, SLboolean enabled) {
55867bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
55967bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    if (NULL == pAudioEffect) {
56067bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi        return SL_RESULT_PARAMETER_INVALID;
56167bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    }
56267bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
56367bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    android::status_t status =
56467bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            ((android::AudioEffect*)pAudioEffect)->setEnabled(SL_BOOLEAN_TRUE == enabled);
56567bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
5666a433388b625eb5931736cfa65a5e7ac931f5de4Jean-Michel Trivi    return android_fx_statusToResult(status);
56767bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi}
56867bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
56967bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
57067bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi//-----------------------------------------------------------------------------
57167bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel TriviSLresult android_genericFx_isEnabled(void *pAudioEffect, SLboolean *pEnabled) {
57267bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
57367bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    if (NULL == pAudioEffect) {
57467bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi        *pEnabled = SL_BOOLEAN_FALSE;
57567bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi        return SL_RESULT_PARAMETER_INVALID;
57667bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    }
57767bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
57867bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    *pEnabled =
57967bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi           ((android::AudioEffect*)pAudioEffect)->getEnabled() ? SL_BOOLEAN_TRUE : SL_BOOLEAN_FALSE;
58067bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
58167bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    return SL_RESULT_SUCCESS;
58267bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi}
58367bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
58467bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
58567bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi//-----------------------------------------------------------------------------
58667bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel TriviSLresult android_genericFx_sendCommand(void *pAudioEffect, SLuint32 command, SLuint32 commandSize,
58767bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi        void* pCommand, SLuint32 *replySize, void *pReply) {
58867bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
58967bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    if (NULL == pAudioEffect) {
59067bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi        return SL_RESULT_PARAMETER_INVALID;
59167bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    }
59267bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
59367bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    android::status_t status = ((android::AudioEffect*)pAudioEffect)->command(
5946a433388b625eb5931736cfa65a5e7ac931f5de4Jean-Michel Trivi            (uint32_t) command,
5956a433388b625eb5931736cfa65a5e7ac931f5de4Jean-Michel Trivi            (uint32_t) commandSize,
59667bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            pCommand,
5978b7d70c522234225689d0ecce70eecb8a6c0ac1fJean-Michel Trivi            (uint32_t*)replySize,
59867bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            pReply);
59967bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
60067bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    if (android::BAD_VALUE == status) {
60167bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi        return SL_RESULT_PARAMETER_INVALID;
60267bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    }
60367bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    return SL_RESULT_SUCCESS;
60467bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi}
60567bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
60667bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
607