blob: ad1e7c9f20e8379ddce74f3909a671b552c9c2c5 [file] [log] [blame]
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -08001/*
Dhananjay Kumar5f15ff92014-05-19 16:45:08 +08002 * Copyright (c) 2013-2015, 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,
40 (EFFECT_FLAG_TYPE_INSERT | EFFECT_FLAG_DEVICE_IND | EFFECT_FLAG_HW_ACC_TUNNEL),
41 0, /* TODO */
42 1,
43 "MSM offload bassboost",
44 "The Android Open Source Project",
45};
46
Dhananjay Kumar5f15ff92014-05-19 16:45:08 +080047#define LIB_ACDB_LOADER "libacdbloader.so"
48#define PBE_CONF_APP_ID 0x00011134
49
50enum {
51 AUDIO_DEVICE_CAL_TYPE = 0,
52 AUDIO_STREAM_CAL_TYPE,
53};
54
55typedef struct acdb_audio_cal_cfg {
56 uint32_t persist;
57 uint32_t snd_dev_id;
58 uint32_t dev_id;
59 int32_t acdb_dev_id;
60 uint32_t app_type;
61 uint32_t topo_id;
62 uint32_t sampling_rate;
63 uint32_t cal_type;
64 uint32_t module_id;
65 uint32_t param_id;
66} acdb_audio_cal_cfg_t;
67
68typedef int (*acdb_get_audio_cal_t) (void *, void *, uint32_t*);
69static int pbe_load_config(struct pbe_params *params);
70
71/*
72 * Bass operations
73 */
74int bass_get_parameter(effect_context_t *context, effect_param_t *p,
75 uint32_t *size)
76{
77 bass_context_t *bass_ctxt = (bass_context_t *)context;
78 int voffset = ((p->psize - 1) / sizeof(int32_t) + 1) * sizeof(int32_t);
79 int32_t *param_tmp = (int32_t *)p->data;
80 int32_t param = *param_tmp++;
81 void *value = p->data + voffset;
82 int i;
83
84 ALOGV("%s", __func__);
85
86 p->status = 0;
87
88 switch (param) {
89 case BASSBOOST_PARAM_STRENGTH_SUPPORTED:
90 if (p->vsize < sizeof(uint32_t))
91 p->status = -EINVAL;
92 p->vsize = sizeof(uint32_t);
93 break;
94 case BASSBOOST_PARAM_STRENGTH:
95 if (p->vsize < sizeof(int16_t))
96 p->status = -EINVAL;
97 p->vsize = sizeof(int16_t);
98 break;
99 default:
100 p->status = -EINVAL;
101 }
102
103 *size = sizeof(effect_param_t) + voffset + p->vsize;
104
105 if (p->status != 0)
106 return 0;
107
108 switch (param) {
109 case BASSBOOST_PARAM_STRENGTH_SUPPORTED:
110 ALOGV("%s: BASSBOOST_PARAM_STRENGTH_SUPPORTED", __func__);
111 if (bass_ctxt->active_index == BASS_BOOST)
112 *(uint32_t *)value = 1;
113 else
114 *(uint32_t *)value = 0;
115 break;
116
117 case BASSBOOST_PARAM_STRENGTH:
118 ALOGV("%s: BASSBOOST_PARAM_STRENGTH", __func__);
119 if (bass_ctxt->active_index == BASS_BOOST)
120 *(int16_t *)value = bassboost_get_strength(&(bass_ctxt->bassboost_ctxt));
121 else
122 *(int16_t *)value = 0;
123 break;
124
125 default:
126 p->status = -EINVAL;
127 break;
128 }
129
130 return 0;
131}
132
133int bass_set_parameter(effect_context_t *context, effect_param_t *p,
134 uint32_t size __unused)
135{
136 bass_context_t *bass_ctxt = (bass_context_t *)context;
137 int voffset = ((p->psize - 1) / sizeof(int32_t) + 1) * sizeof(int32_t);
138 void *value = p->data + voffset;
139 int32_t *param_tmp = (int32_t *)p->data;
140 int32_t param = *param_tmp++;
141 uint32_t strength;
142
143 ALOGV("%s", __func__);
144
145 p->status = 0;
146
147 switch (param) {
148 case BASSBOOST_PARAM_STRENGTH:
149 ALOGV("%s BASSBOOST_PARAM_STRENGTH", __func__);
150 if (bass_ctxt->active_index == BASS_BOOST) {
151 strength = (uint32_t)(*(int16_t *)value);
152 bassboost_set_strength(&(bass_ctxt->bassboost_ctxt), strength);
153 } else {
154 /* stength supported only for BB and not for PBE, but do not
155 * return error for unsupported case, as it fails cts test
156 */
157 ALOGD("%s ignore set strength, index %d",
158 __func__, bass_ctxt->active_index);
159 break;
160 }
161 break;
162 default:
163 p->status = -EINVAL;
164 break;
165 }
166
167 return 0;
168}
169
170int bass_set_device(effect_context_t *context, uint32_t device)
171{
172 bass_context_t *bass_ctxt = (bass_context_t *)context;
173
174 if (device == AUDIO_DEVICE_OUT_SPEAKER) {
175 bass_ctxt->active_index = BASS_PBE;
176 ALOGV("%s: set PBE mode, device: %x", __func__, device);
177 } else if (device == AUDIO_DEVICE_OUT_WIRED_HEADSET ||
178 device == AUDIO_DEVICE_OUT_WIRED_HEADPHONE ||
179 device == AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES) {
180 ALOGV("%s: set BB mode, device: %x", __func__, device);
181 bass_ctxt->active_index = BASS_BOOST;
182 } else {
183 ALOGI("%s: disabled by device: %x", __func__, device);
184 bass_ctxt->active_index = BASS_INVALID;
185 }
186
187 bassboost_set_device((effect_context_t *)&(bass_ctxt->bassboost_ctxt), device);
188 pbe_set_device((effect_context_t *)&(bass_ctxt->pbe_ctxt), device);
189
190 return 0;
191}
192
193int bass_reset(effect_context_t *context)
194{
195 bass_context_t *bass_ctxt = (bass_context_t *)context;
196
197 bassboost_reset((effect_context_t *)&(bass_ctxt->bassboost_ctxt));
198 pbe_reset((effect_context_t *)&(bass_ctxt->pbe_ctxt));
199
200 return 0;
201}
202
203int bass_init(effect_context_t *context)
204{
205 bass_context_t *bass_ctxt = (bass_context_t *)context;
206
207 // convery i/o channel config to sub effects
208 bass_ctxt->bassboost_ctxt.common.config = context->config;
209 bass_ctxt->pbe_ctxt.common.config = context->config;
210
211 ALOGV("%s", __func__);
212
213 bass_ctxt->active_index = BASS_BOOST;
214
215
216 bassboost_init((effect_context_t *)&(bass_ctxt->bassboost_ctxt));
217 pbe_init((effect_context_t *)&(bass_ctxt->pbe_ctxt));
218
219 return 0;
220}
221
222int bass_enable(effect_context_t *context)
223{
224 bass_context_t *bass_ctxt = (bass_context_t *)context;
225
226 ALOGV("%s", __func__);
227
228 bassboost_enable((effect_context_t *)&(bass_ctxt->bassboost_ctxt));
229 pbe_enable((effect_context_t *)&(bass_ctxt->pbe_ctxt));
230
231 return 0;
232}
233
234int bass_disable(effect_context_t *context)
235{
236 bass_context_t *bass_ctxt = (bass_context_t *)context;
237
238 ALOGV("%s", __func__);
239
240 bassboost_disable((effect_context_t *)&(bass_ctxt->bassboost_ctxt));
241 pbe_disable((effect_context_t *)&(bass_ctxt->pbe_ctxt));
242
243 return 0;
244}
245
246int bass_start(effect_context_t *context, output_context_t *output)
247{
248 bass_context_t *bass_ctxt = (bass_context_t *)context;
249
250 ALOGV("%s", __func__);
251
252 bassboost_start((effect_context_t *)&(bass_ctxt->bassboost_ctxt), output);
253 pbe_start((effect_context_t *)&(bass_ctxt->pbe_ctxt), output);
254
255 return 0;
256}
257
258int bass_stop(effect_context_t *context, output_context_t *output)
259{
260 bass_context_t *bass_ctxt = (bass_context_t *)context;
261
262 ALOGV("%s", __func__);
263
264 bassboost_stop((effect_context_t *)&(bass_ctxt->bassboost_ctxt), output);
265 pbe_stop((effect_context_t *)&(bass_ctxt->pbe_ctxt), output);
266
267 return 0;
268}
269
270int bass_set_mode(effect_context_t *context, int32_t hw_acc_fd)
271{
272 bass_context_t *bass_ctxt = (bass_context_t *)context;
273
274 ALOGV("%s", __func__);
275
276 bassboost_set_mode((effect_context_t *)&(bass_ctxt->bassboost_ctxt), hw_acc_fd);
277 pbe_set_mode((effect_context_t *)&(bass_ctxt->pbe_ctxt), hw_acc_fd);
278
279 return 0;
280}
281
282#undef LOG_TAG
283#define LOG_TAG "offload_effect_bb"
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -0800284/*
285 * Bassboost operations
286 */
287
288int bassboost_get_strength(bassboost_context_t *context)
289{
Dhananjay Kumar574f3922014-03-25 17:41:44 +0530290 ALOGV("%s: ctxt %p, strength: %d", __func__,
291 context, context->strength);
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -0800292 return context->strength;
293}
294
295int bassboost_set_strength(bassboost_context_t *context, uint32_t strength)
296{
Dhananjay Kumar574f3922014-03-25 17:41:44 +0530297 ALOGV("%s: ctxt %p, strength: %d", __func__, context, strength);
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -0800298 context->strength = strength;
299
300 offload_bassboost_set_strength(&(context->offload_bass), strength);
301 if (context->ctl)
Subhash Chandra Bose Naripeddye40a7cd2014-06-03 19:42:41 -0700302 offload_bassboost_send_params(context->ctl, &context->offload_bass,
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -0800303 OFFLOAD_SEND_BASSBOOST_ENABLE_FLAG |
304 OFFLOAD_SEND_BASSBOOST_STRENGTH);
Subhash Chandra Bose Naripeddye40a7cd2014-06-03 19:42:41 -0700305 if (context->hw_acc_fd > 0)
306 hw_acc_bassboost_send_params(context->hw_acc_fd,
307 &context->offload_bass,
308 OFFLOAD_SEND_BASSBOOST_ENABLE_FLAG |
309 OFFLOAD_SEND_BASSBOOST_STRENGTH);
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -0800310 return 0;
311}
312
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -0800313int bassboost_set_device(effect_context_t *context, uint32_t device)
314{
315 bassboost_context_t *bass_ctxt = (bassboost_context_t *)context;
316
Dhananjay Kumar574f3922014-03-25 17:41:44 +0530317 ALOGV("%s: ctxt %p, device 0x%x", __func__, bass_ctxt, device);
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -0800318 bass_ctxt->device = device;
Dhananjay Kumar5f15ff92014-05-19 16:45:08 +0800319 if (device == AUDIO_DEVICE_OUT_WIRED_HEADSET ||
320 device == AUDIO_DEVICE_OUT_WIRED_HEADPHONE ||
321 device == AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES) {
322 if (bass_ctxt->temp_disabled) {
323 if (effect_is_active(&bass_ctxt->common)) {
324 offload_bassboost_set_enable_flag(&(bass_ctxt->offload_bass), true);
325 if (bass_ctxt->ctl)
326 offload_bassboost_send_params(bass_ctxt->ctl,
327 &bass_ctxt->offload_bass,
328 OFFLOAD_SEND_BASSBOOST_ENABLE_FLAG);
329 if (bass_ctxt->hw_acc_fd > 0)
330 hw_acc_bassboost_send_params(bass_ctxt->hw_acc_fd,
331 &bass_ctxt->offload_bass,
332 OFFLOAD_SEND_BASSBOOST_ENABLE_FLAG);
333 }
334 bass_ctxt->temp_disabled = false;
335 }
336 } else {
wjiang50b81f42014-08-06 08:03:14 +0800337 if (!bass_ctxt->temp_disabled) {
338 if (effect_is_active(&bass_ctxt->common)) {
339 offload_bassboost_set_enable_flag(&(bass_ctxt->offload_bass), false);
340 if (bass_ctxt->ctl)
341 offload_bassboost_send_params(bass_ctxt->ctl,
Subhash Chandra Bose Naripeddye40a7cd2014-06-03 19:42:41 -0700342 &bass_ctxt->offload_bass,
wjiang50b81f42014-08-06 08:03:14 +0800343 OFFLOAD_SEND_BASSBOOST_ENABLE_FLAG);
Subhash Chandra Bose Naripeddye40a7cd2014-06-03 19:42:41 -0700344 if (bass_ctxt->hw_acc_fd > 0)
345 hw_acc_bassboost_send_params(bass_ctxt->hw_acc_fd,
346 &bass_ctxt->offload_bass,
347 OFFLOAD_SEND_BASSBOOST_ENABLE_FLAG);
wjiang50b81f42014-08-06 08:03:14 +0800348 }
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -0800349 bass_ctxt->temp_disabled = true;
350 }
wjiang50b81f42014-08-06 08:03:14 +0800351 ALOGI("%s: ctxt %p, disabled based on device", __func__, bass_ctxt);
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -0800352 }
353 offload_bassboost_set_device(&(bass_ctxt->offload_bass), device);
354 return 0;
355}
356
357int bassboost_reset(effect_context_t *context)
358{
359 bassboost_context_t *bass_ctxt = (bassboost_context_t *)context;
360
361 return 0;
362}
363
364int bassboost_init(effect_context_t *context)
365{
366 bassboost_context_t *bass_ctxt = (bassboost_context_t *)context;
367
Dhananjay Kumar574f3922014-03-25 17:41:44 +0530368 ALOGV("%s: ctxt %p", __func__, bass_ctxt);
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -0800369 context->config.inputCfg.accessMode = EFFECT_BUFFER_ACCESS_READ;
370 context->config.inputCfg.channels = AUDIO_CHANNEL_OUT_STEREO;
371 context->config.inputCfg.format = AUDIO_FORMAT_PCM_16_BIT;
372 context->config.inputCfg.samplingRate = 44100;
373 context->config.inputCfg.bufferProvider.getBuffer = NULL;
374 context->config.inputCfg.bufferProvider.releaseBuffer = NULL;
375 context->config.inputCfg.bufferProvider.cookie = NULL;
376 context->config.inputCfg.mask = EFFECT_CONFIG_ALL;
377 context->config.outputCfg.accessMode = EFFECT_BUFFER_ACCESS_ACCUMULATE;
378 context->config.outputCfg.channels = AUDIO_CHANNEL_OUT_STEREO;
379 context->config.outputCfg.format = AUDIO_FORMAT_PCM_16_BIT;
380 context->config.outputCfg.samplingRate = 44100;
381 context->config.outputCfg.bufferProvider.getBuffer = NULL;
382 context->config.outputCfg.bufferProvider.releaseBuffer = NULL;
383 context->config.outputCfg.bufferProvider.cookie = NULL;
384 context->config.outputCfg.mask = EFFECT_CONFIG_ALL;
385
386 set_config(context, &context->config);
387
Subhash Chandra Bose Naripeddye40a7cd2014-06-03 19:42:41 -0700388 bass_ctxt->hw_acc_fd = -1;
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -0800389 bass_ctxt->temp_disabled = false;
390 memset(&(bass_ctxt->offload_bass), 0, sizeof(struct bass_boost_params));
391
392 return 0;
393}
394
395int bassboost_enable(effect_context_t *context)
396{
397 bassboost_context_t *bass_ctxt = (bassboost_context_t *)context;
398
Dhananjay Kumar574f3922014-03-25 17:41:44 +0530399 ALOGV("%s: ctxt %p, strength %d", __func__, bass_ctxt, bass_ctxt->strength);
wjiang95d74c22014-03-28 12:29:58 +0800400
401 if (!offload_bassboost_get_enable_flag(&(bass_ctxt->offload_bass)) &&
402 !(bass_ctxt->temp_disabled)) {
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -0800403 offload_bassboost_set_enable_flag(&(bass_ctxt->offload_bass), true);
wjiangd45948e2014-02-24 22:19:43 +0800404 if (bass_ctxt->ctl && bass_ctxt->strength)
405 offload_bassboost_send_params(bass_ctxt->ctl,
Subhash Chandra Bose Naripeddye40a7cd2014-06-03 19:42:41 -0700406 &bass_ctxt->offload_bass,
wjiangd45948e2014-02-24 22:19:43 +0800407 OFFLOAD_SEND_BASSBOOST_ENABLE_FLAG |
408 OFFLOAD_SEND_BASSBOOST_STRENGTH);
Subhash Chandra Bose Naripeddye40a7cd2014-06-03 19:42:41 -0700409 if ((bass_ctxt->hw_acc_fd > 0) && (bass_ctxt->strength))
410 hw_acc_bassboost_send_params(bass_ctxt->hw_acc_fd,
411 &bass_ctxt->offload_bass,
412 OFFLOAD_SEND_BASSBOOST_ENABLE_FLAG |
413 OFFLOAD_SEND_BASSBOOST_STRENGTH);
wjiangd45948e2014-02-24 22:19:43 +0800414 }
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -0800415 return 0;
416}
417
418int bassboost_disable(effect_context_t *context)
419{
420 bassboost_context_t *bass_ctxt = (bassboost_context_t *)context;
421
Dhananjay Kumar574f3922014-03-25 17:41:44 +0530422 ALOGV("%s: ctxt %p", __func__, bass_ctxt);
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -0800423 if (offload_bassboost_get_enable_flag(&(bass_ctxt->offload_bass))) {
424 offload_bassboost_set_enable_flag(&(bass_ctxt->offload_bass), false);
425 if (bass_ctxt->ctl)
426 offload_bassboost_send_params(bass_ctxt->ctl,
Subhash Chandra Bose Naripeddye40a7cd2014-06-03 19:42:41 -0700427 &bass_ctxt->offload_bass,
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -0800428 OFFLOAD_SEND_BASSBOOST_ENABLE_FLAG);
Subhash Chandra Bose Naripeddye40a7cd2014-06-03 19:42:41 -0700429 if (bass_ctxt->hw_acc_fd > 0)
430 hw_acc_bassboost_send_params(bass_ctxt->hw_acc_fd,
431 &bass_ctxt->offload_bass,
432 OFFLOAD_SEND_BASSBOOST_ENABLE_FLAG);
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -0800433 }
434 return 0;
435}
436
437int bassboost_start(effect_context_t *context, output_context_t *output)
438{
439 bassboost_context_t *bass_ctxt = (bassboost_context_t *)context;
440
Dhananjay Kumar574f3922014-03-25 17:41:44 +0530441 ALOGV("%s: ctxt %p, ctl %p, strength %d", __func__, bass_ctxt,
442 output->ctl, bass_ctxt->strength);
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -0800443 bass_ctxt->ctl = output->ctl;
Subhash Chandra Bose Naripeddye40a7cd2014-06-03 19:42:41 -0700444 if (offload_bassboost_get_enable_flag(&(bass_ctxt->offload_bass))) {
Amit Shekhard02f2cd2014-01-16 16:51:43 -0800445 if (bass_ctxt->ctl)
Subhash Chandra Bose Naripeddye40a7cd2014-06-03 19:42:41 -0700446 offload_bassboost_send_params(bass_ctxt->ctl, &bass_ctxt->offload_bass,
Amit Shekhard02f2cd2014-01-16 16:51:43 -0800447 OFFLOAD_SEND_BASSBOOST_ENABLE_FLAG |
448 OFFLOAD_SEND_BASSBOOST_STRENGTH);
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 |
453 OFFLOAD_SEND_BASSBOOST_STRENGTH);
454 }
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -0800455 return 0;
456}
457
Subhash Chandra Bose Naripeddye40a7cd2014-06-03 19:42:41 -0700458int bassboost_stop(effect_context_t *context, output_context_t *output __unused)
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -0800459{
460 bassboost_context_t *bass_ctxt = (bassboost_context_t *)context;
461
Dhananjay Kumar574f3922014-03-25 17:41:44 +0530462 ALOGV("%s: ctxt %p", __func__, bass_ctxt);
Subhash Chandra Bose Naripeddye40a7cd2014-06-03 19:42:41 -0700463 if (offload_bassboost_get_enable_flag(&(bass_ctxt->offload_bass)) &&
464 bass_ctxt->ctl) {
465 struct bass_boost_params bassboost;
466 bassboost.enable_flag = false;
467 offload_bassboost_send_params(bass_ctxt->ctl, &bassboost,
468 OFFLOAD_SEND_BASSBOOST_ENABLE_FLAG);
469 }
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -0800470 bass_ctxt->ctl = NULL;
471 return 0;
472}
Subhash Chandra Bose Naripeddye40a7cd2014-06-03 19:42:41 -0700473
474int bassboost_set_mode(effect_context_t *context, int32_t hw_acc_fd)
475{
476 bassboost_context_t *bass_ctxt = (bassboost_context_t *)context;
477
478 ALOGV("%s: ctxt %p", __func__, bass_ctxt);
479 bass_ctxt->hw_acc_fd = hw_acc_fd;
480 if ((bass_ctxt->hw_acc_fd > 0) &&
481 (offload_bassboost_get_enable_flag(&(bass_ctxt->offload_bass))))
482 hw_acc_bassboost_send_params(bass_ctxt->hw_acc_fd,
483 &bass_ctxt->offload_bass,
484 OFFLOAD_SEND_BASSBOOST_ENABLE_FLAG |
485 OFFLOAD_SEND_BASSBOOST_STRENGTH);
486 return 0;
487}
Dhananjay Kumar5f15ff92014-05-19 16:45:08 +0800488
489#undef LOG_TAG
490#define LOG_TAG "offload_effect_pbe"
491/*
492 * PBE operations
493 */
494
495int pbe_set_device(effect_context_t *context, uint32_t device)
496{
497 pbe_context_t *pbe_ctxt = (pbe_context_t *)context;
498 char propValue[PROPERTY_VALUE_MAX];
499 bool pbe_enabled_by_prop = false;
500
501 ALOGV("%s: device: %d", __func__, device);
502 pbe_ctxt->device = device;
503
504 if (property_get("audio.safx.pbe.enabled", propValue, NULL)) {
505 pbe_enabled_by_prop = atoi(propValue) ||
506 !strncmp("true", propValue, 4);
507 }
508
509 if (device == AUDIO_DEVICE_OUT_SPEAKER && pbe_enabled_by_prop == true) {
510 if (pbe_ctxt->temp_disabled) {
511 if (effect_is_active(&pbe_ctxt->common)) {
512 offload_pbe_set_enable_flag(&(pbe_ctxt->offload_pbe), true);
513 if (pbe_ctxt->ctl)
514 offload_pbe_send_params(pbe_ctxt->ctl,
515 &pbe_ctxt->offload_pbe,
516 OFFLOAD_SEND_PBE_ENABLE_FLAG |
517 OFFLOAD_SEND_PBE_CONFIG);
518 if (pbe_ctxt->hw_acc_fd > 0)
519 hw_acc_pbe_send_params(pbe_ctxt->hw_acc_fd,
520 &pbe_ctxt->offload_pbe,
521 OFFLOAD_SEND_PBE_ENABLE_FLAG |
522 OFFLOAD_SEND_PBE_CONFIG);
523 }
524 pbe_ctxt->temp_disabled = false;
525 }
526 } else {
527 if (!pbe_ctxt->temp_disabled) {
528 if (effect_is_active(&pbe_ctxt->common)) {
529 offload_pbe_set_enable_flag(&(pbe_ctxt->offload_pbe), false);
530 if (pbe_ctxt->ctl)
531 offload_pbe_send_params(pbe_ctxt->ctl,
532 &pbe_ctxt->offload_pbe,
533 OFFLOAD_SEND_PBE_ENABLE_FLAG);
534 if (pbe_ctxt->hw_acc_fd > 0)
535 hw_acc_pbe_send_params(pbe_ctxt->hw_acc_fd,
536 &pbe_ctxt->offload_pbe,
537 OFFLOAD_SEND_PBE_ENABLE_FLAG);
538 }
539 pbe_ctxt->temp_disabled = true;
540 }
541 }
542 offload_pbe_set_device(&(pbe_ctxt->offload_pbe), device);
543 return 0;
544}
545
546int pbe_reset(effect_context_t *context)
547{
548 pbe_context_t *pbe_ctxt = (pbe_context_t *)context;
549
550 return 0;
551}
552
553int pbe_init(effect_context_t *context)
554{
555 pbe_context_t *pbe_ctxt = (pbe_context_t *)context;
556
557 ALOGV("%s", __func__);
558 context->config.inputCfg.accessMode = EFFECT_BUFFER_ACCESS_READ;
559 context->config.inputCfg.channels = AUDIO_CHANNEL_OUT_STEREO;
560 context->config.inputCfg.format = AUDIO_FORMAT_PCM_16_BIT;
561 context->config.inputCfg.samplingRate = 44100;
562 context->config.inputCfg.bufferProvider.getBuffer = NULL;
563 context->config.inputCfg.bufferProvider.releaseBuffer = NULL;
564 context->config.inputCfg.bufferProvider.cookie = NULL;
565 context->config.inputCfg.mask = EFFECT_CONFIG_ALL;
566 context->config.outputCfg.accessMode = EFFECT_BUFFER_ACCESS_ACCUMULATE;
567 context->config.outputCfg.channels = AUDIO_CHANNEL_OUT_STEREO;
568 context->config.outputCfg.format = AUDIO_FORMAT_PCM_16_BIT;
569 context->config.outputCfg.samplingRate = 44100;
570 context->config.outputCfg.bufferProvider.getBuffer = NULL;
571 context->config.outputCfg.bufferProvider.releaseBuffer = NULL;
572 context->config.outputCfg.bufferProvider.cookie = NULL;
573 context->config.outputCfg.mask = EFFECT_CONFIG_ALL;
574
575 set_config(context, &context->config);
576
577 pbe_ctxt->hw_acc_fd = -1;
578 pbe_ctxt->temp_disabled = false;
579 memset(&(pbe_ctxt->offload_pbe), 0, sizeof(struct pbe_params));
580 pbe_load_config(&(pbe_ctxt->offload_pbe));
581
582 return 0;
583}
584
585int pbe_enable(effect_context_t *context)
586{
587 pbe_context_t *pbe_ctxt = (pbe_context_t *)context;
588
589 ALOGV("%s", __func__);
590
591 if (!offload_pbe_get_enable_flag(&(pbe_ctxt->offload_pbe)) &&
592 !(pbe_ctxt->temp_disabled)) {
593 offload_pbe_set_enable_flag(&(pbe_ctxt->offload_pbe), true);
594 if (pbe_ctxt->ctl)
595 offload_pbe_send_params(pbe_ctxt->ctl,
596 &pbe_ctxt->offload_pbe,
597 OFFLOAD_SEND_PBE_ENABLE_FLAG |
598 OFFLOAD_SEND_PBE_CONFIG);
599 if (pbe_ctxt->hw_acc_fd > 0)
600 hw_acc_pbe_send_params(pbe_ctxt->hw_acc_fd,
601 &pbe_ctxt->offload_pbe,
602 OFFLOAD_SEND_PBE_ENABLE_FLAG |
603 OFFLOAD_SEND_PBE_CONFIG);
604 }
605 return 0;
606}
607
608int pbe_disable(effect_context_t *context)
609{
610 pbe_context_t *pbe_ctxt = (pbe_context_t *)context;
611
612 ALOGV("%s", __func__);
613 if (offload_pbe_get_enable_flag(&(pbe_ctxt->offload_pbe))) {
614 offload_pbe_set_enable_flag(&(pbe_ctxt->offload_pbe), false);
615 if (pbe_ctxt->ctl)
616 offload_pbe_send_params(pbe_ctxt->ctl,
617 &pbe_ctxt->offload_pbe,
618 OFFLOAD_SEND_PBE_ENABLE_FLAG);
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 }
624 return 0;
625}
626
627int pbe_start(effect_context_t *context, output_context_t *output)
628{
629 pbe_context_t *pbe_ctxt = (pbe_context_t *)context;
630
631 ALOGV("%s", __func__);
632 pbe_ctxt->ctl = output->ctl;
633 ALOGV("output->ctl: %p", output->ctl);
634 if (offload_pbe_get_enable_flag(&(pbe_ctxt->offload_pbe))) {
635 if (pbe_ctxt->ctl)
636 offload_pbe_send_params(pbe_ctxt->ctl, &pbe_ctxt->offload_pbe,
637 OFFLOAD_SEND_PBE_ENABLE_FLAG |
638 OFFLOAD_SEND_PBE_CONFIG);
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 OFFLOAD_SEND_PBE_CONFIG);
644 }
645 return 0;
646}
647
648int pbe_stop(effect_context_t *context, output_context_t *output __unused)
649{
650 pbe_context_t *pbe_ctxt = (pbe_context_t *)context;
651
652 ALOGV("%s", __func__);
653 pbe_ctxt->ctl = NULL;
654 return 0;
655}
656
657int pbe_set_mode(effect_context_t *context, int32_t hw_acc_fd)
658{
659 pbe_context_t *pbe_ctxt = (pbe_context_t *)context;
660
661 ALOGV("%s: ctxt %p", __func__, pbe_ctxt);
662 pbe_ctxt->hw_acc_fd = hw_acc_fd;
663 if ((pbe_ctxt->hw_acc_fd > 0) &&
664 (offload_pbe_get_enable_flag(&(pbe_ctxt->offload_pbe))))
665 hw_acc_pbe_send_params(pbe_ctxt->hw_acc_fd,
666 &pbe_ctxt->offload_pbe,
667 OFFLOAD_SEND_PBE_ENABLE_FLAG |
668 OFFLOAD_SEND_PBE_CONFIG);
669 return 0;
670}
671
672static int pbe_load_config(struct pbe_params *params)
673{
674 int ret = 0;
675 uint32_t len = 0;
676 uint32_t propValue = 0;
677 uint32_t pbe_app_type = PBE_CONF_APP_ID;
678 char propValueStr[PROPERTY_VALUE_MAX];
679 void *acdb_handle = NULL;
680 acdb_get_audio_cal_t acdb_get_audio_cal = NULL;
681 acdb_audio_cal_cfg_t cal_cfg = {0};
682
683 acdb_handle = dlopen(LIB_ACDB_LOADER, RTLD_NOW);
684 if (acdb_handle == NULL) {
685 ALOGE("%s error opening library %s", __func__, LIB_ACDB_LOADER);
686 return -EFAULT;
687 }
688
689 acdb_get_audio_cal = (acdb_get_audio_cal_t)dlsym(acdb_handle,
690 "acdb_loader_get_audio_cal_v2");
691 if (acdb_get_audio_cal == NULL) {
692 dlclose(acdb_handle);
693 ALOGE("%s error resolving acdb func symbols", __func__);
694 return -EFAULT;
695 }
696 if (property_get("audio.safx.pbe.app.type", propValueStr, "0")) {
697 propValue = atoll(propValueStr);
698 if (propValue != 0) {
699 pbe_app_type = propValue;
700 }
701 }
702 ALOGD("%s pbe_app_type = 0x%.8x", __func__, pbe_app_type);
703
704 cal_cfg.persist = 1;
705 cal_cfg.cal_type = AUDIO_STREAM_CAL_TYPE;
706 cal_cfg.app_type = pbe_app_type;
707 cal_cfg.module_id = PBE_CONF_MODULE_ID;
708 cal_cfg.param_id = PBE_CONF_PARAM_ID;
709
710 len = sizeof(params->config);
711 ret = acdb_get_audio_cal((void *)&cal_cfg, (void*)&(params->config), &len);
712 ALOGD("%s ret = %d, len = %u", __func__, ret, len);
713 if (ret == 0)
714 params->cfg_len = len;
715
716 dlclose(acdb_handle);
717 return ret;
718}