android_Effect.cpp revision f4aebfe499998c11b31319afb1c7738d4801f7b1
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 2194be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi//----------------------------------------------------------------------------- 2204be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivivoid android_eq_init(int sessionId, CAudioPlayer* ap) { 2219cd3c9e7a2395647b92c32f33c06cf9fd546b22fJean-Michel Trivi SL_LOGV("session %d", sessionId); 2224be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi 223f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi if (!android_fx_initEffectObj(sessionId, ap->mEqualizer.mEqEffect, 224f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi &ap->mEqualizer.mEqDescriptor.type, &ap->mEqualizer.mEqDescriptor.uuid)) { 225f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi SL_LOGE("Equalizer effect initialization failed"); 2264be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi return; 2274be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi } 2284be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi 2294be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi // initialize number of bands, band level range 230b3b757daa7d162b6f66590d917c1f84f3ba73c70Eric Laurent uint16_t num = 0; 2314be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi if (android::NO_ERROR == android_eq_getParam(ap->mEqualizer.mEqEffect, 2324be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi EQ_PARAM_NUM_BANDS, 0, &num)) { 2334be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi ap->mEqualizer.mNumBands = num; 2344be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi } 235b3b757daa7d162b6f66590d917c1f84f3ba73c70Eric Laurent int16_t range[2] = {0, 0}; 2364be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi if (android::NO_ERROR == android_eq_getParam(ap->mEqualizer.mEqEffect, 2374be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi EQ_PARAM_LEVEL_RANGE, 0, range)) { 2384be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi ap->mEqualizer.mBandLevelRangeMin = range[0]; 2394be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi ap->mEqualizer.mBandLevelRangeMax = range[1]; 2404be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi } 2414be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi 2424be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi SL_LOGV(" EQ init: num presets = %u, band range=[%d %d]mB", num, range[0], range[1]); 2434be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi 2444be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi // initialize preset number and names, store in IEngine 245b3b757daa7d162b6f66590d917c1f84f3ba73c70Eric Laurent uint16_t numPresets = 0; 2464be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi if (android::NO_ERROR == android_eq_getParam(ap->mEqualizer.mEqEffect, 2474be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi EQ_PARAM_GET_NUM_OF_PRESETS, 0, &numPresets)) { 2484be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi ap->mObject.mEngine->mEqNumPresets = numPresets; 2494be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi } 2504be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi char name[EFFECT_STRING_LEN_MAX]; 2514be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi if ((0 < numPresets) && (NULL == ap->mObject.mEngine->mEqPresetNames)) { 2524be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi ap->mObject.mEngine->mEqPresetNames = (char **)new char *[numPresets]; 2534be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi for(uint32_t i = 0 ; i < numPresets ; i++) { 2544be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi if (android::NO_ERROR == android_eq_getParam(ap->mEqualizer.mEqEffect, 2554be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi EQ_PARAM_GET_PRESET_NAME, i, name)) { 2564be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi ap->mObject.mEngine->mEqPresetNames[i] = new char[strlen(name) + 1]; 2574be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi strcpy(ap->mObject.mEngine->mEqPresetNames[i], name); 2584be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi SL_LOGV(" EQ init: presets = %u is %s", i, ap->mObject.mEngine->mEqPresetNames[i]); 2594be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi } 2604be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi 2614be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi } 2624be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi } 2634be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#if 0 2644be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi // configure the EQ so it can easily be heard, for test only 2654be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi uint32_t freq = 1977; 2664be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi uint32_t frange[2]; 267b3b757daa7d162b6f66590d917c1f84f3ba73c70Eric Laurent int16_t value = ap->mEqualizer.mBandLevelRangeMin; 2684be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi for(int32_t i=0 ; i< ap->mEqualizer.mNumBands ; i++) { 2694be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi android_eq_setParam(ap->mEqualizer.mEqEffect, EQ_PARAM_BAND_LEVEL, i, &value); 2704be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi // display EQ characteristics 2714be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi android_eq_getParam(ap->mEqualizer.mEqEffect, EQ_PARAM_CENTER_FREQ, i, &freq); 2724be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi android_eq_getParam(ap->mEqualizer.mEqEffect, EQ_PARAM_BAND_FREQ_RANGE, i, frange); 27349e4076e940559bc204d0f0aa7ab412986445bfaGlenn Kasten SL_LOGV(" EQ init: band %d = %d - %d - %dHz", i, frange[0]/1000, freq/1000, 2744be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi frange[1]/1000); 2754be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi } 2764be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi value = ap->mEqualizer.mBandLevelRangeMax; 2774be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi if (ap->mEqualizer.mNumBands > 2) { 2784be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi android_eq_setParam(ap->mEqualizer.mEqEffect, EQ_PARAM_BAND_LEVEL, 2, &value); 2794be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi } 2804be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi if (ap->mEqualizer.mNumBands > 3) { 2814be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi android_eq_setParam(ap->mEqualizer.mEqEffect, EQ_PARAM_BAND_LEVEL, 3, &value); 2824be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi } 2834be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi 2844be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi ap->mEqualizer.mEqEffect->setEnabled(true); 2854be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi#endif 2864be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi} 2874be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi 288f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi 289f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi//----------------------------------------------------------------------------- 290f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivivoid android_virt_init(int sessionId, CAudioPlayer* ap) { 291f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi SL_LOGV("session %d", sessionId); 292f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi 293f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi if (!android_fx_initEffectObj(sessionId, ap->mVirtualizer.mVirtualizerEffect, 294f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi &ap->mVirtualizer.mVirtualizerDescriptor.type, 295f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi &ap->mVirtualizer.mVirtualizerDescriptor.uuid)) { 296f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi SL_LOGE("Virtualizer effect initialization failed"); 297f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi return; 298f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi } 299f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi 300f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi // initialize strength 301f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi int16_t strength; 302f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi if (android::NO_ERROR == android_virt_getParam(ap->mVirtualizer.mVirtualizerEffect, 303f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi VIRTUALIZER_PARAM_STRENGTH, &strength)) { 304f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi ap->mVirtualizer.mStrength = (SLpermille) strength; 305f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi } 306f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi} 307f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi 308f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi//----------------------------------------------------------------------------- 309f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Triviandroid::status_t android_virt_setParam(android::sp<android::AudioEffect> pFx, 310f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi int32_t param, void *pValue) { 311f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi 312f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi return android_fx_setParam(pFx, param, VIRTUALIZER_PARAM_SIZE_MAX, 313f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi pValue, virt_valueSize(param)); 314f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi} 315f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi 316f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi//----------------------------------------------------------------------------- 317f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Triviandroid::status_t android_virt_getParam(android::sp<android::AudioEffect> pFx, 318f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi int32_t param, void *pValue) { 319f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi 320f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi return android_fx_getParam(pFx, param, VIRTUALIZER_PARAM_SIZE_MAX, 321f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi pValue, virt_valueSize(param)); 322f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi} 323f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi 324f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi//----------------------------------------------------------------------------- 325f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Triviandroid::status_t android_fx_setParam(android::sp<android::AudioEffect> pFx, 326f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi int32_t param, uint32_t paramSizeMax, void *pValue, uint32_t valueSize) 327f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi{ 328f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi 329f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi android::status_t status; 330f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi uint32_t buf32[(paramSizeMax - 1) / sizeof(uint32_t) + 1]; 331f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi effect_param_t *p = (effect_param_t *)buf32; 332f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi 333f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi p->psize = sizeof(int32_t); 334f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi *(int32_t *)p->data = param; 335f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi p->vsize = valueSize; 336f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi memcpy(p->data + p->psize, pValue, p->vsize); 337f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi status = pFx->setParameter(p); 338f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi if (android::NO_ERROR == status) { 339f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi status = p->status; 340f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi } 341f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi return status; 342f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi} 343f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi 344f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi 345f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi//----------------------------------------------------------------------------- 346f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Triviandroid::status_t android_fx_getParam(android::sp<android::AudioEffect> pFx, 347f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi int32_t param, uint32_t paramSizeMax, void *pValue, uint32_t valueSize) 348f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi{ 349f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi android::status_t status; 350f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi uint32_t buf32[(paramSizeMax - 1) / sizeof(uint32_t) + 1]; 351f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi effect_param_t *p = (effect_param_t *)buf32; 352f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi 353f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi p->psize = sizeof(int32_t); 354f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi *(int32_t *)p->data = param; 355f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi p->vsize = valueSize; 356f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi status = pFx->getParameter(p); 357f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi if (android::NO_ERROR == status) { 358f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi status = p->status; 359f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi if (android::NO_ERROR == status) { 360f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi memcpy(pValue, p->data + p->psize, p->vsize); 361f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi } 362f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi } 363f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi 364f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi return status; 365f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi} 366f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi 367f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi 3684be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi//----------------------------------------------------------------------------- 3694be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel TriviSLresult android_fx_statusToResult(android::status_t status) { 3704be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi 3714be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi if ((android::INVALID_OPERATION == status) || (android::DEAD_OBJECT == status)) { 3724be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi return SL_RESULT_CONTROL_LOST; 3734be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi } else { 3744be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi return SL_RESULT_SUCCESS; 3754be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi } 3764be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi} 3774be7fe875758b42939719a1082ae9e6dbf37a1d7Jean-Michel Trivi 37867bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi 37967bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi//----------------------------------------------------------------------------- 380f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivibool android_fx_initEffectObj(int sessionId, android::sp<android::AudioEffect>& effect, 381f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi const effect_uuid_t *type, const effect_uuid_t *uuid) { 382f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi SL_LOGV("session %d", sessionId); 383f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi 384f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi effect = new android::AudioEffect(type, uuid, 385f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi 0,// priority 386f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi 0,// effect callback 387f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi 0,// callback data 388f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi sessionId,// session ID 389f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi 0 );// output 390f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi 391f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi android::status_t status = effect->initCheck(); 392f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi if (android::NO_ERROR != status) { 393f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi effect.clear(); 394f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi SL_LOGE("Effect initCheck() returned %d", status); 395f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi return false; 396f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi } 397f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi 398f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi return true; 399f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi} 400f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi 401f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi 402f4aebfe499998c11b31319afb1c7738d4801f7b1Jean-Michel Trivi//----------------------------------------------------------------------------- 403f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivibool android_fx_initEffectDescriptor(const SLInterfaceID effectId, 404f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi effect_descriptor_t* fxDescrLoc) { 405f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi uint32_t numEffects = 0; 406f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi effect_descriptor_t descriptor; 407f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi bool foundEffect = false; 408f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi 409f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi // any effects? 410f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi android::status_t res = android::AudioEffect::queryNumberEffects(&numEffects); 411f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi if (android::NO_ERROR != res) { 412f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi SL_LOGE("unable to find any effects."); 413f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi goto effectError; 414f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi } 415f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi 416f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi // request effect in the effects? 417f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi for (uint32_t i=0 ; i < numEffects ; i++) { 418f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi res = android::AudioEffect::queryEffect(i, &descriptor); 419f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi if ((android::NO_ERROR == res) && 420f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi (0 == memcmp(effectId, &descriptor.type, sizeof(effect_uuid_t)))) { 421f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi SL_LOGV("found effect %d %s", i, descriptor.name); 422f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi foundEffect = true; 423f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi break; 424f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi } 425f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi } 426f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi if (foundEffect) { 427f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi memcpy(fxDescrLoc, &descriptor, sizeof(effect_descriptor_t)); 428f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi } else { 429f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi SL_LOGE("unable to find an implementation for the requested effect."); 430f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi goto effectError; 431f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi } 432f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi 433f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi return true; 434f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi 435f5fce95f98037ea4ab341b416c82444af595313dJean-Michel TrivieffectError: 436f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi // the requested effect wasn't found 437f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi memset(fxDescrLoc, 0, sizeof(effect_descriptor_t)); 438f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi 439f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi return false; 440f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi} 441f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi 442f5fce95f98037ea4ab341b416c82444af595313dJean-Michel Trivi//----------------------------------------------------------------------------- 44367bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel TriviSLresult android_genericFx_queryNumEffects(SLuint32 *pNumSupportedAudioEffects) { 44467bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi 44567bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi if (NULL == pNumSupportedAudioEffects) { 44667bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi return SL_RESULT_PARAMETER_INVALID; 44767bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi } 44867bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi 44967bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi android::status_t status = 45067bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi android::AudioEffect::queryNumberEffects((uint32_t*)pNumSupportedAudioEffects); 45167bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi 45267bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi SLresult result = SL_RESULT_SUCCESS; 45367bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi switch(status) { 45467bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi case android::NO_ERROR: 45567bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi result = SL_RESULT_SUCCESS; 45667bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi break; 45767bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi case android::PERMISSION_DENIED: 45867bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi result = SL_RESULT_PERMISSION_DENIED; 45967bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi break; 46067bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi case android::NO_INIT: 46167bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi result = SL_RESULT_RESOURCE_ERROR; 46267bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi break; 46367bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi case android::BAD_VALUE: 46467bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi result = SL_RESULT_PARAMETER_INVALID; 46567bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi break; 46667bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi default: 46767bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi result = SL_RESULT_INTERNAL_ERROR; 46867bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi SL_LOGE("received invalid status %d from AudioEffect::queryNumberEffects()", status); 46967bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi break; 47067bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi } 47167bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi return result; 47267bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi} 47367bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi 47467bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi 47567bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi//----------------------------------------------------------------------------- 47667bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel TriviSLresult android_genericFx_queryEffect(SLuint32 index, SLInterfaceID *pAudioEffectId) { 47767bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi 47867bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi if (NULL == pAudioEffectId) { 47967bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi return SL_RESULT_PARAMETER_INVALID; 48067bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi } 48167bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi 48267bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi effect_descriptor_t descriptor; 48367bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi android::status_t status = 48467bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi android::AudioEffect::queryEffect(index, &descriptor); 48567bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi 48667bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi SLresult result = SL_RESULT_SUCCESS; 48767bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi switch(status) { 48867bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi case android::NO_ERROR: 48967bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi // FIXME this function will move to an engine interface where we will store the 49067bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi // audio effect IDs and we only return references to those, as SLInterfaceID 49167bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi // is a pointer to the struct where a uuid is stored. 49267bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi //*pAudioEffectId = some global reference to where we keep a copy of the effect uuid 49367bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi result = SL_RESULT_SUCCESS; 49467bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi break; 49567bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi case android::PERMISSION_DENIED: 49667bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi result = SL_RESULT_PERMISSION_DENIED; 49767bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi break; 49867bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi case android::NO_INIT: 49967bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi case android::INVALID_OPERATION: 50067bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi result = SL_RESULT_RESOURCE_ERROR; 50167bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi break; 50267bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi case android::BAD_VALUE: 50367bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi result = SL_RESULT_PARAMETER_INVALID; 50467bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi break; 50567bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi default: 50667bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi result = SL_RESULT_INTERNAL_ERROR; 50767bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi SL_LOGE("received invalid status %d from AudioEffect::queryNumberEffects()", status); 50867bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi break; 50967bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi } 51067bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi return result; 51167bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi} 51267bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi 51367bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi 51467bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi//----------------------------------------------------------------------------- 51567bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel TriviSLresult android_genericFx_createEffect(int sessionId, SLInterfaceID pUuid, void **ppAudioEffect) { 51667bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi 51767bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi android::AudioEffect* af = NULL; 51867bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi SLresult result = SL_RESULT_SUCCESS; 51967bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi 52067bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi af = new android::AudioEffect( 52167bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi NULL, // not using type to create effect 52267bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi (const effect_uuid_t*)pUuid, 52367bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi 0,// priority 52467bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi 0,// effect callback 52567bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi 0,// callback data 52667bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi sessionId, 52767bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi 0 );// output 52867bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi android::status_t status = af->initCheck(); 52967bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi 53067bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi if (android::NO_ERROR != status) { 53167bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi SL_LOGE("AudioEffect initCheck() returned %d", status); 53267bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi result = SL_RESULT_RESOURCE_ERROR; 53367bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi } 53467bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi 53567bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi *ppAudioEffect = af; 53667bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi return result; 53767bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi} 53867bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi 53967bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi 54067bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi//----------------------------------------------------------------------------- 54167bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel TriviSLresult android_genericFx_releaseEffect(void *pAudioEffect) { 54267bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi 54367bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi if (NULL != pAudioEffect) { 54467bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi delete ((android::AudioEffect*)pAudioEffect); 54567bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi return SL_RESULT_SUCCESS; 54667bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi } else { 54767bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi return SL_RESULT_PARAMETER_INVALID; 54867bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi } 54967bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi} 55067bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi 55167bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi 55267bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi//----------------------------------------------------------------------------- 55367bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel TriviSLresult android_genericFx_setEnabled(void *pAudioEffect, SLboolean enabled) { 55467bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi 55567bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi if (NULL == pAudioEffect) { 55667bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi return SL_RESULT_PARAMETER_INVALID; 55767bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi } 55867bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi 55967bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi android::status_t status = 56067bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi ((android::AudioEffect*)pAudioEffect)->setEnabled(SL_BOOLEAN_TRUE == enabled); 56167bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi 5626a433388b625eb5931736cfa65a5e7ac931f5de4Jean-Michel Trivi return android_fx_statusToResult(status); 56367bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi} 56467bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi 56567bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi 56667bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi//----------------------------------------------------------------------------- 56767bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel TriviSLresult android_genericFx_isEnabled(void *pAudioEffect, SLboolean *pEnabled) { 56867bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi 56967bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi if (NULL == pAudioEffect) { 57067bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi *pEnabled = SL_BOOLEAN_FALSE; 57167bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi return SL_RESULT_PARAMETER_INVALID; 57267bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi } 57367bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi 57467bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi *pEnabled = 57567bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi ((android::AudioEffect*)pAudioEffect)->getEnabled() ? SL_BOOLEAN_TRUE : SL_BOOLEAN_FALSE; 57667bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi 57767bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi return SL_RESULT_SUCCESS; 57867bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi} 57967bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi 58067bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi 58167bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi//----------------------------------------------------------------------------- 58267bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel TriviSLresult android_genericFx_sendCommand(void *pAudioEffect, SLuint32 command, SLuint32 commandSize, 58367bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi void* pCommand, SLuint32 *replySize, void *pReply) { 58467bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi 58567bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi if (NULL == pAudioEffect) { 58667bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi return SL_RESULT_PARAMETER_INVALID; 58767bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi } 58867bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi 58967bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi android::status_t status = ((android::AudioEffect*)pAudioEffect)->command( 5906a433388b625eb5931736cfa65a5e7ac931f5de4Jean-Michel Trivi (uint32_t) command, 5916a433388b625eb5931736cfa65a5e7ac931f5de4Jean-Michel Trivi (uint32_t) commandSize, 59267bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi pCommand, 5938b7d70c522234225689d0ecce70eecb8a6c0ac1fJean-Michel Trivi (uint32_t*)replySize, 59467bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi pReply); 59567bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi 59667bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi if (android::BAD_VALUE == status) { 59767bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi return SL_RESULT_PARAMETER_INVALID; 59867bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi } 59967bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi return SL_RESULT_SUCCESS; 60067bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi} 60167bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi 60267bdf8a2fbd1024ab50c4513e1504325475368e0Jean-Michel Trivi 603