1*bebae9c0SAndroid Build Coastguard Worker /*
2*bebae9c0SAndroid Build Coastguard Worker * Copyright (C) 2010 The Android Open Source Project
3*bebae9c0SAndroid Build Coastguard Worker *
4*bebae9c0SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*bebae9c0SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*bebae9c0SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*bebae9c0SAndroid Build Coastguard Worker *
8*bebae9c0SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*bebae9c0SAndroid Build Coastguard Worker *
10*bebae9c0SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*bebae9c0SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*bebae9c0SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*bebae9c0SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*bebae9c0SAndroid Build Coastguard Worker * limitations under the License.
15*bebae9c0SAndroid Build Coastguard Worker */
16*bebae9c0SAndroid Build Coastguard Worker
17*bebae9c0SAndroid Build Coastguard Worker
18*bebae9c0SAndroid Build Coastguard Worker #include "sles_allinclusive.h"
19*bebae9c0SAndroid Build Coastguard Worker #include "math.h"
20*bebae9c0SAndroid Build Coastguard Worker #include "utils/RefBase.h"
21*bebae9c0SAndroid Build Coastguard Worker #include "utils/String16.h"
22*bebae9c0SAndroid Build Coastguard Worker
23*bebae9c0SAndroid Build Coastguard Worker #include <system/audio_effects/effect_bassboost.h>
24*bebae9c0SAndroid Build Coastguard Worker #include <system/audio_effects/effect_equalizer.h>
25*bebae9c0SAndroid Build Coastguard Worker #include <system/audio_effects/effect_environmentalreverb.h>
26*bebae9c0SAndroid Build Coastguard Worker #include <system/audio_effects/effect_presetreverb.h>
27*bebae9c0SAndroid Build Coastguard Worker #include <system/audio_effects/effect_virtualizer.h>
28*bebae9c0SAndroid Build Coastguard Worker
29*bebae9c0SAndroid Build Coastguard Worker #include <system/audio_effects/effect_aec.h>
30*bebae9c0SAndroid Build Coastguard Worker #include <system/audio_effects/effect_agc.h>
31*bebae9c0SAndroid Build Coastguard Worker #include <system/audio_effects/effect_ns.h>
32*bebae9c0SAndroid Build Coastguard Worker
33*bebae9c0SAndroid Build Coastguard Worker #include <system/audio.h>
34*bebae9c0SAndroid Build Coastguard Worker
35*bebae9c0SAndroid Build Coastguard Worker using android::content::AttributionSourceState;
36*bebae9c0SAndroid Build Coastguard Worker
37*bebae9c0SAndroid Build Coastguard Worker static const int EQUALIZER_PARAM_SIZE_MAX = sizeof(effect_param_t) + 2 * sizeof(int32_t)
38*bebae9c0SAndroid Build Coastguard Worker + EFFECT_STRING_LEN_MAX;
39*bebae9c0SAndroid Build Coastguard Worker
40*bebae9c0SAndroid Build Coastguard Worker static const int BASSBOOST_PARAM_SIZE_MAX = sizeof(effect_param_t) + 2 * sizeof(int32_t);
41*bebae9c0SAndroid Build Coastguard Worker
42*bebae9c0SAndroid Build Coastguard Worker static const int VIRTUALIZER_PARAM_SIZE_MAX = sizeof(effect_param_t) + 2 * sizeof(int32_t);
43*bebae9c0SAndroid Build Coastguard Worker
44*bebae9c0SAndroid Build Coastguard Worker static const int ENVREVERB_PARAM_SIZE_MAX_SINGLE = sizeof(effect_param_t) + 2 * sizeof(int32_t);
45*bebae9c0SAndroid Build Coastguard Worker
46*bebae9c0SAndroid Build Coastguard Worker static const int ENVREVERB_PARAM_SIZE_MAX_ALL = sizeof(effect_param_t) + sizeof(int32_t)
47*bebae9c0SAndroid Build Coastguard Worker + sizeof(s_reverb_settings);
48*bebae9c0SAndroid Build Coastguard Worker
49*bebae9c0SAndroid Build Coastguard Worker static const int PRESETREVERB_PARAM_SIZE_MAX = sizeof(effect_param_t) + 2 * sizeof(int32_t);
50*bebae9c0SAndroid Build Coastguard Worker
KEY_FROM_GUID(SLInterfaceID pUuid)51*bebae9c0SAndroid Build Coastguard Worker static inline SLuint32 KEY_FROM_GUID(SLInterfaceID pUuid) {
52*bebae9c0SAndroid Build Coastguard Worker return pUuid->time_low;
53*bebae9c0SAndroid Build Coastguard Worker }
54*bebae9c0SAndroid Build Coastguard Worker
55*bebae9c0SAndroid Build Coastguard Worker
56*bebae9c0SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
57*bebae9c0SAndroid Build Coastguard Worker static
eq_paramSize(int32_t param)58*bebae9c0SAndroid Build Coastguard Worker uint32_t eq_paramSize(int32_t param) {
59*bebae9c0SAndroid Build Coastguard Worker uint32_t size;
60*bebae9c0SAndroid Build Coastguard Worker
61*bebae9c0SAndroid Build Coastguard Worker switch (param) {
62*bebae9c0SAndroid Build Coastguard Worker case EQ_PARAM_NUM_BANDS:
63*bebae9c0SAndroid Build Coastguard Worker case EQ_PARAM_LEVEL_RANGE:
64*bebae9c0SAndroid Build Coastguard Worker case EQ_PARAM_CUR_PRESET:
65*bebae9c0SAndroid Build Coastguard Worker case EQ_PARAM_GET_NUM_OF_PRESETS:
66*bebae9c0SAndroid Build Coastguard Worker size = sizeof(int32_t);
67*bebae9c0SAndroid Build Coastguard Worker break;
68*bebae9c0SAndroid Build Coastguard Worker case EQ_PARAM_BAND_LEVEL:
69*bebae9c0SAndroid Build Coastguard Worker case EQ_PARAM_CENTER_FREQ:
70*bebae9c0SAndroid Build Coastguard Worker case EQ_PARAM_BAND_FREQ_RANGE:
71*bebae9c0SAndroid Build Coastguard Worker case EQ_PARAM_GET_BAND:
72*bebae9c0SAndroid Build Coastguard Worker case EQ_PARAM_GET_PRESET_NAME:
73*bebae9c0SAndroid Build Coastguard Worker size = 2 * sizeof(int32_t);
74*bebae9c0SAndroid Build Coastguard Worker break;
75*bebae9c0SAndroid Build Coastguard Worker default:
76*bebae9c0SAndroid Build Coastguard Worker size = 2 * sizeof(int32_t);
77*bebae9c0SAndroid Build Coastguard Worker SL_LOGE("Trying to use an unknown EQ parameter %d", param);
78*bebae9c0SAndroid Build Coastguard Worker break;
79*bebae9c0SAndroid Build Coastguard Worker }
80*bebae9c0SAndroid Build Coastguard Worker return size;
81*bebae9c0SAndroid Build Coastguard Worker }
82*bebae9c0SAndroid Build Coastguard Worker
83*bebae9c0SAndroid Build Coastguard Worker static
eq_valueSize(int32_t param)84*bebae9c0SAndroid Build Coastguard Worker uint32_t eq_valueSize(int32_t param) {
85*bebae9c0SAndroid Build Coastguard Worker uint32_t size;
86*bebae9c0SAndroid Build Coastguard Worker
87*bebae9c0SAndroid Build Coastguard Worker switch (param) {
88*bebae9c0SAndroid Build Coastguard Worker case EQ_PARAM_NUM_BANDS:
89*bebae9c0SAndroid Build Coastguard Worker case EQ_PARAM_CUR_PRESET:
90*bebae9c0SAndroid Build Coastguard Worker case EQ_PARAM_GET_NUM_OF_PRESETS:
91*bebae9c0SAndroid Build Coastguard Worker case EQ_PARAM_BAND_LEVEL:
92*bebae9c0SAndroid Build Coastguard Worker case EQ_PARAM_GET_BAND:
93*bebae9c0SAndroid Build Coastguard Worker size = sizeof(int16_t);
94*bebae9c0SAndroid Build Coastguard Worker break;
95*bebae9c0SAndroid Build Coastguard Worker case EQ_PARAM_LEVEL_RANGE:
96*bebae9c0SAndroid Build Coastguard Worker size = 2 * sizeof(int16_t);
97*bebae9c0SAndroid Build Coastguard Worker break;
98*bebae9c0SAndroid Build Coastguard Worker case EQ_PARAM_CENTER_FREQ:
99*bebae9c0SAndroid Build Coastguard Worker size = sizeof(int32_t);
100*bebae9c0SAndroid Build Coastguard Worker break;
101*bebae9c0SAndroid Build Coastguard Worker case EQ_PARAM_BAND_FREQ_RANGE:
102*bebae9c0SAndroid Build Coastguard Worker size = 2 * sizeof(int32_t);
103*bebae9c0SAndroid Build Coastguard Worker break;
104*bebae9c0SAndroid Build Coastguard Worker case EQ_PARAM_GET_PRESET_NAME:
105*bebae9c0SAndroid Build Coastguard Worker size = EFFECT_STRING_LEN_MAX;
106*bebae9c0SAndroid Build Coastguard Worker break;
107*bebae9c0SAndroid Build Coastguard Worker default:
108*bebae9c0SAndroid Build Coastguard Worker size = sizeof(int32_t);
109*bebae9c0SAndroid Build Coastguard Worker SL_LOGE("Trying to access an unknown EQ parameter %d", param);
110*bebae9c0SAndroid Build Coastguard Worker break;
111*bebae9c0SAndroid Build Coastguard Worker }
112*bebae9c0SAndroid Build Coastguard Worker return size;
113*bebae9c0SAndroid Build Coastguard Worker }
114*bebae9c0SAndroid Build Coastguard Worker
115*bebae9c0SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
116*bebae9c0SAndroid Build Coastguard Worker /**
117*bebae9c0SAndroid Build Coastguard Worker * returns the size in bytes of the value of each bass boost parameter
118*bebae9c0SAndroid Build Coastguard Worker */
119*bebae9c0SAndroid Build Coastguard Worker static
bb_valueSize(int32_t param)120*bebae9c0SAndroid Build Coastguard Worker uint32_t bb_valueSize(int32_t param) {
121*bebae9c0SAndroid Build Coastguard Worker uint32_t size;
122*bebae9c0SAndroid Build Coastguard Worker
123*bebae9c0SAndroid Build Coastguard Worker switch (param) {
124*bebae9c0SAndroid Build Coastguard Worker case BASSBOOST_PARAM_STRENGTH_SUPPORTED:
125*bebae9c0SAndroid Build Coastguard Worker size = sizeof(int32_t);
126*bebae9c0SAndroid Build Coastguard Worker break;
127*bebae9c0SAndroid Build Coastguard Worker case BASSBOOST_PARAM_STRENGTH:
128*bebae9c0SAndroid Build Coastguard Worker size = sizeof(int16_t);
129*bebae9c0SAndroid Build Coastguard Worker break;
130*bebae9c0SAndroid Build Coastguard Worker default:
131*bebae9c0SAndroid Build Coastguard Worker size = sizeof(int32_t);
132*bebae9c0SAndroid Build Coastguard Worker SL_LOGE("Trying to access an unknown BassBoost parameter %d", param);
133*bebae9c0SAndroid Build Coastguard Worker break;
134*bebae9c0SAndroid Build Coastguard Worker }
135*bebae9c0SAndroid Build Coastguard Worker
136*bebae9c0SAndroid Build Coastguard Worker return size;
137*bebae9c0SAndroid Build Coastguard Worker }
138*bebae9c0SAndroid Build Coastguard Worker
139*bebae9c0SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
140*bebae9c0SAndroid Build Coastguard Worker /**
141*bebae9c0SAndroid Build Coastguard Worker * returns the size in bytes of the value of each virtualizer parameter
142*bebae9c0SAndroid Build Coastguard Worker */
143*bebae9c0SAndroid Build Coastguard Worker static
virt_valueSize(int32_t param)144*bebae9c0SAndroid Build Coastguard Worker uint32_t virt_valueSize(int32_t param) {
145*bebae9c0SAndroid Build Coastguard Worker uint32_t size;
146*bebae9c0SAndroid Build Coastguard Worker
147*bebae9c0SAndroid Build Coastguard Worker switch (param) {
148*bebae9c0SAndroid Build Coastguard Worker case VIRTUALIZER_PARAM_STRENGTH_SUPPORTED:
149*bebae9c0SAndroid Build Coastguard Worker size = sizeof(int32_t);
150*bebae9c0SAndroid Build Coastguard Worker break;
151*bebae9c0SAndroid Build Coastguard Worker case VIRTUALIZER_PARAM_STRENGTH:
152*bebae9c0SAndroid Build Coastguard Worker size = sizeof(int16_t);
153*bebae9c0SAndroid Build Coastguard Worker break;
154*bebae9c0SAndroid Build Coastguard Worker default:
155*bebae9c0SAndroid Build Coastguard Worker size = sizeof(int32_t);
156*bebae9c0SAndroid Build Coastguard Worker SL_LOGE("Trying to access an unknown Virtualizer parameter %d", param);
157*bebae9c0SAndroid Build Coastguard Worker break;
158*bebae9c0SAndroid Build Coastguard Worker }
159*bebae9c0SAndroid Build Coastguard Worker
160*bebae9c0SAndroid Build Coastguard Worker return size;
161*bebae9c0SAndroid Build Coastguard Worker }
162*bebae9c0SAndroid Build Coastguard Worker
163*bebae9c0SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
164*bebae9c0SAndroid Build Coastguard Worker /**
165*bebae9c0SAndroid Build Coastguard Worker * returns the size in bytes of the value of each environmental reverb parameter
166*bebae9c0SAndroid Build Coastguard Worker */
167*bebae9c0SAndroid Build Coastguard Worker static
erev_valueSize(int32_t param)168*bebae9c0SAndroid Build Coastguard Worker uint32_t erev_valueSize(int32_t param) {
169*bebae9c0SAndroid Build Coastguard Worker uint32_t size;
170*bebae9c0SAndroid Build Coastguard Worker
171*bebae9c0SAndroid Build Coastguard Worker switch (param) {
172*bebae9c0SAndroid Build Coastguard Worker case REVERB_PARAM_ROOM_LEVEL:
173*bebae9c0SAndroid Build Coastguard Worker case REVERB_PARAM_ROOM_HF_LEVEL:
174*bebae9c0SAndroid Build Coastguard Worker case REVERB_PARAM_REFLECTIONS_LEVEL:
175*bebae9c0SAndroid Build Coastguard Worker case REVERB_PARAM_REVERB_LEVEL:
176*bebae9c0SAndroid Build Coastguard Worker size = sizeof(int16_t); // millibel
177*bebae9c0SAndroid Build Coastguard Worker break;
178*bebae9c0SAndroid Build Coastguard Worker case REVERB_PARAM_DECAY_TIME:
179*bebae9c0SAndroid Build Coastguard Worker case REVERB_PARAM_REFLECTIONS_DELAY:
180*bebae9c0SAndroid Build Coastguard Worker case REVERB_PARAM_REVERB_DELAY:
181*bebae9c0SAndroid Build Coastguard Worker size = sizeof(uint32_t); // milliseconds
182*bebae9c0SAndroid Build Coastguard Worker break;
183*bebae9c0SAndroid Build Coastguard Worker case REVERB_PARAM_DECAY_HF_RATIO:
184*bebae9c0SAndroid Build Coastguard Worker case REVERB_PARAM_DIFFUSION:
185*bebae9c0SAndroid Build Coastguard Worker case REVERB_PARAM_DENSITY:
186*bebae9c0SAndroid Build Coastguard Worker size = sizeof(int16_t); // permille
187*bebae9c0SAndroid Build Coastguard Worker break;
188*bebae9c0SAndroid Build Coastguard Worker case REVERB_PARAM_PROPERTIES:
189*bebae9c0SAndroid Build Coastguard Worker size = sizeof(s_reverb_settings); // struct of all reverb properties
190*bebae9c0SAndroid Build Coastguard Worker break;
191*bebae9c0SAndroid Build Coastguard Worker default:
192*bebae9c0SAndroid Build Coastguard Worker size = sizeof(int32_t);
193*bebae9c0SAndroid Build Coastguard Worker SL_LOGE("Trying to access an unknown Environmental Reverb parameter %d", param);
194*bebae9c0SAndroid Build Coastguard Worker break;
195*bebae9c0SAndroid Build Coastguard Worker }
196*bebae9c0SAndroid Build Coastguard Worker
197*bebae9c0SAndroid Build Coastguard Worker return size;
198*bebae9c0SAndroid Build Coastguard Worker }
199*bebae9c0SAndroid Build Coastguard Worker
200*bebae9c0SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
android_eq_getParam(const android::sp<android::AudioEffect> & pFx,int32_t param,int32_t param2,void * pValue)201*bebae9c0SAndroid Build Coastguard Worker android::status_t android_eq_getParam(const android::sp<android::AudioEffect>& pFx,
202*bebae9c0SAndroid Build Coastguard Worker int32_t param, int32_t param2, void *pValue)
203*bebae9c0SAndroid Build Coastguard Worker {
204*bebae9c0SAndroid Build Coastguard Worker android::status_t status;
205*bebae9c0SAndroid Build Coastguard Worker uint32_t buf32[(EQUALIZER_PARAM_SIZE_MAX - 1) / sizeof(uint32_t) + 1];
206*bebae9c0SAndroid Build Coastguard Worker effect_param_t *p = (effect_param_t *)buf32;
207*bebae9c0SAndroid Build Coastguard Worker
208*bebae9c0SAndroid Build Coastguard Worker p->psize = eq_paramSize(param);
209*bebae9c0SAndroid Build Coastguard Worker *(int32_t *)p->data = param;
210*bebae9c0SAndroid Build Coastguard Worker if (p->psize == 2 * sizeof(int32_t)) {
211*bebae9c0SAndroid Build Coastguard Worker *((int32_t *)p->data + 1) = param2;
212*bebae9c0SAndroid Build Coastguard Worker }
213*bebae9c0SAndroid Build Coastguard Worker p->vsize = eq_valueSize(param);
214*bebae9c0SAndroid Build Coastguard Worker status = pFx->getParameter(p);
215*bebae9c0SAndroid Build Coastguard Worker if (android::NO_ERROR == status) {
216*bebae9c0SAndroid Build Coastguard Worker status = p->status;
217*bebae9c0SAndroid Build Coastguard Worker if (android::NO_ERROR == status) {
218*bebae9c0SAndroid Build Coastguard Worker memcpy(pValue, p->data + p->psize, p->vsize);
219*bebae9c0SAndroid Build Coastguard Worker }
220*bebae9c0SAndroid Build Coastguard Worker }
221*bebae9c0SAndroid Build Coastguard Worker
222*bebae9c0SAndroid Build Coastguard Worker return status;
223*bebae9c0SAndroid Build Coastguard Worker }
224*bebae9c0SAndroid Build Coastguard Worker
225*bebae9c0SAndroid Build Coastguard Worker
226*bebae9c0SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
android_eq_setParam(const android::sp<android::AudioEffect> & pFx,int32_t param,int32_t param2,void * pValue)227*bebae9c0SAndroid Build Coastguard Worker android::status_t android_eq_setParam(const android::sp<android::AudioEffect>& pFx,
228*bebae9c0SAndroid Build Coastguard Worker int32_t param, int32_t param2, void *pValue)
229*bebae9c0SAndroid Build Coastguard Worker {
230*bebae9c0SAndroid Build Coastguard Worker android::status_t status;
231*bebae9c0SAndroid Build Coastguard Worker uint32_t buf32[(EQUALIZER_PARAM_SIZE_MAX - 1) / sizeof(uint32_t) + 1];
232*bebae9c0SAndroid Build Coastguard Worker effect_param_t *p = (effect_param_t *)buf32;
233*bebae9c0SAndroid Build Coastguard Worker
234*bebae9c0SAndroid Build Coastguard Worker p->psize = eq_paramSize(param);
235*bebae9c0SAndroid Build Coastguard Worker *(int32_t *)p->data = param;
236*bebae9c0SAndroid Build Coastguard Worker if (p->psize == 2 * sizeof(int32_t)) {
237*bebae9c0SAndroid Build Coastguard Worker *((int32_t *)p->data + 1) = param2;
238*bebae9c0SAndroid Build Coastguard Worker }
239*bebae9c0SAndroid Build Coastguard Worker p->vsize = eq_valueSize(param);
240*bebae9c0SAndroid Build Coastguard Worker memcpy(p->data + p->psize, pValue, p->vsize);
241*bebae9c0SAndroid Build Coastguard Worker status = pFx->setParameter(p);
242*bebae9c0SAndroid Build Coastguard Worker if (android::NO_ERROR == status) {
243*bebae9c0SAndroid Build Coastguard Worker status = p->status;
244*bebae9c0SAndroid Build Coastguard Worker }
245*bebae9c0SAndroid Build Coastguard Worker
246*bebae9c0SAndroid Build Coastguard Worker return status;
247*bebae9c0SAndroid Build Coastguard Worker }
248*bebae9c0SAndroid Build Coastguard Worker
249*bebae9c0SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
android_bb_setParam(const android::sp<android::AudioEffect> & pFx,int32_t param,void * pValue)250*bebae9c0SAndroid Build Coastguard Worker android::status_t android_bb_setParam(const android::sp<android::AudioEffect>& pFx,
251*bebae9c0SAndroid Build Coastguard Worker int32_t param, void *pValue) {
252*bebae9c0SAndroid Build Coastguard Worker
253*bebae9c0SAndroid Build Coastguard Worker return android_fx_setParam(pFx, param, BASSBOOST_PARAM_SIZE_MAX,
254*bebae9c0SAndroid Build Coastguard Worker pValue, bb_valueSize(param));
255*bebae9c0SAndroid Build Coastguard Worker }
256*bebae9c0SAndroid Build Coastguard Worker
257*bebae9c0SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
android_bb_getParam(const android::sp<android::AudioEffect> & pFx,int32_t param,void * pValue)258*bebae9c0SAndroid Build Coastguard Worker android::status_t android_bb_getParam(const android::sp<android::AudioEffect>& pFx,
259*bebae9c0SAndroid Build Coastguard Worker int32_t param, void *pValue) {
260*bebae9c0SAndroid Build Coastguard Worker
261*bebae9c0SAndroid Build Coastguard Worker return android_fx_getParam(pFx, param, BASSBOOST_PARAM_SIZE_MAX,
262*bebae9c0SAndroid Build Coastguard Worker pValue, bb_valueSize(param));
263*bebae9c0SAndroid Build Coastguard Worker }
264*bebae9c0SAndroid Build Coastguard Worker
265*bebae9c0SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
android_bb_init(audio_session_t sessionId,IBassBoost * ibb)266*bebae9c0SAndroid Build Coastguard Worker void android_bb_init(audio_session_t sessionId, IBassBoost* ibb) {
267*bebae9c0SAndroid Build Coastguard Worker SL_LOGV("session %d", sessionId);
268*bebae9c0SAndroid Build Coastguard Worker
269*bebae9c0SAndroid Build Coastguard Worker if (!android_fx_initEffectObj(sessionId, ibb->mBassBoostEffect,
270*bebae9c0SAndroid Build Coastguard Worker &ibb->mBassBoostDescriptor.type))
271*bebae9c0SAndroid Build Coastguard Worker {
272*bebae9c0SAndroid Build Coastguard Worker SL_LOGE("BassBoost effect initialization failed");
273*bebae9c0SAndroid Build Coastguard Worker return;
274*bebae9c0SAndroid Build Coastguard Worker }
275*bebae9c0SAndroid Build Coastguard Worker
276*bebae9c0SAndroid Build Coastguard Worker // initialize strength
277*bebae9c0SAndroid Build Coastguard Worker int16_t strength;
278*bebae9c0SAndroid Build Coastguard Worker if (android::NO_ERROR == android_bb_getParam(ibb->mBassBoostEffect,
279*bebae9c0SAndroid Build Coastguard Worker BASSBOOST_PARAM_STRENGTH, &strength)) {
280*bebae9c0SAndroid Build Coastguard Worker ibb->mStrength = (SLpermille) strength;
281*bebae9c0SAndroid Build Coastguard Worker }
282*bebae9c0SAndroid Build Coastguard Worker }
283*bebae9c0SAndroid Build Coastguard Worker
284*bebae9c0SAndroid Build Coastguard Worker
285*bebae9c0SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
android_eq_init(audio_session_t sessionId,IEqualizer * ieq)286*bebae9c0SAndroid Build Coastguard Worker void android_eq_init(audio_session_t sessionId, IEqualizer* ieq) {
287*bebae9c0SAndroid Build Coastguard Worker SL_LOGV("android_eq_init on session %d", sessionId);
288*bebae9c0SAndroid Build Coastguard Worker
289*bebae9c0SAndroid Build Coastguard Worker if (!android_fx_initEffectObj(sessionId, ieq->mEqEffect, &ieq->mEqDescriptor.type)) {
290*bebae9c0SAndroid Build Coastguard Worker SL_LOGE("Equalizer effect initialization failed");
291*bebae9c0SAndroid Build Coastguard Worker return;
292*bebae9c0SAndroid Build Coastguard Worker }
293*bebae9c0SAndroid Build Coastguard Worker
294*bebae9c0SAndroid Build Coastguard Worker // initialize number of bands, band level range, and number of presets
295*bebae9c0SAndroid Build Coastguard Worker uint16_t num = 0;
296*bebae9c0SAndroid Build Coastguard Worker if (android::NO_ERROR == android_eq_getParam(ieq->mEqEffect, EQ_PARAM_NUM_BANDS, 0, &num)) {
297*bebae9c0SAndroid Build Coastguard Worker ieq->mNumBands = num;
298*bebae9c0SAndroid Build Coastguard Worker }
299*bebae9c0SAndroid Build Coastguard Worker int16_t range[2] = {0, 0};
300*bebae9c0SAndroid Build Coastguard Worker if (android::NO_ERROR == android_eq_getParam(ieq->mEqEffect, EQ_PARAM_LEVEL_RANGE, 0, range)) {
301*bebae9c0SAndroid Build Coastguard Worker ieq->mBandLevelRangeMin = range[0];
302*bebae9c0SAndroid Build Coastguard Worker ieq->mBandLevelRangeMax = range[1];
303*bebae9c0SAndroid Build Coastguard Worker }
304*bebae9c0SAndroid Build Coastguard Worker
305*bebae9c0SAndroid Build Coastguard Worker SL_LOGV(" EQ init: num bands = %u, band range=[%d %d]mB", num, range[0], range[1]);
306*bebae9c0SAndroid Build Coastguard Worker
307*bebae9c0SAndroid Build Coastguard Worker // FIXME don't store presets names, they can be queried each time they're needed
308*bebae9c0SAndroid Build Coastguard Worker // initialize preset number and names, store in IEngine
309*bebae9c0SAndroid Build Coastguard Worker uint16_t numPresets = 0;
310*bebae9c0SAndroid Build Coastguard Worker if (android::NO_ERROR == android_eq_getParam(ieq->mEqEffect,
311*bebae9c0SAndroid Build Coastguard Worker EQ_PARAM_GET_NUM_OF_PRESETS, 0, &numPresets)) {
312*bebae9c0SAndroid Build Coastguard Worker ieq->mThis->mEngine->mEqNumPresets = numPresets;
313*bebae9c0SAndroid Build Coastguard Worker ieq->mNumPresets = numPresets;
314*bebae9c0SAndroid Build Coastguard Worker }
315*bebae9c0SAndroid Build Coastguard Worker
316*bebae9c0SAndroid Build Coastguard Worker object_lock_exclusive(&ieq->mThis->mEngine->mObject);
317*bebae9c0SAndroid Build Coastguard Worker char name[EFFECT_STRING_LEN_MAX];
318*bebae9c0SAndroid Build Coastguard Worker if ((0 < numPresets) && (NULL == ieq->mThis->mEngine->mEqPresetNames)) {
319*bebae9c0SAndroid Build Coastguard Worker ieq->mThis->mEngine->mEqPresetNames = (char **)new char *[numPresets];
320*bebae9c0SAndroid Build Coastguard Worker for(uint32_t i = 0 ; i < numPresets ; i++) {
321*bebae9c0SAndroid Build Coastguard Worker if (android::NO_ERROR == android_eq_getParam(ieq->mEqEffect,
322*bebae9c0SAndroid Build Coastguard Worker EQ_PARAM_GET_PRESET_NAME, i, name)) {
323*bebae9c0SAndroid Build Coastguard Worker ieq->mThis->mEngine->mEqPresetNames[i] = new char[strlen(name) + 1];
324*bebae9c0SAndroid Build Coastguard Worker strcpy(ieq->mThis->mEngine->mEqPresetNames[i], name);
325*bebae9c0SAndroid Build Coastguard Worker SL_LOGV(" EQ init: presets = %u is %s", i, ieq->mThis->mEngine->mEqPresetNames[i]);
326*bebae9c0SAndroid Build Coastguard Worker }
327*bebae9c0SAndroid Build Coastguard Worker }
328*bebae9c0SAndroid Build Coastguard Worker }
329*bebae9c0SAndroid Build Coastguard Worker object_unlock_exclusive(&ieq->mThis->mEngine->mObject);
330*bebae9c0SAndroid Build Coastguard Worker
331*bebae9c0SAndroid Build Coastguard Worker }
332*bebae9c0SAndroid Build Coastguard Worker
333*bebae9c0SAndroid Build Coastguard Worker
334*bebae9c0SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
android_virt_init(audio_session_t sessionId,IVirtualizer * ivi)335*bebae9c0SAndroid Build Coastguard Worker void android_virt_init(audio_session_t sessionId, IVirtualizer* ivi) {
336*bebae9c0SAndroid Build Coastguard Worker SL_LOGV("android_virt_init on session %d", sessionId);
337*bebae9c0SAndroid Build Coastguard Worker
338*bebae9c0SAndroid Build Coastguard Worker if (!android_fx_initEffectObj(sessionId, ivi->mVirtualizerEffect,
339*bebae9c0SAndroid Build Coastguard Worker &ivi->mVirtualizerDescriptor.type)) {
340*bebae9c0SAndroid Build Coastguard Worker SL_LOGE("Virtualizer effect initialization failed");
341*bebae9c0SAndroid Build Coastguard Worker return;
342*bebae9c0SAndroid Build Coastguard Worker }
343*bebae9c0SAndroid Build Coastguard Worker
344*bebae9c0SAndroid Build Coastguard Worker // initialize strength
345*bebae9c0SAndroid Build Coastguard Worker int16_t strength;
346*bebae9c0SAndroid Build Coastguard Worker if (android::NO_ERROR == android_virt_getParam(ivi->mVirtualizerEffect,
347*bebae9c0SAndroid Build Coastguard Worker VIRTUALIZER_PARAM_STRENGTH, &strength)) {
348*bebae9c0SAndroid Build Coastguard Worker ivi->mStrength = (SLpermille) strength;
349*bebae9c0SAndroid Build Coastguard Worker }
350*bebae9c0SAndroid Build Coastguard Worker }
351*bebae9c0SAndroid Build Coastguard Worker
352*bebae9c0SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
android_virt_setParam(const android::sp<android::AudioEffect> & pFx,int32_t param,void * pValue)353*bebae9c0SAndroid Build Coastguard Worker android::status_t android_virt_setParam(const android::sp<android::AudioEffect>& pFx,
354*bebae9c0SAndroid Build Coastguard Worker int32_t param, void *pValue) {
355*bebae9c0SAndroid Build Coastguard Worker
356*bebae9c0SAndroid Build Coastguard Worker return android_fx_setParam(pFx, param, VIRTUALIZER_PARAM_SIZE_MAX,
357*bebae9c0SAndroid Build Coastguard Worker pValue, virt_valueSize(param));
358*bebae9c0SAndroid Build Coastguard Worker }
359*bebae9c0SAndroid Build Coastguard Worker
360*bebae9c0SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
android_virt_getParam(const android::sp<android::AudioEffect> & pFx,int32_t param,void * pValue)361*bebae9c0SAndroid Build Coastguard Worker android::status_t android_virt_getParam(const android::sp<android::AudioEffect>& pFx,
362*bebae9c0SAndroid Build Coastguard Worker int32_t param, void *pValue) {
363*bebae9c0SAndroid Build Coastguard Worker
364*bebae9c0SAndroid Build Coastguard Worker return android_fx_getParam(pFx, param, VIRTUALIZER_PARAM_SIZE_MAX,
365*bebae9c0SAndroid Build Coastguard Worker pValue, virt_valueSize(param));
366*bebae9c0SAndroid Build Coastguard Worker }
367*bebae9c0SAndroid Build Coastguard Worker
368*bebae9c0SAndroid Build Coastguard Worker
369*bebae9c0SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
android_prev_init(IPresetReverb * ipr)370*bebae9c0SAndroid Build Coastguard Worker void android_prev_init(IPresetReverb* ipr) {
371*bebae9c0SAndroid Build Coastguard Worker SL_LOGV("session is implicitly %d (aux effect)", AUDIO_SESSION_OUTPUT_MIX);
372*bebae9c0SAndroid Build Coastguard Worker
373*bebae9c0SAndroid Build Coastguard Worker if (!android_fx_initEffectObj(AUDIO_SESSION_OUTPUT_MIX /*sessionId*/,
374*bebae9c0SAndroid Build Coastguard Worker ipr->mPresetReverbEffect, &ipr->mPresetReverbDescriptor.type)) {
375*bebae9c0SAndroid Build Coastguard Worker SL_LOGE("PresetReverb effect initialization failed");
376*bebae9c0SAndroid Build Coastguard Worker return;
377*bebae9c0SAndroid Build Coastguard Worker }
378*bebae9c0SAndroid Build Coastguard Worker
379*bebae9c0SAndroid Build Coastguard Worker // initialize preset
380*bebae9c0SAndroid Build Coastguard Worker uint16_t preset;
381*bebae9c0SAndroid Build Coastguard Worker if (android::NO_ERROR == android_prev_getPreset(ipr->mPresetReverbEffect, &preset)) {
382*bebae9c0SAndroid Build Coastguard Worker ipr->mPreset = preset;
383*bebae9c0SAndroid Build Coastguard Worker // enable the effect if it has a preset loaded
384*bebae9c0SAndroid Build Coastguard Worker ipr->mPresetReverbEffect->setEnabled(SL_REVERBPRESET_NONE != preset);
385*bebae9c0SAndroid Build Coastguard Worker }
386*bebae9c0SAndroid Build Coastguard Worker }
387*bebae9c0SAndroid Build Coastguard Worker
388*bebae9c0SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
android_prev_setPreset(const android::sp<android::AudioEffect> & pFx,uint16_t preset)389*bebae9c0SAndroid Build Coastguard Worker android::status_t android_prev_setPreset(const android::sp<android::AudioEffect>& pFx,
390*bebae9c0SAndroid Build Coastguard Worker uint16_t preset) {
391*bebae9c0SAndroid Build Coastguard Worker android::status_t status = android_fx_setParam(pFx, REVERB_PARAM_PRESET,
392*bebae9c0SAndroid Build Coastguard Worker PRESETREVERB_PARAM_SIZE_MAX, &preset, sizeof(uint16_t));
393*bebae9c0SAndroid Build Coastguard Worker // enable the effect if the preset is different from SL_REVERBPRESET_NONE
394*bebae9c0SAndroid Build Coastguard Worker pFx->setEnabled(SL_REVERBPRESET_NONE != preset);
395*bebae9c0SAndroid Build Coastguard Worker return status;
396*bebae9c0SAndroid Build Coastguard Worker }
397*bebae9c0SAndroid Build Coastguard Worker
398*bebae9c0SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
android_prev_getPreset(const android::sp<android::AudioEffect> & pFx,uint16_t * preset)399*bebae9c0SAndroid Build Coastguard Worker android::status_t android_prev_getPreset(const android::sp<android::AudioEffect>& pFx,
400*bebae9c0SAndroid Build Coastguard Worker uint16_t* preset) {
401*bebae9c0SAndroid Build Coastguard Worker return android_fx_getParam(pFx, REVERB_PARAM_PRESET, PRESETREVERB_PARAM_SIZE_MAX, preset,
402*bebae9c0SAndroid Build Coastguard Worker sizeof(uint16_t));
403*bebae9c0SAndroid Build Coastguard Worker }
404*bebae9c0SAndroid Build Coastguard Worker
405*bebae9c0SAndroid Build Coastguard Worker
406*bebae9c0SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
android_erev_init(IEnvironmentalReverb * ier)407*bebae9c0SAndroid Build Coastguard Worker void android_erev_init(IEnvironmentalReverb* ier) {
408*bebae9c0SAndroid Build Coastguard Worker SL_LOGV("session is implicitly %d (aux effect)", AUDIO_SESSION_OUTPUT_MIX);
409*bebae9c0SAndroid Build Coastguard Worker
410*bebae9c0SAndroid Build Coastguard Worker if (!android_fx_initEffectObj(AUDIO_SESSION_OUTPUT_MIX /*sessionId*/,
411*bebae9c0SAndroid Build Coastguard Worker ier->mEnvironmentalReverbEffect, &ier->mEnvironmentalReverbDescriptor.type)) {
412*bebae9c0SAndroid Build Coastguard Worker SL_LOGE("EnvironmentalReverb effect initialization failed");
413*bebae9c0SAndroid Build Coastguard Worker return;
414*bebae9c0SAndroid Build Coastguard Worker }
415*bebae9c0SAndroid Build Coastguard Worker
416*bebae9c0SAndroid Build Coastguard Worker // enable env reverb: other SL ES effects have an explicit SetEnabled() function, and the
417*bebae9c0SAndroid Build Coastguard Worker // preset reverb state depends on the selected preset.
418*bebae9c0SAndroid Build Coastguard Worker ier->mEnvironmentalReverbEffect->setEnabled(true);
419*bebae9c0SAndroid Build Coastguard Worker
420*bebae9c0SAndroid Build Coastguard Worker // initialize reverb properties
421*bebae9c0SAndroid Build Coastguard Worker SLEnvironmentalReverbSettings properties;
422*bebae9c0SAndroid Build Coastguard Worker if (android::NO_ERROR == android_erev_getParam(ier->mEnvironmentalReverbEffect,
423*bebae9c0SAndroid Build Coastguard Worker REVERB_PARAM_PROPERTIES, &properties)) {
424*bebae9c0SAndroid Build Coastguard Worker ier->mProperties = properties;
425*bebae9c0SAndroid Build Coastguard Worker }
426*bebae9c0SAndroid Build Coastguard Worker }
427*bebae9c0SAndroid Build Coastguard Worker
428*bebae9c0SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
android_erev_setParam(const android::sp<android::AudioEffect> & pFx,int32_t param,void * pValue)429*bebae9c0SAndroid Build Coastguard Worker android::status_t android_erev_setParam(const android::sp<android::AudioEffect>& pFx,
430*bebae9c0SAndroid Build Coastguard Worker int32_t param, void *pValue) {
431*bebae9c0SAndroid Build Coastguard Worker
432*bebae9c0SAndroid Build Coastguard Worker // given the size difference between a single reverb property and the whole set of reverb
433*bebae9c0SAndroid Build Coastguard Worker // properties, select which max size to pass to avoid allocating too much memory
434*bebae9c0SAndroid Build Coastguard Worker if (param == REVERB_PARAM_PROPERTIES) {
435*bebae9c0SAndroid Build Coastguard Worker return android_fx_setParam(pFx, param, ENVREVERB_PARAM_SIZE_MAX_ALL,
436*bebae9c0SAndroid Build Coastguard Worker pValue, erev_valueSize(param));
437*bebae9c0SAndroid Build Coastguard Worker } else {
438*bebae9c0SAndroid Build Coastguard Worker return android_fx_setParam(pFx, param, ENVREVERB_PARAM_SIZE_MAX_SINGLE,
439*bebae9c0SAndroid Build Coastguard Worker pValue, erev_valueSize(param));
440*bebae9c0SAndroid Build Coastguard Worker }
441*bebae9c0SAndroid Build Coastguard Worker }
442*bebae9c0SAndroid Build Coastguard Worker
443*bebae9c0SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
android_erev_getParam(const android::sp<android::AudioEffect> & pFx,int32_t param,void * pValue)444*bebae9c0SAndroid Build Coastguard Worker android::status_t android_erev_getParam(const android::sp<android::AudioEffect>& pFx,
445*bebae9c0SAndroid Build Coastguard Worker int32_t param, void *pValue) {
446*bebae9c0SAndroid Build Coastguard Worker
447*bebae9c0SAndroid Build Coastguard Worker // given the size difference between a single reverb property and the whole set of reverb
448*bebae9c0SAndroid Build Coastguard Worker // properties, select which max size to pass to avoid allocating too much memory
449*bebae9c0SAndroid Build Coastguard Worker if (param == REVERB_PARAM_PROPERTIES) {
450*bebae9c0SAndroid Build Coastguard Worker return android_fx_getParam(pFx, param, ENVREVERB_PARAM_SIZE_MAX_ALL,
451*bebae9c0SAndroid Build Coastguard Worker pValue, erev_valueSize(param));
452*bebae9c0SAndroid Build Coastguard Worker } else {
453*bebae9c0SAndroid Build Coastguard Worker return android_fx_getParam(pFx, param, ENVREVERB_PARAM_SIZE_MAX_SINGLE,
454*bebae9c0SAndroid Build Coastguard Worker pValue, erev_valueSize(param));
455*bebae9c0SAndroid Build Coastguard Worker }
456*bebae9c0SAndroid Build Coastguard Worker }
457*bebae9c0SAndroid Build Coastguard Worker
458*bebae9c0SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
android_aec_init(audio_session_t sessionId,IAndroidAcousticEchoCancellation * iaec)459*bebae9c0SAndroid Build Coastguard Worker void android_aec_init(audio_session_t sessionId, IAndroidAcousticEchoCancellation* iaec) {
460*bebae9c0SAndroid Build Coastguard Worker SL_LOGV("android_aec_init on session %d", sessionId);
461*bebae9c0SAndroid Build Coastguard Worker
462*bebae9c0SAndroid Build Coastguard Worker if (!android_fx_initEffectObj(sessionId, iaec->mAECEffect,
463*bebae9c0SAndroid Build Coastguard Worker &iaec->mAECDescriptor.type)) {
464*bebae9c0SAndroid Build Coastguard Worker SL_LOGE("AEC effect initialization failed");
465*bebae9c0SAndroid Build Coastguard Worker return;
466*bebae9c0SAndroid Build Coastguard Worker }
467*bebae9c0SAndroid Build Coastguard Worker }
468*bebae9c0SAndroid Build Coastguard Worker
469*bebae9c0SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
android_agc_init(audio_session_t sessionId,IAndroidAutomaticGainControl * iagc)470*bebae9c0SAndroid Build Coastguard Worker void android_agc_init(audio_session_t sessionId, IAndroidAutomaticGainControl* iagc) {
471*bebae9c0SAndroid Build Coastguard Worker SL_LOGV("android_agc_init on session %d", sessionId);
472*bebae9c0SAndroid Build Coastguard Worker
473*bebae9c0SAndroid Build Coastguard Worker if (!android_fx_initEffectObj(sessionId, iagc->mAGCEffect,
474*bebae9c0SAndroid Build Coastguard Worker &iagc->mAGCDescriptor.type)) {
475*bebae9c0SAndroid Build Coastguard Worker SL_LOGE("AGC effect initialization failed");
476*bebae9c0SAndroid Build Coastguard Worker return;
477*bebae9c0SAndroid Build Coastguard Worker }
478*bebae9c0SAndroid Build Coastguard Worker }
479*bebae9c0SAndroid Build Coastguard Worker
480*bebae9c0SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
android_ns_init(audio_session_t sessionId,IAndroidNoiseSuppression * ins)481*bebae9c0SAndroid Build Coastguard Worker void android_ns_init(audio_session_t sessionId, IAndroidNoiseSuppression* ins) {
482*bebae9c0SAndroid Build Coastguard Worker SL_LOGV("android_ns_init on session %d", sessionId);
483*bebae9c0SAndroid Build Coastguard Worker
484*bebae9c0SAndroid Build Coastguard Worker if (!android_fx_initEffectObj(sessionId, ins->mNSEffect,
485*bebae9c0SAndroid Build Coastguard Worker &ins->mNSDescriptor.type)) {
486*bebae9c0SAndroid Build Coastguard Worker SL_LOGE("NS effect initialization failed");
487*bebae9c0SAndroid Build Coastguard Worker return;
488*bebae9c0SAndroid Build Coastguard Worker }
489*bebae9c0SAndroid Build Coastguard Worker }
490*bebae9c0SAndroid Build Coastguard Worker
491*bebae9c0SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
492*bebae9c0SAndroid Build Coastguard Worker /**
493*bebae9c0SAndroid Build Coastguard Worker * pre-condition:
494*bebae9c0SAndroid Build Coastguard Worker * ap != NULL
495*bebae9c0SAndroid Build Coastguard Worker * for media players:
496*bebae9c0SAndroid Build Coastguard Worker * ap->mAPlayer != 0
497*bebae9c0SAndroid Build Coastguard Worker * ap->mTrackPlayer->mAudioTrack == 0
498*bebae9c0SAndroid Build Coastguard Worker * for buffer queue players:
499*bebae9c0SAndroid Build Coastguard Worker * ap->mAPlayer == 0
500*bebae9c0SAndroid Build Coastguard Worker * ap->mTrackPlayer->mAudioTrack != 0 is optional; if no track yet then the setting is deferred
501*bebae9c0SAndroid Build Coastguard Worker */
android_fxSend_attach(CAudioPlayer * ap,bool attach,const android::sp<android::AudioEffect> & pFx,SLmillibel sendLevel)502*bebae9c0SAndroid Build Coastguard Worker android::status_t android_fxSend_attach(CAudioPlayer* ap, bool attach,
503*bebae9c0SAndroid Build Coastguard Worker const android::sp<android::AudioEffect>& pFx, SLmillibel sendLevel) {
504*bebae9c0SAndroid Build Coastguard Worker
505*bebae9c0SAndroid Build Coastguard Worker if (pFx == 0) {
506*bebae9c0SAndroid Build Coastguard Worker return android::INVALID_OPERATION;
507*bebae9c0SAndroid Build Coastguard Worker }
508*bebae9c0SAndroid Build Coastguard Worker
509*bebae9c0SAndroid Build Coastguard Worker // There are 3 cases:
510*bebae9c0SAndroid Build Coastguard Worker // mAPlayer != 0 && mAudioTrack == 0 means playing decoded audio
511*bebae9c0SAndroid Build Coastguard Worker // mAPlayer == 0 && mAudioTrack != 0 means playing PCM audio
512*bebae9c0SAndroid Build Coastguard Worker // mAPlayer == 0 && mAudioTrack == 0 means player not fully configured yet
513*bebae9c0SAndroid Build Coastguard Worker // The asserts document and verify this.
514*bebae9c0SAndroid Build Coastguard Worker auto audioTrack = ap->mTrackPlayer->getAudioTrack();
515*bebae9c0SAndroid Build Coastguard Worker if (ap->mAPlayer != 0) {
516*bebae9c0SAndroid Build Coastguard Worker assert(audioTrack == 0);
517*bebae9c0SAndroid Build Coastguard Worker if (attach) {
518*bebae9c0SAndroid Build Coastguard Worker ap->mAPlayer->attachAuxEffect(pFx->id());
519*bebae9c0SAndroid Build Coastguard Worker ap->mAPlayer->setAuxEffectSendLevel( sles_to_android_amplification(sendLevel) );
520*bebae9c0SAndroid Build Coastguard Worker } else {
521*bebae9c0SAndroid Build Coastguard Worker ap->mAPlayer->attachAuxEffect(0);
522*bebae9c0SAndroid Build Coastguard Worker }
523*bebae9c0SAndroid Build Coastguard Worker return android::NO_ERROR;
524*bebae9c0SAndroid Build Coastguard Worker }
525*bebae9c0SAndroid Build Coastguard Worker
526*bebae9c0SAndroid Build Coastguard Worker if (audioTrack == 0) {
527*bebae9c0SAndroid Build Coastguard Worker // the player doesn't have an AudioTrack at the moment, so store this info to use it
528*bebae9c0SAndroid Build Coastguard Worker // when the AudioTrack becomes available
529*bebae9c0SAndroid Build Coastguard Worker if (attach) {
530*bebae9c0SAndroid Build Coastguard Worker ap->mAuxEffect = pFx;
531*bebae9c0SAndroid Build Coastguard Worker } else {
532*bebae9c0SAndroid Build Coastguard Worker ap->mAuxEffect.clear();
533*bebae9c0SAndroid Build Coastguard Worker }
534*bebae9c0SAndroid Build Coastguard Worker // we keep track of the send level, independently of the current audio player level
535*bebae9c0SAndroid Build Coastguard Worker ap->mAuxSendLevel = sendLevel - ap->mVolume.mLevel;
536*bebae9c0SAndroid Build Coastguard Worker return android::NO_ERROR;
537*bebae9c0SAndroid Build Coastguard Worker }
538*bebae9c0SAndroid Build Coastguard Worker
539*bebae9c0SAndroid Build Coastguard Worker if (attach) {
540*bebae9c0SAndroid Build Coastguard Worker android::status_t status = audioTrack->attachAuxEffect(pFx->id());
541*bebae9c0SAndroid Build Coastguard Worker //SL_LOGV("attachAuxEffect(%d) returned %d", pFx->id(), status);
542*bebae9c0SAndroid Build Coastguard Worker if (android::NO_ERROR == status) {
543*bebae9c0SAndroid Build Coastguard Worker status = audioTrack->setAuxEffectSendLevel(
544*bebae9c0SAndroid Build Coastguard Worker sles_to_android_amplification(sendLevel) );
545*bebae9c0SAndroid Build Coastguard Worker }
546*bebae9c0SAndroid Build Coastguard Worker return status;
547*bebae9c0SAndroid Build Coastguard Worker } else {
548*bebae9c0SAndroid Build Coastguard Worker return audioTrack->attachAuxEffect(0);
549*bebae9c0SAndroid Build Coastguard Worker }
550*bebae9c0SAndroid Build Coastguard Worker }
551*bebae9c0SAndroid Build Coastguard Worker
552*bebae9c0SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
553*bebae9c0SAndroid Build Coastguard Worker /**
554*bebae9c0SAndroid Build Coastguard Worker * pre-condition:
555*bebae9c0SAndroid Build Coastguard Worker * ap != NULL
556*bebae9c0SAndroid Build Coastguard Worker * ap->mOutputMix != NULL
557*bebae9c0SAndroid Build Coastguard Worker */
android_fxSend_attachToAux(CAudioPlayer * ap,SLInterfaceID pUuid,SLboolean attach,SLmillibel sendLevel)558*bebae9c0SAndroid Build Coastguard Worker SLresult android_fxSend_attachToAux(CAudioPlayer* ap, SLInterfaceID pUuid, SLboolean attach,
559*bebae9c0SAndroid Build Coastguard Worker SLmillibel sendLevel) {
560*bebae9c0SAndroid Build Coastguard Worker COutputMix *outputMix = CAudioPlayer_GetOutputMix(ap);
561*bebae9c0SAndroid Build Coastguard Worker ssize_t index = outputMix->mAndroidEffect.mEffects->indexOfKey(KEY_FROM_GUID(pUuid));
562*bebae9c0SAndroid Build Coastguard Worker
563*bebae9c0SAndroid Build Coastguard Worker if (0 > index) {
564*bebae9c0SAndroid Build Coastguard Worker SL_LOGE("invalid effect ID: no such effect attached to the OutputMix");
565*bebae9c0SAndroid Build Coastguard Worker return SL_RESULT_PARAMETER_INVALID;
566*bebae9c0SAndroid Build Coastguard Worker }
567*bebae9c0SAndroid Build Coastguard Worker
568*bebae9c0SAndroid Build Coastguard Worker android::sp<android::AudioEffect> pFx =
569*bebae9c0SAndroid Build Coastguard Worker outputMix->mAndroidEffect.mEffects->valueAt(index);
570*bebae9c0SAndroid Build Coastguard Worker if (pFx == 0) {
571*bebae9c0SAndroid Build Coastguard Worker return SL_RESULT_RESOURCE_ERROR;
572*bebae9c0SAndroid Build Coastguard Worker }
573*bebae9c0SAndroid Build Coastguard Worker if (android::NO_ERROR == android_fxSend_attach( ap, (bool) attach, pFx, sendLevel) ) {
574*bebae9c0SAndroid Build Coastguard Worker return SL_RESULT_SUCCESS;
575*bebae9c0SAndroid Build Coastguard Worker } else {
576*bebae9c0SAndroid Build Coastguard Worker return SL_RESULT_RESOURCE_ERROR;
577*bebae9c0SAndroid Build Coastguard Worker }
578*bebae9c0SAndroid Build Coastguard Worker
579*bebae9c0SAndroid Build Coastguard Worker }
580*bebae9c0SAndroid Build Coastguard Worker
581*bebae9c0SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
582*bebae9c0SAndroid Build Coastguard Worker /**
583*bebae9c0SAndroid Build Coastguard Worker * pre-condition:
584*bebae9c0SAndroid Build Coastguard Worker * ap != NULL
585*bebae9c0SAndroid Build Coastguard Worker * for media players:
586*bebae9c0SAndroid Build Coastguard Worker * ap->mAPlayer != 0
587*bebae9c0SAndroid Build Coastguard Worker * ap->mTrackPlayer->mAudioTrack == 0
588*bebae9c0SAndroid Build Coastguard Worker * for buffer queue players:
589*bebae9c0SAndroid Build Coastguard Worker * ap->mAPlayer == 0
590*bebae9c0SAndroid Build Coastguard Worker * ap->mTrackPlayer->mAudioTrack != 0 is optional; if no track yet then the setting is deferred
591*bebae9c0SAndroid Build Coastguard Worker */
android_fxSend_setSendLevel(CAudioPlayer * ap,SLmillibel sendLevel)592*bebae9c0SAndroid Build Coastguard Worker android::status_t android_fxSend_setSendLevel(CAudioPlayer* ap, SLmillibel sendLevel) {
593*bebae9c0SAndroid Build Coastguard Worker // we keep track of the send level, independently of the current audio player level
594*bebae9c0SAndroid Build Coastguard Worker ap->mAuxSendLevel = sendLevel - ap->mVolume.mLevel;
595*bebae9c0SAndroid Build Coastguard Worker
596*bebae9c0SAndroid Build Coastguard Worker auto audioTrack = ap->mTrackPlayer->getAudioTrack();
597*bebae9c0SAndroid Build Coastguard Worker if (ap->mAPlayer != 0) {
598*bebae9c0SAndroid Build Coastguard Worker assert(audioTrack == 0);
599*bebae9c0SAndroid Build Coastguard Worker ap->mAPlayer->setAuxEffectSendLevel( sles_to_android_amplification(sendLevel) );
600*bebae9c0SAndroid Build Coastguard Worker return android::NO_ERROR;
601*bebae9c0SAndroid Build Coastguard Worker }
602*bebae9c0SAndroid Build Coastguard Worker
603*bebae9c0SAndroid Build Coastguard Worker if (audioTrack == 0) {
604*bebae9c0SAndroid Build Coastguard Worker return android::NO_ERROR;
605*bebae9c0SAndroid Build Coastguard Worker }
606*bebae9c0SAndroid Build Coastguard Worker
607*bebae9c0SAndroid Build Coastguard Worker return audioTrack->setAuxEffectSendLevel(
608*bebae9c0SAndroid Build Coastguard Worker sles_to_android_amplification(sendLevel) );
609*bebae9c0SAndroid Build Coastguard Worker }
610*bebae9c0SAndroid Build Coastguard Worker
611*bebae9c0SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
android_fx_setParam(const android::sp<android::AudioEffect> & pFx,int32_t param,uint32_t paramSizeMax,void * pValue,uint32_t valueSize)612*bebae9c0SAndroid Build Coastguard Worker android::status_t android_fx_setParam(const android::sp<android::AudioEffect>& pFx,
613*bebae9c0SAndroid Build Coastguard Worker int32_t param, uint32_t paramSizeMax, void *pValue, uint32_t valueSize)
614*bebae9c0SAndroid Build Coastguard Worker {
615*bebae9c0SAndroid Build Coastguard Worker
616*bebae9c0SAndroid Build Coastguard Worker android::status_t status;
617*bebae9c0SAndroid Build Coastguard Worker uint32_t buf32[(paramSizeMax - 1) / sizeof(uint32_t) + 1];
618*bebae9c0SAndroid Build Coastguard Worker effect_param_t *p = (effect_param_t *)buf32;
619*bebae9c0SAndroid Build Coastguard Worker
620*bebae9c0SAndroid Build Coastguard Worker p->psize = sizeof(int32_t);
621*bebae9c0SAndroid Build Coastguard Worker *(int32_t *)p->data = param;
622*bebae9c0SAndroid Build Coastguard Worker p->vsize = valueSize;
623*bebae9c0SAndroid Build Coastguard Worker memcpy(p->data + p->psize, pValue, p->vsize);
624*bebae9c0SAndroid Build Coastguard Worker status = pFx->setParameter(p);
625*bebae9c0SAndroid Build Coastguard Worker if (android::NO_ERROR == status) {
626*bebae9c0SAndroid Build Coastguard Worker status = p->status;
627*bebae9c0SAndroid Build Coastguard Worker }
628*bebae9c0SAndroid Build Coastguard Worker return status;
629*bebae9c0SAndroid Build Coastguard Worker }
630*bebae9c0SAndroid Build Coastguard Worker
631*bebae9c0SAndroid Build Coastguard Worker
632*bebae9c0SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
android_fx_getParam(const android::sp<android::AudioEffect> & pFx,int32_t param,uint32_t paramSizeMax,void * pValue,uint32_t valueSize)633*bebae9c0SAndroid Build Coastguard Worker android::status_t android_fx_getParam(const android::sp<android::AudioEffect>& pFx,
634*bebae9c0SAndroid Build Coastguard Worker int32_t param, uint32_t paramSizeMax, void *pValue, uint32_t valueSize)
635*bebae9c0SAndroid Build Coastguard Worker {
636*bebae9c0SAndroid Build Coastguard Worker android::status_t status;
637*bebae9c0SAndroid Build Coastguard Worker uint32_t buf32[(paramSizeMax - 1) / sizeof(uint32_t) + 1];
638*bebae9c0SAndroid Build Coastguard Worker effect_param_t *p = (effect_param_t *)buf32;
639*bebae9c0SAndroid Build Coastguard Worker
640*bebae9c0SAndroid Build Coastguard Worker p->psize = sizeof(int32_t);
641*bebae9c0SAndroid Build Coastguard Worker *(int32_t *)p->data = param;
642*bebae9c0SAndroid Build Coastguard Worker p->vsize = valueSize;
643*bebae9c0SAndroid Build Coastguard Worker status = pFx->getParameter(p);
644*bebae9c0SAndroid Build Coastguard Worker if (android::NO_ERROR == status) {
645*bebae9c0SAndroid Build Coastguard Worker status = p->status;
646*bebae9c0SAndroid Build Coastguard Worker if (android::NO_ERROR == status) {
647*bebae9c0SAndroid Build Coastguard Worker memcpy(pValue, p->data + p->psize, p->vsize);
648*bebae9c0SAndroid Build Coastguard Worker }
649*bebae9c0SAndroid Build Coastguard Worker }
650*bebae9c0SAndroid Build Coastguard Worker
651*bebae9c0SAndroid Build Coastguard Worker return status;
652*bebae9c0SAndroid Build Coastguard Worker }
653*bebae9c0SAndroid Build Coastguard Worker
654*bebae9c0SAndroid Build Coastguard Worker
655*bebae9c0SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
android_fx_statusToResult(android::status_t status)656*bebae9c0SAndroid Build Coastguard Worker SLresult android_fx_statusToResult(android::status_t status) {
657*bebae9c0SAndroid Build Coastguard Worker
658*bebae9c0SAndroid Build Coastguard Worker if ((android::INVALID_OPERATION == status) || (android::DEAD_OBJECT == status)) {
659*bebae9c0SAndroid Build Coastguard Worker return SL_RESULT_CONTROL_LOST;
660*bebae9c0SAndroid Build Coastguard Worker } else {
661*bebae9c0SAndroid Build Coastguard Worker return SL_RESULT_SUCCESS;
662*bebae9c0SAndroid Build Coastguard Worker }
663*bebae9c0SAndroid Build Coastguard Worker }
664*bebae9c0SAndroid Build Coastguard Worker
665*bebae9c0SAndroid Build Coastguard Worker
666*bebae9c0SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
android_fx_initEffectObj(audio_session_t sessionId,android::sp<android::AudioEffect> & effect,const effect_uuid_t * type)667*bebae9c0SAndroid Build Coastguard Worker bool android_fx_initEffectObj(audio_session_t sessionId, android::sp<android::AudioEffect>& effect,
668*bebae9c0SAndroid Build Coastguard Worker const effect_uuid_t *type) {
669*bebae9c0SAndroid Build Coastguard Worker //SL_LOGV("android_fx_initEffectObj on session %d", sessionId);
670*bebae9c0SAndroid Build Coastguard Worker
671*bebae9c0SAndroid Build Coastguard Worker // TODO b/182392769: use attribution source util
672*bebae9c0SAndroid Build Coastguard Worker AttributionSourceState attributionSource;
673*bebae9c0SAndroid Build Coastguard Worker attributionSource.uid = VALUE_OR_FATAL(android::legacy2aidl_uid_t_int32_t(getuid()));
674*bebae9c0SAndroid Build Coastguard Worker attributionSource.pid = VALUE_OR_FATAL(android::legacy2aidl_pid_t_int32_t(getpid()));
675*bebae9c0SAndroid Build Coastguard Worker attributionSource.token = android::sp<android::BBinder>::make();
676*bebae9c0SAndroid Build Coastguard Worker
677*bebae9c0SAndroid Build Coastguard Worker effect = android::sp<android::AudioEffect>::make(attributionSource);
678*bebae9c0SAndroid Build Coastguard Worker
679*bebae9c0SAndroid Build Coastguard Worker effect->set(type, EFFECT_UUID_NULL,
680*bebae9c0SAndroid Build Coastguard Worker 0,// priority
681*bebae9c0SAndroid Build Coastguard Worker nullptr,// effect callback
682*bebae9c0SAndroid Build Coastguard Worker sessionId,// session ID
683*bebae9c0SAndroid Build Coastguard Worker 0); // output
684*bebae9c0SAndroid Build Coastguard Worker
685*bebae9c0SAndroid Build Coastguard Worker android::status_t status = effect->initCheck();
686*bebae9c0SAndroid Build Coastguard Worker if (android::NO_ERROR != status) {
687*bebae9c0SAndroid Build Coastguard Worker effect.clear();
688*bebae9c0SAndroid Build Coastguard Worker SL_LOGE("Effect initCheck() returned %d", status);
689*bebae9c0SAndroid Build Coastguard Worker return false;
690*bebae9c0SAndroid Build Coastguard Worker }
691*bebae9c0SAndroid Build Coastguard Worker
692*bebae9c0SAndroid Build Coastguard Worker return true;
693*bebae9c0SAndroid Build Coastguard Worker }
694*bebae9c0SAndroid Build Coastguard Worker
695*bebae9c0SAndroid Build Coastguard Worker
696*bebae9c0SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
android_fx_initEffectDescriptor(const SLInterfaceID effectId,effect_descriptor_t * fxDescrLoc)697*bebae9c0SAndroid Build Coastguard Worker bool android_fx_initEffectDescriptor(const SLInterfaceID effectId,
698*bebae9c0SAndroid Build Coastguard Worker effect_descriptor_t* fxDescrLoc) {
699*bebae9c0SAndroid Build Coastguard Worker uint32_t numEffects = 0;
700*bebae9c0SAndroid Build Coastguard Worker effect_descriptor_t descriptor;
701*bebae9c0SAndroid Build Coastguard Worker bool foundEffect = false;
702*bebae9c0SAndroid Build Coastguard Worker
703*bebae9c0SAndroid Build Coastguard Worker // any effects?
704*bebae9c0SAndroid Build Coastguard Worker android::status_t res = android::AudioEffect::queryNumberEffects(&numEffects);
705*bebae9c0SAndroid Build Coastguard Worker if (android::NO_ERROR != res) {
706*bebae9c0SAndroid Build Coastguard Worker SL_LOGE("unable to find any effects.");
707*bebae9c0SAndroid Build Coastguard Worker goto effectError;
708*bebae9c0SAndroid Build Coastguard Worker }
709*bebae9c0SAndroid Build Coastguard Worker
710*bebae9c0SAndroid Build Coastguard Worker // request effect in the effects?
711*bebae9c0SAndroid Build Coastguard Worker for (uint32_t i=0 ; i < numEffects ; i++) {
712*bebae9c0SAndroid Build Coastguard Worker res = android::AudioEffect::queryEffect(i, &descriptor);
713*bebae9c0SAndroid Build Coastguard Worker if ((android::NO_ERROR == res) &&
714*bebae9c0SAndroid Build Coastguard Worker (0 == memcmp(effectId, &descriptor.type, sizeof(effect_uuid_t)))) {
715*bebae9c0SAndroid Build Coastguard Worker SL_LOGV("found effect %d %s", i, descriptor.name);
716*bebae9c0SAndroid Build Coastguard Worker foundEffect = true;
717*bebae9c0SAndroid Build Coastguard Worker break;
718*bebae9c0SAndroid Build Coastguard Worker }
719*bebae9c0SAndroid Build Coastguard Worker }
720*bebae9c0SAndroid Build Coastguard Worker if (foundEffect) {
721*bebae9c0SAndroid Build Coastguard Worker memcpy(fxDescrLoc, &descriptor, sizeof(effect_descriptor_t));
722*bebae9c0SAndroid Build Coastguard Worker } else {
723*bebae9c0SAndroid Build Coastguard Worker SL_LOGE("unable to find an implementation for the requested effect.");
724*bebae9c0SAndroid Build Coastguard Worker goto effectError;
725*bebae9c0SAndroid Build Coastguard Worker }
726*bebae9c0SAndroid Build Coastguard Worker
727*bebae9c0SAndroid Build Coastguard Worker return true;
728*bebae9c0SAndroid Build Coastguard Worker
729*bebae9c0SAndroid Build Coastguard Worker effectError:
730*bebae9c0SAndroid Build Coastguard Worker // the requested effect wasn't found
731*bebae9c0SAndroid Build Coastguard Worker memset(fxDescrLoc, 0, sizeof(effect_descriptor_t));
732*bebae9c0SAndroid Build Coastguard Worker
733*bebae9c0SAndroid Build Coastguard Worker return false;
734*bebae9c0SAndroid Build Coastguard Worker }
735*bebae9c0SAndroid Build Coastguard Worker
736*bebae9c0SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
android_genericFx_queryNumEffects(SLuint32 * pNumSupportedAudioEffects)737*bebae9c0SAndroid Build Coastguard Worker SLresult android_genericFx_queryNumEffects(SLuint32 *pNumSupportedAudioEffects) {
738*bebae9c0SAndroid Build Coastguard Worker
739*bebae9c0SAndroid Build Coastguard Worker if (NULL == pNumSupportedAudioEffects) {
740*bebae9c0SAndroid Build Coastguard Worker return SL_RESULT_PARAMETER_INVALID;
741*bebae9c0SAndroid Build Coastguard Worker }
742*bebae9c0SAndroid Build Coastguard Worker
743*bebae9c0SAndroid Build Coastguard Worker android::status_t status =
744*bebae9c0SAndroid Build Coastguard Worker android::AudioEffect::queryNumberEffects((uint32_t*)pNumSupportedAudioEffects);
745*bebae9c0SAndroid Build Coastguard Worker
746*bebae9c0SAndroid Build Coastguard Worker SLresult result = SL_RESULT_SUCCESS;
747*bebae9c0SAndroid Build Coastguard Worker switch (status) {
748*bebae9c0SAndroid Build Coastguard Worker case android::NO_ERROR:
749*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_SUCCESS;
750*bebae9c0SAndroid Build Coastguard Worker break;
751*bebae9c0SAndroid Build Coastguard Worker case android::PERMISSION_DENIED:
752*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_PERMISSION_DENIED;
753*bebae9c0SAndroid Build Coastguard Worker break;
754*bebae9c0SAndroid Build Coastguard Worker case android::NO_INIT:
755*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_RESOURCE_ERROR;
756*bebae9c0SAndroid Build Coastguard Worker break;
757*bebae9c0SAndroid Build Coastguard Worker case android::BAD_VALUE:
758*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_PARAMETER_INVALID;
759*bebae9c0SAndroid Build Coastguard Worker break;
760*bebae9c0SAndroid Build Coastguard Worker default:
761*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_INTERNAL_ERROR;
762*bebae9c0SAndroid Build Coastguard Worker SL_LOGE("received invalid status %d from AudioEffect::queryNumberEffects()", status);
763*bebae9c0SAndroid Build Coastguard Worker break;
764*bebae9c0SAndroid Build Coastguard Worker }
765*bebae9c0SAndroid Build Coastguard Worker return result;
766*bebae9c0SAndroid Build Coastguard Worker }
767*bebae9c0SAndroid Build Coastguard Worker
768*bebae9c0SAndroid Build Coastguard Worker
769*bebae9c0SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
android_genericFx_queryEffect(SLuint32 index,effect_descriptor_t * pDescriptor)770*bebae9c0SAndroid Build Coastguard Worker SLresult android_genericFx_queryEffect(SLuint32 index, effect_descriptor_t* pDescriptor) {
771*bebae9c0SAndroid Build Coastguard Worker
772*bebae9c0SAndroid Build Coastguard Worker if (NULL == pDescriptor) {
773*bebae9c0SAndroid Build Coastguard Worker return SL_RESULT_PARAMETER_INVALID;
774*bebae9c0SAndroid Build Coastguard Worker }
775*bebae9c0SAndroid Build Coastguard Worker
776*bebae9c0SAndroid Build Coastguard Worker android::status_t status =
777*bebae9c0SAndroid Build Coastguard Worker android::AudioEffect::queryEffect(index, pDescriptor);
778*bebae9c0SAndroid Build Coastguard Worker
779*bebae9c0SAndroid Build Coastguard Worker SLresult result = SL_RESULT_SUCCESS;
780*bebae9c0SAndroid Build Coastguard Worker if (android::NO_ERROR != status) {
781*bebae9c0SAndroid Build Coastguard Worker switch (status) {
782*bebae9c0SAndroid Build Coastguard Worker case android::PERMISSION_DENIED:
783*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_PERMISSION_DENIED;
784*bebae9c0SAndroid Build Coastguard Worker break;
785*bebae9c0SAndroid Build Coastguard Worker case android::NO_INIT:
786*bebae9c0SAndroid Build Coastguard Worker case android::INVALID_OPERATION:
787*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_RESOURCE_ERROR;
788*bebae9c0SAndroid Build Coastguard Worker break;
789*bebae9c0SAndroid Build Coastguard Worker case android::BAD_VALUE:
790*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_PARAMETER_INVALID;
791*bebae9c0SAndroid Build Coastguard Worker break;
792*bebae9c0SAndroid Build Coastguard Worker default:
793*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_INTERNAL_ERROR;
794*bebae9c0SAndroid Build Coastguard Worker SL_LOGE("received invalid status %d from AudioEffect::queryNumberEffects()", status);
795*bebae9c0SAndroid Build Coastguard Worker break;
796*bebae9c0SAndroid Build Coastguard Worker }
797*bebae9c0SAndroid Build Coastguard Worker // an error occurred, reset the effect descriptor
798*bebae9c0SAndroid Build Coastguard Worker memset(pDescriptor, 0, sizeof(effect_descriptor_t));
799*bebae9c0SAndroid Build Coastguard Worker }
800*bebae9c0SAndroid Build Coastguard Worker
801*bebae9c0SAndroid Build Coastguard Worker return result;
802*bebae9c0SAndroid Build Coastguard Worker }
803*bebae9c0SAndroid Build Coastguard Worker
804*bebae9c0SAndroid Build Coastguard Worker
805*bebae9c0SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
android_genericFx_createEffect(IAndroidEffect * iae,SLInterfaceID pUuid,audio_session_t sessionId)806*bebae9c0SAndroid Build Coastguard Worker SLresult android_genericFx_createEffect(IAndroidEffect* iae, SLInterfaceID pUuid,
807*bebae9c0SAndroid Build Coastguard Worker audio_session_t sessionId)
808*bebae9c0SAndroid Build Coastguard Worker {
809*bebae9c0SAndroid Build Coastguard Worker
810*bebae9c0SAndroid Build Coastguard Worker SLresult result = SL_RESULT_SUCCESS;
811*bebae9c0SAndroid Build Coastguard Worker
812*bebae9c0SAndroid Build Coastguard Worker // does this effect already exist?
813*bebae9c0SAndroid Build Coastguard Worker if (0 <= iae->mEffects->indexOfKey(KEY_FROM_GUID(pUuid))) {
814*bebae9c0SAndroid Build Coastguard Worker return result;
815*bebae9c0SAndroid Build Coastguard Worker }
816*bebae9c0SAndroid Build Coastguard Worker
817*bebae9c0SAndroid Build Coastguard Worker // create new effect
818*bebae9c0SAndroid Build Coastguard Worker // TODO b/182392769: use attribution source util
819*bebae9c0SAndroid Build Coastguard Worker AttributionSourceState attributionSource;
820*bebae9c0SAndroid Build Coastguard Worker attributionSource.uid = VALUE_OR_FATAL(android::legacy2aidl_uid_t_int32_t(getuid()));
821*bebae9c0SAndroid Build Coastguard Worker attributionSource.pid = VALUE_OR_FATAL(android::legacy2aidl_pid_t_int32_t(getpid()));
822*bebae9c0SAndroid Build Coastguard Worker attributionSource.token = android::sp<android::BBinder>::make();
823*bebae9c0SAndroid Build Coastguard Worker
824*bebae9c0SAndroid Build Coastguard Worker const auto pFx = android::sp<android::AudioEffect>::make(attributionSource);
825*bebae9c0SAndroid Build Coastguard Worker
826*bebae9c0SAndroid Build Coastguard Worker pFx->set(NULL, // not using type to create effect
827*bebae9c0SAndroid Build Coastguard Worker (const effect_uuid_t*)pUuid,
828*bebae9c0SAndroid Build Coastguard Worker 0,// priority
829*bebae9c0SAndroid Build Coastguard Worker nullptr,// effect callback
830*bebae9c0SAndroid Build Coastguard Worker sessionId,
831*bebae9c0SAndroid Build Coastguard Worker 0 );// output
832*bebae9c0SAndroid Build Coastguard Worker
833*bebae9c0SAndroid Build Coastguard Worker // verify effect was successfully created before storing it
834*bebae9c0SAndroid Build Coastguard Worker android::status_t status = pFx->initCheck();
835*bebae9c0SAndroid Build Coastguard Worker if (android::NO_ERROR != status) {
836*bebae9c0SAndroid Build Coastguard Worker SL_LOGE("AudioEffect initCheck() returned %d, effect will not be stored", status);
837*bebae9c0SAndroid Build Coastguard Worker result = SL_RESULT_RESOURCE_ERROR;
838*bebae9c0SAndroid Build Coastguard Worker } else {
839*bebae9c0SAndroid Build Coastguard Worker SL_LOGV("AudioEffect successfully created on session %d", sessionId);
840*bebae9c0SAndroid Build Coastguard Worker iae->mEffects->add(KEY_FROM_GUID(pUuid), pFx);
841*bebae9c0SAndroid Build Coastguard Worker }
842*bebae9c0SAndroid Build Coastguard Worker
843*bebae9c0SAndroid Build Coastguard Worker return result;
844*bebae9c0SAndroid Build Coastguard Worker }
845*bebae9c0SAndroid Build Coastguard Worker
846*bebae9c0SAndroid Build Coastguard Worker
847*bebae9c0SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
android_genericFx_releaseEffect(IAndroidEffect * iae,SLInterfaceID pUuid)848*bebae9c0SAndroid Build Coastguard Worker SLresult android_genericFx_releaseEffect(IAndroidEffect* iae, SLInterfaceID pUuid) {
849*bebae9c0SAndroid Build Coastguard Worker
850*bebae9c0SAndroid Build Coastguard Worker ssize_t index = iae->mEffects->indexOfKey(KEY_FROM_GUID(pUuid));
851*bebae9c0SAndroid Build Coastguard Worker
852*bebae9c0SAndroid Build Coastguard Worker if (0 > index) {
853*bebae9c0SAndroid Build Coastguard Worker return SL_RESULT_PARAMETER_INVALID;
854*bebae9c0SAndroid Build Coastguard Worker } else {
855*bebae9c0SAndroid Build Coastguard Worker iae->mEffects->removeItem(index);
856*bebae9c0SAndroid Build Coastguard Worker return SL_RESULT_SUCCESS;
857*bebae9c0SAndroid Build Coastguard Worker }
858*bebae9c0SAndroid Build Coastguard Worker }
859*bebae9c0SAndroid Build Coastguard Worker
860*bebae9c0SAndroid Build Coastguard Worker
861*bebae9c0SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
android_genericFx_setEnabled(IAndroidEffect * iae,SLInterfaceID pUuid,SLboolean enabled)862*bebae9c0SAndroid Build Coastguard Worker SLresult android_genericFx_setEnabled(IAndroidEffect* iae, SLInterfaceID pUuid, SLboolean enabled) {
863*bebae9c0SAndroid Build Coastguard Worker
864*bebae9c0SAndroid Build Coastguard Worker ssize_t index = iae->mEffects->indexOfKey(KEY_FROM_GUID(pUuid));
865*bebae9c0SAndroid Build Coastguard Worker
866*bebae9c0SAndroid Build Coastguard Worker if (0 > index) {
867*bebae9c0SAndroid Build Coastguard Worker return SL_RESULT_PARAMETER_INVALID;
868*bebae9c0SAndroid Build Coastguard Worker } else {
869*bebae9c0SAndroid Build Coastguard Worker android::sp<android::AudioEffect> pFx = iae->mEffects->valueAt(index);
870*bebae9c0SAndroid Build Coastguard Worker android::status_t status = pFx->setEnabled(SL_BOOLEAN_TRUE == enabled);
871*bebae9c0SAndroid Build Coastguard Worker return android_fx_statusToResult(status);
872*bebae9c0SAndroid Build Coastguard Worker }
873*bebae9c0SAndroid Build Coastguard Worker }
874*bebae9c0SAndroid Build Coastguard Worker
875*bebae9c0SAndroid Build Coastguard Worker
876*bebae9c0SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
android_genericFx_isEnabled(IAndroidEffect * iae,SLInterfaceID pUuid,SLboolean * pEnabled)877*bebae9c0SAndroid Build Coastguard Worker SLresult android_genericFx_isEnabled(IAndroidEffect* iae, SLInterfaceID pUuid, SLboolean *pEnabled)
878*bebae9c0SAndroid Build Coastguard Worker {
879*bebae9c0SAndroid Build Coastguard Worker ssize_t index = iae->mEffects->indexOfKey(KEY_FROM_GUID(pUuid));
880*bebae9c0SAndroid Build Coastguard Worker
881*bebae9c0SAndroid Build Coastguard Worker if (0 > index) {
882*bebae9c0SAndroid Build Coastguard Worker return SL_RESULT_PARAMETER_INVALID;
883*bebae9c0SAndroid Build Coastguard Worker } else {
884*bebae9c0SAndroid Build Coastguard Worker android::sp<android::AudioEffect> pFx = iae->mEffects->valueAt(index);
885*bebae9c0SAndroid Build Coastguard Worker *pEnabled = (SLboolean) pFx->getEnabled();
886*bebae9c0SAndroid Build Coastguard Worker return SL_RESULT_SUCCESS;
887*bebae9c0SAndroid Build Coastguard Worker }
888*bebae9c0SAndroid Build Coastguard Worker }
889*bebae9c0SAndroid Build Coastguard Worker
890*bebae9c0SAndroid Build Coastguard Worker
891*bebae9c0SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
android_genericFx_sendCommand(IAndroidEffect * iae,SLInterfaceID pUuid,SLuint32 command,SLuint32 commandSize,void * pCommandData,SLuint32 * replySize,void * pReplyData)892*bebae9c0SAndroid Build Coastguard Worker SLresult android_genericFx_sendCommand(IAndroidEffect* iae, SLInterfaceID pUuid,
893*bebae9c0SAndroid Build Coastguard Worker SLuint32 command, SLuint32 commandSize, void* pCommandData,
894*bebae9c0SAndroid Build Coastguard Worker SLuint32 *replySize, void *pReplyData) {
895*bebae9c0SAndroid Build Coastguard Worker
896*bebae9c0SAndroid Build Coastguard Worker ssize_t index = iae->mEffects->indexOfKey(KEY_FROM_GUID(pUuid));
897*bebae9c0SAndroid Build Coastguard Worker
898*bebae9c0SAndroid Build Coastguard Worker if (0 > index) {
899*bebae9c0SAndroid Build Coastguard Worker return SL_RESULT_PARAMETER_INVALID;
900*bebae9c0SAndroid Build Coastguard Worker } else {
901*bebae9c0SAndroid Build Coastguard Worker android::sp<android::AudioEffect> pFx = iae->mEffects->valueAt(index);
902*bebae9c0SAndroid Build Coastguard Worker android::status_t status = pFx->command(
903*bebae9c0SAndroid Build Coastguard Worker (uint32_t) command,
904*bebae9c0SAndroid Build Coastguard Worker (uint32_t) commandSize,
905*bebae9c0SAndroid Build Coastguard Worker pCommandData,
906*bebae9c0SAndroid Build Coastguard Worker (uint32_t*)replySize,
907*bebae9c0SAndroid Build Coastguard Worker pReplyData);
908*bebae9c0SAndroid Build Coastguard Worker if (android::BAD_VALUE == status) {
909*bebae9c0SAndroid Build Coastguard Worker return SL_RESULT_PARAMETER_INVALID;
910*bebae9c0SAndroid Build Coastguard Worker } else {
911*bebae9c0SAndroid Build Coastguard Worker return SL_RESULT_SUCCESS;
912*bebae9c0SAndroid Build Coastguard Worker }
913*bebae9c0SAndroid Build Coastguard Worker }
914*bebae9c0SAndroid Build Coastguard Worker }
915*bebae9c0SAndroid Build Coastguard Worker
916*bebae9c0SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
917*bebae9c0SAndroid Build Coastguard Worker /**
918*bebae9c0SAndroid Build Coastguard Worker * returns true if the given effect id is present in the AndroidEffect interface
919*bebae9c0SAndroid Build Coastguard Worker */
android_genericFx_hasEffect(IAndroidEffect * iae,SLInterfaceID pUuid)920*bebae9c0SAndroid Build Coastguard Worker bool android_genericFx_hasEffect(IAndroidEffect* iae, SLInterfaceID pUuid) {
921*bebae9c0SAndroid Build Coastguard Worker return( 0 <= iae->mEffects->indexOfKey(KEY_FROM_GUID(pUuid)));
922*bebae9c0SAndroid Build Coastguard Worker }
923*bebae9c0SAndroid Build Coastguard Worker
924*bebae9c0SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
925*bebae9c0SAndroid Build Coastguard Worker static const int AEC_PARAM_SIZE_MAX = sizeof(effect_param_t) + (2 * sizeof(int32_t));
926*bebae9c0SAndroid Build Coastguard Worker /**
927*bebae9c0SAndroid Build Coastguard Worker * returns the size in bytes of the value of each acoustic echo cancellation parameter
928*bebae9c0SAndroid Build Coastguard Worker */
aec_valueSize(int32_t param)929*bebae9c0SAndroid Build Coastguard Worker uint32_t aec_valueSize(int32_t param) {
930*bebae9c0SAndroid Build Coastguard Worker uint32_t size;
931*bebae9c0SAndroid Build Coastguard Worker switch (param) {
932*bebae9c0SAndroid Build Coastguard Worker case AEC_PARAM_ECHO_DELAY:
933*bebae9c0SAndroid Build Coastguard Worker size = sizeof(int32_t);
934*bebae9c0SAndroid Build Coastguard Worker break;
935*bebae9c0SAndroid Build Coastguard Worker default:
936*bebae9c0SAndroid Build Coastguard Worker size = sizeof(int32_t);
937*bebae9c0SAndroid Build Coastguard Worker SL_LOGE("Trying to access an unknown Acoustic Echo Cancellation parameter %d", param);
938*bebae9c0SAndroid Build Coastguard Worker break;
939*bebae9c0SAndroid Build Coastguard Worker }
940*bebae9c0SAndroid Build Coastguard Worker
941*bebae9c0SAndroid Build Coastguard Worker return size;
942*bebae9c0SAndroid Build Coastguard Worker }
943*bebae9c0SAndroid Build Coastguard Worker
android_aec_setParam(const android::sp<android::AudioEffect> & pFx,int32_t param,void * pValue)944*bebae9c0SAndroid Build Coastguard Worker android::status_t android_aec_setParam(const android::sp<android::AudioEffect>& pFx,
945*bebae9c0SAndroid Build Coastguard Worker int32_t param, void *pValue) {
946*bebae9c0SAndroid Build Coastguard Worker return android_fx_setParam(pFx, param, AEC_PARAM_SIZE_MAX,
947*bebae9c0SAndroid Build Coastguard Worker pValue, aec_valueSize(param));
948*bebae9c0SAndroid Build Coastguard Worker }
949*bebae9c0SAndroid Build Coastguard Worker
android_aec_getParam(const android::sp<android::AudioEffect> & pFx,int32_t param,void * pValue)950*bebae9c0SAndroid Build Coastguard Worker android::status_t android_aec_getParam(const android::sp<android::AudioEffect>& pFx,
951*bebae9c0SAndroid Build Coastguard Worker int32_t param, void *pValue) {
952*bebae9c0SAndroid Build Coastguard Worker return android_fx_getParam(pFx, param, AEC_PARAM_SIZE_MAX,
953*bebae9c0SAndroid Build Coastguard Worker pValue, aec_valueSize(param));
954*bebae9c0SAndroid Build Coastguard Worker }
955*bebae9c0SAndroid Build Coastguard Worker
956*bebae9c0SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
957*bebae9c0SAndroid Build Coastguard Worker static const int AGC_PARAM_SIZE_MAX = sizeof(effect_param_t) + (2 * sizeof(int16_t)) + sizeof(bool);
958*bebae9c0SAndroid Build Coastguard Worker /**
959*bebae9c0SAndroid Build Coastguard Worker * returns the size in bytes of the value of each automatic gain control parameter
960*bebae9c0SAndroid Build Coastguard Worker */
agc_valueSize(int32_t param)961*bebae9c0SAndroid Build Coastguard Worker uint32_t agc_valueSize(int32_t param) {
962*bebae9c0SAndroid Build Coastguard Worker uint32_t size;
963*bebae9c0SAndroid Build Coastguard Worker switch (param) {
964*bebae9c0SAndroid Build Coastguard Worker case AGC_PARAM_TARGET_LEVEL:
965*bebae9c0SAndroid Build Coastguard Worker case AGC_PARAM_COMP_GAIN:
966*bebae9c0SAndroid Build Coastguard Worker size = sizeof(int16_t);
967*bebae9c0SAndroid Build Coastguard Worker break;
968*bebae9c0SAndroid Build Coastguard Worker case AGC_PARAM_LIMITER_ENA:
969*bebae9c0SAndroid Build Coastguard Worker size = sizeof(bool);
970*bebae9c0SAndroid Build Coastguard Worker break;
971*bebae9c0SAndroid Build Coastguard Worker default:
972*bebae9c0SAndroid Build Coastguard Worker size = sizeof(int32_t);
973*bebae9c0SAndroid Build Coastguard Worker SL_LOGE("Trying to access an unknown Automatic Gain Control parameter %d", param);
974*bebae9c0SAndroid Build Coastguard Worker break;
975*bebae9c0SAndroid Build Coastguard Worker }
976*bebae9c0SAndroid Build Coastguard Worker
977*bebae9c0SAndroid Build Coastguard Worker return size;
978*bebae9c0SAndroid Build Coastguard Worker }
979*bebae9c0SAndroid Build Coastguard Worker
android_agc_setParam(const android::sp<android::AudioEffect> & pFx,int32_t param,void * pValue)980*bebae9c0SAndroid Build Coastguard Worker android::status_t android_agc_setParam(const android::sp<android::AudioEffect>& pFx,
981*bebae9c0SAndroid Build Coastguard Worker int32_t param, void *pValue) {
982*bebae9c0SAndroid Build Coastguard Worker return android_fx_setParam(pFx, param, AGC_PARAM_SIZE_MAX,
983*bebae9c0SAndroid Build Coastguard Worker pValue, agc_valueSize(param));
984*bebae9c0SAndroid Build Coastguard Worker }
985*bebae9c0SAndroid Build Coastguard Worker
android_agc_getParam(const android::sp<android::AudioEffect> & pFx,int32_t param,void * pValue)986*bebae9c0SAndroid Build Coastguard Worker android::status_t android_agc_getParam(const android::sp<android::AudioEffect>& pFx,
987*bebae9c0SAndroid Build Coastguard Worker int32_t param, void *pValue) {
988*bebae9c0SAndroid Build Coastguard Worker return android_fx_getParam(pFx, param, AGC_PARAM_SIZE_MAX,
989*bebae9c0SAndroid Build Coastguard Worker pValue, agc_valueSize(param));
990*bebae9c0SAndroid Build Coastguard Worker }
991*bebae9c0SAndroid Build Coastguard Worker
992*bebae9c0SAndroid Build Coastguard Worker //-----------------------------------------------------------------------------
993*bebae9c0SAndroid Build Coastguard Worker static const int NS_PARAM_SIZE_MAX = sizeof(effect_param_t) + 2 * sizeof(int32_t);
994*bebae9c0SAndroid Build Coastguard Worker /**
995*bebae9c0SAndroid Build Coastguard Worker * returns the size in bytes of the value of each noise suppression parameter
996*bebae9c0SAndroid Build Coastguard Worker */
ns_valueSize(int32_t param)997*bebae9c0SAndroid Build Coastguard Worker uint32_t ns_valueSize(int32_t param) {
998*bebae9c0SAndroid Build Coastguard Worker uint32_t size;
999*bebae9c0SAndroid Build Coastguard Worker switch (param) {
1000*bebae9c0SAndroid Build Coastguard Worker case NS_PARAM_LEVEL:
1001*bebae9c0SAndroid Build Coastguard Worker size = sizeof(int32_t);
1002*bebae9c0SAndroid Build Coastguard Worker break;
1003*bebae9c0SAndroid Build Coastguard Worker default:
1004*bebae9c0SAndroid Build Coastguard Worker size = sizeof(int32_t);
1005*bebae9c0SAndroid Build Coastguard Worker SL_LOGE("Trying to access an unknown Noise suppression parameter %d", param);
1006*bebae9c0SAndroid Build Coastguard Worker break;
1007*bebae9c0SAndroid Build Coastguard Worker }
1008*bebae9c0SAndroid Build Coastguard Worker
1009*bebae9c0SAndroid Build Coastguard Worker return size;
1010*bebae9c0SAndroid Build Coastguard Worker }
1011*bebae9c0SAndroid Build Coastguard Worker
android_ns_setParam(const android::sp<android::AudioEffect> & pFx,int32_t param,void * pValue)1012*bebae9c0SAndroid Build Coastguard Worker android::status_t android_ns_setParam(const android::sp<android::AudioEffect>& pFx,
1013*bebae9c0SAndroid Build Coastguard Worker int32_t param, void *pValue)
1014*bebae9c0SAndroid Build Coastguard Worker {
1015*bebae9c0SAndroid Build Coastguard Worker return android_fx_setParam(pFx, param, NS_PARAM_SIZE_MAX,
1016*bebae9c0SAndroid Build Coastguard Worker pValue, ns_valueSize(param));
1017*bebae9c0SAndroid Build Coastguard Worker }
1018*bebae9c0SAndroid Build Coastguard Worker
android_ns_getParam(const android::sp<android::AudioEffect> & pFx,int32_t param,void * pValue)1019*bebae9c0SAndroid Build Coastguard Worker android::status_t android_ns_getParam(const android::sp<android::AudioEffect>& pFx,
1020*bebae9c0SAndroid Build Coastguard Worker int32_t param, void *pValue)
1021*bebae9c0SAndroid Build Coastguard Worker {
1022*bebae9c0SAndroid Build Coastguard Worker return android_fx_getParam(pFx, param, NS_PARAM_SIZE_MAX,
1023*bebae9c0SAndroid Build Coastguard Worker pValue, ns_valueSize(param));
1024*bebae9c0SAndroid Build Coastguard Worker }
1025