android_Effect.cpp revision 9cd3c9e7a2395647b92c32f33c06cf9fd546b22f
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
284be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
294be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi//-----------------------------------------------------------------------------
309cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Triviuint32_t eq_paramSize(int32_t param) {
314be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    uint32_t size;
324be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
334be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    switch (param) {
344be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    case EQ_PARAM_NUM_BANDS:
354be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    case EQ_PARAM_LEVEL_RANGE:
364be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    case EQ_PARAM_CUR_PRESET:
374be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    case EQ_PARAM_GET_NUM_OF_PRESETS:
384be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        size = sizeof(int32_t);
394be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        break;
404be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    case EQ_PARAM_BAND_LEVEL:
414be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    case EQ_PARAM_CENTER_FREQ:
424be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    case EQ_PARAM_BAND_FREQ_RANGE:
434be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    case EQ_PARAM_GET_BAND:
444be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    case EQ_PARAM_GET_PRESET_NAME:
454be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        size = 2 * sizeof(int32_t);
464be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        break;
474be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    default:
484be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        size = 2 * sizeof(int32_t);
494be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        SL_LOGE("Trying to use an unknown EQ parameter %d", param);
504be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        break;
514be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    }
524be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    return size;
534be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi}
544be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
559cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Triviuint32_t eq_valueSize(int32_t param) {
564be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    uint32_t size;
574be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
584be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    switch (param) {
594be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    case EQ_PARAM_NUM_BANDS:
604be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    case EQ_PARAM_CUR_PRESET:
614be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    case EQ_PARAM_GET_NUM_OF_PRESETS:
624be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    case EQ_PARAM_BAND_LEVEL:
634be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    case EQ_PARAM_GET_BAND:
64b3b757daa7d162b6f66590d917c1f84f3ba73c70Eric Laurent        size = sizeof(int16_t);
65b3b757daa7d162b6f66590d917c1f84f3ba73c70Eric Laurent        break;
66b3b757daa7d162b6f66590d917c1f84f3ba73c70Eric Laurent    case EQ_PARAM_LEVEL_RANGE:
67b3b757daa7d162b6f66590d917c1f84f3ba73c70Eric Laurent        size = 2 * sizeof(int16_t);
68b3b757daa7d162b6f66590d917c1f84f3ba73c70Eric Laurent        break;
694be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    case EQ_PARAM_CENTER_FREQ:
704be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        size = sizeof(int32_t);
714be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        break;
724be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    case EQ_PARAM_BAND_FREQ_RANGE:
734be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        size = 2 * sizeof(int32_t);
744be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        break;
754be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    case EQ_PARAM_GET_PRESET_NAME:
764be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        size = EFFECT_STRING_LEN_MAX;
774be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        break;
784be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    default:
794be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        size = sizeof(int32_t);
804be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        SL_LOGE("Trying to access an unknown EQ parameter %d", param);
814be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        break;
824be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    }
834be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    return size;
844be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi}
854be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
869cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi//-----------------------------------------------------------------------------
879cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi/**
889cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi * returns the size in bytes required to represent each bass boost parameter
899cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi */
909cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Triviuint32_t bb_paramSize(int32_t param) {
919cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    uint32_t size;
929cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi
939cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    switch (param) {
949cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    case BASSBOOST_PARAM_STRENGTH_SUPPORTED:
959cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    case BASSBOOST_PARAM_STRENGTH:
969cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        size = sizeof(int32_t);
979cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        break;
989cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    default:
999cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        size = sizeof(int32_t);
1009cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        SL_LOGE("Trying to use an unknown BassBoost parameter %d", param);
1019cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        break;
1029cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    }
1039cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi
1049cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    return size;
1059cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi}
1069cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi
1079cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi/**
1089cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi * returns the size in bytes of the value of each bass boost parameter
1099cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi */
1109cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Triviuint32_t bb_valueSize(int32_t param) {
1119cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    uint32_t size;
1129cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi
1139cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    switch (param) {
1149cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    case BASSBOOST_PARAM_STRENGTH_SUPPORTED:
1159cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        size = sizeof(int32_t);
1169cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        break;
1179cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    case BASSBOOST_PARAM_STRENGTH:
1189cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        size = sizeof(int16_t);
1199cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        break;
1209cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    default:
1219cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        size = sizeof(int32_t);
1229cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        SL_LOGE("Trying to access an unknown BassBoost parameter %d", param);
1239cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        break;
1249cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    }
1259cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi
1269cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    return size;
1279cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi}
1289cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi
1294be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
1304be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi//-----------------------------------------------------------------------------
1314be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Triviandroid::status_t android_eq_getParam(android::sp<android::AudioEffect> pFx,
1324be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        int32_t param, int32_t param2, void *pValue)
1334be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi{
1344be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi     android::status_t status;
1354be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi     uint32_t buf32[(EQUALIZER_PARAM_SIZE_MAX - 1) / sizeof(uint32_t) + 1];
1364be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi     effect_param_t *p = (effect_param_t *)buf32;
1374be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
1384be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi     p->psize = eq_paramSize(param);
1394be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi     *(int32_t *)p->data = param;
1404be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi     if (p->psize == 2 * sizeof(int32_t)) {
1414be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi         *((int32_t *)p->data + 1) = param2;
1424be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi     }
1434be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi     p->vsize = eq_valueSize(param);
1444be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi     status = pFx->getParameter(p);
1454be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi     if (android::NO_ERROR == status) {
1464be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi         status = p->status;
1474be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi         if (android::NO_ERROR == status) {
1484be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi             memcpy(pValue, p->data + p->psize, p->vsize);
1494be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi         }
1504be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi     }
1514be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
1524be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi     return status;
1534be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi }
1544be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
1554be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
1564be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi//-----------------------------------------------------------------------------
1574be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Triviandroid::status_t android_eq_setParam(android::sp<android::AudioEffect> pFx,
1584be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        int32_t param, int32_t param2, void *pValue)
1594be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi{
1604be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    android::status_t status;
1614be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    uint32_t buf32[(EQUALIZER_PARAM_SIZE_MAX - 1) / sizeof(uint32_t) + 1];
1624be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    effect_param_t *p = (effect_param_t *)buf32;
1634be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
1644be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    p->psize = eq_paramSize(param);
1654be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    *(int32_t *)p->data = param;
1664be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    if (p->psize == 2 * sizeof(int32_t)) {
1674be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        *((int32_t *)p->data + 1) = param2;
1684be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    }
1694be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    p->vsize = eq_valueSize(param);
1704be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    memcpy(p->data + p->psize, pValue, p->vsize);
1714be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    status = pFx->setParameter(p);
1724be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    if (android::NO_ERROR == status) {
1734be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        status = p->status;
1744be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    }
1754be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
1764be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    return status;
1774be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi}
1784be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
1799cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi//-----------------------------------------------------------------------------
1809cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Triviandroid::status_t android_bb_setParam(android::sp<android::AudioEffect> pFx,
1819cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        int32_t param, void *pValue) {
1829cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi
1839cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    android::status_t status;
1849cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    uint32_t buf32[(BASSBOOST_PARAM_SIZE_MAX - 1) / sizeof(uint32_t) + 1];
1859cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    effect_param_t *p = (effect_param_t *)buf32;
1869cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi
1879cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    p->psize = bb_paramSize(param);
1889cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    *(int32_t *)p->data = param;
1899cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    p->vsize = bb_valueSize(param);
1909cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    memcpy(p->data + p->psize, pValue, p->vsize);
1919cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    status = pFx->setParameter(p);
1929cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    if (android::NO_ERROR == status) {
1939cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        status = p->status;
1949cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    }
1959cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    return status;
1969cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi}
1979cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi
1989cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi//-----------------------------------------------------------------------------
1999cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Triviandroid::status_t android_bb_getParam(android::sp<android::AudioEffect> pFx,
2009cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        int32_t param, void *pValue) {
2019cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi
2029cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    android::status_t status;
2039cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    uint32_t buf32[(BASSBOOST_PARAM_SIZE_MAX - 1) / sizeof(uint32_t) + 1];
2049cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    effect_param_t *p = (effect_param_t *)buf32;
2059cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi
2069cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    p->psize = bb_paramSize(param);
2079cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    *(int32_t *)p->data = param;
2089cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    p->vsize = bb_valueSize(param);
2099cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    status = pFx->getParameter(p);
2109cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    if (android::NO_ERROR == status) {
2119cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        status = p->status;
2129cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        if (android::NO_ERROR == status) {
2139cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi            memcpy(pValue, p->data + p->psize, p->vsize);
2149cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        }
2159cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    }
2169cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi
2179cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    return status;
2189cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi}
2199cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi
2209cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi
2219cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi//-----------------------------------------------------------------------------
2229cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivivoid android_bb_init(int sessionId, CAudioPlayer* ap) {
2239cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    SL_LOGV("session %d", sessionId);
2249cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi
2259cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    ap->mBassBoost.mBassBoostEffect = new android::AudioEffect(
2269cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi            &ap->mBassBoost.mBassBoostDescriptor.type,
2279cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi            &ap->mBassBoost.mBassBoostDescriptor.uuid,
2289cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi            0,// priority
2299cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi            0,// effect callback
2309cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi            0,// callback data
2319cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi            sessionId,// session ID
2329cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi            0 );// output
2339cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    android::status_t status = ap->mBassBoost.mBassBoostEffect->initCheck();
2349cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    if (android::NO_ERROR != status) {
2359cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        ap->mBassBoost.mBassBoostEffect.clear();
2369cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        SL_LOGE("BassBoost initCheck() returned %d", status);
2379cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        return;
2389cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    }
2399cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi
2409cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    // initialize strength, and whether it's supported
2419cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    int16_t strength;
2429cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    if (android::NO_ERROR == android_bb_getParam(ap->mBassBoost.mBassBoostEffect,
2439cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi            BASSBOOST_PARAM_STRENGTH, &strength)) {
2449cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        ap->mBassBoost.mStrength = (SLpermille) strength;
2459cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    }
2469cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi}
2474be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
2484be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi//-----------------------------------------------------------------------------
2494be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivivoid android_eq_init(int sessionId, CAudioPlayer* ap) {
2509cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi    SL_LOGV("session %d", sessionId);
2514be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
2524be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    ap->mEqualizer.mEqEffect = new android::AudioEffect(
2534be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi            &ap->mEqualizer.mEqDescriptor.type,//(const effect_uuid_t*)SL_IID_EQUALIZER,//
2544be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi            &ap->mEqualizer.mEqDescriptor.uuid,
2554be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi            0,// priority
2564be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi            0,// effect callback
2574be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi            0,// callback data
2584be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi            sessionId,// session ID
2594be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi            0 );// output
2604be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    android::status_t status = ap->mEqualizer.mEqEffect->initCheck();
2614be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    if (android::NO_ERROR != status) {
2629cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi        ap->mEqualizer.mEqEffect.clear();
2634be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        SL_LOGE("EQ initCheck() returned %d", status);
2644be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        return;
2654be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    }
2664be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
2674be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    // initialize number of bands, band level range
268b3b757daa7d162b6f66590d917c1f84f3ba73c70Eric Laurent    uint16_t num = 0;
2694be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    if (android::NO_ERROR == android_eq_getParam(ap->mEqualizer.mEqEffect,
2704be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi            EQ_PARAM_NUM_BANDS, 0, &num)) {
2714be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        ap->mEqualizer.mNumBands = num;
2724be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    }
273b3b757daa7d162b6f66590d917c1f84f3ba73c70Eric Laurent    int16_t range[2] = {0, 0};
2744be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    if (android::NO_ERROR == android_eq_getParam(ap->mEqualizer.mEqEffect,
2754be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi            EQ_PARAM_LEVEL_RANGE, 0, range)) {
2764be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        ap->mEqualizer.mBandLevelRangeMin = range[0];
2774be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        ap->mEqualizer.mBandLevelRangeMax = range[1];
2784be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    }
2794be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
2804be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    SL_LOGV(" EQ init: num presets = %u, band range=[%d %d]mB", num, range[0], range[1]);
2814be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
2824be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    // initialize preset number and names, store in IEngine
283b3b757daa7d162b6f66590d917c1f84f3ba73c70Eric Laurent    uint16_t numPresets = 0;
2844be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    if (android::NO_ERROR == android_eq_getParam(ap->mEqualizer.mEqEffect,
2854be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi            EQ_PARAM_GET_NUM_OF_PRESETS, 0, &numPresets)) {
2864be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        ap->mObject.mEngine->mEqNumPresets = numPresets;
2874be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    }
2884be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    char name[EFFECT_STRING_LEN_MAX];
2894be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    if ((0 < numPresets) && (NULL == ap->mObject.mEngine->mEqPresetNames)) {
2904be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        ap->mObject.mEngine->mEqPresetNames = (char **)new char *[numPresets];
2914be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        for(uint32_t i = 0 ; i < numPresets ; i++) {
2924be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi            if (android::NO_ERROR == android_eq_getParam(ap->mEqualizer.mEqEffect,
2934be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi                    EQ_PARAM_GET_PRESET_NAME, i, name)) {
2944be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi                ap->mObject.mEngine->mEqPresetNames[i] = new char[strlen(name) + 1];
2954be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi                strcpy(ap->mObject.mEngine->mEqPresetNames[i], name);
2964be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi                SL_LOGV(" EQ init: presets = %u is %s", i, ap->mObject.mEngine->mEqPresetNames[i]);
2974be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi            }
2984be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
2994be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        }
3004be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    }
3014be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#if 0
3024be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    // configure the EQ so it can easily be heard, for test only
3034be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    uint32_t freq = 1977;
3044be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    uint32_t frange[2];
305b3b757daa7d162b6f66590d917c1f84f3ba73c70Eric Laurent    int16_t value = ap->mEqualizer.mBandLevelRangeMin;
3064be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    for(int32_t i=0 ; i< ap->mEqualizer.mNumBands ; i++) {
3074be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        android_eq_setParam(ap->mEqualizer.mEqEffect, EQ_PARAM_BAND_LEVEL, i, &value);
3084be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        // display EQ characteristics
3094be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        android_eq_getParam(ap->mEqualizer.mEqEffect, EQ_PARAM_CENTER_FREQ, i, &freq);
3104be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        android_eq_getParam(ap->mEqualizer.mEqEffect, EQ_PARAM_BAND_FREQ_RANGE, i, frange);
31149e4076e940559bc204d0f0aa7ab412986445bfaGlenn Kasten        SL_LOGV(" EQ init: band %d = %d - %d - %dHz", i, frange[0]/1000, freq/1000,
3124be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi                frange[1]/1000);
3134be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    }
3144be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    value = ap->mEqualizer.mBandLevelRangeMax;
3154be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    if (ap->mEqualizer.mNumBands > 2) {
3164be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        android_eq_setParam(ap->mEqualizer.mEqEffect, EQ_PARAM_BAND_LEVEL, 2, &value);
3174be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    }
3184be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    if (ap->mEqualizer.mNumBands > 3) {
3194be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        android_eq_setParam(ap->mEqualizer.mEqEffect, EQ_PARAM_BAND_LEVEL, 3, &value);
3204be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    }
3214be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
3224be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    ap->mEqualizer.mEqEffect->setEnabled(true);
3234be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#endif
3244be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi}
3254be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
3264be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi//-----------------------------------------------------------------------------
3274be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel TriviSLresult android_fx_statusToResult(android::status_t status) {
3284be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
3294be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    if ((android::INVALID_OPERATION == status) || (android::DEAD_OBJECT == status)) {
3304be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        return SL_RESULT_CONTROL_LOST;
3314be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    } else {
3324be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi        return SL_RESULT_SUCCESS;
3334be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi    }
3344be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi}
3354be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi
33667bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
33767bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi//-----------------------------------------------------------------------------
338f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivibool android_fx_initEffectDescriptor(const SLInterfaceID effectId,
339f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi        effect_descriptor_t* fxDescrLoc) {
340f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi    uint32_t numEffects = 0;
341f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi    effect_descriptor_t descriptor;
342f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi    bool foundEffect = false;
343f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi
344f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi    // any effects?
345f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi    android::status_t res = android::AudioEffect::queryNumberEffects(&numEffects);
346f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi    if (android::NO_ERROR != res) {
347f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi        SL_LOGE("unable to find any effects.");
348f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi        goto effectError;
349f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi    }
350f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi
351f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi    // request effect in the effects?
352f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi    for (uint32_t i=0 ; i < numEffects ; i++) {
353f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi        res = android::AudioEffect::queryEffect(i, &descriptor);
354f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi        if ((android::NO_ERROR == res) &&
355f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi                (0 == memcmp(effectId, &descriptor.type, sizeof(effect_uuid_t)))) {
356f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi            SL_LOGV("found effect %d %s", i, descriptor.name);
357f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi            foundEffect = true;
358f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi            break;
359f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi        }
360f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi    }
361f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi    if (foundEffect) {
362f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi        memcpy(fxDescrLoc, &descriptor, sizeof(effect_descriptor_t));
363f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi    } else {
364f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi        SL_LOGE("unable to find an implementation for the requested effect.");
365f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi        goto effectError;
366f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi    }
367f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi
368f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi    return true;
369f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi
370f5fce95f98037ea4ab341b416c82444af595313dJean-Michel TrivieffectError:
371f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi    // the requested effect wasn't found
372f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi    memset(fxDescrLoc, 0, sizeof(effect_descriptor_t));
373f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi
374f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi    return false;
375f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi}
376f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi
377f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi//-----------------------------------------------------------------------------
37867bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel TriviSLresult android_genericFx_queryNumEffects(SLuint32 *pNumSupportedAudioEffects) {
37967bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
38067bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    if (NULL == pNumSupportedAudioEffects) {
38167bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi        return SL_RESULT_PARAMETER_INVALID;
38267bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    }
38367bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
38467bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    android::status_t status =
38567bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            android::AudioEffect::queryNumberEffects((uint32_t*)pNumSupportedAudioEffects);
38667bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
38767bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    SLresult result = SL_RESULT_SUCCESS;
38867bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    switch(status) {
38967bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi        case android::NO_ERROR:
39067bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            result = SL_RESULT_SUCCESS;
39167bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            break;
39267bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi        case android::PERMISSION_DENIED:
39367bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            result = SL_RESULT_PERMISSION_DENIED;
39467bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            break;
39567bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi        case android::NO_INIT:
39667bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            result = SL_RESULT_RESOURCE_ERROR;
39767bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            break;
39867bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi        case android::BAD_VALUE:
39967bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            result = SL_RESULT_PARAMETER_INVALID;
40067bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            break;
40167bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi        default:
40267bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            result = SL_RESULT_INTERNAL_ERROR;
40367bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            SL_LOGE("received invalid status %d from AudioEffect::queryNumberEffects()", status);
40467bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            break;
40567bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    }
40667bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    return result;
40767bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi}
40867bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
40967bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
41067bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi//-----------------------------------------------------------------------------
41167bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel TriviSLresult android_genericFx_queryEffect(SLuint32 index, SLInterfaceID *pAudioEffectId) {
41267bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
41367bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    if (NULL == pAudioEffectId) {
41467bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi        return SL_RESULT_PARAMETER_INVALID;
41567bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    }
41667bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
41767bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    effect_descriptor_t descriptor;
41867bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    android::status_t status =
41967bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi                android::AudioEffect::queryEffect(index, &descriptor);
42067bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
42167bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    SLresult result = SL_RESULT_SUCCESS;
42267bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    switch(status) {
42367bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi        case android::NO_ERROR:
42467bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            // FIXME this function will move to an engine interface where we will store the
42567bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            //       audio effect IDs and we only return references to those, as SLInterfaceID
42667bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            //       is a pointer to the struct where a uuid is stored.
42767bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            //*pAudioEffectId = some global reference to where we keep a copy of the effect uuid
42867bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            result = SL_RESULT_SUCCESS;
42967bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            break;
43067bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi        case android::PERMISSION_DENIED:
43167bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            result = SL_RESULT_PERMISSION_DENIED;
43267bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            break;
43367bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi        case android::NO_INIT:
43467bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi        case android::INVALID_OPERATION:
43567bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            result = SL_RESULT_RESOURCE_ERROR;
43667bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            break;
43767bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi        case android::BAD_VALUE:
43867bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            result = SL_RESULT_PARAMETER_INVALID;
43967bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            break;
44067bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi        default:
44167bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            result = SL_RESULT_INTERNAL_ERROR;
44267bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            SL_LOGE("received invalid status %d from AudioEffect::queryNumberEffects()", status);
44367bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            break;
44467bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    }
44567bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    return result;
44667bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi}
44767bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
44867bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
44967bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi//-----------------------------------------------------------------------------
45067bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel TriviSLresult android_genericFx_createEffect(int sessionId, SLInterfaceID pUuid, void **ppAudioEffect) {
45167bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
45267bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    android::AudioEffect* af = NULL;
45367bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    SLresult result = SL_RESULT_SUCCESS;
45467bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
45567bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    af = new android::AudioEffect(
45667bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            NULL, // not using type to create effect
45767bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            (const effect_uuid_t*)pUuid,
45867bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            0,// priority
45967bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            0,// effect callback
46067bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            0,// callback data
46167bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            sessionId,
46267bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            0 );// output
46367bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    android::status_t status = af->initCheck();
46467bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
46567bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    if (android::NO_ERROR != status) {
46667bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi        SL_LOGE("AudioEffect initCheck() returned %d", status);
46767bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi        result = SL_RESULT_RESOURCE_ERROR;
46867bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    }
46967bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
47067bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    *ppAudioEffect = af;
47167bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    return result;
47267bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi}
47367bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
47467bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
47567bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi//-----------------------------------------------------------------------------
47667bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel TriviSLresult android_genericFx_releaseEffect(void *pAudioEffect) {
47767bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
47867bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    if (NULL != pAudioEffect) {
47967bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi        delete ((android::AudioEffect*)pAudioEffect);
48067bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi        return SL_RESULT_SUCCESS;
48167bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    } else {
48267bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi        return SL_RESULT_PARAMETER_INVALID;
48367bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    }
48467bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi}
48567bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
48667bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
48767bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi//-----------------------------------------------------------------------------
48867bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel TriviSLresult android_genericFx_setEnabled(void *pAudioEffect, SLboolean enabled) {
48967bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
49067bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    if (NULL == pAudioEffect) {
49167bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi        return SL_RESULT_PARAMETER_INVALID;
49267bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    }
49367bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
49467bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    android::status_t status =
49567bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            ((android::AudioEffect*)pAudioEffect)->setEnabled(SL_BOOLEAN_TRUE == enabled);
49667bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
4976a433388b625eb5931736cfa65a5e7ac931f5de4Jean-Michel Trivi    return android_fx_statusToResult(status);
49867bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi}
49967bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
50067bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
50167bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi//-----------------------------------------------------------------------------
50267bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel TriviSLresult android_genericFx_isEnabled(void *pAudioEffect, SLboolean *pEnabled) {
50367bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
50467bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    if (NULL == pAudioEffect) {
50567bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi        *pEnabled = SL_BOOLEAN_FALSE;
50667bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi        return SL_RESULT_PARAMETER_INVALID;
50767bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    }
50867bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
50967bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    *pEnabled =
51067bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi           ((android::AudioEffect*)pAudioEffect)->getEnabled() ? SL_BOOLEAN_TRUE : SL_BOOLEAN_FALSE;
51167bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
51267bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    return SL_RESULT_SUCCESS;
51367bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi}
51467bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
51567bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
51667bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi//-----------------------------------------------------------------------------
51767bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel TriviSLresult android_genericFx_sendCommand(void *pAudioEffect, SLuint32 command, SLuint32 commandSize,
51867bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi        void* pCommand, SLuint32 *replySize, void *pReply) {
51967bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
52067bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    if (NULL == pAudioEffect) {
52167bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi        return SL_RESULT_PARAMETER_INVALID;
52267bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    }
52367bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
52467bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    android::status_t status = ((android::AudioEffect*)pAudioEffect)->command(
5256a433388b625eb5931736cfa65a5e7ac931f5de4Jean-Michel Trivi            (uint32_t) command,
5266a433388b625eb5931736cfa65a5e7ac931f5de4Jean-Michel Trivi            (uint32_t) commandSize,
52767bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            pCommand,
5288b7d70c522234225689d0ecce70eecb8a6c0ac1fJean-Michel Trivi            (uint32_t*)replySize,
52967bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi            pReply);
53067bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
53167bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    if (android::BAD_VALUE == status) {
53267bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi        return SL_RESULT_PARAMETER_INVALID;
53367bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    }
53467bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi    return SL_RESULT_SUCCESS;
53567bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi}
53667bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
53767bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi
538