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