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