1/* 2 * Copyright (C) 2010-2010 NXP Software 3 * Copyright (C) 2009 The Android Open Source Project 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18#define LOG_TAG "Reverb" 19#define ARRAY_SIZE(array) (sizeof array / sizeof array[0]) 20//#define LOG_NDEBUG 0 21 22#include <assert.h> 23#include <inttypes.h> 24#include <new> 25#include <stdlib.h> 26#include <string.h> 27 28#include <cutils/log.h> 29#include "EffectReverb.h" 30// from Reverb/lib 31#include "LVREV.h" 32 33// effect_handle_t interface implementation for reverb 34extern "C" const struct effect_interface_s gReverbInterface; 35 36#define LVM_ERROR_CHECK(LvmStatus, callingFunc, calledFunc){\ 37 if (LvmStatus == LVREV_NULLADDRESS){\ 38 ALOGV("\tLVREV_ERROR : Parameter error - "\ 39 "null pointer returned by %s in %s\n\n\n\n", callingFunc, calledFunc);\ 40 }\ 41 if (LvmStatus == LVREV_INVALIDNUMSAMPLES){\ 42 ALOGV("\tLVREV_ERROR : Parameter error - "\ 43 "bad number of samples returned by %s in %s\n\n\n\n", callingFunc, calledFunc);\ 44 }\ 45 if (LvmStatus == LVREV_OUTOFRANGE){\ 46 ALOGV("\tLVREV_ERROR : Parameter error - "\ 47 "out of range returned by %s in %s\n", callingFunc, calledFunc);\ 48 }\ 49 } 50 51// Namespaces 52namespace android { 53namespace { 54 55/************************************************************************************/ 56/* */ 57/* Preset definitions */ 58/* */ 59/************************************************************************************/ 60 61const static t_reverb_settings sReverbPresets[] = { 62 // REVERB_PRESET_NONE: values are unused 63 {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 64 // REVERB_PRESET_SMALLROOM 65 {-400, -600, 1100, 830, -400, 5, 500, 10, 1000, 1000}, 66 // REVERB_PRESET_MEDIUMROOM 67 {-400, -600, 1300, 830, -1000, 20, -200, 20, 1000, 1000}, 68 // REVERB_PRESET_LARGEROOM 69 {-400, -600, 1500, 830, -1600, 5, -1000, 40, 1000, 1000}, 70 // REVERB_PRESET_MEDIUMHALL 71 {-400, -600, 1800, 700, -1300, 15, -800, 30, 1000, 1000}, 72 // REVERB_PRESET_LARGEHALL 73 {-400, -600, 1800, 700, -2000, 30, -1400, 60, 1000, 1000}, 74 // REVERB_PRESET_PLATE 75 {-400, -200, 1300, 900, 0, 2, 0, 10, 1000, 750}, 76}; 77 78 79// NXP SW auxiliary environmental reverb 80const effect_descriptor_t gAuxEnvReverbDescriptor = { 81 { 0xc2e5d5f0, 0x94bd, 0x4763, 0x9cac, { 0x4e, 0x23, 0x4d, 0x06, 0x83, 0x9e } }, 82 { 0x4a387fc0, 0x8ab3, 0x11df, 0x8bad, { 0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b } }, 83 EFFECT_CONTROL_API_VERSION, 84 EFFECT_FLAG_TYPE_AUXILIARY, 85 LVREV_CUP_LOAD_ARM9E, 86 LVREV_MEM_USAGE, 87 "Auxiliary Environmental Reverb", 88 "NXP Software Ltd.", 89}; 90 91// NXP SW insert environmental reverb 92static const effect_descriptor_t gInsertEnvReverbDescriptor = { 93 {0xc2e5d5f0, 0x94bd, 0x4763, 0x9cac, {0x4e, 0x23, 0x4d, 0x06, 0x83, 0x9e}}, 94 {0xc7a511a0, 0xa3bb, 0x11df, 0x860e, {0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}}, 95 EFFECT_CONTROL_API_VERSION, 96 EFFECT_FLAG_TYPE_INSERT | EFFECT_FLAG_INSERT_FIRST | EFFECT_FLAG_VOLUME_CTRL, 97 LVREV_CUP_LOAD_ARM9E, 98 LVREV_MEM_USAGE, 99 "Insert Environmental Reverb", 100 "NXP Software Ltd.", 101}; 102 103// NXP SW auxiliary preset reverb 104static const effect_descriptor_t gAuxPresetReverbDescriptor = { 105 {0x47382d60, 0xddd8, 0x11db, 0xbf3a, {0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}}, 106 {0xf29a1400, 0xa3bb, 0x11df, 0x8ddc, {0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}}, 107 EFFECT_CONTROL_API_VERSION, 108 EFFECT_FLAG_TYPE_AUXILIARY, 109 LVREV_CUP_LOAD_ARM9E, 110 LVREV_MEM_USAGE, 111 "Auxiliary Preset Reverb", 112 "NXP Software Ltd.", 113}; 114 115// NXP SW insert preset reverb 116static const effect_descriptor_t gInsertPresetReverbDescriptor = { 117 {0x47382d60, 0xddd8, 0x11db, 0xbf3a, {0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}}, 118 {0x172cdf00, 0xa3bc, 0x11df, 0xa72f, {0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}}, 119 EFFECT_CONTROL_API_VERSION, 120 EFFECT_FLAG_TYPE_INSERT | EFFECT_FLAG_INSERT_FIRST | EFFECT_FLAG_VOLUME_CTRL, 121 LVREV_CUP_LOAD_ARM9E, 122 LVREV_MEM_USAGE, 123 "Insert Preset Reverb", 124 "NXP Software Ltd.", 125}; 126 127// gDescriptors contains pointers to all defined effect descriptor in this library 128static const effect_descriptor_t * const gDescriptors[] = { 129 &gAuxEnvReverbDescriptor, 130 &gInsertEnvReverbDescriptor, 131 &gAuxPresetReverbDescriptor, 132 &gInsertPresetReverbDescriptor 133}; 134 135struct ReverbContext{ 136 const struct effect_interface_s *itfe; 137 effect_config_t config; 138 LVREV_Handle_t hInstance; 139 int16_t SavedRoomLevel; 140 int16_t SavedHfLevel; 141 int16_t SavedDecayTime; 142 int16_t SavedDecayHfRatio; 143 int16_t SavedReverbLevel; 144 int16_t SavedDiffusion; 145 int16_t SavedDensity; 146 bool bEnabled; 147 #ifdef LVM_PCM 148 FILE *PcmInPtr; 149 FILE *PcmOutPtr; 150 #endif 151 LVM_Fs_en SampleRate; 152 LVM_INT32 *InFrames32; 153 LVM_INT32 *OutFrames32; 154 bool auxiliary; 155 bool preset; 156 uint16_t curPreset; 157 uint16_t nextPreset; 158 int SamplesToExitCount; 159 LVM_INT16 leftVolume; 160 LVM_INT16 rightVolume; 161 LVM_INT16 prevLeftVolume; 162 LVM_INT16 prevRightVolume; 163 int volumeMode; 164}; 165 166enum { 167 REVERB_VOLUME_OFF, 168 REVERB_VOLUME_FLAT, 169 REVERB_VOLUME_RAMP, 170}; 171 172#define REVERB_DEFAULT_PRESET REVERB_PRESET_NONE 173 174 175#define REVERB_SEND_LEVEL (0x0C00) // 0.75 in 4.12 format 176#define REVERB_UNIT_VOLUME (0x1000) // 1.0 in 4.12 format 177 178//--- local function prototypes 179int Reverb_init (ReverbContext *pContext); 180void Reverb_free (ReverbContext *pContext); 181int Reverb_setConfig (ReverbContext *pContext, effect_config_t *pConfig); 182void Reverb_getConfig (ReverbContext *pContext, effect_config_t *pConfig); 183int Reverb_setParameter (ReverbContext *pContext, void *pParam, void *pValue, int vsize); 184int Reverb_getParameter (ReverbContext *pContext, 185 void *pParam, 186 uint32_t *pValueSize, 187 void *pValue); 188int Reverb_LoadPreset (ReverbContext *pContext); 189int Reverb_paramValueSize (int32_t param); 190 191/* Effect Library Interface Implementation */ 192 193extern "C" int EffectCreate(const effect_uuid_t *uuid, 194 int32_t sessionId __unused, 195 int32_t ioId __unused, 196 effect_handle_t *pHandle){ 197 int ret; 198 int i; 199 int length = sizeof(gDescriptors) / sizeof(const effect_descriptor_t *); 200 const effect_descriptor_t *desc; 201 202 ALOGV("\t\nEffectCreate start"); 203 204 if (pHandle == NULL || uuid == NULL){ 205 ALOGV("\tLVM_ERROR : EffectCreate() called with NULL pointer"); 206 return -EINVAL; 207 } 208 209 for (i = 0; i < length; i++) { 210 desc = gDescriptors[i]; 211 if (memcmp(uuid, &desc->uuid, sizeof(effect_uuid_t)) 212 == 0) { 213 ALOGV("\tEffectCreate - UUID matched Reverb type %d, UUID = %x", i, desc->uuid.timeLow); 214 break; 215 } 216 } 217 218 if (i == length) { 219 return -ENOENT; 220 } 221 222 ReverbContext *pContext = new ReverbContext; 223 224 pContext->itfe = &gReverbInterface; 225 pContext->hInstance = NULL; 226 227 pContext->auxiliary = false; 228 if ((desc->flags & EFFECT_FLAG_TYPE_MASK) == EFFECT_FLAG_TYPE_AUXILIARY){ 229 pContext->auxiliary = true; 230 ALOGV("\tEffectCreate - AUX"); 231 }else{ 232 ALOGV("\tEffectCreate - INS"); 233 } 234 235 pContext->preset = false; 236 if (memcmp(&desc->type, SL_IID_PRESETREVERB, sizeof(effect_uuid_t)) == 0) { 237 pContext->preset = true; 238 // force reloading preset at first call to process() 239 pContext->curPreset = REVERB_PRESET_LAST + 1; 240 pContext->nextPreset = REVERB_DEFAULT_PRESET; 241 ALOGV("\tEffectCreate - PRESET"); 242 }else{ 243 ALOGV("\tEffectCreate - ENVIRONMENTAL"); 244 } 245 246 ALOGV("\tEffectCreate - Calling Reverb_init"); 247 ret = Reverb_init(pContext); 248 249 if (ret < 0){ 250 ALOGV("\tLVM_ERROR : EffectCreate() init failed"); 251 delete pContext; 252 return ret; 253 } 254 255 *pHandle = (effect_handle_t)pContext; 256 257 #ifdef LVM_PCM 258 pContext->PcmInPtr = NULL; 259 pContext->PcmOutPtr = NULL; 260 261 pContext->PcmInPtr = fopen("/data/tmp/reverb_pcm_in.pcm", "w"); 262 pContext->PcmOutPtr = fopen("/data/tmp/reverb_pcm_out.pcm", "w"); 263 264 if((pContext->PcmInPtr == NULL)|| 265 (pContext->PcmOutPtr == NULL)){ 266 return -EINVAL; 267 } 268 #endif 269 270 271 // Allocate memory for reverb process (*2 is for STEREO) 272 pContext->InFrames32 = (LVM_INT32 *)malloc(LVREV_MAX_FRAME_SIZE * sizeof(LVM_INT32) * 2); 273 pContext->OutFrames32 = (LVM_INT32 *)malloc(LVREV_MAX_FRAME_SIZE * sizeof(LVM_INT32) * 2); 274 275 ALOGV("\tEffectCreate %p, size %zu", pContext, sizeof(ReverbContext)); 276 ALOGV("\tEffectCreate end\n"); 277 return 0; 278} /* end EffectCreate */ 279 280extern "C" int EffectRelease(effect_handle_t handle){ 281 ReverbContext * pContext = (ReverbContext *)handle; 282 283 ALOGV("\tEffectRelease %p", handle); 284 if (pContext == NULL){ 285 ALOGV("\tLVM_ERROR : EffectRelease called with NULL pointer"); 286 return -EINVAL; 287 } 288 289 #ifdef LVM_PCM 290 fclose(pContext->PcmInPtr); 291 fclose(pContext->PcmOutPtr); 292 #endif 293 free(pContext->InFrames32); 294 free(pContext->OutFrames32); 295 Reverb_free(pContext); 296 delete pContext; 297 return 0; 298} /* end EffectRelease */ 299 300extern "C" int EffectGetDescriptor(const effect_uuid_t *uuid, 301 effect_descriptor_t *pDescriptor) { 302 int i; 303 int length = sizeof(gDescriptors) / sizeof(const effect_descriptor_t *); 304 305 if (pDescriptor == NULL || uuid == NULL){ 306 ALOGV("EffectGetDescriptor() called with NULL pointer"); 307 return -EINVAL; 308 } 309 310 for (i = 0; i < length; i++) { 311 if (memcmp(uuid, &gDescriptors[i]->uuid, sizeof(effect_uuid_t)) == 0) { 312 *pDescriptor = *gDescriptors[i]; 313 ALOGV("EffectGetDescriptor - UUID matched Reverb type %d, UUID = %x", 314 i, gDescriptors[i]->uuid.timeLow); 315 return 0; 316 } 317 } 318 319 return -EINVAL; 320} /* end EffectGetDescriptor */ 321 322/* local functions */ 323#define CHECK_ARG(cond) { \ 324 if (!(cond)) { \ 325 ALOGV("\tLVM_ERROR : Invalid argument: "#cond); \ 326 return -EINVAL; \ 327 } \ 328} 329 330//---------------------------------------------------------------------------- 331// MonoTo2I_32() 332//---------------------------------------------------------------------------- 333// Purpose: 334// Convert MONO to STEREO 335// 336//---------------------------------------------------------------------------- 337 338void MonoTo2I_32( const LVM_INT32 *src, 339 LVM_INT32 *dst, 340 LVM_INT16 n) 341{ 342 LVM_INT16 ii; 343 src += (n-1); 344 dst += ((n*2)-1); 345 346 for (ii = n; ii != 0; ii--) 347 { 348 *dst = *src; 349 dst--; 350 351 *dst = *src; 352 dst--; 353 src--; 354 } 355 356 return; 357} 358 359//---------------------------------------------------------------------------- 360// From2iToMono_32() 361//---------------------------------------------------------------------------- 362// Purpose: 363// Convert STEREO to MONO 364// 365//---------------------------------------------------------------------------- 366 367void From2iToMono_32( const LVM_INT32 *src, 368 LVM_INT32 *dst, 369 LVM_INT16 n) 370{ 371 LVM_INT16 ii; 372 LVM_INT32 Temp; 373 374 for (ii = n; ii != 0; ii--) 375 { 376 Temp = (*src>>1); 377 src++; 378 379 Temp +=(*src>>1); 380 src++; 381 382 *dst = Temp; 383 dst++; 384 } 385 386 return; 387} 388 389static inline int16_t clamp16(int32_t sample) 390{ 391 if ((sample>>15) ^ (sample>>31)) 392 sample = 0x7FFF ^ (sample>>31); 393 return sample; 394} 395 396//---------------------------------------------------------------------------- 397// process() 398//---------------------------------------------------------------------------- 399// Purpose: 400// Apply the Reverb 401// 402// Inputs: 403// pIn: pointer to stereo/mono 16 bit input data 404// pOut: pointer to stereo 16 bit output data 405// frameCount: Frames to process 406// pContext: effect engine context 407// strength strength to be applied 408// 409// Outputs: 410// pOut: pointer to updated stereo 16 bit output data 411// 412//---------------------------------------------------------------------------- 413 414int process( LVM_INT16 *pIn, 415 LVM_INT16 *pOut, 416 int frameCount, 417 ReverbContext *pContext){ 418 419 LVM_INT16 samplesPerFrame = 1; 420 LVREV_ReturnStatus_en LvmStatus = LVREV_SUCCESS; /* Function call status */ 421 LVM_INT16 *OutFrames16; 422 423 424 // Check that the input is either mono or stereo 425 if (pContext->config.inputCfg.channels == AUDIO_CHANNEL_OUT_STEREO) { 426 samplesPerFrame = 2; 427 } else if (pContext->config.inputCfg.channels != AUDIO_CHANNEL_OUT_MONO) { 428 ALOGV("\tLVREV_ERROR : process invalid PCM format"); 429 return -EINVAL; 430 } 431 432 OutFrames16 = (LVM_INT16 *)pContext->OutFrames32; 433 434 // Check for NULL pointers 435 if((pContext->InFrames32 == NULL)||(pContext->OutFrames32 == NULL)){ 436 ALOGV("\tLVREV_ERROR : process failed to allocate memory for temporary buffers "); 437 return -EINVAL; 438 } 439 440 #ifdef LVM_PCM 441 fwrite(pIn, frameCount*sizeof(LVM_INT16)*samplesPerFrame, 1, pContext->PcmInPtr); 442 fflush(pContext->PcmInPtr); 443 #endif 444 445 if (pContext->preset && pContext->nextPreset != pContext->curPreset) { 446 Reverb_LoadPreset(pContext); 447 } 448 449 450 451 // Convert to Input 32 bits 452 if (pContext->auxiliary) { 453 for(int i=0; i<frameCount*samplesPerFrame; i++){ 454 pContext->InFrames32[i] = (LVM_INT32)pIn[i]<<8; 455 } 456 } else { 457 // insert reverb input is always stereo 458 for (int i = 0; i < frameCount; i++) { 459 pContext->InFrames32[2*i] = (pIn[2*i] * REVERB_SEND_LEVEL) >> 4; // <<8 + >>12 460 pContext->InFrames32[2*i+1] = (pIn[2*i+1] * REVERB_SEND_LEVEL) >> 4; // <<8 + >>12 461 } 462 } 463 464 if (pContext->preset && pContext->curPreset == REVERB_PRESET_NONE) { 465 memset(pContext->OutFrames32, 0, frameCount * sizeof(LVM_INT32) * 2); //always stereo here 466 } else { 467 if(pContext->bEnabled == LVM_FALSE && pContext->SamplesToExitCount > 0) { 468 memset(pContext->InFrames32,0,frameCount * sizeof(LVM_INT32) * samplesPerFrame); 469 ALOGV("\tZeroing %d samples per frame at the end of call", samplesPerFrame); 470 } 471 472 /* Process the samples, producing a stereo output */ 473 LvmStatus = LVREV_Process(pContext->hInstance, /* Instance handle */ 474 pContext->InFrames32, /* Input buffer */ 475 pContext->OutFrames32, /* Output buffer */ 476 frameCount); /* Number of samples to read */ 477 } 478 479 LVM_ERROR_CHECK(LvmStatus, "LVREV_Process", "process") 480 if(LvmStatus != LVREV_SUCCESS) return -EINVAL; 481 482 // Convert to 16 bits 483 if (pContext->auxiliary) { 484 for (int i=0; i < frameCount*2; i++) { //always stereo here 485 OutFrames16[i] = clamp16(pContext->OutFrames32[i]>>8); 486 } 487 } else { 488 for (int i=0; i < frameCount*2; i++) { //always stereo here 489 OutFrames16[i] = clamp16((pContext->OutFrames32[i]>>8) + (LVM_INT32)pIn[i]); 490 } 491 492 // apply volume with ramp if needed 493 if ((pContext->leftVolume != pContext->prevLeftVolume || 494 pContext->rightVolume != pContext->prevRightVolume) && 495 pContext->volumeMode == REVERB_VOLUME_RAMP) { 496 LVM_INT32 vl = (LVM_INT32)pContext->prevLeftVolume << 16; 497 LVM_INT32 incl = (((LVM_INT32)pContext->leftVolume << 16) - vl) / frameCount; 498 LVM_INT32 vr = (LVM_INT32)pContext->prevRightVolume << 16; 499 LVM_INT32 incr = (((LVM_INT32)pContext->rightVolume << 16) - vr) / frameCount; 500 501 for (int i = 0; i < frameCount; i++) { 502 OutFrames16[2*i] = 503 clamp16((LVM_INT32)((vl >> 16) * OutFrames16[2*i]) >> 12); 504 OutFrames16[2*i+1] = 505 clamp16((LVM_INT32)((vr >> 16) * OutFrames16[2*i+1]) >> 12); 506 507 vl += incl; 508 vr += incr; 509 } 510 511 pContext->prevLeftVolume = pContext->leftVolume; 512 pContext->prevRightVolume = pContext->rightVolume; 513 } else if (pContext->volumeMode != REVERB_VOLUME_OFF) { 514 if (pContext->leftVolume != REVERB_UNIT_VOLUME || 515 pContext->rightVolume != REVERB_UNIT_VOLUME) { 516 for (int i = 0; i < frameCount; i++) { 517 OutFrames16[2*i] = 518 clamp16((LVM_INT32)(pContext->leftVolume * OutFrames16[2*i]) >> 12); 519 OutFrames16[2*i+1] = 520 clamp16((LVM_INT32)(pContext->rightVolume * OutFrames16[2*i+1]) >> 12); 521 } 522 } 523 pContext->prevLeftVolume = pContext->leftVolume; 524 pContext->prevRightVolume = pContext->rightVolume; 525 pContext->volumeMode = REVERB_VOLUME_RAMP; 526 } 527 } 528 529 #ifdef LVM_PCM 530 fwrite(OutFrames16, frameCount*sizeof(LVM_INT16)*2, 1, pContext->PcmOutPtr); 531 fflush(pContext->PcmOutPtr); 532 #endif 533 534 // Accumulate if required 535 if (pContext->config.outputCfg.accessMode == EFFECT_BUFFER_ACCESS_ACCUMULATE){ 536 //ALOGV("\tBuffer access is ACCUMULATE"); 537 for (int i=0; i<frameCount*2; i++){ //always stereo here 538 pOut[i] = clamp16((int32_t)pOut[i] + (int32_t)OutFrames16[i]); 539 } 540 }else{ 541 //ALOGV("\tBuffer access is WRITE"); 542 memcpy(pOut, OutFrames16, frameCount*sizeof(LVM_INT16)*2); 543 } 544 545 return 0; 546} /* end process */ 547 548//---------------------------------------------------------------------------- 549// Reverb_free() 550//---------------------------------------------------------------------------- 551// Purpose: Free all memory associated with the Bundle. 552// 553// Inputs: 554// pContext: effect engine context 555// 556// Outputs: 557// 558//---------------------------------------------------------------------------- 559 560void Reverb_free(ReverbContext *pContext){ 561 562 LVREV_ReturnStatus_en LvmStatus=LVREV_SUCCESS; /* Function call status */ 563 LVREV_ControlParams_st params; /* Control Parameters */ 564 LVREV_MemoryTable_st MemTab; 565 566 /* Free the algorithm memory */ 567 LvmStatus = LVREV_GetMemoryTable(pContext->hInstance, 568 &MemTab, 569 LVM_NULL); 570 571 LVM_ERROR_CHECK(LvmStatus, "LVM_GetMemoryTable", "Reverb_free") 572 573 for (int i=0; i<LVM_NR_MEMORY_REGIONS; i++){ 574 if (MemTab.Region[i].Size != 0){ 575 if (MemTab.Region[i].pBaseAddress != NULL){ 576 ALOGV("\tfree() - START freeing %" PRIu32 " bytes for region %u at %p\n", 577 MemTab.Region[i].Size, i, MemTab.Region[i].pBaseAddress); 578 579 free(MemTab.Region[i].pBaseAddress); 580 581 ALOGV("\tfree() - END freeing %" PRIu32 " bytes for region %u at %p\n", 582 MemTab.Region[i].Size, i, MemTab.Region[i].pBaseAddress); 583 }else{ 584 ALOGV("\tLVM_ERROR : free() - trying to free with NULL pointer %" PRIu32 " bytes " 585 "for region %u at %p ERROR\n", 586 MemTab.Region[i].Size, i, MemTab.Region[i].pBaseAddress); 587 } 588 } 589 } 590} /* end Reverb_free */ 591 592//---------------------------------------------------------------------------- 593// Reverb_setConfig() 594//---------------------------------------------------------------------------- 595// Purpose: Set input and output audio configuration. 596// 597// Inputs: 598// pContext: effect engine context 599// pConfig: pointer to effect_config_t structure holding input and output 600// configuration parameters 601// 602// Outputs: 603// 604//---------------------------------------------------------------------------- 605 606int Reverb_setConfig(ReverbContext *pContext, effect_config_t *pConfig){ 607 LVM_Fs_en SampleRate; 608 //ALOGV("\tReverb_setConfig start"); 609 610 CHECK_ARG(pContext != NULL); 611 CHECK_ARG(pConfig != NULL); 612 613 CHECK_ARG(pConfig->inputCfg.samplingRate == pConfig->outputCfg.samplingRate); 614 CHECK_ARG(pConfig->inputCfg.format == pConfig->outputCfg.format); 615 CHECK_ARG((pContext->auxiliary && pConfig->inputCfg.channels == AUDIO_CHANNEL_OUT_MONO) || 616 ((!pContext->auxiliary) && pConfig->inputCfg.channels == AUDIO_CHANNEL_OUT_STEREO)); 617 CHECK_ARG(pConfig->outputCfg.channels == AUDIO_CHANNEL_OUT_STEREO); 618 CHECK_ARG(pConfig->outputCfg.accessMode == EFFECT_BUFFER_ACCESS_WRITE 619 || pConfig->outputCfg.accessMode == EFFECT_BUFFER_ACCESS_ACCUMULATE); 620 CHECK_ARG(pConfig->inputCfg.format == AUDIO_FORMAT_PCM_16_BIT); 621 622 //ALOGV("\tReverb_setConfig calling memcpy"); 623 pContext->config = *pConfig; 624 625 626 switch (pConfig->inputCfg.samplingRate) { 627 case 8000: 628 SampleRate = LVM_FS_8000; 629 break; 630 case 16000: 631 SampleRate = LVM_FS_16000; 632 break; 633 case 22050: 634 SampleRate = LVM_FS_22050; 635 break; 636 case 32000: 637 SampleRate = LVM_FS_32000; 638 break; 639 case 44100: 640 SampleRate = LVM_FS_44100; 641 break; 642 case 48000: 643 SampleRate = LVM_FS_48000; 644 break; 645 default: 646 ALOGV("\rReverb_setConfig invalid sampling rate %d", pConfig->inputCfg.samplingRate); 647 return -EINVAL; 648 } 649 650 if (pContext->SampleRate != SampleRate) { 651 652 LVREV_ControlParams_st ActiveParams; 653 LVREV_ReturnStatus_en LvmStatus = LVREV_SUCCESS; 654 655 //ALOGV("\tReverb_setConfig change sampling rate to %d", SampleRate); 656 657 /* Get the current settings */ 658 LvmStatus = LVREV_GetControlParameters(pContext->hInstance, 659 &ActiveParams); 660 661 LVM_ERROR_CHECK(LvmStatus, "LVREV_GetControlParameters", "Reverb_setConfig") 662 if(LvmStatus != LVREV_SUCCESS) return -EINVAL; 663 664 ActiveParams.SampleRate = SampleRate; 665 666 LvmStatus = LVREV_SetControlParameters(pContext->hInstance, &ActiveParams); 667 668 LVM_ERROR_CHECK(LvmStatus, "LVREV_SetControlParameters", "Reverb_setConfig") 669 if(LvmStatus != LVREV_SUCCESS) return -EINVAL; 670 //ALOGV("\tReverb_setConfig Succesfully called LVREV_SetControlParameters\n"); 671 pContext->SampleRate = SampleRate; 672 }else{ 673 //ALOGV("\tReverb_setConfig keep sampling rate at %d", SampleRate); 674 } 675 676 //ALOGV("\tReverb_setConfig End"); 677 return 0; 678} /* end Reverb_setConfig */ 679 680//---------------------------------------------------------------------------- 681// Reverb_getConfig() 682//---------------------------------------------------------------------------- 683// Purpose: Get input and output audio configuration. 684// 685// Inputs: 686// pContext: effect engine context 687// pConfig: pointer to effect_config_t structure holding input and output 688// configuration parameters 689// 690// Outputs: 691// 692//---------------------------------------------------------------------------- 693 694void Reverb_getConfig(ReverbContext *pContext, effect_config_t *pConfig) 695{ 696 *pConfig = pContext->config; 697} /* end Reverb_getConfig */ 698 699//---------------------------------------------------------------------------- 700// Reverb_init() 701//---------------------------------------------------------------------------- 702// Purpose: Initialize engine with default configuration 703// 704// Inputs: 705// pContext: effect engine context 706// 707// Outputs: 708// 709//---------------------------------------------------------------------------- 710 711int Reverb_init(ReverbContext *pContext){ 712 int status; 713 714 ALOGV("\tReverb_init start"); 715 716 CHECK_ARG(pContext != NULL); 717 718 if (pContext->hInstance != NULL){ 719 Reverb_free(pContext); 720 } 721 722 pContext->config.inputCfg.accessMode = EFFECT_BUFFER_ACCESS_READ; 723 if (pContext->auxiliary) { 724 pContext->config.inputCfg.channels = AUDIO_CHANNEL_OUT_MONO; 725 } else { 726 pContext->config.inputCfg.channels = AUDIO_CHANNEL_OUT_STEREO; 727 } 728 729 pContext->config.inputCfg.format = AUDIO_FORMAT_PCM_16_BIT; 730 pContext->config.inputCfg.samplingRate = 44100; 731 pContext->config.inputCfg.bufferProvider.getBuffer = NULL; 732 pContext->config.inputCfg.bufferProvider.releaseBuffer = NULL; 733 pContext->config.inputCfg.bufferProvider.cookie = NULL; 734 pContext->config.inputCfg.mask = EFFECT_CONFIG_ALL; 735 pContext->config.outputCfg.accessMode = EFFECT_BUFFER_ACCESS_ACCUMULATE; 736 pContext->config.outputCfg.channels = AUDIO_CHANNEL_OUT_STEREO; 737 pContext->config.outputCfg.format = AUDIO_FORMAT_PCM_16_BIT; 738 pContext->config.outputCfg.samplingRate = 44100; 739 pContext->config.outputCfg.bufferProvider.getBuffer = NULL; 740 pContext->config.outputCfg.bufferProvider.releaseBuffer = NULL; 741 pContext->config.outputCfg.bufferProvider.cookie = NULL; 742 pContext->config.outputCfg.mask = EFFECT_CONFIG_ALL; 743 744 pContext->leftVolume = REVERB_UNIT_VOLUME; 745 pContext->rightVolume = REVERB_UNIT_VOLUME; 746 pContext->prevLeftVolume = REVERB_UNIT_VOLUME; 747 pContext->prevRightVolume = REVERB_UNIT_VOLUME; 748 pContext->volumeMode = REVERB_VOLUME_FLAT; 749 750 LVREV_ReturnStatus_en LvmStatus=LVREV_SUCCESS; /* Function call status */ 751 LVREV_ControlParams_st params; /* Control Parameters */ 752 LVREV_InstanceParams_st InstParams; /* Instance parameters */ 753 LVREV_MemoryTable_st MemTab; /* Memory allocation table */ 754 bool bMallocFailure = LVM_FALSE; 755 756 /* Set the capabilities */ 757 InstParams.MaxBlockSize = MAX_CALL_SIZE; 758 InstParams.SourceFormat = LVM_STEREO; // Max format, could be mono during process 759 InstParams.NumDelays = LVREV_DELAYLINES_4; 760 761 /* Allocate memory, forcing alignment */ 762 LvmStatus = LVREV_GetMemoryTable(LVM_NULL, 763 &MemTab, 764 &InstParams); 765 766 LVM_ERROR_CHECK(LvmStatus, "LVREV_GetMemoryTable", "Reverb_init") 767 if(LvmStatus != LVREV_SUCCESS) return -EINVAL; 768 769 ALOGV("\tCreateInstance Succesfully called LVM_GetMemoryTable\n"); 770 771 /* Allocate memory */ 772 for (int i=0; i<LVM_NR_MEMORY_REGIONS; i++){ 773 if (MemTab.Region[i].Size != 0){ 774 MemTab.Region[i].pBaseAddress = malloc(MemTab.Region[i].Size); 775 776 if (MemTab.Region[i].pBaseAddress == LVM_NULL){ 777 ALOGV("\tLVREV_ERROR :Reverb_init CreateInstance Failed to allocate %" PRIu32 778 " bytes for region %u\n", MemTab.Region[i].Size, i ); 779 bMallocFailure = LVM_TRUE; 780 }else{ 781 ALOGV("\tReverb_init CreateInstance allocate %" PRIu32 782 " bytes for region %u at %p\n", 783 MemTab.Region[i].Size, i, MemTab.Region[i].pBaseAddress); 784 } 785 } 786 } 787 788 /* If one or more of the memory regions failed to allocate, free the regions that were 789 * succesfully allocated and return with an error 790 */ 791 if(bMallocFailure == LVM_TRUE){ 792 for (int i=0; i<LVM_NR_MEMORY_REGIONS; i++){ 793 if (MemTab.Region[i].pBaseAddress == LVM_NULL){ 794 ALOGV("\tLVM_ERROR :Reverb_init CreateInstance Failed to allocate %" PRIu32 795 " bytes for region %u - Not freeing\n", MemTab.Region[i].Size, i ); 796 }else{ 797 ALOGV("\tLVM_ERROR :Reverb_init CreateInstance Failed: but allocated %" PRIu32 798 " bytes for region %u at %p- free\n", 799 MemTab.Region[i].Size, i, MemTab.Region[i].pBaseAddress); 800 free(MemTab.Region[i].pBaseAddress); 801 } 802 } 803 return -EINVAL; 804 } 805 ALOGV("\tReverb_init CreateInstance Succesfully malloc'd memory\n"); 806 807 /* Initialise */ 808 pContext->hInstance = LVM_NULL; 809 810 /* Init sets the instance handle */ 811 LvmStatus = LVREV_GetInstanceHandle(&pContext->hInstance, 812 &MemTab, 813 &InstParams); 814 815 LVM_ERROR_CHECK(LvmStatus, "LVM_GetInstanceHandle", "Reverb_init") 816 if(LvmStatus != LVREV_SUCCESS) return -EINVAL; 817 818 ALOGV("\tReverb_init CreateInstance Succesfully called LVM_GetInstanceHandle\n"); 819 820 /* Set the initial process parameters */ 821 /* General parameters */ 822 params.OperatingMode = LVM_MODE_ON; 823 params.SampleRate = LVM_FS_44100; 824 pContext->SampleRate = LVM_FS_44100; 825 826 if(pContext->config.inputCfg.channels == AUDIO_CHANNEL_OUT_MONO){ 827 params.SourceFormat = LVM_MONO; 828 } else { 829 params.SourceFormat = LVM_STEREO; 830 } 831 832 /* Reverb parameters */ 833 params.Level = 0; 834 params.LPF = 23999; 835 params.HPF = 50; 836 params.T60 = 1490; 837 params.Density = 100; 838 params.Damping = 21; 839 params.RoomSize = 100; 840 841 pContext->SamplesToExitCount = (params.T60 * pContext->config.inputCfg.samplingRate)/1000; 842 843 /* Saved strength is used to return the exact strength that was used in the set to the get 844 * because we map the original strength range of 0:1000 to 1:15, and this will avoid 845 * quantisation like effect when returning 846 */ 847 pContext->SavedRoomLevel = -6000; 848 pContext->SavedHfLevel = 0; 849 pContext->bEnabled = LVM_FALSE; 850 pContext->SavedDecayTime = params.T60; 851 pContext->SavedDecayHfRatio = params.Damping*20; 852 pContext->SavedDensity = params.RoomSize*10; 853 pContext->SavedDiffusion = params.Density*10; 854 pContext->SavedReverbLevel = -6000; 855 856 /* Activate the initial settings */ 857 LvmStatus = LVREV_SetControlParameters(pContext->hInstance, 858 ¶ms); 859 860 LVM_ERROR_CHECK(LvmStatus, "LVREV_SetControlParameters", "Reverb_init") 861 if(LvmStatus != LVREV_SUCCESS) return -EINVAL; 862 863 ALOGV("\tReverb_init CreateInstance Succesfully called LVREV_SetControlParameters\n"); 864 ALOGV("\tReverb_init End"); 865 return 0; 866} /* end Reverb_init */ 867 868//---------------------------------------------------------------------------- 869// ReverbConvertLevel() 870//---------------------------------------------------------------------------- 871// Purpose: 872// Convert level from OpenSL ES format to LVM format 873// 874// Inputs: 875// level level to be applied 876// 877//---------------------------------------------------------------------------- 878 879int16_t ReverbConvertLevel(int16_t level){ 880 static int16_t LevelArray[101] = 881 { 882 -12000, -4000, -3398, -3046, -2796, -2603, -2444, -2310, -2194, -2092, 883 -2000, -1918, -1842, -1773, -1708, -1648, -1592, -1540, -1490, -1443, 884 -1398, -1356, -1316, -1277, -1240, -1205, -1171, -1138, -1106, -1076, 885 -1046, -1018, -990, -963, -938, -912, -888, -864, -841, -818, 886 -796, -775, -754, -734, -714, -694, -675, -656, -638, -620, 887 -603, -585, -568, -552, -536, -520, -504, -489, -474, -459, 888 -444, -430, -416, -402, -388, -375, -361, -348, -335, -323, 889 -310, -298, -286, -274, -262, -250, -239, -228, -216, -205, 890 -194, -184, -173, -162, -152, -142, -132, -121, -112, -102, 891 -92, -82, -73, -64, -54, -45, -36, -27, -18, -9, 892 0 893 }; 894 int16_t i; 895 896 for(i = 0; i < 101; i++) 897 { 898 if(level <= LevelArray[i]) 899 break; 900 } 901 return i; 902} 903 904//---------------------------------------------------------------------------- 905// ReverbConvertHFLevel() 906//---------------------------------------------------------------------------- 907// Purpose: 908// Convert level from OpenSL ES format to LVM format 909// 910// Inputs: 911// level level to be applied 912// 913//---------------------------------------------------------------------------- 914 915int16_t ReverbConvertHfLevel(int16_t Hflevel){ 916 int16_t i; 917 918 static LPFPair_t LPFArray[97] = 919 { // Limit range to 50 for LVREV parameter range 920 {-10000, 50}, { -5000, 50 }, { -4000, 50}, { -3000, 158}, { -2000, 502}, 921 {-1000, 1666},{ -900, 1897}, { -800, 2169}, { -700, 2496}, { -600, 2895}, 922 {-500, 3400}, { -400, 4066}, { -300, 5011}, { -200, 6537}, { -100, 9826}, 923 {-99, 9881 }, { -98, 9937 }, { -97, 9994 }, { -96, 10052}, { -95, 10111}, 924 {-94, 10171}, { -93, 10231}, { -92, 10293}, { -91, 10356}, { -90, 10419}, 925 {-89, 10484}, { -88, 10549}, { -87, 10616}, { -86, 10684}, { -85, 10753}, 926 {-84, 10823}, { -83, 10895}, { -82, 10968}, { -81, 11042}, { -80, 11117}, 927 {-79, 11194}, { -78, 11272}, { -77, 11352}, { -76, 11433}, { -75, 11516}, 928 {-74, 11600}, { -73, 11686}, { -72, 11774}, { -71, 11864}, { -70, 11955}, 929 {-69, 12049}, { -68, 12144}, { -67, 12242}, { -66, 12341}, { -65, 12443}, 930 {-64, 12548}, { -63, 12654}, { -62, 12763}, { -61, 12875}, { -60, 12990}, 931 {-59, 13107}, { -58, 13227}, { -57, 13351}, { -56, 13477}, { -55, 13607}, 932 {-54, 13741}, { -53, 13878}, { -52, 14019}, { -51, 14164}, { -50, 14313}, 933 {-49, 14467}, { -48, 14626}, { -47, 14789}, { -46, 14958}, { -45, 15132}, 934 {-44, 15312}, { -43, 15498}, { -42, 15691}, { -41, 15890}, { -40, 16097}, 935 {-39, 16311}, { -38, 16534}, { -37, 16766}, { -36, 17007}, { -35, 17259}, 936 {-34, 17521}, { -33, 17795}, { -32, 18081}, { -31, 18381}, { -30, 18696}, 937 {-29, 19027}, { -28, 19375}, { -27, 19742}, { -26, 20129}, { -25, 20540}, 938 {-24, 20976}, { -23, 21439}, { -22, 21934}, { -21, 22463}, { -20, 23031}, 939 {-19, 23643}, { -18, 23999} 940 }; 941 942 for(i = 0; i < 96; i++) 943 { 944 if(Hflevel <= LPFArray[i].Room_HF) 945 break; 946 } 947 return LPFArray[i].LPF; 948} 949 950//---------------------------------------------------------------------------- 951// ReverbSetRoomHfLevel() 952//---------------------------------------------------------------------------- 953// Purpose: 954// Apply the HF level to the Reverb. Must first be converted to LVM format 955// 956// Inputs: 957// pContext: effect engine context 958// level level to be applied 959// 960//---------------------------------------------------------------------------- 961 962void ReverbSetRoomHfLevel(ReverbContext *pContext, int16_t level){ 963 //ALOGV("\tReverbSetRoomHfLevel start (%d)", level); 964 965 LVREV_ControlParams_st ActiveParams; /* Current control Parameters */ 966 LVREV_ReturnStatus_en LvmStatus=LVREV_SUCCESS; /* Function call status */ 967 968 /* Get the current settings */ 969 LvmStatus = LVREV_GetControlParameters(pContext->hInstance, &ActiveParams); 970 LVM_ERROR_CHECK(LvmStatus, "LVREV_GetControlParameters", "ReverbSetRoomHfLevel") 971 //ALOGV("\tReverbSetRoomHfLevel Succesfully returned from LVM_GetControlParameters\n"); 972 //ALOGV("\tReverbSetRoomHfLevel() just Got -> %d\n", ActiveParams.LPF); 973 974 ActiveParams.LPF = ReverbConvertHfLevel(level); 975 976 /* Activate the initial settings */ 977 LvmStatus = LVREV_SetControlParameters(pContext->hInstance, &ActiveParams); 978 LVM_ERROR_CHECK(LvmStatus, "LVREV_SetControlParameters", "ReverbSetRoomHfLevel") 979 //ALOGV("\tReverbSetRoomhfLevel() just Set -> %d\n", ActiveParams.LPF); 980 pContext->SavedHfLevel = level; 981 //ALOGV("\tReverbSetHfRoomLevel end.. saving %d", pContext->SavedHfLevel); 982 return; 983} 984 985//---------------------------------------------------------------------------- 986// ReverbGetRoomHfLevel() 987//---------------------------------------------------------------------------- 988// Purpose: 989// Get the level applied to the Revervb. Must first be converted to LVM format 990// 991// Inputs: 992// pContext: effect engine context 993// 994//---------------------------------------------------------------------------- 995 996int16_t ReverbGetRoomHfLevel(ReverbContext *pContext){ 997 int16_t level; 998 //ALOGV("\tReverbGetRoomHfLevel start, saved level is %d", pContext->SavedHfLevel); 999 1000 LVREV_ControlParams_st ActiveParams; /* Current control Parameters */ 1001 LVREV_ReturnStatus_en LvmStatus=LVREV_SUCCESS; /* Function call status */ 1002 1003 /* Get the current settings */ 1004 LvmStatus = LVREV_GetControlParameters(pContext->hInstance, &ActiveParams); 1005 LVM_ERROR_CHECK(LvmStatus, "LVREV_GetControlParameters", "ReverbGetRoomHfLevel") 1006 //ALOGV("\tReverbGetRoomHfLevel Succesfully returned from LVM_GetControlParameters\n"); 1007 //ALOGV("\tReverbGetRoomHfLevel() just Got -> %d\n", ActiveParams.LPF); 1008 1009 level = ReverbConvertHfLevel(pContext->SavedHfLevel); 1010 1011 //ALOGV("\tReverbGetRoomHfLevel() ActiveParams.LPFL %d, pContext->SavedHfLevel: %d, " 1012 // "converted level: %d\n", ActiveParams.LPF, pContext->SavedHfLevel, level); 1013 1014 if(ActiveParams.LPF != level){ 1015 ALOGV("\tLVM_ERROR : (ignore at start up) ReverbGetRoomHfLevel() has wrong level -> %d %d\n", 1016 ActiveParams.Level, level); 1017 } 1018 1019 //ALOGV("\tReverbGetRoomHfLevel end"); 1020 return pContext->SavedHfLevel; 1021} 1022 1023//---------------------------------------------------------------------------- 1024// ReverbSetReverbLevel() 1025//---------------------------------------------------------------------------- 1026// Purpose: 1027// Apply the level to the Reverb. Must first be converted to LVM format 1028// 1029// Inputs: 1030// pContext: effect engine context 1031// level level to be applied 1032// 1033//---------------------------------------------------------------------------- 1034 1035void ReverbSetReverbLevel(ReverbContext *pContext, int16_t level){ 1036 //ALOGV("\n\tReverbSetReverbLevel start (%d)", level); 1037 1038 LVREV_ControlParams_st ActiveParams; /* Current control Parameters */ 1039 LVREV_ReturnStatus_en LvmStatus=LVREV_SUCCESS; /* Function call status */ 1040 LVM_INT32 CombinedLevel; // Sum of room and reverb level controls 1041 1042 /* Get the current settings */ 1043 LvmStatus = LVREV_GetControlParameters(pContext->hInstance, &ActiveParams); 1044 LVM_ERROR_CHECK(LvmStatus, "LVREV_GetControlParameters", "ReverbSetReverbLevel") 1045 //ALOGV("\tReverbSetReverbLevel Succesfully returned from LVM_GetControlParameters\n"); 1046 //ALOGV("\tReverbSetReverbLevel just Got -> %d\n", ActiveParams.Level); 1047 1048 // needs to subtract max levels for both RoomLevel and ReverbLevel 1049 CombinedLevel = (level + pContext->SavedRoomLevel)-LVREV_MAX_REVERB_LEVEL; 1050 //ALOGV("\tReverbSetReverbLevel() CombinedLevel is %d = %d + %d\n", 1051 // CombinedLevel, level, pContext->SavedRoomLevel); 1052 1053 ActiveParams.Level = ReverbConvertLevel(CombinedLevel); 1054 1055 //ALOGV("\tReverbSetReverbLevel() Trying to set -> %d\n", ActiveParams.Level); 1056 1057 /* Activate the initial settings */ 1058 LvmStatus = LVREV_SetControlParameters(pContext->hInstance, &ActiveParams); 1059 LVM_ERROR_CHECK(LvmStatus, "LVREV_SetControlParameters", "ReverbSetReverbLevel") 1060 //ALOGV("\tReverbSetReverbLevel() just Set -> %d\n", ActiveParams.Level); 1061 1062 pContext->SavedReverbLevel = level; 1063 //ALOGV("\tReverbSetReverbLevel end pContext->SavedReverbLevel is %d\n\n", 1064 // pContext->SavedReverbLevel); 1065 return; 1066} 1067 1068//---------------------------------------------------------------------------- 1069// ReverbGetReverbLevel() 1070//---------------------------------------------------------------------------- 1071// Purpose: 1072// Get the level applied to the Revervb. Must first be converted to LVM format 1073// 1074// Inputs: 1075// pContext: effect engine context 1076// 1077//---------------------------------------------------------------------------- 1078 1079int16_t ReverbGetReverbLevel(ReverbContext *pContext){ 1080 int16_t level; 1081 //ALOGV("\tReverbGetReverbLevel start"); 1082 1083 LVREV_ControlParams_st ActiveParams; /* Current control Parameters */ 1084 LVREV_ReturnStatus_en LvmStatus=LVREV_SUCCESS; /* Function call status */ 1085 LVM_INT32 CombinedLevel; // Sum of room and reverb level controls 1086 1087 /* Get the current settings */ 1088 LvmStatus = LVREV_GetControlParameters(pContext->hInstance, &ActiveParams); 1089 LVM_ERROR_CHECK(LvmStatus, "LVREV_GetControlParameters", "ReverbGetReverbLevel") 1090 //ALOGV("\tReverbGetReverbLevel Succesfully returned from LVM_GetControlParameters\n"); 1091 //ALOGV("\tReverbGetReverbLevel() just Got -> %d\n", ActiveParams.Level); 1092 1093 // needs to subtract max levels for both RoomLevel and ReverbLevel 1094 CombinedLevel = (pContext->SavedReverbLevel + pContext->SavedRoomLevel)-LVREV_MAX_REVERB_LEVEL; 1095 1096 //ALOGV("\tReverbGetReverbLevel() CombinedLevel is %d = %d + %d\n", 1097 //CombinedLevel, pContext->SavedReverbLevel, pContext->SavedRoomLevel); 1098 level = ReverbConvertLevel(CombinedLevel); 1099 1100 //ALOGV("\tReverbGetReverbLevel(): ActiveParams.Level: %d, pContext->SavedReverbLevel: %d, " 1101 //"pContext->SavedRoomLevel: %d, CombinedLevel: %d, converted level: %d\n", 1102 //ActiveParams.Level, pContext->SavedReverbLevel,pContext->SavedRoomLevel, CombinedLevel,level); 1103 1104 if(ActiveParams.Level != level){ 1105 ALOGV("\tLVM_ERROR : (ignore at start up) ReverbGetReverbLevel() has wrong level -> %d %d\n", 1106 ActiveParams.Level, level); 1107 } 1108 1109 //ALOGV("\tReverbGetReverbLevel end\n"); 1110 1111 return pContext->SavedReverbLevel; 1112} 1113 1114//---------------------------------------------------------------------------- 1115// ReverbSetRoomLevel() 1116//---------------------------------------------------------------------------- 1117// Purpose: 1118// Apply the level to the Reverb. Must first be converted to LVM format 1119// 1120// Inputs: 1121// pContext: effect engine context 1122// level level to be applied 1123// 1124//---------------------------------------------------------------------------- 1125 1126void ReverbSetRoomLevel(ReverbContext *pContext, int16_t level){ 1127 //ALOGV("\tReverbSetRoomLevel start (%d)", level); 1128 1129 LVREV_ControlParams_st ActiveParams; /* Current control Parameters */ 1130 LVREV_ReturnStatus_en LvmStatus=LVREV_SUCCESS; /* Function call status */ 1131 LVM_INT32 CombinedLevel; // Sum of room and reverb level controls 1132 1133 /* Get the current settings */ 1134 LvmStatus = LVREV_GetControlParameters(pContext->hInstance, &ActiveParams); 1135 LVM_ERROR_CHECK(LvmStatus, "LVREV_GetControlParameters", "ReverbSetRoomLevel") 1136 //ALOGV("\tReverbSetRoomLevel Succesfully returned from LVM_GetControlParameters\n"); 1137 //ALOGV("\tReverbSetRoomLevel() just Got -> %d\n", ActiveParams.Level); 1138 1139 // needs to subtract max levels for both RoomLevel and ReverbLevel 1140 CombinedLevel = (level + pContext->SavedReverbLevel)-LVREV_MAX_REVERB_LEVEL; 1141 ActiveParams.Level = ReverbConvertLevel(CombinedLevel); 1142 1143 /* Activate the initial settings */ 1144 LvmStatus = LVREV_SetControlParameters(pContext->hInstance, &ActiveParams); 1145 LVM_ERROR_CHECK(LvmStatus, "LVREV_SetControlParameters", "ReverbSetRoomLevel") 1146 //ALOGV("\tReverbSetRoomLevel() just Set -> %d\n", ActiveParams.Level); 1147 1148 pContext->SavedRoomLevel = level; 1149 //ALOGV("\tReverbSetRoomLevel end"); 1150 return; 1151} 1152 1153//---------------------------------------------------------------------------- 1154// ReverbGetRoomLevel() 1155//---------------------------------------------------------------------------- 1156// Purpose: 1157// Get the level applied to the Revervb. Must first be converted to LVM format 1158// 1159// Inputs: 1160// pContext: effect engine context 1161// 1162//---------------------------------------------------------------------------- 1163 1164int16_t ReverbGetRoomLevel(ReverbContext *pContext){ 1165 int16_t level; 1166 //ALOGV("\tReverbGetRoomLevel start"); 1167 1168 LVREV_ControlParams_st ActiveParams; /* Current control Parameters */ 1169 LVREV_ReturnStatus_en LvmStatus=LVREV_SUCCESS; /* Function call status */ 1170 LVM_INT32 CombinedLevel; // Sum of room and reverb level controls 1171 1172 /* Get the current settings */ 1173 LvmStatus = LVREV_GetControlParameters(pContext->hInstance, &ActiveParams); 1174 LVM_ERROR_CHECK(LvmStatus, "LVREV_GetControlParameters", "ReverbGetRoomLevel") 1175 //ALOGV("\tReverbGetRoomLevel Succesfully returned from LVM_GetControlParameters\n"); 1176 //ALOGV("\tReverbGetRoomLevel() just Got -> %d\n", ActiveParams.Level); 1177 1178 // needs to subtract max levels for both RoomLevel and ReverbLevel 1179 CombinedLevel = (pContext->SavedRoomLevel + pContext->SavedReverbLevel-LVREV_MAX_REVERB_LEVEL); 1180 level = ReverbConvertLevel(CombinedLevel); 1181 1182 //ALOGV("\tReverbGetRoomLevel, Level = %d, pContext->SavedRoomLevel = %d, " 1183 // "pContext->SavedReverbLevel = %d, CombinedLevel = %d, level = %d", 1184 // ActiveParams.Level, pContext->SavedRoomLevel, 1185 // pContext->SavedReverbLevel, CombinedLevel, level); 1186 1187 if(ActiveParams.Level != level){ 1188 ALOGV("\tLVM_ERROR : (ignore at start up) ReverbGetRoomLevel() has wrong level -> %d %d\n", 1189 ActiveParams.Level, level); 1190 } 1191 1192 //ALOGV("\tReverbGetRoomLevel end"); 1193 return pContext->SavedRoomLevel; 1194} 1195 1196//---------------------------------------------------------------------------- 1197// ReverbSetDecayTime() 1198//---------------------------------------------------------------------------- 1199// Purpose: 1200// Apply the decay time to the Reverb. 1201// 1202// Inputs: 1203// pContext: effect engine context 1204// time decay to be applied 1205// 1206//---------------------------------------------------------------------------- 1207 1208void ReverbSetDecayTime(ReverbContext *pContext, uint32_t time){ 1209 //ALOGV("\tReverbSetDecayTime start (%d)", time); 1210 1211 LVREV_ControlParams_st ActiveParams; /* Current control Parameters */ 1212 LVREV_ReturnStatus_en LvmStatus=LVREV_SUCCESS; /* Function call status */ 1213 1214 /* Get the current settings */ 1215 LvmStatus = LVREV_GetControlParameters(pContext->hInstance, &ActiveParams); 1216 LVM_ERROR_CHECK(LvmStatus, "LVREV_GetControlParameters", "ReverbSetDecayTime") 1217 //ALOGV("\tReverbSetDecayTime Succesfully returned from LVM_GetControlParameters\n"); 1218 //ALOGV("\tReverbSetDecayTime() just Got -> %d\n", ActiveParams.T60); 1219 1220 if (time <= LVREV_MAX_T60) { 1221 ActiveParams.T60 = (LVM_UINT16)time; 1222 } 1223 else { 1224 ActiveParams.T60 = LVREV_MAX_T60; 1225 } 1226 1227 /* Activate the initial settings */ 1228 LvmStatus = LVREV_SetControlParameters(pContext->hInstance, &ActiveParams); 1229 LVM_ERROR_CHECK(LvmStatus, "LVREV_SetControlParameters", "ReverbSetDecayTime") 1230 //ALOGV("\tReverbSetDecayTime() just Set -> %d\n", ActiveParams.T60); 1231 1232 pContext->SamplesToExitCount = (ActiveParams.T60 * pContext->config.inputCfg.samplingRate)/1000; 1233 //ALOGV("\tReverbSetDecayTime() just Set SamplesToExitCount-> %d\n",pContext->SamplesToExitCount); 1234 pContext->SavedDecayTime = (int16_t)time; 1235 //ALOGV("\tReverbSetDecayTime end"); 1236 return; 1237} 1238 1239//---------------------------------------------------------------------------- 1240// ReverbGetDecayTime() 1241//---------------------------------------------------------------------------- 1242// Purpose: 1243// Get the decay time applied to the Revervb. 1244// 1245// Inputs: 1246// pContext: effect engine context 1247// 1248//---------------------------------------------------------------------------- 1249 1250uint32_t ReverbGetDecayTime(ReverbContext *pContext){ 1251 //ALOGV("\tReverbGetDecayTime start"); 1252 1253 LVREV_ControlParams_st ActiveParams; /* Current control Parameters */ 1254 LVREV_ReturnStatus_en LvmStatus=LVREV_SUCCESS; /* Function call status */ 1255 1256 /* Get the current settings */ 1257 LvmStatus = LVREV_GetControlParameters(pContext->hInstance, &ActiveParams); 1258 LVM_ERROR_CHECK(LvmStatus, "LVREV_GetControlParameters", "ReverbGetDecayTime") 1259 //ALOGV("\tReverbGetDecayTime Succesfully returned from LVM_GetControlParameters\n"); 1260 //ALOGV("\tReverbGetDecayTime() just Got -> %d\n", ActiveParams.T60); 1261 1262 if(ActiveParams.T60 != pContext->SavedDecayTime){ 1263 // This will fail if the decay time is set to more than 7000 1264 ALOGV("\tLVM_ERROR : ReverbGetDecayTime() has wrong level -> %d %d\n", 1265 ActiveParams.T60, pContext->SavedDecayTime); 1266 } 1267 1268 //ALOGV("\tReverbGetDecayTime end"); 1269 return (uint32_t)ActiveParams.T60; 1270} 1271 1272//---------------------------------------------------------------------------- 1273// ReverbSetDecayHfRatio() 1274//---------------------------------------------------------------------------- 1275// Purpose: 1276// Apply the HF decay ratio to the Reverb. 1277// 1278// Inputs: 1279// pContext: effect engine context 1280// ratio ratio to be applied 1281// 1282//---------------------------------------------------------------------------- 1283 1284void ReverbSetDecayHfRatio(ReverbContext *pContext, int16_t ratio){ 1285 //ALOGV("\tReverbSetDecayHfRatioe start (%d)", ratio); 1286 1287 LVREV_ControlParams_st ActiveParams; /* Current control Parameters */ 1288 LVREV_ReturnStatus_en LvmStatus=LVREV_SUCCESS; /* Function call status */ 1289 1290 /* Get the current settings */ 1291 LvmStatus = LVREV_GetControlParameters(pContext->hInstance, &ActiveParams); 1292 LVM_ERROR_CHECK(LvmStatus, "LVREV_GetControlParameters", "ReverbSetDecayHfRatio") 1293 //ALOGV("\tReverbSetDecayHfRatio Succesfully returned from LVM_GetControlParameters\n"); 1294 //ALOGV("\tReverbSetDecayHfRatio() just Got -> %d\n", ActiveParams.Damping); 1295 1296 ActiveParams.Damping = (LVM_INT16)(ratio/20); 1297 1298 /* Activate the initial settings */ 1299 LvmStatus = LVREV_SetControlParameters(pContext->hInstance, &ActiveParams); 1300 LVM_ERROR_CHECK(LvmStatus, "LVREV_SetControlParameters", "ReverbSetDecayHfRatio") 1301 //ALOGV("\tReverbSetDecayHfRatio() just Set -> %d\n", ActiveParams.Damping); 1302 1303 pContext->SavedDecayHfRatio = ratio; 1304 //ALOGV("\tReverbSetDecayHfRatio end"); 1305 return; 1306} 1307 1308//---------------------------------------------------------------------------- 1309// ReverbGetDecayHfRatio() 1310//---------------------------------------------------------------------------- 1311// Purpose: 1312// Get the HF decay ratio applied to the Revervb. 1313// 1314// Inputs: 1315// pContext: effect engine context 1316// 1317//---------------------------------------------------------------------------- 1318 1319int32_t ReverbGetDecayHfRatio(ReverbContext *pContext){ 1320 //ALOGV("\tReverbGetDecayHfRatio start"); 1321 1322 LVREV_ControlParams_st ActiveParams; /* Current control Parameters */ 1323 LVREV_ReturnStatus_en LvmStatus=LVREV_SUCCESS; /* Function call status */ 1324 1325 /* Get the current settings */ 1326 LvmStatus = LVREV_GetControlParameters(pContext->hInstance, &ActiveParams); 1327 LVM_ERROR_CHECK(LvmStatus, "LVREV_GetControlParameters", "ReverbGetDecayHfRatio") 1328 //ALOGV("\tReverbGetDecayHfRatio Succesfully returned from LVM_GetControlParameters\n"); 1329 //ALOGV("\tReverbGetDecayHfRatio() just Got -> %d\n", ActiveParams.Damping); 1330 1331 if(ActiveParams.Damping != (LVM_INT16)(pContext->SavedDecayHfRatio / 20)){ 1332 ALOGV("\tLVM_ERROR : ReverbGetDecayHfRatio() has wrong level -> %d %d\n", 1333 ActiveParams.Damping, pContext->SavedDecayHfRatio); 1334 } 1335 1336 //ALOGV("\tReverbGetDecayHfRatio end"); 1337 return pContext->SavedDecayHfRatio; 1338} 1339 1340//---------------------------------------------------------------------------- 1341// ReverbSetDiffusion() 1342//---------------------------------------------------------------------------- 1343// Purpose: 1344// Apply the diffusion to the Reverb. 1345// 1346// Inputs: 1347// pContext: effect engine context 1348// level decay to be applied 1349// 1350//---------------------------------------------------------------------------- 1351 1352void ReverbSetDiffusion(ReverbContext *pContext, int16_t level){ 1353 //ALOGV("\tReverbSetDiffusion start (%d)", level); 1354 1355 LVREV_ControlParams_st ActiveParams; /* Current control Parameters */ 1356 LVREV_ReturnStatus_en LvmStatus=LVREV_SUCCESS; /* Function call status */ 1357 1358 /* Get the current settings */ 1359 LvmStatus = LVREV_GetControlParameters(pContext->hInstance, &ActiveParams); 1360 LVM_ERROR_CHECK(LvmStatus, "LVREV_GetControlParameters", "ReverbSetDiffusion") 1361 //ALOGV("\tReverbSetDiffusion Succesfully returned from LVM_GetControlParameters\n"); 1362 //ALOGV("\tReverbSetDiffusion() just Got -> %d\n", ActiveParams.Density); 1363 1364 ActiveParams.Density = (LVM_INT16)(level/10); 1365 1366 /* Activate the initial settings */ 1367 LvmStatus = LVREV_SetControlParameters(pContext->hInstance, &ActiveParams); 1368 LVM_ERROR_CHECK(LvmStatus, "LVREV_SetControlParameters", "ReverbSetDiffusion") 1369 //ALOGV("\tReverbSetDiffusion() just Set -> %d\n", ActiveParams.Density); 1370 1371 pContext->SavedDiffusion = level; 1372 //ALOGV("\tReverbSetDiffusion end"); 1373 return; 1374} 1375 1376//---------------------------------------------------------------------------- 1377// ReverbGetDiffusion() 1378//---------------------------------------------------------------------------- 1379// Purpose: 1380// Get the decay time applied to the Revervb. 1381// 1382// Inputs: 1383// pContext: effect engine context 1384// 1385//---------------------------------------------------------------------------- 1386 1387int32_t ReverbGetDiffusion(ReverbContext *pContext){ 1388 //ALOGV("\tReverbGetDiffusion start"); 1389 1390 LVREV_ControlParams_st ActiveParams; /* Current control Parameters */ 1391 LVREV_ReturnStatus_en LvmStatus=LVREV_SUCCESS; /* Function call status */ 1392 LVM_INT16 Temp; 1393 1394 /* Get the current settings */ 1395 LvmStatus = LVREV_GetControlParameters(pContext->hInstance, &ActiveParams); 1396 LVM_ERROR_CHECK(LvmStatus, "LVREV_GetControlParameters", "ReverbGetDiffusion") 1397 //ALOGV("\tReverbGetDiffusion Succesfully returned from LVM_GetControlParameters\n"); 1398 //ALOGV("\tReverbGetDiffusion just Got -> %d\n", ActiveParams.Density); 1399 1400 Temp = (LVM_INT16)(pContext->SavedDiffusion/10); 1401 1402 if(ActiveParams.Density != Temp){ 1403 ALOGV("\tLVM_ERROR : ReverbGetDiffusion invalid value %d %d", Temp, ActiveParams.Density); 1404 } 1405 1406 //ALOGV("\tReverbGetDiffusion end"); 1407 return pContext->SavedDiffusion; 1408} 1409 1410//---------------------------------------------------------------------------- 1411// ReverbSetDensity() 1412//---------------------------------------------------------------------------- 1413// Purpose: 1414// Apply the density level the Reverb. 1415// 1416// Inputs: 1417// pContext: effect engine context 1418// level decay to be applied 1419// 1420//---------------------------------------------------------------------------- 1421 1422void ReverbSetDensity(ReverbContext *pContext, int16_t level){ 1423 //ALOGV("\tReverbSetDensity start (%d)", level); 1424 1425 LVREV_ControlParams_st ActiveParams; /* Current control Parameters */ 1426 LVREV_ReturnStatus_en LvmStatus=LVREV_SUCCESS; /* Function call status */ 1427 1428 /* Get the current settings */ 1429 LvmStatus = LVREV_GetControlParameters(pContext->hInstance, &ActiveParams); 1430 LVM_ERROR_CHECK(LvmStatus, "LVREV_GetControlParameters", "ReverbSetDensity") 1431 //ALOGV("\tReverbSetDensity Succesfully returned from LVM_GetControlParameters\n"); 1432 //ALOGV("\tReverbSetDensity just Got -> %d\n", ActiveParams.RoomSize); 1433 1434 ActiveParams.RoomSize = (LVM_INT16)(((level * 99) / 1000) + 1); 1435 1436 /* Activate the initial settings */ 1437 LvmStatus = LVREV_SetControlParameters(pContext->hInstance, &ActiveParams); 1438 LVM_ERROR_CHECK(LvmStatus, "LVREV_SetControlParameters", "ReverbSetDensity") 1439 //ALOGV("\tReverbSetDensity just Set -> %d\n", ActiveParams.RoomSize); 1440 1441 pContext->SavedDensity = level; 1442 //ALOGV("\tReverbSetDensity end"); 1443 return; 1444} 1445 1446//---------------------------------------------------------------------------- 1447// ReverbGetDensity() 1448//---------------------------------------------------------------------------- 1449// Purpose: 1450// Get the density level applied to the Revervb. 1451// 1452// Inputs: 1453// pContext: effect engine context 1454// 1455//---------------------------------------------------------------------------- 1456 1457int32_t ReverbGetDensity(ReverbContext *pContext){ 1458 //ALOGV("\tReverbGetDensity start"); 1459 1460 LVREV_ControlParams_st ActiveParams; /* Current control Parameters */ 1461 LVREV_ReturnStatus_en LvmStatus=LVREV_SUCCESS; /* Function call status */ 1462 LVM_INT16 Temp; 1463 /* Get the current settings */ 1464 LvmStatus = LVREV_GetControlParameters(pContext->hInstance, &ActiveParams); 1465 LVM_ERROR_CHECK(LvmStatus, "LVREV_GetControlParameters", "ReverbGetDensity") 1466 //ALOGV("\tReverbGetDensity Succesfully returned from LVM_GetControlParameters\n"); 1467 //ALOGV("\tReverbGetDensity() just Got -> %d\n", ActiveParams.RoomSize); 1468 1469 1470 Temp = (LVM_INT16)(((pContext->SavedDensity * 99) / 1000) + 1); 1471 1472 if(Temp != ActiveParams.RoomSize){ 1473 ALOGV("\tLVM_ERROR : ReverbGetDensity invalid value %d %d", Temp, ActiveParams.RoomSize); 1474 } 1475 1476 //ALOGV("\tReverbGetDensity end"); 1477 return pContext->SavedDensity; 1478} 1479 1480//---------------------------------------------------------------------------- 1481// Reverb_LoadPreset() 1482//---------------------------------------------------------------------------- 1483// Purpose: 1484// Load a the next preset 1485// 1486// Inputs: 1487// pContext - handle to instance data 1488// 1489// Outputs: 1490// 1491// Side Effects: 1492// 1493//---------------------------------------------------------------------------- 1494int Reverb_LoadPreset(ReverbContext *pContext) 1495{ 1496 //TODO: add reflections delay, level and reverb delay when early reflections are 1497 // implemented 1498 pContext->curPreset = pContext->nextPreset; 1499 1500 if (pContext->curPreset != REVERB_PRESET_NONE) { 1501 const t_reverb_settings *preset = &sReverbPresets[pContext->curPreset]; 1502 ReverbSetRoomLevel(pContext, preset->roomLevel); 1503 ReverbSetRoomHfLevel(pContext, preset->roomHFLevel); 1504 ReverbSetDecayTime(pContext, preset->decayTime); 1505 ReverbSetDecayHfRatio(pContext, preset->decayHFRatio); 1506 //reflectionsLevel 1507 //reflectionsDelay 1508 ReverbSetReverbLevel(pContext, preset->reverbLevel); 1509 // reverbDelay 1510 ReverbSetDiffusion(pContext, preset->diffusion); 1511 ReverbSetDensity(pContext, preset->density); 1512 } 1513 1514 return 0; 1515} 1516 1517 1518//---------------------------------------------------------------------------- 1519// Reverb_getParameter() 1520//---------------------------------------------------------------------------- 1521// Purpose: 1522// Get a Reverb parameter 1523// 1524// Inputs: 1525// pContext - handle to instance data 1526// pParam - pointer to parameter 1527// pValue - pointer to variable to hold retrieved value 1528// pValueSize - pointer to value size: maximum size as input 1529// 1530// Outputs: 1531// *pValue updated with parameter value 1532// *pValueSize updated with actual value size 1533// 1534// 1535// Side Effects: 1536// 1537//---------------------------------------------------------------------------- 1538 1539int Reverb_getParameter(ReverbContext *pContext, 1540 void *pParam, 1541 uint32_t *pValueSize, 1542 void *pValue){ 1543 int status = 0; 1544 int32_t *pParamTemp = (int32_t *)pParam; 1545 int32_t param = *pParamTemp++; 1546 char *name; 1547 t_reverb_settings *pProperties; 1548 1549 //ALOGV("\tReverb_getParameter start"); 1550 if (pContext->preset) { 1551 if (param != REVERB_PARAM_PRESET || *pValueSize < sizeof(uint16_t)) { 1552 return -EINVAL; 1553 } 1554 1555 *(uint16_t *)pValue = pContext->nextPreset; 1556 ALOGV("get REVERB_PARAM_PRESET, preset %d", pContext->nextPreset); 1557 return 0; 1558 } 1559 1560 switch (param){ 1561 case REVERB_PARAM_ROOM_LEVEL: 1562 if (*pValueSize != sizeof(int16_t)){ 1563 ALOGV("\tLVM_ERROR : Reverb_getParameter() invalid pValueSize1 %d", *pValueSize); 1564 return -EINVAL; 1565 } 1566 *pValueSize = sizeof(int16_t); 1567 break; 1568 case REVERB_PARAM_ROOM_HF_LEVEL: 1569 if (*pValueSize != sizeof(int16_t)){ 1570 ALOGV("\tLVM_ERROR : Reverb_getParameter() invalid pValueSize12 %d", *pValueSize); 1571 return -EINVAL; 1572 } 1573 *pValueSize = sizeof(int16_t); 1574 break; 1575 case REVERB_PARAM_DECAY_TIME: 1576 if (*pValueSize != sizeof(uint32_t)){ 1577 ALOGV("\tLVM_ERROR : Reverb_getParameter() invalid pValueSize3 %d", *pValueSize); 1578 return -EINVAL; 1579 } 1580 *pValueSize = sizeof(uint32_t); 1581 break; 1582 case REVERB_PARAM_DECAY_HF_RATIO: 1583 if (*pValueSize != sizeof(int16_t)){ 1584 ALOGV("\tLVM_ERROR : Reverb_getParameter() invalid pValueSize4 %d", *pValueSize); 1585 return -EINVAL; 1586 } 1587 *pValueSize = sizeof(int16_t); 1588 break; 1589 case REVERB_PARAM_REFLECTIONS_LEVEL: 1590 if (*pValueSize != sizeof(int16_t)){ 1591 ALOGV("\tLVM_ERROR : Reverb_getParameter() invalid pValueSize5 %d", *pValueSize); 1592 return -EINVAL; 1593 } 1594 *pValueSize = sizeof(int16_t); 1595 break; 1596 case REVERB_PARAM_REFLECTIONS_DELAY: 1597 if (*pValueSize != sizeof(uint32_t)){ 1598 ALOGV("\tLVM_ERROR : Reverb_getParameter() invalid pValueSize6 %d", *pValueSize); 1599 return -EINVAL; 1600 } 1601 *pValueSize = sizeof(uint32_t); 1602 break; 1603 case REVERB_PARAM_REVERB_LEVEL: 1604 if (*pValueSize != sizeof(int16_t)){ 1605 ALOGV("\tLVM_ERROR : Reverb_getParameter() invalid pValueSize7 %d", *pValueSize); 1606 return -EINVAL; 1607 } 1608 *pValueSize = sizeof(int16_t); 1609 break; 1610 case REVERB_PARAM_REVERB_DELAY: 1611 if (*pValueSize != sizeof(uint32_t)){ 1612 ALOGV("\tLVM_ERROR : Reverb_getParameter() invalid pValueSize8 %d", *pValueSize); 1613 return -EINVAL; 1614 } 1615 *pValueSize = sizeof(uint32_t); 1616 break; 1617 case REVERB_PARAM_DIFFUSION: 1618 if (*pValueSize != sizeof(int16_t)){ 1619 ALOGV("\tLVM_ERROR : Reverb_getParameter() invalid pValueSize9 %d", *pValueSize); 1620 return -EINVAL; 1621 } 1622 *pValueSize = sizeof(int16_t); 1623 break; 1624 case REVERB_PARAM_DENSITY: 1625 if (*pValueSize != sizeof(int16_t)){ 1626 ALOGV("\tLVM_ERROR : Reverb_getParameter() invalid pValueSize10 %d", *pValueSize); 1627 return -EINVAL; 1628 } 1629 *pValueSize = sizeof(int16_t); 1630 break; 1631 case REVERB_PARAM_PROPERTIES: 1632 if (*pValueSize != sizeof(t_reverb_settings)){ 1633 ALOGV("\tLVM_ERROR : Reverb_getParameter() invalid pValueSize11 %d", *pValueSize); 1634 return -EINVAL; 1635 } 1636 *pValueSize = sizeof(t_reverb_settings); 1637 break; 1638 1639 default: 1640 ALOGV("\tLVM_ERROR : Reverb_getParameter() invalid param %d", param); 1641 return -EINVAL; 1642 } 1643 1644 pProperties = (t_reverb_settings *) pValue; 1645 1646 switch (param){ 1647 case REVERB_PARAM_PROPERTIES: 1648 pProperties->roomLevel = ReverbGetRoomLevel(pContext); 1649 pProperties->roomHFLevel = ReverbGetRoomHfLevel(pContext); 1650 pProperties->decayTime = ReverbGetDecayTime(pContext); 1651 pProperties->decayHFRatio = ReverbGetDecayHfRatio(pContext); 1652 pProperties->reflectionsLevel = 0; 1653 pProperties->reflectionsDelay = 0; 1654 pProperties->reverbDelay = 0; 1655 pProperties->reverbLevel = ReverbGetReverbLevel(pContext); 1656 pProperties->diffusion = ReverbGetDiffusion(pContext); 1657 pProperties->density = ReverbGetDensity(pContext); 1658 1659 ALOGV("\tReverb_getParameter() REVERB_PARAM_PROPERTIES Value is roomLevel %d", 1660 pProperties->roomLevel); 1661 ALOGV("\tReverb_getParameter() REVERB_PARAM_PROPERTIES Value is roomHFLevel %d", 1662 pProperties->roomHFLevel); 1663 ALOGV("\tReverb_getParameter() REVERB_PARAM_PROPERTIES Value is decayTime %d", 1664 pProperties->decayTime); 1665 ALOGV("\tReverb_getParameter() REVERB_PARAM_PROPERTIES Value is decayHFRatio %d", 1666 pProperties->decayHFRatio); 1667 ALOGV("\tReverb_getParameter() REVERB_PARAM_PROPERTIES Value is reflectionsLevel %d", 1668 pProperties->reflectionsLevel); 1669 ALOGV("\tReverb_getParameter() REVERB_PARAM_PROPERTIES Value is reflectionsDelay %d", 1670 pProperties->reflectionsDelay); 1671 ALOGV("\tReverb_getParameter() REVERB_PARAM_PROPERTIES Value is reverbDelay %d", 1672 pProperties->reverbDelay); 1673 ALOGV("\tReverb_getParameter() REVERB_PARAM_PROPERTIES Value is reverbLevel %d", 1674 pProperties->reverbLevel); 1675 ALOGV("\tReverb_getParameter() REVERB_PARAM_PROPERTIES Value is diffusion %d", 1676 pProperties->diffusion); 1677 ALOGV("\tReverb_getParameter() REVERB_PARAM_PROPERTIES Value is density %d", 1678 pProperties->density); 1679 break; 1680 1681 case REVERB_PARAM_ROOM_LEVEL: 1682 *(int16_t *)pValue = ReverbGetRoomLevel(pContext); 1683 1684 //ALOGV("\tReverb_getParameter() REVERB_PARAM_ROOM_LEVEL Value is %d", 1685 // *(int16_t *)pValue); 1686 break; 1687 case REVERB_PARAM_ROOM_HF_LEVEL: 1688 *(int16_t *)pValue = ReverbGetRoomHfLevel(pContext); 1689 1690 //ALOGV("\tReverb_getParameter() REVERB_PARAM_ROOM_HF_LEVEL Value is %d", 1691 // *(int16_t *)pValue); 1692 break; 1693 case REVERB_PARAM_DECAY_TIME: 1694 *(uint32_t *)pValue = ReverbGetDecayTime(pContext); 1695 1696 //ALOGV("\tReverb_getParameter() REVERB_PARAM_DECAY_TIME Value is %d", 1697 // *(int32_t *)pValue); 1698 break; 1699 case REVERB_PARAM_DECAY_HF_RATIO: 1700 *(int16_t *)pValue = ReverbGetDecayHfRatio(pContext); 1701 1702 //ALOGV("\tReverb_getParameter() REVERB_PARAM_DECAY_HF_RATION Value is %d", 1703 // *(int16_t *)pValue); 1704 break; 1705 case REVERB_PARAM_REVERB_LEVEL: 1706 *(int16_t *)pValue = ReverbGetReverbLevel(pContext); 1707 1708 //ALOGV("\tReverb_getParameter() REVERB_PARAM_REVERB_LEVEL Value is %d", 1709 // *(int16_t *)pValue); 1710 break; 1711 case REVERB_PARAM_DIFFUSION: 1712 *(int16_t *)pValue = ReverbGetDiffusion(pContext); 1713 1714 //ALOGV("\tReverb_getParameter() REVERB_PARAM_DECAY_DIFFUSION Value is %d", 1715 // *(int16_t *)pValue); 1716 break; 1717 case REVERB_PARAM_DENSITY: 1718 *(uint16_t *)pValue = 0; 1719 *(int16_t *)pValue = ReverbGetDensity(pContext); 1720 //ALOGV("\tReverb_getParameter() REVERB_PARAM_DENSITY Value is %d", 1721 // *(uint32_t *)pValue); 1722 break; 1723 case REVERB_PARAM_REFLECTIONS_LEVEL: 1724 *(uint16_t *)pValue = 0; 1725 case REVERB_PARAM_REFLECTIONS_DELAY: 1726 *(uint32_t *)pValue = 0; 1727 case REVERB_PARAM_REVERB_DELAY: 1728 *(uint32_t *)pValue = 0; 1729 break; 1730 1731 default: 1732 ALOGV("\tLVM_ERROR : Reverb_getParameter() invalid param %d", param); 1733 status = -EINVAL; 1734 break; 1735 } 1736 1737 //ALOGV("\tReverb_getParameter end"); 1738 return status; 1739} /* end Reverb_getParameter */ 1740 1741//---------------------------------------------------------------------------- 1742// Reverb_setParameter() 1743//---------------------------------------------------------------------------- 1744// Purpose: 1745// Set a Reverb parameter 1746// 1747// Inputs: 1748// pContext - handle to instance data 1749// pParam - pointer to parameter 1750// pValue - pointer to value 1751// vsize - value size 1752// 1753// Outputs: 1754// 1755//---------------------------------------------------------------------------- 1756 1757int Reverb_setParameter (ReverbContext *pContext, void *pParam, void *pValue, int vsize){ 1758 int status = 0; 1759 int16_t level; 1760 int16_t ratio; 1761 uint32_t time; 1762 t_reverb_settings *pProperties; 1763 int32_t *pParamTemp = (int32_t *)pParam; 1764 int32_t param = *pParamTemp++; 1765 1766 //ALOGV("\tReverb_setParameter start"); 1767 if (pContext->preset) { 1768 if (param != REVERB_PARAM_PRESET) { 1769 return -EINVAL; 1770 } 1771 1772 uint16_t preset = *(uint16_t *)pValue; 1773 ALOGV("set REVERB_PARAM_PRESET, preset %d", preset); 1774 if (preset > REVERB_PRESET_LAST) { 1775 return -EINVAL; 1776 } 1777 pContext->nextPreset = preset; 1778 return 0; 1779 } 1780 1781 if (vsize < Reverb_paramValueSize(param)) { 1782 android_errorWriteLog(0x534e4554, "63526567"); 1783 return -EINVAL; 1784 } 1785 1786 switch (param){ 1787 case REVERB_PARAM_PROPERTIES: 1788 ALOGV("\tReverb_setParameter() REVERB_PARAM_PROPERTIES"); 1789 pProperties = (t_reverb_settings *) pValue; 1790 ReverbSetRoomLevel(pContext, pProperties->roomLevel); 1791 ReverbSetRoomHfLevel(pContext, pProperties->roomHFLevel); 1792 ReverbSetDecayTime(pContext, pProperties->decayTime); 1793 ReverbSetDecayHfRatio(pContext, pProperties->decayHFRatio); 1794 ReverbSetReverbLevel(pContext, pProperties->reverbLevel); 1795 ReverbSetDiffusion(pContext, pProperties->diffusion); 1796 ReverbSetDensity(pContext, pProperties->density); 1797 break; 1798 case REVERB_PARAM_ROOM_LEVEL: 1799 level = *(int16_t *)pValue; 1800 //ALOGV("\tReverb_setParameter() REVERB_PARAM_ROOM_LEVEL value is %d", level); 1801 //ALOGV("\tReverb_setParameter() Calling ReverbSetRoomLevel"); 1802 ReverbSetRoomLevel(pContext, level); 1803 //ALOGV("\tReverb_setParameter() Called ReverbSetRoomLevel"); 1804 break; 1805 case REVERB_PARAM_ROOM_HF_LEVEL: 1806 level = *(int16_t *)pValue; 1807 //ALOGV("\tReverb_setParameter() REVERB_PARAM_ROOM_HF_LEVEL value is %d", level); 1808 //ALOGV("\tReverb_setParameter() Calling ReverbSetRoomHfLevel"); 1809 ReverbSetRoomHfLevel(pContext, level); 1810 //ALOGV("\tReverb_setParameter() Called ReverbSetRoomHfLevel"); 1811 break; 1812 case REVERB_PARAM_DECAY_TIME: 1813 time = *(uint32_t *)pValue; 1814 //ALOGV("\tReverb_setParameter() REVERB_PARAM_DECAY_TIME value is %d", time); 1815 //ALOGV("\tReverb_setParameter() Calling ReverbSetDecayTime"); 1816 ReverbSetDecayTime(pContext, time); 1817 //ALOGV("\tReverb_setParameter() Called ReverbSetDecayTime"); 1818 break; 1819 case REVERB_PARAM_DECAY_HF_RATIO: 1820 ratio = *(int16_t *)pValue; 1821 //ALOGV("\tReverb_setParameter() REVERB_PARAM_DECAY_HF_RATIO value is %d", ratio); 1822 //ALOGV("\tReverb_setParameter() Calling ReverbSetDecayHfRatio"); 1823 ReverbSetDecayHfRatio(pContext, ratio); 1824 //ALOGV("\tReverb_setParameter() Called ReverbSetDecayHfRatio"); 1825 break; 1826 case REVERB_PARAM_REVERB_LEVEL: 1827 level = *(int16_t *)pValue; 1828 //ALOGV("\tReverb_setParameter() REVERB_PARAM_REVERB_LEVEL value is %d", level); 1829 //ALOGV("\tReverb_setParameter() Calling ReverbSetReverbLevel"); 1830 ReverbSetReverbLevel(pContext, level); 1831 //ALOGV("\tReverb_setParameter() Called ReverbSetReverbLevel"); 1832 break; 1833 case REVERB_PARAM_DIFFUSION: 1834 ratio = *(int16_t *)pValue; 1835 //ALOGV("\tReverb_setParameter() REVERB_PARAM_DECAY_DIFFUSION value is %d", ratio); 1836 //ALOGV("\tReverb_setParameter() Calling ReverbSetDiffusion"); 1837 ReverbSetDiffusion(pContext, ratio); 1838 //ALOGV("\tReverb_setParameter() Called ReverbSetDiffusion"); 1839 break; 1840 case REVERB_PARAM_DENSITY: 1841 ratio = *(int16_t *)pValue; 1842 //ALOGV("\tReverb_setParameter() REVERB_PARAM_DECAY_DENSITY value is %d", ratio); 1843 //ALOGV("\tReverb_setParameter() Calling ReverbSetDensity"); 1844 ReverbSetDensity(pContext, ratio); 1845 //ALOGV("\tReverb_setParameter() Called ReverbSetDensity"); 1846 break; 1847 break; 1848 case REVERB_PARAM_REFLECTIONS_LEVEL: 1849 case REVERB_PARAM_REFLECTIONS_DELAY: 1850 case REVERB_PARAM_REVERB_DELAY: 1851 break; 1852 default: 1853 ALOGV("\tLVM_ERROR : Reverb_setParameter() invalid param %d", param); 1854 break; 1855 } 1856 1857 //ALOGV("\tReverb_setParameter end"); 1858 return status; 1859} /* end Reverb_setParameter */ 1860 1861 1862/** 1863 * returns the size in bytes of the value of each environmental reverb parameter 1864 */ 1865int Reverb_paramValueSize(int32_t param) { 1866 switch (param) { 1867 case REVERB_PARAM_ROOM_LEVEL: 1868 case REVERB_PARAM_ROOM_HF_LEVEL: 1869 case REVERB_PARAM_REFLECTIONS_LEVEL: 1870 case REVERB_PARAM_REVERB_LEVEL: 1871 return sizeof(int16_t); // millibel 1872 case REVERB_PARAM_DECAY_TIME: 1873 case REVERB_PARAM_REFLECTIONS_DELAY: 1874 case REVERB_PARAM_REVERB_DELAY: 1875 return sizeof(uint32_t); // milliseconds 1876 case REVERB_PARAM_DECAY_HF_RATIO: 1877 case REVERB_PARAM_DIFFUSION: 1878 case REVERB_PARAM_DENSITY: 1879 return sizeof(int16_t); // permille 1880 case REVERB_PARAM_PROPERTIES: 1881 return sizeof(s_reverb_settings); // struct of all reverb properties 1882 } 1883 return sizeof(int32_t); 1884} 1885 1886} // namespace 1887} // namespace 1888 1889extern "C" { 1890/* Effect Control Interface Implementation: Process */ 1891int Reverb_process(effect_handle_t self, 1892 audio_buffer_t *inBuffer, 1893 audio_buffer_t *outBuffer){ 1894 android::ReverbContext * pContext = (android::ReverbContext *) self; 1895 int status = 0; 1896 1897 if (pContext == NULL){ 1898 ALOGV("\tLVM_ERROR : Reverb_process() ERROR pContext == NULL"); 1899 return -EINVAL; 1900 } 1901 if (inBuffer == NULL || inBuffer->raw == NULL || 1902 outBuffer == NULL || outBuffer->raw == NULL || 1903 inBuffer->frameCount != outBuffer->frameCount){ 1904 ALOGV("\tLVM_ERROR : Reverb_process() ERROR NULL INPUT POINTER OR FRAME COUNT IS WRONG"); 1905 return -EINVAL; 1906 } 1907 //ALOGV("\tReverb_process() Calling process with %d frames", outBuffer->frameCount); 1908 /* Process all the available frames, block processing is handled internalLY by the LVM bundle */ 1909 status = process( (LVM_INT16 *)inBuffer->raw, 1910 (LVM_INT16 *)outBuffer->raw, 1911 outBuffer->frameCount, 1912 pContext); 1913 1914 if (pContext->bEnabled == LVM_FALSE) { 1915 if (pContext->SamplesToExitCount > 0) { 1916 pContext->SamplesToExitCount -= outBuffer->frameCount; 1917 } else { 1918 status = -ENODATA; 1919 } 1920 } 1921 1922 return status; 1923} /* end Reverb_process */ 1924 1925/* Effect Control Interface Implementation: Command */ 1926int Reverb_command(effect_handle_t self, 1927 uint32_t cmdCode, 1928 uint32_t cmdSize, 1929 void *pCmdData, 1930 uint32_t *replySize, 1931 void *pReplyData){ 1932 android::ReverbContext * pContext = (android::ReverbContext *) self; 1933 int retsize; 1934 LVREV_ControlParams_st ActiveParams; /* Current control Parameters */ 1935 LVREV_ReturnStatus_en LvmStatus=LVREV_SUCCESS; /* Function call status */ 1936 1937 1938 if (pContext == NULL){ 1939 ALOGV("\tLVM_ERROR : Reverb_command ERROR pContext == NULL"); 1940 return -EINVAL; 1941 } 1942 1943 //ALOGV("\tReverb_command INPUTS are: command %d cmdSize %d",cmdCode, cmdSize); 1944 1945 switch (cmdCode){ 1946 case EFFECT_CMD_INIT: 1947 //ALOGV("\tReverb_command cmdCode Case: " 1948 // "EFFECT_CMD_INIT start"); 1949 1950 if (pReplyData == NULL || replySize == NULL || *replySize != sizeof(int)){ 1951 ALOGV("\tLVM_ERROR : Reverb_command cmdCode Case: " 1952 "EFFECT_CMD_INIT: ERROR"); 1953 return -EINVAL; 1954 } 1955 *(int *) pReplyData = 0; 1956 break; 1957 1958 case EFFECT_CMD_SET_CONFIG: 1959 //ALOGV("\tReverb_command cmdCode Case: " 1960 // "EFFECT_CMD_SET_CONFIG start"); 1961 if (pCmdData == NULL || cmdSize != sizeof(effect_config_t) || 1962 pReplyData == NULL || replySize == NULL || *replySize != sizeof(int)) { 1963 ALOGV("\tLVM_ERROR : Reverb_command cmdCode Case: " 1964 "EFFECT_CMD_SET_CONFIG: ERROR"); 1965 return -EINVAL; 1966 } 1967 *(int *) pReplyData = android::Reverb_setConfig(pContext, 1968 (effect_config_t *) pCmdData); 1969 break; 1970 1971 case EFFECT_CMD_GET_CONFIG: 1972 if (pReplyData == NULL || replySize == NULL || *replySize != sizeof(effect_config_t)) { 1973 ALOGV("\tLVM_ERROR : Reverb_command cmdCode Case: " 1974 "EFFECT_CMD_GET_CONFIG: ERROR"); 1975 return -EINVAL; 1976 } 1977 1978 android::Reverb_getConfig(pContext, (effect_config_t *)pReplyData); 1979 break; 1980 1981 case EFFECT_CMD_RESET: 1982 //ALOGV("\tReverb_command cmdCode Case: " 1983 // "EFFECT_CMD_RESET start"); 1984 Reverb_setConfig(pContext, &pContext->config); 1985 break; 1986 1987 case EFFECT_CMD_GET_PARAM:{ 1988 //ALOGV("\tReverb_command cmdCode Case: " 1989 // "EFFECT_CMD_GET_PARAM start"); 1990 effect_param_t *p = (effect_param_t *)pCmdData; 1991 if (SIZE_MAX - sizeof(effect_param_t) < (size_t)p->psize) { 1992 android_errorWriteLog(0x534e4554, "26347509"); 1993 return -EINVAL; 1994 } 1995 if (pCmdData == NULL || cmdSize < sizeof(effect_param_t) || 1996 cmdSize < (sizeof(effect_param_t) + p->psize) || 1997 pReplyData == NULL || replySize == NULL || 1998 *replySize < (sizeof(effect_param_t) + p->psize)) { 1999 ALOGV("\tLVM_ERROR : Reverb_command cmdCode Case: " 2000 "EFFECT_CMD_GET_PARAM: ERROR"); 2001 return -EINVAL; 2002 } 2003 2004 memcpy(pReplyData, pCmdData, sizeof(effect_param_t) + p->psize); 2005 2006 p = (effect_param_t *)pReplyData; 2007 2008 int voffset = ((p->psize - 1) / sizeof(int32_t) + 1) * sizeof(int32_t); 2009 2010 p->status = android::Reverb_getParameter(pContext, 2011 (void *)p->data, 2012 &p->vsize, 2013 p->data + voffset); 2014 2015 *replySize = sizeof(effect_param_t) + voffset + p->vsize; 2016 2017 //ALOGV("\tReverb_command EFFECT_CMD_GET_PARAM " 2018 // "*pCmdData %d, *replySize %d, *pReplyData %d ", 2019 // *(int32_t *)((char *)pCmdData + sizeof(effect_param_t)), 2020 // *replySize, 2021 // *(int16_t *)((char *)pReplyData + sizeof(effect_param_t) + voffset)); 2022 2023 } break; 2024 case EFFECT_CMD_SET_PARAM:{ 2025 2026 //ALOGV("\tReverb_command cmdCode Case: " 2027 // "EFFECT_CMD_SET_PARAM start"); 2028 //ALOGV("\tReverb_command EFFECT_CMD_SET_PARAM param %d, *replySize %d, value %d ", 2029 // *(int32_t *)((char *)pCmdData + sizeof(effect_param_t)), 2030 // *replySize, 2031 // *(int16_t *)((char *)pCmdData + sizeof(effect_param_t) + sizeof(int32_t))); 2032 2033 if (pCmdData == NULL || (cmdSize < (sizeof(effect_param_t) + sizeof(int32_t))) || 2034 pReplyData == NULL || replySize == NULL || *replySize != sizeof(int32_t)) { 2035 ALOGV("\tLVM_ERROR : Reverb_command cmdCode Case: " 2036 "EFFECT_CMD_SET_PARAM: ERROR"); 2037 return -EINVAL; 2038 } 2039 2040 effect_param_t *p = (effect_param_t *) pCmdData; 2041 2042 if (p->psize != sizeof(int32_t)){ 2043 ALOGV("\t4LVM_ERROR : Reverb_command cmdCode Case: " 2044 "EFFECT_CMD_SET_PARAM: ERROR, psize is not sizeof(int32_t)"); 2045 return -EINVAL; 2046 } 2047 2048 //ALOGV("\tn5Reverb_command cmdSize is %d\n" 2049 // "\tsizeof(effect_param_t) is %d\n" 2050 // "\tp->psize is %d\n" 2051 // "\tp->vsize is %d" 2052 // "\n", 2053 // cmdSize, sizeof(effect_param_t), p->psize, p->vsize ); 2054 2055 *(int *)pReplyData = android::Reverb_setParameter(pContext, 2056 (void *)p->data, 2057 p->data + p->psize, 2058 p->vsize); 2059 } break; 2060 2061 case EFFECT_CMD_ENABLE: 2062 //ALOGV("\tReverb_command cmdCode Case: " 2063 // "EFFECT_CMD_ENABLE start"); 2064 2065 if (pReplyData == NULL || *replySize != sizeof(int)){ 2066 ALOGV("\tLVM_ERROR : Reverb_command cmdCode Case: " 2067 "EFFECT_CMD_ENABLE: ERROR"); 2068 return -EINVAL; 2069 } 2070 if(pContext->bEnabled == LVM_TRUE){ 2071 ALOGV("\tLVM_ERROR : Reverb_command cmdCode Case: " 2072 "EFFECT_CMD_ENABLE: ERROR-Effect is already enabled"); 2073 return -EINVAL; 2074 } 2075 *(int *)pReplyData = 0; 2076 pContext->bEnabled = LVM_TRUE; 2077 /* Get the current settings */ 2078 LvmStatus = LVREV_GetControlParameters(pContext->hInstance, &ActiveParams); 2079 LVM_ERROR_CHECK(LvmStatus, "LVREV_GetControlParameters", "EFFECT_CMD_ENABLE") 2080 pContext->SamplesToExitCount = 2081 (ActiveParams.T60 * pContext->config.inputCfg.samplingRate)/1000; 2082 // force no volume ramp for first buffer processed after enabling the effect 2083 pContext->volumeMode = android::REVERB_VOLUME_FLAT; 2084 //ALOGV("\tEFFECT_CMD_ENABLE SamplesToExitCount = %d", pContext->SamplesToExitCount); 2085 break; 2086 case EFFECT_CMD_DISABLE: 2087 //ALOGV("\tReverb_command cmdCode Case: " 2088 // "EFFECT_CMD_DISABLE start"); 2089 2090 if (pReplyData == NULL || *replySize != sizeof(int)){ 2091 ALOGV("\tLVM_ERROR : Reverb_command cmdCode Case: " 2092 "EFFECT_CMD_DISABLE: ERROR"); 2093 return -EINVAL; 2094 } 2095 if(pContext->bEnabled == LVM_FALSE){ 2096 ALOGV("\tLVM_ERROR : Reverb_command cmdCode Case: " 2097 "EFFECT_CMD_DISABLE: ERROR-Effect is not yet enabled"); 2098 return -EINVAL; 2099 } 2100 *(int *)pReplyData = 0; 2101 pContext->bEnabled = LVM_FALSE; 2102 break; 2103 2104 case EFFECT_CMD_SET_VOLUME: 2105 if (pCmdData == NULL || 2106 cmdSize != 2 * sizeof(uint32_t)) { 2107 ALOGV("\tLVM_ERROR : Reverb_command cmdCode Case: " 2108 "EFFECT_CMD_SET_VOLUME: ERROR"); 2109 return -EINVAL; 2110 } 2111 2112 2113 if (pReplyData != NULL) { // we have volume control 2114 pContext->leftVolume = (LVM_INT16)((*(uint32_t *)pCmdData + (1 << 11)) >> 12); 2115 pContext->rightVolume = (LVM_INT16)((*((uint32_t *)pCmdData + 1) + (1 << 11)) >> 12); 2116 *(uint32_t *)pReplyData = (1 << 24); 2117 *((uint32_t *)pReplyData + 1) = (1 << 24); 2118 if (pContext->volumeMode == android::REVERB_VOLUME_OFF) { 2119 // force no volume ramp for first buffer processed after getting volume control 2120 pContext->volumeMode = android::REVERB_VOLUME_FLAT; 2121 } 2122 } else { // we don't have volume control 2123 pContext->leftVolume = REVERB_UNIT_VOLUME; 2124 pContext->rightVolume = REVERB_UNIT_VOLUME; 2125 pContext->volumeMode = android::REVERB_VOLUME_OFF; 2126 } 2127 ALOGV("EFFECT_CMD_SET_VOLUME left %d, right %d mode %d", 2128 pContext->leftVolume, pContext->rightVolume, pContext->volumeMode); 2129 break; 2130 2131 case EFFECT_CMD_SET_DEVICE: 2132 case EFFECT_CMD_SET_AUDIO_MODE: 2133 //ALOGV("\tReverb_command cmdCode Case: " 2134 // "EFFECT_CMD_SET_DEVICE/EFFECT_CMD_SET_VOLUME/EFFECT_CMD_SET_AUDIO_MODE start"); 2135 break; 2136 2137 default: 2138 ALOGV("\tLVM_ERROR : Reverb_command cmdCode Case: " 2139 "DEFAULT start %d ERROR",cmdCode); 2140 return -EINVAL; 2141 } 2142 2143 //ALOGV("\tReverb_command end\n\n"); 2144 return 0; 2145} /* end Reverb_command */ 2146 2147/* Effect Control Interface Implementation: get_descriptor */ 2148int Reverb_getDescriptor(effect_handle_t self, 2149 effect_descriptor_t *pDescriptor) 2150{ 2151 android::ReverbContext * pContext = (android::ReverbContext *)self; 2152 const effect_descriptor_t *desc; 2153 2154 if (pContext == NULL || pDescriptor == NULL) { 2155 ALOGV("Reverb_getDescriptor() invalid param"); 2156 return -EINVAL; 2157 } 2158 2159 if (pContext->auxiliary) { 2160 if (pContext->preset) { 2161 desc = &android::gAuxPresetReverbDescriptor; 2162 } else { 2163 desc = &android::gAuxEnvReverbDescriptor; 2164 } 2165 } else { 2166 if (pContext->preset) { 2167 desc = &android::gInsertPresetReverbDescriptor; 2168 } else { 2169 desc = &android::gInsertEnvReverbDescriptor; 2170 } 2171 } 2172 2173 *pDescriptor = *desc; 2174 2175 return 0; 2176} /* end Reverb_getDescriptor */ 2177 2178// effect_handle_t interface implementation for Reverb effect 2179const struct effect_interface_s gReverbInterface = { 2180 Reverb_process, 2181 Reverb_command, 2182 Reverb_getDescriptor, 2183 NULL, 2184}; /* end gReverbInterface */ 2185 2186// This is the only symbol that needs to be exported 2187__attribute__ ((visibility ("default"))) 2188audio_effect_library_t AUDIO_EFFECT_LIBRARY_INFO_SYM = { 2189 .tag = AUDIO_EFFECT_LIBRARY_TAG, 2190 .version = EFFECT_LIBRARY_API_VERSION, 2191 .name = "Reverb Library", 2192 .implementor = "NXP Software Ltd.", 2193 .create_effect = android::EffectCreate, 2194 .release_effect = android::EffectRelease, 2195 .get_descriptor = android::EffectGetDescriptor, 2196}; 2197 2198} 2199