blob: 7c5043037bc3f540d71a1ca74cd66c28efa0d17a [file] [log] [blame]
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -08001/*
2 * Copyright (c) 2013, The Linux Foundation. All rights reserved.
3 * 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
20#define LOG_TAG "offload_effect_reverb"
21#define LOG_NDEBUG 0
22
23#include <cutils/list.h>
24#include <cutils/log.h>
25#include <tinyalsa/asoundlib.h>
Subhash Chandra Bose Naripeddy090a2aa2014-01-30 14:03:12 -080026#include <sound/audio_effects.h>
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -080027#include <audio_effects/effect_environmentalreverb.h>
28#include <audio_effects/effect_presetreverb.h>
29
30#include "effect_api.h"
31#include "reverb.h"
32
33/* Offload auxiliary environmental reverb UUID: 79a18026-18fd-4185-8233-0002a5d5c51b */
34const effect_descriptor_t aux_env_reverb_descriptor = {
35 { 0xc2e5d5f0, 0x94bd, 0x4763, 0x9cac, { 0x4e, 0x23, 0x4d, 0x06, 0x83, 0x9e } },
36 { 0x79a18026, 0x18fd, 0x4185, 0x8233, { 0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b } },
37 EFFECT_CONTROL_API_VERSION,
38 (EFFECT_FLAG_TYPE_AUXILIARY | EFFECT_FLAG_HW_ACC_TUNNEL),
39 0, /* TODO */
40 1,
41 "MSM offload Auxiliary Environmental Reverb",
42 "The Android Open Source Project",
43};
44
45/* Offload insert environmental reverb UUID: eb64ea04-973b-43d2-8f5e-0002a5d5c51b */
46const effect_descriptor_t ins_env_reverb_descriptor = {
47 {0xc2e5d5f0, 0x94bd, 0x4763, 0x9cac, {0x4e, 0x23, 0x4d, 0x06, 0x83, 0x9e}},
48 {0xeb64ea04, 0x973b, 0x43d2, 0x8f5e, {0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}},
49 EFFECT_CONTROL_API_VERSION,
50 (EFFECT_FLAG_TYPE_INSERT | EFFECT_FLAG_INSERT_FIRST | EFFECT_FLAG_HW_ACC_TUNNEL),
51 0, /* TODO */
52 1,
53 "MSM offload Insert Environmental Reverb",
54 "The Android Open Source Project",
55};
56
57// Offload auxiliary preset reverb UUID: 6987be09-b142-4b41-9056-0002a5d5c51b */
58const effect_descriptor_t aux_preset_reverb_descriptor = {
59 {0x47382d60, 0xddd8, 0x11db, 0xbf3a, {0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}},
60 {0x6987be09, 0xb142, 0x4b41, 0x9056, {0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}},
61 EFFECT_CONTROL_API_VERSION,
62 (EFFECT_FLAG_TYPE_AUXILIARY | EFFECT_FLAG_HW_ACC_TUNNEL),
63 0, /* TODO */
64 1,
65 "MSM offload Auxiliary Preset Reverb",
66 "The Android Open Source Project",
67};
68
69// Offload insert preset reverb UUID: aa2bebf6-47cf-4613-9bca-0002a5d5c51b */
70const effect_descriptor_t ins_preset_reverb_descriptor = {
71 {0x47382d60, 0xddd8, 0x11db, 0xbf3a, {0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}},
72 {0xaa2bebf6, 0x47cf, 0x4613, 0x9bca, {0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}},
73 EFFECT_CONTROL_API_VERSION,
74 (EFFECT_FLAG_TYPE_INSERT | EFFECT_FLAG_INSERT_FIRST | EFFECT_FLAG_HW_ACC_TUNNEL),
75 0, /* TODO */
76 1,
77 "MSM offload Insert Preset Reverb",
78 "The Android Open Source Project",
79};
80
81static const reverb_settings_t reverb_presets[] = {
82 // REVERB_PRESET_NONE: values are unused
83 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
84 // REVERB_PRESET_SMALLROOM
85 {-400, -600, 1100, 830, -400, 5, 500, 10, 1000, 1000},
86 // REVERB_PRESET_MEDIUMROOM
87 {-400, -600, 1300, 830, -1000, 20, -200, 20, 1000, 1000},
88 // REVERB_PRESET_LARGEROOM
89 {-400, -600, 1500, 830, -1600, 5, -1000, 40, 1000, 1000},
90 // REVERB_PRESET_MEDIUMHALL
91 {-400, -600, 1800, 700, -1300, 15, -800, 30, 1000, 1000},
92 // REVERB_PRESET_LARGEHALL
93 {-400, -600, 1800, 700, -2000, 30, -1400, 60, 1000, 1000},
94 // REVERB_PRESET_PLATE
95 {-400, -200, 1300, 900, 0, 2, 0, 10, 1000, 750},
96};
97
98
99void reverb_auxiliary_init(reverb_context_t *context)
100{
101 context->auxiliary = true;
102 context->preset = false;
103}
104
105void reverb_preset_init(reverb_context_t *context)
106{
107 context->auxiliary = false;
108 context->preset = true;
109 context->cur_preset = REVERB_PRESET_LAST + 1;
110 context->next_preset = REVERB_DEFAULT_PRESET;
111}
112
113/*
114 * Reverb operations
115 */
116int16_t reverb_get_room_level(reverb_context_t *context)
117{
118 ALOGV("%s: room level: %d", __func__, context->reverb_settings.roomLevel);
119 return context->reverb_settings.roomLevel;
120}
121
122void reverb_set_room_level(reverb_context_t *context, int16_t room_level)
123{
124 ALOGV("%s: room level: %d", __func__, room_level);
125 context->reverb_settings.roomLevel = room_level;
126 offload_reverb_set_room_level(&(context->offload_reverb), room_level);
127 if (context->ctl)
128 offload_reverb_send_params(context->ctl, context->offload_reverb,
129 OFFLOAD_SEND_REVERB_ENABLE_FLAG |
130 OFFLOAD_SEND_REVERB_ROOM_LEVEL);
131}
132
133int16_t reverb_get_room_hf_level(reverb_context_t *context)
134{
135 ALOGV("%s: room hf level: %d", __func__,
136 context->reverb_settings.roomHFLevel);
137 return context->reverb_settings.roomHFLevel;
138}
139
140void reverb_set_room_hf_level(reverb_context_t *context, int16_t room_hf_level)
141{
142 ALOGV("%s: room hf level: %d", __func__, room_hf_level);
143 context->reverb_settings.roomHFLevel = room_hf_level;
144 offload_reverb_set_room_hf_level(&(context->offload_reverb), room_hf_level);
145 if (context->ctl)
146 offload_reverb_send_params(context->ctl, context->offload_reverb,
147 OFFLOAD_SEND_REVERB_ENABLE_FLAG |
148 OFFLOAD_SEND_REVERB_ROOM_HF_LEVEL);
149}
150
151uint32_t reverb_get_decay_time(reverb_context_t *context)
152{
153 ALOGV("%s: decay time: %d", __func__, context->reverb_settings.decayTime);
154 return context->reverb_settings.decayTime;
155}
156
157void reverb_set_decay_time(reverb_context_t *context, uint32_t decay_time)
158{
159 ALOGV("%s: decay_time: %d", __func__, decay_time);
160 context->reverb_settings.decayTime = decay_time;
161 offload_reverb_set_decay_time(&(context->offload_reverb), decay_time);
162 if (context->ctl)
163 offload_reverb_send_params(context->ctl, context->offload_reverb,
164 OFFLOAD_SEND_REVERB_ENABLE_FLAG |
165 OFFLOAD_SEND_REVERB_DECAY_TIME);
166}
167
168int16_t reverb_get_decay_hf_ratio(reverb_context_t *context)
169{
170 ALOGV("%s: decay hf ratio: %d", __func__,
171 context->reverb_settings.decayHFRatio);
172 return context->reverb_settings.decayHFRatio;
173}
174
175void reverb_set_decay_hf_ratio(reverb_context_t *context, int16_t decay_hf_ratio)
176{
177 ALOGV("%s: decay_hf_ratio: %d", __func__, decay_hf_ratio);
178 context->reverb_settings.decayHFRatio = decay_hf_ratio;
179 offload_reverb_set_decay_hf_ratio(&(context->offload_reverb), decay_hf_ratio);
180 if (context->ctl)
181 offload_reverb_send_params(context->ctl, context->offload_reverb,
182 OFFLOAD_SEND_REVERB_ENABLE_FLAG |
183 OFFLOAD_SEND_REVERB_DECAY_HF_RATIO);
184}
185
186int16_t reverb_get_reverb_level(reverb_context_t *context)
187{
188 ALOGV("%s: reverb level: %d", __func__, context->reverb_settings.reverbLevel);
189 return context->reverb_settings.reverbLevel;
190}
191
192void reverb_set_reverb_level(reverb_context_t *context, int16_t reverb_level)
193{
194 ALOGV("%s: reverb level: %d", __func__, reverb_level);
195 context->reverb_settings.reverbLevel = reverb_level;
196 offload_reverb_set_reverb_level(&(context->offload_reverb), reverb_level);
197 if (context->ctl)
198 offload_reverb_send_params(context->ctl, context->offload_reverb,
199 OFFLOAD_SEND_REVERB_ENABLE_FLAG |
200 OFFLOAD_SEND_REVERB_LEVEL);
201}
202
203int16_t reverb_get_diffusion(reverb_context_t *context)
204{
205 ALOGV("%s: diffusion: %d", __func__, context->reverb_settings.diffusion);
206 return context->reverb_settings.diffusion;
207}
208
209void reverb_set_diffusion(reverb_context_t *context, int16_t diffusion)
210{
211 ALOGV("%s: diffusion: %d", __func__, diffusion);
212 context->reverb_settings.diffusion = diffusion;
213 offload_reverb_set_diffusion(&(context->offload_reverb), diffusion);
214 if (context->ctl)
215 offload_reverb_send_params(context->ctl, context->offload_reverb,
216 OFFLOAD_SEND_REVERB_ENABLE_FLAG |
217 OFFLOAD_SEND_REVERB_DIFFUSION);
218}
219
220int16_t reverb_get_density(reverb_context_t *context)
221{
222 ALOGV("%s: density: %d", __func__, context->reverb_settings.density);
223 return context->reverb_settings.density;
224}
225
226void reverb_set_density(reverb_context_t *context, int16_t density)
227{
228 ALOGV("%s: density: %d", __func__, density);
229 context->reverb_settings.density = density;
230 offload_reverb_set_density(&(context->offload_reverb), density);
231 if (context->ctl)
232 offload_reverb_send_params(context->ctl, context->offload_reverb,
233 OFFLOAD_SEND_REVERB_ENABLE_FLAG |
234 OFFLOAD_SEND_REVERB_DENSITY);
235}
236
237void reverb_set_preset(reverb_context_t *context, int16_t preset)
238{
wjiangb27e25f2014-01-22 13:24:26 +0800239 bool enable;
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -0800240 ALOGV("%s: preset: %d", __func__, preset);
241 context->next_preset = preset;
242 offload_reverb_set_preset(&(context->offload_reverb), preset);
wjiangb27e25f2014-01-22 13:24:26 +0800243
244 enable = (preset == REVERB_PRESET_NONE) ? false: true;
245 offload_reverb_set_enable_flag(&(context->offload_reverb), enable);
246
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -0800247 if (context->ctl)
248 offload_reverb_send_params(context->ctl, context->offload_reverb,
249 OFFLOAD_SEND_REVERB_ENABLE_FLAG |
250 OFFLOAD_SEND_REVERB_PRESET);
251}
252
253void reverb_set_all_properties(reverb_context_t *context,
254 reverb_settings_t *reverb_settings)
255{
256 ALOGV("%s", __func__);
257 context->reverb_settings.roomLevel = reverb_settings->roomLevel;
258 context->reverb_settings.roomHFLevel = reverb_settings->roomHFLevel;
259 context->reverb_settings.decayTime = reverb_settings->decayTime;
260 context->reverb_settings.decayHFRatio = reverb_settings->decayHFRatio;
261 context->reverb_settings.reverbLevel = reverb_settings->reverbLevel;
262 context->reverb_settings.diffusion = reverb_settings->diffusion;
263 context->reverb_settings.density = reverb_settings->density;
264 if (context->ctl)
265 offload_reverb_send_params(context->ctl, context->offload_reverb,
266 OFFLOAD_SEND_REVERB_ENABLE_FLAG |
267 OFFLOAD_SEND_REVERB_ROOM_LEVEL |
268 OFFLOAD_SEND_REVERB_ROOM_HF_LEVEL |
269 OFFLOAD_SEND_REVERB_DECAY_TIME |
270 OFFLOAD_SEND_REVERB_DECAY_HF_RATIO |
271 OFFLOAD_SEND_REVERB_LEVEL |
272 OFFLOAD_SEND_REVERB_DIFFUSION |
273 OFFLOAD_SEND_REVERB_DENSITY);
274}
275
276void reverb_load_preset(reverb_context_t *context)
277{
278 context->cur_preset = context->next_preset;
279
280 if (context->cur_preset != REVERB_PRESET_NONE) {
281 const reverb_settings_t *preset = &reverb_presets[context->cur_preset];
282 reverb_set_room_level(context, preset->roomLevel);
283 reverb_set_room_hf_level(context, preset->roomHFLevel);
284 reverb_set_decay_time(context, preset->decayTime);
285 reverb_set_decay_hf_ratio(context, preset->decayHFRatio);
286 reverb_set_reverb_level(context, preset->reverbLevel);
287 reverb_set_diffusion(context, preset->diffusion);
288 reverb_set_density(context, preset->density);
289 }
290}
291
292int reverb_get_parameter(effect_context_t *context, effect_param_t *p,
293 uint32_t *size)
294{
295 reverb_context_t *reverb_ctxt = (reverb_context_t *)context;
296 int voffset = ((p->psize - 1) / sizeof(int32_t) + 1) * sizeof(int32_t);
297 int32_t *param_tmp = (int32_t *)p->data;
298 int32_t param = *param_tmp++;
299 void *value = p->data + voffset;
300 reverb_settings_t *reverb_settings;
301 int i;
302
303 ALOGV("%s", __func__);
304
305 p->status = 0;
306
307 if (reverb_ctxt->preset) {
308 if (param != REVERB_PARAM_PRESET || p->vsize < sizeof(uint16_t))
309 return -EINVAL;
310 *(uint16_t *)value = reverb_ctxt->next_preset;
311 ALOGV("get REVERB_PARAM_PRESET, preset %d", reverb_ctxt->next_preset);
wjiangc37c2602014-03-24 23:43:09 +0800312 return 0;
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -0800313 }
314 switch (param) {
315 case REVERB_PARAM_ROOM_LEVEL:
316 if (p->vsize < sizeof(uint16_t))
317 p->status = -EINVAL;
318 p->vsize = sizeof(uint16_t);
319 break;
320 case REVERB_PARAM_ROOM_HF_LEVEL:
321 if (p->vsize < sizeof(uint16_t))
322 p->status = -EINVAL;
323 p->vsize = sizeof(uint16_t);
324 break;
325 case REVERB_PARAM_DECAY_TIME:
326 if (p->vsize < sizeof(uint32_t))
327 p->status = -EINVAL;
328 p->vsize = sizeof(uint32_t);
329 break;
330 case REVERB_PARAM_DECAY_HF_RATIO:
331 if (p->vsize < sizeof(uint16_t))
332 p->status = -EINVAL;
333 p->vsize = sizeof(uint16_t);
334 break;
335 case REVERB_PARAM_REFLECTIONS_LEVEL:
336 if (p->vsize < sizeof(uint16_t))
337 p->status = -EINVAL;
338 p->vsize = sizeof(uint16_t);
339 break;
340 case REVERB_PARAM_REFLECTIONS_DELAY:
341 if (p->vsize < sizeof(uint32_t))
342 p->status = -EINVAL;
343 p->vsize = sizeof(uint32_t);
344 break;
345 case REVERB_PARAM_REVERB_LEVEL:
346 if (p->vsize < sizeof(uint16_t))
347 p->status = -EINVAL;
348 p->vsize = sizeof(uint16_t);
349 break;
350 case REVERB_PARAM_REVERB_DELAY:
351 if (p->vsize < sizeof(uint32_t))
352 p->status = -EINVAL;
353 p->vsize = sizeof(uint32_t);
354 break;
355 case REVERB_PARAM_DIFFUSION:
356 if (p->vsize < sizeof(uint16_t))
357 p->status = -EINVAL;
358 p->vsize = sizeof(uint16_t);
359 break;
360 case REVERB_PARAM_DENSITY:
361 if (p->vsize < sizeof(uint16_t))
362 p->status = -EINVAL;
363 p->vsize = sizeof(uint16_t);
364 break;
365 case REVERB_PARAM_PROPERTIES:
366 if (p->vsize < sizeof(reverb_settings_t))
367 p->status = -EINVAL;
368 p->vsize = sizeof(reverb_settings_t);
369 break;
370 default:
371 p->status = -EINVAL;
372 }
373
374 *size = sizeof(effect_param_t) + voffset + p->vsize;
375
376 if (p->status != 0)
377 return 0;
378
379 switch (param) {
380 case REVERB_PARAM_PROPERTIES:
381 ALOGV("%s: REVERB_PARAM_PROPERTIES", __func__);
382 reverb_settings = (reverb_settings_t *)value;
383 reverb_settings->roomLevel = reverb_get_room_level(reverb_ctxt);
384 reverb_settings->roomHFLevel = reverb_get_room_hf_level(reverb_ctxt);
385 reverb_settings->decayTime = reverb_get_decay_time(reverb_ctxt);
386 reverb_settings->decayHFRatio = reverb_get_decay_hf_ratio(reverb_ctxt);
387 reverb_settings->reflectionsLevel = 0;
388 reverb_settings->reflectionsDelay = 0;
389 reverb_settings->reverbDelay = 0;
390 reverb_settings->reverbLevel = reverb_get_reverb_level(reverb_ctxt);
391 reverb_settings->diffusion = reverb_get_diffusion(reverb_ctxt);
392 reverb_settings->density = reverb_get_density(reverb_ctxt);
393 break;
394 case REVERB_PARAM_ROOM_LEVEL:
395 ALOGV("%s: REVERB_PARAM_ROOM_LEVEL", __func__);
396 *(int16_t *)value = reverb_get_room_level(reverb_ctxt);
397 break;
398 case REVERB_PARAM_ROOM_HF_LEVEL:
399 ALOGV("%s: REVERB_PARAM_ROOM_HF_LEVEL", __func__);
400 *(int16_t *)value = reverb_get_room_hf_level(reverb_ctxt);
401 break;
402 case REVERB_PARAM_DECAY_TIME:
403 ALOGV("%s: REVERB_PARAM_DECAY_TIME", __func__);
404 *(uint32_t *)value = reverb_get_decay_time(reverb_ctxt);
405 break;
406 case REVERB_PARAM_DECAY_HF_RATIO:
407 ALOGV("%s: REVERB_PARAM_DECAY_HF_RATIO", __func__);
408 *(int16_t *)value = reverb_get_decay_hf_ratio(reverb_ctxt);
409 break;
410 case REVERB_PARAM_REVERB_LEVEL:
411 ALOGV("%s: REVERB_PARAM_REVERB_LEVEL", __func__);
412 *(int16_t *)value = reverb_get_reverb_level(reverb_ctxt);
413 break;
414 case REVERB_PARAM_DIFFUSION:
415 ALOGV("%s: REVERB_PARAM_DIFFUSION", __func__);
416 *(int16_t *)value = reverb_get_diffusion(reverb_ctxt);
417 break;
418 case REVERB_PARAM_DENSITY:
419 ALOGV("%s: REVERB_PARAM_DENSITY", __func__);
420 *(int16_t *)value = reverb_get_density(reverb_ctxt);
421 break;
422 case REVERB_PARAM_REFLECTIONS_LEVEL:
423 ALOGV("%s: REVERB_PARAM_REFLECTIONS_LEVEL", __func__);
424 *(uint16_t *)value = 0;
425 break;
426 case REVERB_PARAM_REFLECTIONS_DELAY:
427 ALOGV("%s: REVERB_PARAM_REFLECTIONS_DELAY", __func__);
428 *(uint32_t *)value = 0;
429 break;
430 case REVERB_PARAM_REVERB_DELAY:
431 ALOGV("%s: REVERB_PARAM_REVERB_DELAY", __func__);
432 *(uint32_t *)value = 0;
433 break;
434 default:
435 p->status = -EINVAL;
436 break;
437 }
438
439 return 0;
440}
441
442int reverb_set_parameter(effect_context_t *context, effect_param_t *p,
443 uint32_t size)
444{
445 reverb_context_t *reverb_ctxt = (reverb_context_t *)context;
446 int voffset = ((p->psize - 1) / sizeof(int32_t) + 1) * sizeof(int32_t);
447 void *value = p->data + voffset;
448 int32_t *param_tmp = (int32_t *)p->data;
449 int32_t param = *param_tmp++;
450 reverb_settings_t *reverb_settings;
451 int16_t level;
452 int16_t ratio;
453 uint32_t time;
454
455 ALOGV("%s", __func__);
456
457 p->status = 0;
458
459 if (reverb_ctxt->preset) {
460 if (param != REVERB_PARAM_PRESET)
461 return -EINVAL;
462 uint16_t preset = *(uint16_t *)value;
463 ALOGV("set REVERB_PARAM_PRESET, preset %d", preset);
464 if (preset > REVERB_PRESET_LAST) {
465 return -EINVAL;
466 }
467 reverb_set_preset(reverb_ctxt, preset);
wjiangc37c2602014-03-24 23:43:09 +0800468 return 0;
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -0800469 }
470 switch (param) {
471 case REVERB_PARAM_PROPERTIES:
472 ALOGV("%s: REVERB_PARAM_PROPERTIES", __func__);
473 reverb_settings = (reverb_settings_t *)value;
474 break;
475 case REVERB_PARAM_ROOM_LEVEL:
476 ALOGV("%s: REVERB_PARAM_ROOM_LEVEL", __func__);
477 level = *(int16_t *)value;
478 reverb_set_room_level(reverb_ctxt, level);
479 break;
480 case REVERB_PARAM_ROOM_HF_LEVEL:
481 ALOGV("%s: REVERB_PARAM_ROOM_HF_LEVEL", __func__);
482 level = *(int16_t *)value;
483 reverb_set_room_hf_level(reverb_ctxt, level);
484 break;
485 case REVERB_PARAM_DECAY_TIME:
486 ALOGV("%s: REVERB_PARAM_DECAY_TIME", __func__);
487 time = *(uint32_t *)value;
488 reverb_set_decay_time(reverb_ctxt, time);
489 break;
490 case REVERB_PARAM_DECAY_HF_RATIO:
491 ALOGV("%s: REVERB_PARAM_DECAY_HF_RATIO", __func__);
492 ratio = *(int16_t *)value;
493 reverb_set_decay_hf_ratio(reverb_ctxt, ratio);
494 break;
495 case REVERB_PARAM_REVERB_LEVEL:
496 ALOGV("%s: REVERB_PARAM_REVERB_LEVEL", __func__);
497 level = *(int16_t *)value;
498 reverb_set_reverb_level(reverb_ctxt, level);
499 break;
500 case REVERB_PARAM_DIFFUSION:
501 ALOGV("%s: REVERB_PARAM_DIFFUSION", __func__);
502 ratio = *(int16_t *)value;
503 reverb_set_diffusion(reverb_ctxt, ratio);
504 break;
505 case REVERB_PARAM_DENSITY:
506 ALOGV("%s: REVERB_PARAM_DENSITY", __func__);
507 ratio = *(int16_t *)value;
508 reverb_set_density(reverb_ctxt, ratio);
509 break;
510 case REVERB_PARAM_REFLECTIONS_LEVEL:
511 case REVERB_PARAM_REFLECTIONS_DELAY:
512 case REVERB_PARAM_REVERB_DELAY:
513 break;
514 default:
515 p->status = -EINVAL;
516 break;
517 }
518
519 return 0;
520}
521
522int reverb_set_device(effect_context_t *context, uint32_t device)
523{
524 reverb_context_t *reverb_ctxt = (reverb_context_t *)context;
525
526 ALOGV("%s: device: %d", __func__, device);
527 reverb_ctxt->device = device;
528 offload_reverb_set_device(&(reverb_ctxt->offload_reverb), device);
529 return 0;
530}
531
532int reverb_reset(effect_context_t *context)
533{
534 reverb_context_t *reverb_ctxt = (reverb_context_t *)context;
535
536 return 0;
537}
538
539int reverb_init(effect_context_t *context)
540{
541 reverb_context_t *reverb_ctxt = (reverb_context_t *)context;
542
543 context->config.inputCfg.accessMode = EFFECT_BUFFER_ACCESS_READ;
544 /*
545 FIXME: channel mode is mono for auxiliary. is it needed for offload ?
546 If so, this set config needs to be updated accordingly
547 */
548 context->config.inputCfg.channels = AUDIO_CHANNEL_OUT_STEREO;
549 context->config.inputCfg.format = AUDIO_FORMAT_PCM_16_BIT;
550 context->config.inputCfg.samplingRate = 44100;
551 context->config.inputCfg.bufferProvider.getBuffer = NULL;
552 context->config.inputCfg.bufferProvider.releaseBuffer = NULL;
553 context->config.inputCfg.bufferProvider.cookie = NULL;
554 context->config.inputCfg.mask = EFFECT_CONFIG_ALL;
555 context->config.outputCfg.accessMode = EFFECT_BUFFER_ACCESS_ACCUMULATE;
556 context->config.outputCfg.channels = AUDIO_CHANNEL_OUT_STEREO;
557 context->config.outputCfg.format = AUDIO_FORMAT_PCM_16_BIT;
558 context->config.outputCfg.samplingRate = 44100;
559 context->config.outputCfg.bufferProvider.getBuffer = NULL;
560 context->config.outputCfg.bufferProvider.releaseBuffer = NULL;
561 context->config.outputCfg.bufferProvider.cookie = NULL;
562 context->config.outputCfg.mask = EFFECT_CONFIG_ALL;
563
564 set_config(context, &context->config);
565
566 memset(&(reverb_ctxt->reverb_settings), 0, sizeof(reverb_settings_t));
567 memset(&(reverb_ctxt->offload_reverb), 0, sizeof(struct reverb_params));
568
569 if (reverb_ctxt->preset &&
570 reverb_ctxt->next_preset != reverb_ctxt->cur_preset)
571 reverb_load_preset(reverb_ctxt);
572
573 return 0;
574}
575
576int reverb_enable(effect_context_t *context)
577{
578 reverb_context_t *reverb_ctxt = (reverb_context_t *)context;
579
580 ALOGV("%s", __func__);
581
582 if (!offload_reverb_get_enable_flag(&(reverb_ctxt->offload_reverb)))
583 offload_reverb_set_enable_flag(&(reverb_ctxt->offload_reverb), true);
584 return 0;
585}
586
587int reverb_disable(effect_context_t *context)
588{
589 reverb_context_t *reverb_ctxt = (reverb_context_t *)context;
590
591 ALOGV("%s", __func__);
592 if (offload_reverb_get_enable_flag(&(reverb_ctxt->offload_reverb))) {
593 offload_reverb_set_enable_flag(&(reverb_ctxt->offload_reverb), false);
594 if (reverb_ctxt->ctl)
595 offload_reverb_send_params(reverb_ctxt->ctl,
596 reverb_ctxt->offload_reverb,
597 OFFLOAD_SEND_REVERB_ENABLE_FLAG);
598 }
599 return 0;
600}
601
602int reverb_start(effect_context_t *context, output_context_t *output)
603{
604 reverb_context_t *reverb_ctxt = (reverb_context_t *)context;
605
606 ALOGV("%s", __func__);
607 reverb_ctxt->ctl = output->ctl;
wjiangc37c2602014-03-24 23:43:09 +0800608 if (offload_reverb_get_enable_flag(&(reverb_ctxt->offload_reverb))) {
609 if (reverb_ctxt->ctl && reverb_ctxt->preset) {
610 offload_reverb_send_params(reverb_ctxt->ctl, reverb_ctxt->offload_reverb,
611 OFFLOAD_SEND_REVERB_ENABLE_FLAG |
612 OFFLOAD_SEND_REVERB_PRESET);
613 }
614 }
615
Subhash Chandra Bose Naripeddy3eedc002013-11-12 20:45:15 -0800616 return 0;
617}
618
619int reverb_stop(effect_context_t *context, output_context_t *output)
620{
621 reverb_context_t *reverb_ctxt = (reverb_context_t *)context;
622
623 ALOGV("%s", __func__);
624 reverb_ctxt->ctl = NULL;
625 return 0;
626}
627