blob: fcb02a52bf2bc93abaa36ca534474de917e1410b [file] [log] [blame]
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -08001/*
Weiyin Jiang90ac1ea2017-04-13 14:18:23 +08002 * Copyright (c) 2013-2015, 2017, 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
51enum {
52 AUDIO_DEVICE_CAL_TYPE = 0,
53 AUDIO_STREAM_CAL_TYPE,
54};
55
56typedef struct acdb_audio_cal_cfg {
57 uint32_t persist;
58 uint32_t snd_dev_id;
59 uint32_t dev_id;
60 int32_t acdb_dev_id;
61 uint32_t app_type;
62 uint32_t topo_id;
63 uint32_t sampling_rate;
64 uint32_t cal_type;
65 uint32_t module_id;
66 uint32_t param_id;
67} acdb_audio_cal_cfg_t;
68
69typedef int (*acdb_get_audio_cal_t) (void *, void *, uint32_t*);
70static int pbe_load_config(struct pbe_params *params);
71
72/*
73 * Bass operations
74 */
75int bass_get_parameter(effect_context_t *context, effect_param_t *p,
76 uint32_t *size)
77{
78 bass_context_t *bass_ctxt = (bass_context_t *)context;
79 int voffset = ((p->psize - 1) / sizeof(int32_t) + 1) * sizeof(int32_t);
80 int32_t *param_tmp = (int32_t *)p->data;
81 int32_t param = *param_tmp++;
82 void *value = p->data + voffset;
83 int i;
84
85 ALOGV("%s", __func__);
86
87 p->status = 0;
88
89 switch (param) {
90 case BASSBOOST_PARAM_STRENGTH_SUPPORTED:
91 if (p->vsize < sizeof(uint32_t))
92 p->status = -EINVAL;
93 p->vsize = sizeof(uint32_t);
94 break;
95 case BASSBOOST_PARAM_STRENGTH:
96 if (p->vsize < sizeof(int16_t))
97 p->status = -EINVAL;
98 p->vsize = sizeof(int16_t);
99 break;
100 default:
101 p->status = -EINVAL;
102 }
103
104 *size = sizeof(effect_param_t) + voffset + p->vsize;
105
106 if (p->status != 0)
107 return 0;
108
109 switch (param) {
110 case BASSBOOST_PARAM_STRENGTH_SUPPORTED:
111 ALOGV("%s: BASSBOOST_PARAM_STRENGTH_SUPPORTED", __func__);
112 if (bass_ctxt->active_index == BASS_BOOST)
113 *(uint32_t *)value = 1;
114 else
115 *(uint32_t *)value = 0;
116 break;
117
118 case BASSBOOST_PARAM_STRENGTH:
119 ALOGV("%s: BASSBOOST_PARAM_STRENGTH", __func__);
120 if (bass_ctxt->active_index == BASS_BOOST)
121 *(int16_t *)value = bassboost_get_strength(&(bass_ctxt->bassboost_ctxt));
122 else
123 *(int16_t *)value = 0;
124 break;
125
126 default:
127 p->status = -EINVAL;
128 break;
129 }
130
131 return 0;
132}
133
134int bass_set_parameter(effect_context_t *context, effect_param_t *p,
135 uint32_t size __unused)
136{
137 bass_context_t *bass_ctxt = (bass_context_t *)context;
138 int voffset = ((p->psize - 1) / sizeof(int32_t) + 1) * sizeof(int32_t);
139 void *value = p->data + voffset;
140 int32_t *param_tmp = (int32_t *)p->data;
141 int32_t param = *param_tmp++;
142 uint32_t strength;
143
144 ALOGV("%s", __func__);
145
146 p->status = 0;
147
148 switch (param) {
149 case BASSBOOST_PARAM_STRENGTH:
150 ALOGV("%s BASSBOOST_PARAM_STRENGTH", __func__);
151 if (bass_ctxt->active_index == BASS_BOOST) {
152 strength = (uint32_t)(*(int16_t *)value);
153 bassboost_set_strength(&(bass_ctxt->bassboost_ctxt), strength);
154 } else {
155 /* stength supported only for BB and not for PBE, but do not
156 * return error for unsupported case, as it fails cts test
157 */
158 ALOGD("%s ignore set strength, index %d",
159 __func__, bass_ctxt->active_index);
160 break;
161 }
162 break;
163 default:
164 p->status = -EINVAL;
165 break;
166 }
167
168 return 0;
169}
170
171int bass_set_device(effect_context_t *context, uint32_t device)
172{
173 bass_context_t *bass_ctxt = (bass_context_t *)context;
174
175 if (device == AUDIO_DEVICE_OUT_SPEAKER) {
176 bass_ctxt->active_index = BASS_PBE;
177 ALOGV("%s: set PBE mode, device: %x", __func__, device);
178 } else if (device == AUDIO_DEVICE_OUT_WIRED_HEADSET ||
179 device == AUDIO_DEVICE_OUT_WIRED_HEADPHONE ||
Dhananjay Kumar84137882015-06-05 20:34:50 +0530180 device == AUDIO_DEVICE_OUT_BLUETOOTH_A2DP ||
Dhananjay Kumar5f15ff92014-05-19 16:45:08 +0800181 device == AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES) {
182 ALOGV("%s: set BB mode, device: %x", __func__, device);
183 bass_ctxt->active_index = BASS_BOOST;
184 } else {
185 ALOGI("%s: disabled by device: %x", __func__, device);
186 bass_ctxt->active_index = BASS_INVALID;
187 }
188
189 bassboost_set_device((effect_context_t *)&(bass_ctxt->bassboost_ctxt), device);
190 pbe_set_device((effect_context_t *)&(bass_ctxt->pbe_ctxt), device);
191
192 return 0;
193}
194
195int bass_reset(effect_context_t *context)
196{
197 bass_context_t *bass_ctxt = (bass_context_t *)context;
198
199 bassboost_reset((effect_context_t *)&(bass_ctxt->bassboost_ctxt));
200 pbe_reset((effect_context_t *)&(bass_ctxt->pbe_ctxt));
201
202 return 0;
203}
204
205int bass_init(effect_context_t *context)
206{
207 bass_context_t *bass_ctxt = (bass_context_t *)context;
208
209 // convery i/o channel config to sub effects
210 bass_ctxt->bassboost_ctxt.common.config = context->config;
211 bass_ctxt->pbe_ctxt.common.config = context->config;
212
213 ALOGV("%s", __func__);
214
215 bass_ctxt->active_index = BASS_BOOST;
216
217
218 bassboost_init((effect_context_t *)&(bass_ctxt->bassboost_ctxt));
219 pbe_init((effect_context_t *)&(bass_ctxt->pbe_ctxt));
220
221 return 0;
222}
223
224int bass_enable(effect_context_t *context)
225{
226 bass_context_t *bass_ctxt = (bass_context_t *)context;
227
228 ALOGV("%s", __func__);
229
230 bassboost_enable((effect_context_t *)&(bass_ctxt->bassboost_ctxt));
231 pbe_enable((effect_context_t *)&(bass_ctxt->pbe_ctxt));
232
233 return 0;
234}
235
236int bass_disable(effect_context_t *context)
237{
238 bass_context_t *bass_ctxt = (bass_context_t *)context;
239
240 ALOGV("%s", __func__);
241
242 bassboost_disable((effect_context_t *)&(bass_ctxt->bassboost_ctxt));
243 pbe_disable((effect_context_t *)&(bass_ctxt->pbe_ctxt));
244
245 return 0;
246}
247
248int bass_start(effect_context_t *context, output_context_t *output)
249{
250 bass_context_t *bass_ctxt = (bass_context_t *)context;
251
252 ALOGV("%s", __func__);
253
254 bassboost_start((effect_context_t *)&(bass_ctxt->bassboost_ctxt), output);
255 pbe_start((effect_context_t *)&(bass_ctxt->pbe_ctxt), output);
256
257 return 0;
258}
259
260int bass_stop(effect_context_t *context, output_context_t *output)
261{
262 bass_context_t *bass_ctxt = (bass_context_t *)context;
263
264 ALOGV("%s", __func__);
265
266 bassboost_stop((effect_context_t *)&(bass_ctxt->bassboost_ctxt), output);
267 pbe_stop((effect_context_t *)&(bass_ctxt->pbe_ctxt), output);
268
269 return 0;
270}
271
272int bass_set_mode(effect_context_t *context, int32_t hw_acc_fd)
273{
274 bass_context_t *bass_ctxt = (bass_context_t *)context;
275
276 ALOGV("%s", __func__);
277
278 bassboost_set_mode((effect_context_t *)&(bass_ctxt->bassboost_ctxt), hw_acc_fd);
279 pbe_set_mode((effect_context_t *)&(bass_ctxt->pbe_ctxt), hw_acc_fd);
280
281 return 0;
282}
283
284#undef LOG_TAG
285#define LOG_TAG "offload_effect_bb"
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -0800286/*
287 * Bassboost operations
288 */
289
290int bassboost_get_strength(bassboost_context_t *context)
291{
Dhananjay Kumar574f3922014-03-25 17:41:44 +0530292 ALOGV("%s: ctxt %p, strength: %d", __func__,
293 context, context->strength);
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -0800294 return context->strength;
295}
296
297int bassboost_set_strength(bassboost_context_t *context, uint32_t strength)
298{
Dhananjay Kumar574f3922014-03-25 17:41:44 +0530299 ALOGV("%s: ctxt %p, strength: %d", __func__, context, strength);
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -0800300 context->strength = strength;
301
302 offload_bassboost_set_strength(&(context->offload_bass), strength);
303 if (context->ctl)
Subhash Chandra Bose Naripeddye40a7cd2014-06-03 19:42:41 -0700304 offload_bassboost_send_params(context->ctl, &context->offload_bass,
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -0800305 OFFLOAD_SEND_BASSBOOST_ENABLE_FLAG |
306 OFFLOAD_SEND_BASSBOOST_STRENGTH);
Subhash Chandra Bose Naripeddye40a7cd2014-06-03 19:42:41 -0700307 if (context->hw_acc_fd > 0)
308 hw_acc_bassboost_send_params(context->hw_acc_fd,
309 &context->offload_bass,
310 OFFLOAD_SEND_BASSBOOST_ENABLE_FLAG |
311 OFFLOAD_SEND_BASSBOOST_STRENGTH);
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -0800312 return 0;
313}
314
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -0800315int bassboost_set_device(effect_context_t *context, uint32_t device)
316{
317 bassboost_context_t *bass_ctxt = (bassboost_context_t *)context;
318
Dhananjay Kumar574f3922014-03-25 17:41:44 +0530319 ALOGV("%s: ctxt %p, device 0x%x", __func__, bass_ctxt, device);
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -0800320 bass_ctxt->device = device;
Dhananjay Kumar5f15ff92014-05-19 16:45:08 +0800321 if (device == AUDIO_DEVICE_OUT_WIRED_HEADSET ||
322 device == AUDIO_DEVICE_OUT_WIRED_HEADPHONE ||
Dhananjay Kumar84137882015-06-05 20:34:50 +0530323 device == AUDIO_DEVICE_OUT_BLUETOOTH_A2DP ||
Dhananjay Kumar5f15ff92014-05-19 16:45:08 +0800324 device == AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES) {
325 if (bass_ctxt->temp_disabled) {
326 if (effect_is_active(&bass_ctxt->common)) {
327 offload_bassboost_set_enable_flag(&(bass_ctxt->offload_bass), true);
328 if (bass_ctxt->ctl)
329 offload_bassboost_send_params(bass_ctxt->ctl,
330 &bass_ctxt->offload_bass,
331 OFFLOAD_SEND_BASSBOOST_ENABLE_FLAG);
332 if (bass_ctxt->hw_acc_fd > 0)
333 hw_acc_bassboost_send_params(bass_ctxt->hw_acc_fd,
334 &bass_ctxt->offload_bass,
335 OFFLOAD_SEND_BASSBOOST_ENABLE_FLAG);
336 }
337 bass_ctxt->temp_disabled = false;
338 }
339 } else {
wjiang50b81f42014-08-06 08:03:14 +0800340 if (!bass_ctxt->temp_disabled) {
341 if (effect_is_active(&bass_ctxt->common)) {
342 offload_bassboost_set_enable_flag(&(bass_ctxt->offload_bass), false);
343 if (bass_ctxt->ctl)
344 offload_bassboost_send_params(bass_ctxt->ctl,
Subhash Chandra Bose Naripeddye40a7cd2014-06-03 19:42:41 -0700345 &bass_ctxt->offload_bass,
wjiang50b81f42014-08-06 08:03:14 +0800346 OFFLOAD_SEND_BASSBOOST_ENABLE_FLAG);
Subhash Chandra Bose Naripeddye40a7cd2014-06-03 19:42:41 -0700347 if (bass_ctxt->hw_acc_fd > 0)
348 hw_acc_bassboost_send_params(bass_ctxt->hw_acc_fd,
349 &bass_ctxt->offload_bass,
350 OFFLOAD_SEND_BASSBOOST_ENABLE_FLAG);
wjiang50b81f42014-08-06 08:03:14 +0800351 }
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -0800352 bass_ctxt->temp_disabled = true;
353 }
wjiang50b81f42014-08-06 08:03:14 +0800354 ALOGI("%s: ctxt %p, disabled based on device", __func__, bass_ctxt);
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -0800355 }
356 offload_bassboost_set_device(&(bass_ctxt->offload_bass), device);
357 return 0;
358}
359
360int bassboost_reset(effect_context_t *context)
361{
362 bassboost_context_t *bass_ctxt = (bassboost_context_t *)context;
363
364 return 0;
365}
366
367int bassboost_init(effect_context_t *context)
368{
369 bassboost_context_t *bass_ctxt = (bassboost_context_t *)context;
370
Dhananjay Kumar574f3922014-03-25 17:41:44 +0530371 ALOGV("%s: ctxt %p", __func__, bass_ctxt);
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -0800372 context->config.inputCfg.accessMode = EFFECT_BUFFER_ACCESS_READ;
373 context->config.inputCfg.channels = AUDIO_CHANNEL_OUT_STEREO;
374 context->config.inputCfg.format = AUDIO_FORMAT_PCM_16_BIT;
375 context->config.inputCfg.samplingRate = 44100;
376 context->config.inputCfg.bufferProvider.getBuffer = NULL;
377 context->config.inputCfg.bufferProvider.releaseBuffer = NULL;
378 context->config.inputCfg.bufferProvider.cookie = NULL;
379 context->config.inputCfg.mask = EFFECT_CONFIG_ALL;
380 context->config.outputCfg.accessMode = EFFECT_BUFFER_ACCESS_ACCUMULATE;
381 context->config.outputCfg.channels = AUDIO_CHANNEL_OUT_STEREO;
382 context->config.outputCfg.format = AUDIO_FORMAT_PCM_16_BIT;
383 context->config.outputCfg.samplingRate = 44100;
384 context->config.outputCfg.bufferProvider.getBuffer = NULL;
385 context->config.outputCfg.bufferProvider.releaseBuffer = NULL;
386 context->config.outputCfg.bufferProvider.cookie = NULL;
387 context->config.outputCfg.mask = EFFECT_CONFIG_ALL;
388
389 set_config(context, &context->config);
390
Subhash Chandra Bose Naripeddye40a7cd2014-06-03 19:42:41 -0700391 bass_ctxt->hw_acc_fd = -1;
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -0800392 bass_ctxt->temp_disabled = false;
393 memset(&(bass_ctxt->offload_bass), 0, sizeof(struct bass_boost_params));
394
395 return 0;
396}
397
398int bassboost_enable(effect_context_t *context)
399{
400 bassboost_context_t *bass_ctxt = (bassboost_context_t *)context;
401
Dhananjay Kumar574f3922014-03-25 17:41:44 +0530402 ALOGV("%s: ctxt %p, strength %d", __func__, bass_ctxt, bass_ctxt->strength);
wjiang95d74c22014-03-28 12:29:58 +0800403
404 if (!offload_bassboost_get_enable_flag(&(bass_ctxt->offload_bass)) &&
405 !(bass_ctxt->temp_disabled)) {
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -0800406 offload_bassboost_set_enable_flag(&(bass_ctxt->offload_bass), true);
wjiangd45948e2014-02-24 22:19:43 +0800407 if (bass_ctxt->ctl && bass_ctxt->strength)
408 offload_bassboost_send_params(bass_ctxt->ctl,
Subhash Chandra Bose Naripeddye40a7cd2014-06-03 19:42:41 -0700409 &bass_ctxt->offload_bass,
wjiangd45948e2014-02-24 22:19:43 +0800410 OFFLOAD_SEND_BASSBOOST_ENABLE_FLAG |
411 OFFLOAD_SEND_BASSBOOST_STRENGTH);
Subhash Chandra Bose Naripeddye40a7cd2014-06-03 19:42:41 -0700412 if ((bass_ctxt->hw_acc_fd > 0) && (bass_ctxt->strength))
413 hw_acc_bassboost_send_params(bass_ctxt->hw_acc_fd,
414 &bass_ctxt->offload_bass,
415 OFFLOAD_SEND_BASSBOOST_ENABLE_FLAG |
416 OFFLOAD_SEND_BASSBOOST_STRENGTH);
wjiangd45948e2014-02-24 22:19:43 +0800417 }
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -0800418 return 0;
419}
420
421int bassboost_disable(effect_context_t *context)
422{
423 bassboost_context_t *bass_ctxt = (bassboost_context_t *)context;
424
Dhananjay Kumar574f3922014-03-25 17:41:44 +0530425 ALOGV("%s: ctxt %p", __func__, bass_ctxt);
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -0800426 if (offload_bassboost_get_enable_flag(&(bass_ctxt->offload_bass))) {
427 offload_bassboost_set_enable_flag(&(bass_ctxt->offload_bass), false);
428 if (bass_ctxt->ctl)
429 offload_bassboost_send_params(bass_ctxt->ctl,
Subhash Chandra Bose Naripeddye40a7cd2014-06-03 19:42:41 -0700430 &bass_ctxt->offload_bass,
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -0800431 OFFLOAD_SEND_BASSBOOST_ENABLE_FLAG);
Subhash Chandra Bose Naripeddye40a7cd2014-06-03 19:42:41 -0700432 if (bass_ctxt->hw_acc_fd > 0)
433 hw_acc_bassboost_send_params(bass_ctxt->hw_acc_fd,
434 &bass_ctxt->offload_bass,
435 OFFLOAD_SEND_BASSBOOST_ENABLE_FLAG);
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -0800436 }
437 return 0;
438}
439
440int bassboost_start(effect_context_t *context, output_context_t *output)
441{
442 bassboost_context_t *bass_ctxt = (bassboost_context_t *)context;
443
Dhananjay Kumar574f3922014-03-25 17:41:44 +0530444 ALOGV("%s: ctxt %p, ctl %p, strength %d", __func__, bass_ctxt,
445 output->ctl, bass_ctxt->strength);
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -0800446 bass_ctxt->ctl = output->ctl;
Subhash Chandra Bose Naripeddye40a7cd2014-06-03 19:42:41 -0700447 if (offload_bassboost_get_enable_flag(&(bass_ctxt->offload_bass))) {
Amit Shekhard02f2cd2014-01-16 16:51:43 -0800448 if (bass_ctxt->ctl)
Subhash Chandra Bose Naripeddye40a7cd2014-06-03 19:42:41 -0700449 offload_bassboost_send_params(bass_ctxt->ctl, &bass_ctxt->offload_bass,
Amit Shekhard02f2cd2014-01-16 16:51:43 -0800450 OFFLOAD_SEND_BASSBOOST_ENABLE_FLAG |
451 OFFLOAD_SEND_BASSBOOST_STRENGTH);
Subhash Chandra Bose Naripeddye40a7cd2014-06-03 19:42:41 -0700452 if (bass_ctxt->hw_acc_fd > 0)
453 hw_acc_bassboost_send_params(bass_ctxt->hw_acc_fd,
454 &bass_ctxt->offload_bass,
455 OFFLOAD_SEND_BASSBOOST_ENABLE_FLAG |
456 OFFLOAD_SEND_BASSBOOST_STRENGTH);
457 }
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -0800458 return 0;
459}
460
Subhash Chandra Bose Naripeddye40a7cd2014-06-03 19:42:41 -0700461int bassboost_stop(effect_context_t *context, output_context_t *output __unused)
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -0800462{
463 bassboost_context_t *bass_ctxt = (bassboost_context_t *)context;
464
Dhananjay Kumar574f3922014-03-25 17:41:44 +0530465 ALOGV("%s: ctxt %p", __func__, bass_ctxt);
Subhash Chandra Bose Naripeddye40a7cd2014-06-03 19:42:41 -0700466 if (offload_bassboost_get_enable_flag(&(bass_ctxt->offload_bass)) &&
467 bass_ctxt->ctl) {
468 struct bass_boost_params bassboost;
469 bassboost.enable_flag = false;
470 offload_bassboost_send_params(bass_ctxt->ctl, &bassboost,
471 OFFLOAD_SEND_BASSBOOST_ENABLE_FLAG);
472 }
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -0800473 bass_ctxt->ctl = NULL;
474 return 0;
475}
Subhash Chandra Bose Naripeddye40a7cd2014-06-03 19:42:41 -0700476
477int bassboost_set_mode(effect_context_t *context, int32_t hw_acc_fd)
478{
479 bassboost_context_t *bass_ctxt = (bassboost_context_t *)context;
480
481 ALOGV("%s: ctxt %p", __func__, bass_ctxt);
482 bass_ctxt->hw_acc_fd = hw_acc_fd;
483 if ((bass_ctxt->hw_acc_fd > 0) &&
484 (offload_bassboost_get_enable_flag(&(bass_ctxt->offload_bass))))
485 hw_acc_bassboost_send_params(bass_ctxt->hw_acc_fd,
486 &bass_ctxt->offload_bass,
487 OFFLOAD_SEND_BASSBOOST_ENABLE_FLAG |
488 OFFLOAD_SEND_BASSBOOST_STRENGTH);
489 return 0;
490}
Dhananjay Kumar5f15ff92014-05-19 16:45:08 +0800491
492#undef LOG_TAG
493#define LOG_TAG "offload_effect_pbe"
494/*
495 * PBE operations
496 */
497
498int pbe_set_device(effect_context_t *context, uint32_t device)
499{
500 pbe_context_t *pbe_ctxt = (pbe_context_t *)context;
501 char propValue[PROPERTY_VALUE_MAX];
502 bool pbe_enabled_by_prop = false;
503
504 ALOGV("%s: device: %d", __func__, device);
505 pbe_ctxt->device = device;
506
507 if (property_get("audio.safx.pbe.enabled", propValue, NULL)) {
508 pbe_enabled_by_prop = atoi(propValue) ||
509 !strncmp("true", propValue, 4);
510 }
511
512 if (device == AUDIO_DEVICE_OUT_SPEAKER && pbe_enabled_by_prop == true) {
513 if (pbe_ctxt->temp_disabled) {
514 if (effect_is_active(&pbe_ctxt->common)) {
515 offload_pbe_set_enable_flag(&(pbe_ctxt->offload_pbe), true);
516 if (pbe_ctxt->ctl)
517 offload_pbe_send_params(pbe_ctxt->ctl,
518 &pbe_ctxt->offload_pbe,
519 OFFLOAD_SEND_PBE_ENABLE_FLAG |
520 OFFLOAD_SEND_PBE_CONFIG);
521 if (pbe_ctxt->hw_acc_fd > 0)
522 hw_acc_pbe_send_params(pbe_ctxt->hw_acc_fd,
523 &pbe_ctxt->offload_pbe,
524 OFFLOAD_SEND_PBE_ENABLE_FLAG |
525 OFFLOAD_SEND_PBE_CONFIG);
526 }
527 pbe_ctxt->temp_disabled = false;
528 }
529 } else {
530 if (!pbe_ctxt->temp_disabled) {
531 if (effect_is_active(&pbe_ctxt->common)) {
532 offload_pbe_set_enable_flag(&(pbe_ctxt->offload_pbe), false);
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 if (pbe_ctxt->hw_acc_fd > 0)
538 hw_acc_pbe_send_params(pbe_ctxt->hw_acc_fd,
539 &pbe_ctxt->offload_pbe,
540 OFFLOAD_SEND_PBE_ENABLE_FLAG);
541 }
542 pbe_ctxt->temp_disabled = true;
543 }
544 }
545 offload_pbe_set_device(&(pbe_ctxt->offload_pbe), device);
546 return 0;
547}
548
549int pbe_reset(effect_context_t *context)
550{
551 pbe_context_t *pbe_ctxt = (pbe_context_t *)context;
552
553 return 0;
554}
555
556int pbe_init(effect_context_t *context)
557{
558 pbe_context_t *pbe_ctxt = (pbe_context_t *)context;
559
560 ALOGV("%s", __func__);
561 context->config.inputCfg.accessMode = EFFECT_BUFFER_ACCESS_READ;
562 context->config.inputCfg.channels = AUDIO_CHANNEL_OUT_STEREO;
563 context->config.inputCfg.format = AUDIO_FORMAT_PCM_16_BIT;
564 context->config.inputCfg.samplingRate = 44100;
565 context->config.inputCfg.bufferProvider.getBuffer = NULL;
566 context->config.inputCfg.bufferProvider.releaseBuffer = NULL;
567 context->config.inputCfg.bufferProvider.cookie = NULL;
568 context->config.inputCfg.mask = EFFECT_CONFIG_ALL;
569 context->config.outputCfg.accessMode = EFFECT_BUFFER_ACCESS_ACCUMULATE;
570 context->config.outputCfg.channels = AUDIO_CHANNEL_OUT_STEREO;
571 context->config.outputCfg.format = AUDIO_FORMAT_PCM_16_BIT;
572 context->config.outputCfg.samplingRate = 44100;
573 context->config.outputCfg.bufferProvider.getBuffer = NULL;
574 context->config.outputCfg.bufferProvider.releaseBuffer = NULL;
575 context->config.outputCfg.bufferProvider.cookie = NULL;
576 context->config.outputCfg.mask = EFFECT_CONFIG_ALL;
577
578 set_config(context, &context->config);
579
580 pbe_ctxt->hw_acc_fd = -1;
581 pbe_ctxt->temp_disabled = false;
582 memset(&(pbe_ctxt->offload_pbe), 0, sizeof(struct pbe_params));
583 pbe_load_config(&(pbe_ctxt->offload_pbe));
584
585 return 0;
586}
587
588int pbe_enable(effect_context_t *context)
589{
590 pbe_context_t *pbe_ctxt = (pbe_context_t *)context;
591
592 ALOGV("%s", __func__);
593
594 if (!offload_pbe_get_enable_flag(&(pbe_ctxt->offload_pbe)) &&
595 !(pbe_ctxt->temp_disabled)) {
596 offload_pbe_set_enable_flag(&(pbe_ctxt->offload_pbe), true);
597 if (pbe_ctxt->ctl)
598 offload_pbe_send_params(pbe_ctxt->ctl,
599 &pbe_ctxt->offload_pbe,
600 OFFLOAD_SEND_PBE_ENABLE_FLAG |
601 OFFLOAD_SEND_PBE_CONFIG);
602 if (pbe_ctxt->hw_acc_fd > 0)
603 hw_acc_pbe_send_params(pbe_ctxt->hw_acc_fd,
604 &pbe_ctxt->offload_pbe,
605 OFFLOAD_SEND_PBE_ENABLE_FLAG |
606 OFFLOAD_SEND_PBE_CONFIG);
607 }
608 return 0;
609}
610
611int pbe_disable(effect_context_t *context)
612{
613 pbe_context_t *pbe_ctxt = (pbe_context_t *)context;
614
615 ALOGV("%s", __func__);
616 if (offload_pbe_get_enable_flag(&(pbe_ctxt->offload_pbe))) {
617 offload_pbe_set_enable_flag(&(pbe_ctxt->offload_pbe), false);
618 if (pbe_ctxt->ctl)
619 offload_pbe_send_params(pbe_ctxt->ctl,
620 &pbe_ctxt->offload_pbe,
621 OFFLOAD_SEND_PBE_ENABLE_FLAG);
622 if (pbe_ctxt->hw_acc_fd > 0)
623 hw_acc_pbe_send_params(pbe_ctxt->hw_acc_fd,
624 &pbe_ctxt->offload_pbe,
625 OFFLOAD_SEND_PBE_ENABLE_FLAG);
626 }
627 return 0;
628}
629
630int pbe_start(effect_context_t *context, output_context_t *output)
631{
632 pbe_context_t *pbe_ctxt = (pbe_context_t *)context;
633
634 ALOGV("%s", __func__);
635 pbe_ctxt->ctl = output->ctl;
636 ALOGV("output->ctl: %p", output->ctl);
637 if (offload_pbe_get_enable_flag(&(pbe_ctxt->offload_pbe))) {
638 if (pbe_ctxt->ctl)
639 offload_pbe_send_params(pbe_ctxt->ctl, &pbe_ctxt->offload_pbe,
640 OFFLOAD_SEND_PBE_ENABLE_FLAG |
641 OFFLOAD_SEND_PBE_CONFIG);
642 if (pbe_ctxt->hw_acc_fd > 0)
643 hw_acc_pbe_send_params(pbe_ctxt->hw_acc_fd,
644 &pbe_ctxt->offload_pbe,
645 OFFLOAD_SEND_PBE_ENABLE_FLAG |
646 OFFLOAD_SEND_PBE_CONFIG);
647 }
648 return 0;
649}
650
651int pbe_stop(effect_context_t *context, output_context_t *output __unused)
652{
653 pbe_context_t *pbe_ctxt = (pbe_context_t *)context;
654
655 ALOGV("%s", __func__);
656 pbe_ctxt->ctl = NULL;
657 return 0;
658}
659
660int pbe_set_mode(effect_context_t *context, int32_t hw_acc_fd)
661{
662 pbe_context_t *pbe_ctxt = (pbe_context_t *)context;
663
664 ALOGV("%s: ctxt %p", __func__, pbe_ctxt);
665 pbe_ctxt->hw_acc_fd = hw_acc_fd;
666 if ((pbe_ctxt->hw_acc_fd > 0) &&
667 (offload_pbe_get_enable_flag(&(pbe_ctxt->offload_pbe))))
668 hw_acc_pbe_send_params(pbe_ctxt->hw_acc_fd,
669 &pbe_ctxt->offload_pbe,
670 OFFLOAD_SEND_PBE_ENABLE_FLAG |
671 OFFLOAD_SEND_PBE_CONFIG);
672 return 0;
673}
674
675static int pbe_load_config(struct pbe_params *params)
676{
677 int ret = 0;
678 uint32_t len = 0;
679 uint32_t propValue = 0;
680 uint32_t pbe_app_type = PBE_CONF_APP_ID;
681 char propValueStr[PROPERTY_VALUE_MAX];
682 void *acdb_handle = NULL;
683 acdb_get_audio_cal_t acdb_get_audio_cal = NULL;
Weiyin Jiang90ac1ea2017-04-13 14:18:23 +0800684 acdb_audio_cal_cfg_t cal_cfg;
685 memset(&cal_cfg, 0, sizeof(acdb_audio_cal_cfg_t));
Dhananjay Kumar5f15ff92014-05-19 16:45:08 +0800686
687 acdb_handle = dlopen(LIB_ACDB_LOADER, RTLD_NOW);
688 if (acdb_handle == NULL) {
689 ALOGE("%s error opening library %s", __func__, LIB_ACDB_LOADER);
690 return -EFAULT;
691 }
692
693 acdb_get_audio_cal = (acdb_get_audio_cal_t)dlsym(acdb_handle,
694 "acdb_loader_get_audio_cal_v2");
695 if (acdb_get_audio_cal == NULL) {
696 dlclose(acdb_handle);
697 ALOGE("%s error resolving acdb func symbols", __func__);
698 return -EFAULT;
699 }
700 if (property_get("audio.safx.pbe.app.type", propValueStr, "0")) {
701 propValue = atoll(propValueStr);
702 if (propValue != 0) {
703 pbe_app_type = propValue;
704 }
705 }
706 ALOGD("%s pbe_app_type = 0x%.8x", __func__, pbe_app_type);
707
708 cal_cfg.persist = 1;
709 cal_cfg.cal_type = AUDIO_STREAM_CAL_TYPE;
710 cal_cfg.app_type = pbe_app_type;
711 cal_cfg.module_id = PBE_CONF_MODULE_ID;
712 cal_cfg.param_id = PBE_CONF_PARAM_ID;
713
714 len = sizeof(params->config);
715 ret = acdb_get_audio_cal((void *)&cal_cfg, (void*)&(params->config), &len);
716 ALOGD("%s ret = %d, len = %u", __func__, ret, len);
717 if (ret == 0)
718 params->cfg_len = len;
719
720 dlclose(acdb_handle);
721 return ret;
722}