blob: 8e9176400368eed2d0a53d8dc8571adf45696859 [file] [log] [blame]
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -08001/*
Aditya Bavanari3db4a292017-10-04 20:59:41 +05302 * Copyright (c) 2013-2015, 2017-2018, The Linux Foundation. All rights reserved.
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -08003 * Not a Contribution.
4 *
5 * Copyright (C) 2013 The Android Open Source Project
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 */
19
Dhananjay Kumar5f15ff92014-05-19 16:45:08 +080020#define LOG_TAG "offload_effect_bass"
Subhash Chandra Bose Naripeddye40a7cd2014-06-03 19:42:41 -070021//#define LOG_NDEBUG 0
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -080022
23#include <cutils/list.h>
24#include <cutils/log.h>
Dhananjay Kumar5f15ff92014-05-19 16:45:08 +080025#include <cutils/properties.h>
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -080026#include <tinyalsa/asoundlib.h>
Subhash Chandra Bose Naripeddy090a2aa2014-01-30 14:03:12 -080027#include <sound/audio_effects.h>
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -080028#include <audio_effects/effect_bassboost.h>
Dhananjay Kumar5f15ff92014-05-19 16:45:08 +080029#include <stdlib.h>
30#include <dlfcn.h>
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -080031
32#include "effect_api.h"
33#include "bass_boost.h"
34
35/* Offload bassboost UUID: 2c4a8c24-1581-487f-94f6-0002a5d5c51b */
36const effect_descriptor_t bassboost_descriptor = {
37 {0x0634f220, 0xddd4, 0x11db, 0xa0fc, { 0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b }},
38 {0x2c4a8c24, 0x1581, 0x487f, 0x94f6, { 0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}}, // uuid
39 EFFECT_CONTROL_API_VERSION,
Weiyin Jiang90ac1ea2017-04-13 14:18:23 +080040 (EFFECT_FLAG_TYPE_INSERT | EFFECT_FLAG_DEVICE_IND | EFFECT_FLAG_HW_ACC_TUNNEL |
41 EFFECT_FLAG_VOLUME_CTRL),
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -080042 0, /* TODO */
43 1,
44 "MSM offload bassboost",
45 "The Android Open Source Project",
46};
47
Dhananjay Kumar5f15ff92014-05-19 16:45:08 +080048#define LIB_ACDB_LOADER "libacdbloader.so"
49#define PBE_CONF_APP_ID 0x00011134
50
Vatsal Buchaa1358992018-11-14 13:25:08 +053051#ifdef AUDIO_FEATURE_ENABLED_GCOV
52extern void __gcov_flush();
53static void enable_gcov()
54{
55 __gcov_flush();
56}
57#else
58static void enable_gcov()
59{
60}
61#endif
62
Dhananjay Kumar5f15ff92014-05-19 16:45:08 +080063enum {
64 AUDIO_DEVICE_CAL_TYPE = 0,
65 AUDIO_STREAM_CAL_TYPE,
66};
67
68typedef struct acdb_audio_cal_cfg {
69 uint32_t persist;
70 uint32_t snd_dev_id;
71 uint32_t dev_id;
72 int32_t acdb_dev_id;
73 uint32_t app_type;
74 uint32_t topo_id;
75 uint32_t sampling_rate;
76 uint32_t cal_type;
77 uint32_t module_id;
Aditya Bavanari3db4a292017-10-04 20:59:41 +053078#ifdef INSTANCE_ID_ENABLED
79 uint16_t instance_id;
80 uint16_t reserved;
81#endif
Dhananjay Kumar5f15ff92014-05-19 16:45:08 +080082 uint32_t param_id;
83} acdb_audio_cal_cfg_t;
84
85typedef int (*acdb_get_audio_cal_t) (void *, void *, uint32_t*);
86static int pbe_load_config(struct pbe_params *params);
87
88/*
89 * Bass operations
90 */
91int bass_get_parameter(effect_context_t *context, effect_param_t *p,
92 uint32_t *size)
93{
94 bass_context_t *bass_ctxt = (bass_context_t *)context;
95 int voffset = ((p->psize - 1) / sizeof(int32_t) + 1) * sizeof(int32_t);
96 int32_t *param_tmp = (int32_t *)p->data;
97 int32_t param = *param_tmp++;
98 void *value = p->data + voffset;
99 int i;
100
101 ALOGV("%s", __func__);
102
103 p->status = 0;
104
105 switch (param) {
106 case BASSBOOST_PARAM_STRENGTH_SUPPORTED:
107 if (p->vsize < sizeof(uint32_t))
108 p->status = -EINVAL;
109 p->vsize = sizeof(uint32_t);
110 break;
111 case BASSBOOST_PARAM_STRENGTH:
112 if (p->vsize < sizeof(int16_t))
113 p->status = -EINVAL;
114 p->vsize = sizeof(int16_t);
115 break;
116 default:
117 p->status = -EINVAL;
118 }
119
120 *size = sizeof(effect_param_t) + voffset + p->vsize;
121
122 if (p->status != 0)
123 return 0;
124
125 switch (param) {
126 case BASSBOOST_PARAM_STRENGTH_SUPPORTED:
127 ALOGV("%s: BASSBOOST_PARAM_STRENGTH_SUPPORTED", __func__);
128 if (bass_ctxt->active_index == BASS_BOOST)
129 *(uint32_t *)value = 1;
130 else
131 *(uint32_t *)value = 0;
132 break;
133
134 case BASSBOOST_PARAM_STRENGTH:
135 ALOGV("%s: BASSBOOST_PARAM_STRENGTH", __func__);
136 if (bass_ctxt->active_index == BASS_BOOST)
137 *(int16_t *)value = bassboost_get_strength(&(bass_ctxt->bassboost_ctxt));
138 else
139 *(int16_t *)value = 0;
140 break;
141
142 default:
143 p->status = -EINVAL;
144 break;
145 }
146
147 return 0;
148}
149
150int bass_set_parameter(effect_context_t *context, effect_param_t *p,
151 uint32_t size __unused)
152{
153 bass_context_t *bass_ctxt = (bass_context_t *)context;
154 int voffset = ((p->psize - 1) / sizeof(int32_t) + 1) * sizeof(int32_t);
155 void *value = p->data + voffset;
156 int32_t *param_tmp = (int32_t *)p->data;
157 int32_t param = *param_tmp++;
158 uint32_t strength;
159
160 ALOGV("%s", __func__);
161
162 p->status = 0;
163
164 switch (param) {
165 case BASSBOOST_PARAM_STRENGTH:
166 ALOGV("%s BASSBOOST_PARAM_STRENGTH", __func__);
167 if (bass_ctxt->active_index == BASS_BOOST) {
168 strength = (uint32_t)(*(int16_t *)value);
169 bassboost_set_strength(&(bass_ctxt->bassboost_ctxt), strength);
170 } else {
171 /* stength supported only for BB and not for PBE, but do not
172 * return error for unsupported case, as it fails cts test
173 */
174 ALOGD("%s ignore set strength, index %d",
175 __func__, bass_ctxt->active_index);
176 break;
177 }
178 break;
179 default:
180 p->status = -EINVAL;
181 break;
182 }
183
184 return 0;
185}
186
187int bass_set_device(effect_context_t *context, uint32_t device)
188{
189 bass_context_t *bass_ctxt = (bass_context_t *)context;
190
191 if (device == AUDIO_DEVICE_OUT_SPEAKER) {
192 bass_ctxt->active_index = BASS_PBE;
193 ALOGV("%s: set PBE mode, device: %x", __func__, device);
194 } else if (device == AUDIO_DEVICE_OUT_WIRED_HEADSET ||
195 device == AUDIO_DEVICE_OUT_WIRED_HEADPHONE ||
Dhananjay Kumar84137882015-06-05 20:34:50 +0530196 device == AUDIO_DEVICE_OUT_BLUETOOTH_A2DP ||
Dhananjay Kumar5f15ff92014-05-19 16:45:08 +0800197 device == AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES) {
198 ALOGV("%s: set BB mode, device: %x", __func__, device);
199 bass_ctxt->active_index = BASS_BOOST;
200 } else {
201 ALOGI("%s: disabled by device: %x", __func__, device);
202 bass_ctxt->active_index = BASS_INVALID;
203 }
204
205 bassboost_set_device((effect_context_t *)&(bass_ctxt->bassboost_ctxt), device);
206 pbe_set_device((effect_context_t *)&(bass_ctxt->pbe_ctxt), device);
207
208 return 0;
209}
210
211int bass_reset(effect_context_t *context)
212{
213 bass_context_t *bass_ctxt = (bass_context_t *)context;
214
215 bassboost_reset((effect_context_t *)&(bass_ctxt->bassboost_ctxt));
216 pbe_reset((effect_context_t *)&(bass_ctxt->pbe_ctxt));
217
218 return 0;
219}
220
221int bass_init(effect_context_t *context)
222{
223 bass_context_t *bass_ctxt = (bass_context_t *)context;
224
225 // convery i/o channel config to sub effects
226 bass_ctxt->bassboost_ctxt.common.config = context->config;
227 bass_ctxt->pbe_ctxt.common.config = context->config;
228
229 ALOGV("%s", __func__);
230
231 bass_ctxt->active_index = BASS_BOOST;
232
233
234 bassboost_init((effect_context_t *)&(bass_ctxt->bassboost_ctxt));
235 pbe_init((effect_context_t *)&(bass_ctxt->pbe_ctxt));
Vatsal Buchaa1358992018-11-14 13:25:08 +0530236 enable_gcov();
Dhananjay Kumar5f15ff92014-05-19 16:45:08 +0800237 return 0;
238}
239
240int bass_enable(effect_context_t *context)
241{
242 bass_context_t *bass_ctxt = (bass_context_t *)context;
243
244 ALOGV("%s", __func__);
245
246 bassboost_enable((effect_context_t *)&(bass_ctxt->bassboost_ctxt));
247 pbe_enable((effect_context_t *)&(bass_ctxt->pbe_ctxt));
248
249 return 0;
250}
251
252int bass_disable(effect_context_t *context)
253{
254 bass_context_t *bass_ctxt = (bass_context_t *)context;
255
256 ALOGV("%s", __func__);
257
258 bassboost_disable((effect_context_t *)&(bass_ctxt->bassboost_ctxt));
259 pbe_disable((effect_context_t *)&(bass_ctxt->pbe_ctxt));
260
261 return 0;
262}
263
264int bass_start(effect_context_t *context, output_context_t *output)
265{
266 bass_context_t *bass_ctxt = (bass_context_t *)context;
267
268 ALOGV("%s", __func__);
269
270 bassboost_start((effect_context_t *)&(bass_ctxt->bassboost_ctxt), output);
271 pbe_start((effect_context_t *)&(bass_ctxt->pbe_ctxt), output);
272
273 return 0;
274}
275
276int bass_stop(effect_context_t *context, output_context_t *output)
277{
278 bass_context_t *bass_ctxt = (bass_context_t *)context;
279
280 ALOGV("%s", __func__);
281
282 bassboost_stop((effect_context_t *)&(bass_ctxt->bassboost_ctxt), output);
283 pbe_stop((effect_context_t *)&(bass_ctxt->pbe_ctxt), output);
284
285 return 0;
286}
287
288int bass_set_mode(effect_context_t *context, int32_t hw_acc_fd)
289{
290 bass_context_t *bass_ctxt = (bass_context_t *)context;
291
292 ALOGV("%s", __func__);
293
294 bassboost_set_mode((effect_context_t *)&(bass_ctxt->bassboost_ctxt), hw_acc_fd);
295 pbe_set_mode((effect_context_t *)&(bass_ctxt->pbe_ctxt), hw_acc_fd);
296
297 return 0;
298}
299
300#undef LOG_TAG
301#define LOG_TAG "offload_effect_bb"
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -0800302/*
303 * Bassboost operations
304 */
305
306int bassboost_get_strength(bassboost_context_t *context)
307{
Dhananjay Kumar574f3922014-03-25 17:41:44 +0530308 ALOGV("%s: ctxt %p, strength: %d", __func__,
309 context, context->strength);
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -0800310 return context->strength;
311}
312
313int bassboost_set_strength(bassboost_context_t *context, uint32_t strength)
314{
Dhananjay Kumar574f3922014-03-25 17:41:44 +0530315 ALOGV("%s: ctxt %p, strength: %d", __func__, context, strength);
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -0800316 context->strength = strength;
317
318 offload_bassboost_set_strength(&(context->offload_bass), strength);
319 if (context->ctl)
Subhash Chandra Bose Naripeddye40a7cd2014-06-03 19:42:41 -0700320 offload_bassboost_send_params(context->ctl, &context->offload_bass,
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -0800321 OFFLOAD_SEND_BASSBOOST_ENABLE_FLAG |
322 OFFLOAD_SEND_BASSBOOST_STRENGTH);
Subhash Chandra Bose Naripeddye40a7cd2014-06-03 19:42:41 -0700323 if (context->hw_acc_fd > 0)
324 hw_acc_bassboost_send_params(context->hw_acc_fd,
325 &context->offload_bass,
326 OFFLOAD_SEND_BASSBOOST_ENABLE_FLAG |
327 OFFLOAD_SEND_BASSBOOST_STRENGTH);
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -0800328 return 0;
329}
330
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -0800331int bassboost_set_device(effect_context_t *context, uint32_t device)
332{
333 bassboost_context_t *bass_ctxt = (bassboost_context_t *)context;
334
Dhananjay Kumar574f3922014-03-25 17:41:44 +0530335 ALOGV("%s: ctxt %p, device 0x%x", __func__, bass_ctxt, device);
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -0800336 bass_ctxt->device = device;
Dhananjay Kumar5f15ff92014-05-19 16:45:08 +0800337 if (device == AUDIO_DEVICE_OUT_WIRED_HEADSET ||
338 device == AUDIO_DEVICE_OUT_WIRED_HEADPHONE ||
Dhananjay Kumar84137882015-06-05 20:34:50 +0530339 device == AUDIO_DEVICE_OUT_BLUETOOTH_A2DP ||
Dhananjay Kumar5f15ff92014-05-19 16:45:08 +0800340 device == AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES) {
341 if (bass_ctxt->temp_disabled) {
342 if (effect_is_active(&bass_ctxt->common)) {
343 offload_bassboost_set_enable_flag(&(bass_ctxt->offload_bass), true);
344 if (bass_ctxt->ctl)
345 offload_bassboost_send_params(bass_ctxt->ctl,
346 &bass_ctxt->offload_bass,
347 OFFLOAD_SEND_BASSBOOST_ENABLE_FLAG);
348 if (bass_ctxt->hw_acc_fd > 0)
349 hw_acc_bassboost_send_params(bass_ctxt->hw_acc_fd,
350 &bass_ctxt->offload_bass,
351 OFFLOAD_SEND_BASSBOOST_ENABLE_FLAG);
352 }
353 bass_ctxt->temp_disabled = false;
354 }
355 } else {
wjiang50b81f42014-08-06 08:03:14 +0800356 if (!bass_ctxt->temp_disabled) {
357 if (effect_is_active(&bass_ctxt->common)) {
358 offload_bassboost_set_enable_flag(&(bass_ctxt->offload_bass), false);
359 if (bass_ctxt->ctl)
360 offload_bassboost_send_params(bass_ctxt->ctl,
Subhash Chandra Bose Naripeddye40a7cd2014-06-03 19:42:41 -0700361 &bass_ctxt->offload_bass,
wjiang50b81f42014-08-06 08:03:14 +0800362 OFFLOAD_SEND_BASSBOOST_ENABLE_FLAG);
Subhash Chandra Bose Naripeddye40a7cd2014-06-03 19:42:41 -0700363 if (bass_ctxt->hw_acc_fd > 0)
364 hw_acc_bassboost_send_params(bass_ctxt->hw_acc_fd,
365 &bass_ctxt->offload_bass,
366 OFFLOAD_SEND_BASSBOOST_ENABLE_FLAG);
wjiang50b81f42014-08-06 08:03:14 +0800367 }
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -0800368 bass_ctxt->temp_disabled = true;
369 }
wjiang50b81f42014-08-06 08:03:14 +0800370 ALOGI("%s: ctxt %p, disabled based on device", __func__, bass_ctxt);
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -0800371 }
372 offload_bassboost_set_device(&(bass_ctxt->offload_bass), device);
373 return 0;
374}
375
376int bassboost_reset(effect_context_t *context)
377{
378 bassboost_context_t *bass_ctxt = (bassboost_context_t *)context;
379
380 return 0;
381}
382
383int bassboost_init(effect_context_t *context)
384{
385 bassboost_context_t *bass_ctxt = (bassboost_context_t *)context;
386
Dhananjay Kumar574f3922014-03-25 17:41:44 +0530387 ALOGV("%s: ctxt %p", __func__, bass_ctxt);
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -0800388 context->config.inputCfg.accessMode = EFFECT_BUFFER_ACCESS_READ;
389 context->config.inputCfg.channels = AUDIO_CHANNEL_OUT_STEREO;
390 context->config.inputCfg.format = AUDIO_FORMAT_PCM_16_BIT;
391 context->config.inputCfg.samplingRate = 44100;
392 context->config.inputCfg.bufferProvider.getBuffer = NULL;
393 context->config.inputCfg.bufferProvider.releaseBuffer = NULL;
394 context->config.inputCfg.bufferProvider.cookie = NULL;
395 context->config.inputCfg.mask = EFFECT_CONFIG_ALL;
396 context->config.outputCfg.accessMode = EFFECT_BUFFER_ACCESS_ACCUMULATE;
397 context->config.outputCfg.channels = AUDIO_CHANNEL_OUT_STEREO;
398 context->config.outputCfg.format = AUDIO_FORMAT_PCM_16_BIT;
399 context->config.outputCfg.samplingRate = 44100;
400 context->config.outputCfg.bufferProvider.getBuffer = NULL;
401 context->config.outputCfg.bufferProvider.releaseBuffer = NULL;
402 context->config.outputCfg.bufferProvider.cookie = NULL;
403 context->config.outputCfg.mask = EFFECT_CONFIG_ALL;
404
405 set_config(context, &context->config);
406
Subhash Chandra Bose Naripeddye40a7cd2014-06-03 19:42:41 -0700407 bass_ctxt->hw_acc_fd = -1;
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -0800408 bass_ctxt->temp_disabled = false;
409 memset(&(bass_ctxt->offload_bass), 0, sizeof(struct bass_boost_params));
410
Vatsal Buchaa1358992018-11-14 13:25:08 +0530411 enable_gcov();
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -0800412 return 0;
413}
414
415int bassboost_enable(effect_context_t *context)
416{
417 bassboost_context_t *bass_ctxt = (bassboost_context_t *)context;
418
Dhananjay Kumar574f3922014-03-25 17:41:44 +0530419 ALOGV("%s: ctxt %p, strength %d", __func__, bass_ctxt, bass_ctxt->strength);
wjiang95d74c22014-03-28 12:29:58 +0800420
421 if (!offload_bassboost_get_enable_flag(&(bass_ctxt->offload_bass)) &&
422 !(bass_ctxt->temp_disabled)) {
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -0800423 offload_bassboost_set_enable_flag(&(bass_ctxt->offload_bass), true);
wjiangd45948e2014-02-24 22:19:43 +0800424 if (bass_ctxt->ctl && bass_ctxt->strength)
425 offload_bassboost_send_params(bass_ctxt->ctl,
Subhash Chandra Bose Naripeddye40a7cd2014-06-03 19:42:41 -0700426 &bass_ctxt->offload_bass,
wjiangd45948e2014-02-24 22:19:43 +0800427 OFFLOAD_SEND_BASSBOOST_ENABLE_FLAG |
428 OFFLOAD_SEND_BASSBOOST_STRENGTH);
Subhash Chandra Bose Naripeddye40a7cd2014-06-03 19:42:41 -0700429 if ((bass_ctxt->hw_acc_fd > 0) && (bass_ctxt->strength))
430 hw_acc_bassboost_send_params(bass_ctxt->hw_acc_fd,
431 &bass_ctxt->offload_bass,
432 OFFLOAD_SEND_BASSBOOST_ENABLE_FLAG |
433 OFFLOAD_SEND_BASSBOOST_STRENGTH);
wjiangd45948e2014-02-24 22:19:43 +0800434 }
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -0800435 return 0;
436}
437
438int bassboost_disable(effect_context_t *context)
439{
440 bassboost_context_t *bass_ctxt = (bassboost_context_t *)context;
441
Dhananjay Kumar574f3922014-03-25 17:41:44 +0530442 ALOGV("%s: ctxt %p", __func__, bass_ctxt);
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -0800443 if (offload_bassboost_get_enable_flag(&(bass_ctxt->offload_bass))) {
444 offload_bassboost_set_enable_flag(&(bass_ctxt->offload_bass), false);
445 if (bass_ctxt->ctl)
446 offload_bassboost_send_params(bass_ctxt->ctl,
Subhash Chandra Bose Naripeddye40a7cd2014-06-03 19:42:41 -0700447 &bass_ctxt->offload_bass,
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -0800448 OFFLOAD_SEND_BASSBOOST_ENABLE_FLAG);
Subhash Chandra Bose Naripeddye40a7cd2014-06-03 19:42:41 -0700449 if (bass_ctxt->hw_acc_fd > 0)
450 hw_acc_bassboost_send_params(bass_ctxt->hw_acc_fd,
451 &bass_ctxt->offload_bass,
452 OFFLOAD_SEND_BASSBOOST_ENABLE_FLAG);
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -0800453 }
454 return 0;
455}
456
457int bassboost_start(effect_context_t *context, output_context_t *output)
458{
459 bassboost_context_t *bass_ctxt = (bassboost_context_t *)context;
460
Dhananjay Kumar574f3922014-03-25 17:41:44 +0530461 ALOGV("%s: ctxt %p, ctl %p, strength %d", __func__, bass_ctxt,
462 output->ctl, bass_ctxt->strength);
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -0800463 bass_ctxt->ctl = output->ctl;
Subhash Chandra Bose Naripeddye40a7cd2014-06-03 19:42:41 -0700464 if (offload_bassboost_get_enable_flag(&(bass_ctxt->offload_bass))) {
Amit Shekhard02f2cd2014-01-16 16:51:43 -0800465 if (bass_ctxt->ctl)
Subhash Chandra Bose Naripeddye40a7cd2014-06-03 19:42:41 -0700466 offload_bassboost_send_params(bass_ctxt->ctl, &bass_ctxt->offload_bass,
Amit Shekhard02f2cd2014-01-16 16:51:43 -0800467 OFFLOAD_SEND_BASSBOOST_ENABLE_FLAG |
468 OFFLOAD_SEND_BASSBOOST_STRENGTH);
Subhash Chandra Bose Naripeddye40a7cd2014-06-03 19:42:41 -0700469 if (bass_ctxt->hw_acc_fd > 0)
470 hw_acc_bassboost_send_params(bass_ctxt->hw_acc_fd,
471 &bass_ctxt->offload_bass,
472 OFFLOAD_SEND_BASSBOOST_ENABLE_FLAG |
473 OFFLOAD_SEND_BASSBOOST_STRENGTH);
474 }
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -0800475 return 0;
476}
477
Subhash Chandra Bose Naripeddye40a7cd2014-06-03 19:42:41 -0700478int bassboost_stop(effect_context_t *context, output_context_t *output __unused)
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -0800479{
480 bassboost_context_t *bass_ctxt = (bassboost_context_t *)context;
481
Dhananjay Kumar574f3922014-03-25 17:41:44 +0530482 ALOGV("%s: ctxt %p", __func__, bass_ctxt);
Subhash Chandra Bose Naripeddye40a7cd2014-06-03 19:42:41 -0700483 if (offload_bassboost_get_enable_flag(&(bass_ctxt->offload_bass)) &&
484 bass_ctxt->ctl) {
485 struct bass_boost_params bassboost;
486 bassboost.enable_flag = false;
487 offload_bassboost_send_params(bass_ctxt->ctl, &bassboost,
488 OFFLOAD_SEND_BASSBOOST_ENABLE_FLAG);
489 }
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -0800490 bass_ctxt->ctl = NULL;
491 return 0;
492}
Subhash Chandra Bose Naripeddye40a7cd2014-06-03 19:42:41 -0700493
494int bassboost_set_mode(effect_context_t *context, int32_t hw_acc_fd)
495{
496 bassboost_context_t *bass_ctxt = (bassboost_context_t *)context;
497
498 ALOGV("%s: ctxt %p", __func__, bass_ctxt);
499 bass_ctxt->hw_acc_fd = hw_acc_fd;
500 if ((bass_ctxt->hw_acc_fd > 0) &&
501 (offload_bassboost_get_enable_flag(&(bass_ctxt->offload_bass))))
502 hw_acc_bassboost_send_params(bass_ctxt->hw_acc_fd,
503 &bass_ctxt->offload_bass,
504 OFFLOAD_SEND_BASSBOOST_ENABLE_FLAG |
505 OFFLOAD_SEND_BASSBOOST_STRENGTH);
506 return 0;
507}
Dhananjay Kumar5f15ff92014-05-19 16:45:08 +0800508
509#undef LOG_TAG
510#define LOG_TAG "offload_effect_pbe"
511/*
512 * PBE operations
513 */
514
515int pbe_set_device(effect_context_t *context, uint32_t device)
516{
517 pbe_context_t *pbe_ctxt = (pbe_context_t *)context;
518 char propValue[PROPERTY_VALUE_MAX];
519 bool pbe_enabled_by_prop = false;
520
521 ALOGV("%s: device: %d", __func__, device);
522 pbe_ctxt->device = device;
523
Aniket Kumar Lata8fc67e62017-05-02 12:33:46 -0700524 if (property_get("vendor.audio.safx.pbe.enabled", propValue, NULL)) {
Dhananjay Kumar5f15ff92014-05-19 16:45:08 +0800525 pbe_enabled_by_prop = atoi(propValue) ||
526 !strncmp("true", propValue, 4);
527 }
528
529 if (device == AUDIO_DEVICE_OUT_SPEAKER && pbe_enabled_by_prop == true) {
530 if (pbe_ctxt->temp_disabled) {
531 if (effect_is_active(&pbe_ctxt->common)) {
532 offload_pbe_set_enable_flag(&(pbe_ctxt->offload_pbe), true);
533 if (pbe_ctxt->ctl)
534 offload_pbe_send_params(pbe_ctxt->ctl,
535 &pbe_ctxt->offload_pbe,
536 OFFLOAD_SEND_PBE_ENABLE_FLAG |
537 OFFLOAD_SEND_PBE_CONFIG);
538 if (pbe_ctxt->hw_acc_fd > 0)
539 hw_acc_pbe_send_params(pbe_ctxt->hw_acc_fd,
540 &pbe_ctxt->offload_pbe,
541 OFFLOAD_SEND_PBE_ENABLE_FLAG |
542 OFFLOAD_SEND_PBE_CONFIG);
543 }
544 pbe_ctxt->temp_disabled = false;
545 }
546 } else {
547 if (!pbe_ctxt->temp_disabled) {
548 if (effect_is_active(&pbe_ctxt->common)) {
549 offload_pbe_set_enable_flag(&(pbe_ctxt->offload_pbe), false);
550 if (pbe_ctxt->ctl)
551 offload_pbe_send_params(pbe_ctxt->ctl,
552 &pbe_ctxt->offload_pbe,
553 OFFLOAD_SEND_PBE_ENABLE_FLAG);
554 if (pbe_ctxt->hw_acc_fd > 0)
555 hw_acc_pbe_send_params(pbe_ctxt->hw_acc_fd,
556 &pbe_ctxt->offload_pbe,
557 OFFLOAD_SEND_PBE_ENABLE_FLAG);
558 }
559 pbe_ctxt->temp_disabled = true;
560 }
561 }
562 offload_pbe_set_device(&(pbe_ctxt->offload_pbe), device);
563 return 0;
564}
565
566int pbe_reset(effect_context_t *context)
567{
568 pbe_context_t *pbe_ctxt = (pbe_context_t *)context;
569
570 return 0;
571}
572
573int pbe_init(effect_context_t *context)
574{
575 pbe_context_t *pbe_ctxt = (pbe_context_t *)context;
576
577 ALOGV("%s", __func__);
578 context->config.inputCfg.accessMode = EFFECT_BUFFER_ACCESS_READ;
579 context->config.inputCfg.channels = AUDIO_CHANNEL_OUT_STEREO;
580 context->config.inputCfg.format = AUDIO_FORMAT_PCM_16_BIT;
581 context->config.inputCfg.samplingRate = 44100;
582 context->config.inputCfg.bufferProvider.getBuffer = NULL;
583 context->config.inputCfg.bufferProvider.releaseBuffer = NULL;
584 context->config.inputCfg.bufferProvider.cookie = NULL;
585 context->config.inputCfg.mask = EFFECT_CONFIG_ALL;
586 context->config.outputCfg.accessMode = EFFECT_BUFFER_ACCESS_ACCUMULATE;
587 context->config.outputCfg.channels = AUDIO_CHANNEL_OUT_STEREO;
588 context->config.outputCfg.format = AUDIO_FORMAT_PCM_16_BIT;
589 context->config.outputCfg.samplingRate = 44100;
590 context->config.outputCfg.bufferProvider.getBuffer = NULL;
591 context->config.outputCfg.bufferProvider.releaseBuffer = NULL;
592 context->config.outputCfg.bufferProvider.cookie = NULL;
593 context->config.outputCfg.mask = EFFECT_CONFIG_ALL;
594
595 set_config(context, &context->config);
596
597 pbe_ctxt->hw_acc_fd = -1;
598 pbe_ctxt->temp_disabled = false;
599 memset(&(pbe_ctxt->offload_pbe), 0, sizeof(struct pbe_params));
600 pbe_load_config(&(pbe_ctxt->offload_pbe));
601
602 return 0;
603}
604
605int pbe_enable(effect_context_t *context)
606{
607 pbe_context_t *pbe_ctxt = (pbe_context_t *)context;
608
609 ALOGV("%s", __func__);
610
611 if (!offload_pbe_get_enable_flag(&(pbe_ctxt->offload_pbe)) &&
612 !(pbe_ctxt->temp_disabled)) {
613 offload_pbe_set_enable_flag(&(pbe_ctxt->offload_pbe), true);
614 if (pbe_ctxt->ctl)
615 offload_pbe_send_params(pbe_ctxt->ctl,
616 &pbe_ctxt->offload_pbe,
617 OFFLOAD_SEND_PBE_ENABLE_FLAG |
618 OFFLOAD_SEND_PBE_CONFIG);
619 if (pbe_ctxt->hw_acc_fd > 0)
620 hw_acc_pbe_send_params(pbe_ctxt->hw_acc_fd,
621 &pbe_ctxt->offload_pbe,
622 OFFLOAD_SEND_PBE_ENABLE_FLAG |
623 OFFLOAD_SEND_PBE_CONFIG);
624 }
625 return 0;
626}
627
628int pbe_disable(effect_context_t *context)
629{
630 pbe_context_t *pbe_ctxt = (pbe_context_t *)context;
631
632 ALOGV("%s", __func__);
633 if (offload_pbe_get_enable_flag(&(pbe_ctxt->offload_pbe))) {
634 offload_pbe_set_enable_flag(&(pbe_ctxt->offload_pbe), false);
635 if (pbe_ctxt->ctl)
636 offload_pbe_send_params(pbe_ctxt->ctl,
637 &pbe_ctxt->offload_pbe,
638 OFFLOAD_SEND_PBE_ENABLE_FLAG);
639 if (pbe_ctxt->hw_acc_fd > 0)
640 hw_acc_pbe_send_params(pbe_ctxt->hw_acc_fd,
641 &pbe_ctxt->offload_pbe,
642 OFFLOAD_SEND_PBE_ENABLE_FLAG);
643 }
644 return 0;
645}
646
647int pbe_start(effect_context_t *context, output_context_t *output)
648{
649 pbe_context_t *pbe_ctxt = (pbe_context_t *)context;
650
651 ALOGV("%s", __func__);
652 pbe_ctxt->ctl = output->ctl;
653 ALOGV("output->ctl: %p", output->ctl);
654 if (offload_pbe_get_enable_flag(&(pbe_ctxt->offload_pbe))) {
655 if (pbe_ctxt->ctl)
656 offload_pbe_send_params(pbe_ctxt->ctl, &pbe_ctxt->offload_pbe,
657 OFFLOAD_SEND_PBE_ENABLE_FLAG |
658 OFFLOAD_SEND_PBE_CONFIG);
659 if (pbe_ctxt->hw_acc_fd > 0)
660 hw_acc_pbe_send_params(pbe_ctxt->hw_acc_fd,
661 &pbe_ctxt->offload_pbe,
662 OFFLOAD_SEND_PBE_ENABLE_FLAG |
663 OFFLOAD_SEND_PBE_CONFIG);
664 }
665 return 0;
666}
667
668int pbe_stop(effect_context_t *context, output_context_t *output __unused)
669{
670 pbe_context_t *pbe_ctxt = (pbe_context_t *)context;
671
672 ALOGV("%s", __func__);
673 pbe_ctxt->ctl = NULL;
674 return 0;
675}
676
677int pbe_set_mode(effect_context_t *context, int32_t hw_acc_fd)
678{
679 pbe_context_t *pbe_ctxt = (pbe_context_t *)context;
680
681 ALOGV("%s: ctxt %p", __func__, pbe_ctxt);
682 pbe_ctxt->hw_acc_fd = hw_acc_fd;
683 if ((pbe_ctxt->hw_acc_fd > 0) &&
684 (offload_pbe_get_enable_flag(&(pbe_ctxt->offload_pbe))))
685 hw_acc_pbe_send_params(pbe_ctxt->hw_acc_fd,
686 &pbe_ctxt->offload_pbe,
687 OFFLOAD_SEND_PBE_ENABLE_FLAG |
688 OFFLOAD_SEND_PBE_CONFIG);
689 return 0;
690}
691
692static int pbe_load_config(struct pbe_params *params)
693{
694 int ret = 0;
695 uint32_t len = 0;
696 uint32_t propValue = 0;
697 uint32_t pbe_app_type = PBE_CONF_APP_ID;
698 char propValueStr[PROPERTY_VALUE_MAX];
699 void *acdb_handle = NULL;
700 acdb_get_audio_cal_t acdb_get_audio_cal = NULL;
Weiyin Jiang90ac1ea2017-04-13 14:18:23 +0800701 acdb_audio_cal_cfg_t cal_cfg;
702 memset(&cal_cfg, 0, sizeof(acdb_audio_cal_cfg_t));
Dhananjay Kumar5f15ff92014-05-19 16:45:08 +0800703
704 acdb_handle = dlopen(LIB_ACDB_LOADER, RTLD_NOW);
705 if (acdb_handle == NULL) {
706 ALOGE("%s error opening library %s", __func__, LIB_ACDB_LOADER);
707 return -EFAULT;
708 }
709
710 acdb_get_audio_cal = (acdb_get_audio_cal_t)dlsym(acdb_handle,
711 "acdb_loader_get_audio_cal_v2");
712 if (acdb_get_audio_cal == NULL) {
713 dlclose(acdb_handle);
714 ALOGE("%s error resolving acdb func symbols", __func__);
715 return -EFAULT;
716 }
Aniket Kumar Lata8fc67e62017-05-02 12:33:46 -0700717 if (property_get("vendor.audio.safx.pbe.app.type", propValueStr, "0")) {
Dhananjay Kumar5f15ff92014-05-19 16:45:08 +0800718 propValue = atoll(propValueStr);
719 if (propValue != 0) {
720 pbe_app_type = propValue;
721 }
722 }
723 ALOGD("%s pbe_app_type = 0x%.8x", __func__, pbe_app_type);
724
725 cal_cfg.persist = 1;
726 cal_cfg.cal_type = AUDIO_STREAM_CAL_TYPE;
727 cal_cfg.app_type = pbe_app_type;
728 cal_cfg.module_id = PBE_CONF_MODULE_ID;
729 cal_cfg.param_id = PBE_CONF_PARAM_ID;
730
731 len = sizeof(params->config);
732 ret = acdb_get_audio_cal((void *)&cal_cfg, (void*)&(params->config), &len);
733 ALOGD("%s ret = %d, len = %u", __func__, ret, len);
734 if (ret == 0)
735 params->cfg_len = len;
736
737 dlclose(acdb_handle);
738 return ret;
739}