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 "Bundle" 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 "EffectBundle.h" 30 31 32 // effect_handle_t interface implementation for bass boost 33 extern "C" const struct effect_interface_s gLvmEffectInterface; 34 35 #define LVM_ERROR_CHECK(LvmStatus, callingFunc, calledFunc){\ 36 if (LvmStatus == LVM_NULLADDRESS){\ 37 ALOGV("\tLVM_ERROR : Parameter error - "\ 38 "null pointer returned by %s in %s\n\n\n\n", callingFunc, calledFunc);\ 39 }\ 40 if (LvmStatus == LVM_ALIGNMENTERROR){\ 41 ALOGV("\tLVM_ERROR : Parameter error - "\ 42 "bad alignment returned by %s in %s\n\n\n\n", callingFunc, calledFunc);\ 43 }\ 44 if (LvmStatus == LVM_INVALIDNUMSAMPLES){\ 45 ALOGV("\tLVM_ERROR : Parameter error - "\ 46 "bad number of samples returned by %s in %s\n\n\n\n", callingFunc, calledFunc);\ 47 }\ 48 if (LvmStatus == LVM_OUTOFRANGE){\ 49 ALOGV("\tLVM_ERROR : Parameter error - "\ 50 "out of range returned by %s in %s\n", callingFunc, calledFunc);\ 51 }\ 52 } 53 54 55 static inline int16_t clamp16(int32_t sample) 56 { 57 // check overflow for both positive and negative values: 58 // all bits above short range must me equal to sign bit 59 if ((sample>>15) ^ (sample>>31)) 60 sample = 0x7FFF ^ (sample>>31); 61 return sample; 62 } 63 64 // Namespaces 65 namespace android { 66 namespace { 67 68 // Flag to allow a one time init of global memory, only happens on first call ever 69 int LvmInitFlag = LVM_FALSE; 70 SessionContext GlobalSessionMemory[LVM_MAX_SESSIONS]; 71 int SessionIndex[LVM_MAX_SESSIONS]; 72 73 /* local functions */ 74 #define CHECK_ARG(cond) { \ 75 if (!(cond)) { \ 76 ALOGV("\tLVM_ERROR : Invalid argument: "#cond); \ 77 return -EINVAL; \ 78 } \ 79 } 80 81 82 // NXP SW BassBoost UUID 83 const effect_descriptor_t gBassBoostDescriptor = { 84 {0x0634f220, 0xddd4, 0x11db, 0xa0fc, { 0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b }}, 85 {0x8631f300, 0x72e2, 0x11df, 0xb57e, {0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}}, // uuid 86 EFFECT_CONTROL_API_VERSION, 87 (EFFECT_FLAG_TYPE_INSERT | EFFECT_FLAG_INSERT_FIRST | EFFECT_FLAG_DEVICE_IND 88 | EFFECT_FLAG_VOLUME_CTRL), 89 BASS_BOOST_CUP_LOAD_ARM9E, 90 BUNDLE_MEM_USAGE, 91 "Dynamic Bass Boost", 92 "NXP Software Ltd.", 93 }; 94 95 // NXP SW Virtualizer UUID 96 const effect_descriptor_t gVirtualizerDescriptor = { 97 {0x37cc2c00, 0xdddd, 0x11db, 0x8577, {0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}}, 98 {0x1d4033c0, 0x8557, 0x11df, 0x9f2d, {0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}}, 99 EFFECT_CONTROL_API_VERSION, 100 (EFFECT_FLAG_TYPE_INSERT | EFFECT_FLAG_INSERT_LAST | EFFECT_FLAG_DEVICE_IND 101 | EFFECT_FLAG_VOLUME_CTRL), 102 VIRTUALIZER_CUP_LOAD_ARM9E, 103 BUNDLE_MEM_USAGE, 104 "Virtualizer", 105 "NXP Software Ltd.", 106 }; 107 108 // NXP SW Equalizer UUID 109 const effect_descriptor_t gEqualizerDescriptor = { 110 {0x0bed4300, 0xddd6, 0x11db, 0x8f34, {0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}}, // type 111 {0xce772f20, 0x847d, 0x11df, 0xbb17, {0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b}}, // uuid Eq NXP 112 EFFECT_CONTROL_API_VERSION, 113 (EFFECT_FLAG_TYPE_INSERT | EFFECT_FLAG_INSERT_FIRST | EFFECT_FLAG_VOLUME_CTRL), 114 EQUALIZER_CUP_LOAD_ARM9E, 115 BUNDLE_MEM_USAGE, 116 "Equalizer", 117 "NXP Software Ltd.", 118 }; 119 120 // NXP SW Volume UUID 121 const effect_descriptor_t gVolumeDescriptor = { 122 {0x09e8ede0, 0xddde, 0x11db, 0xb4f6, { 0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b }}, 123 {0x119341a0, 0x8469, 0x11df, 0x81f9, { 0x00, 0x02, 0xa5, 0xd5, 0xc5, 0x1b }}, //uuid VOL NXP 124 EFFECT_CONTROL_API_VERSION, 125 (EFFECT_FLAG_TYPE_INSERT | EFFECT_FLAG_INSERT_LAST | EFFECT_FLAG_VOLUME_CTRL), 126 VOLUME_CUP_LOAD_ARM9E, 127 BUNDLE_MEM_USAGE, 128 "Volume", 129 "NXP Software Ltd.", 130 }; 131 132 //--- local function prototypes 133 void LvmGlobalBundle_init (void); 134 int LvmBundle_init (EffectContext *pContext); 135 int LvmEffect_enable (EffectContext *pContext); 136 int LvmEffect_disable (EffectContext *pContext); 137 void LvmEffect_free (EffectContext *pContext); 138 int Effect_setConfig (EffectContext *pContext, effect_config_t *pConfig); 139 void Effect_getConfig (EffectContext *pContext, effect_config_t *pConfig); 140 int BassBoost_setParameter (EffectContext *pContext, void *pParam, void *pValue); 141 int BassBoost_getParameter (EffectContext *pContext, 142 void *pParam, 143 uint32_t *pValueSize, 144 void *pValue); 145 int Virtualizer_setParameter (EffectContext *pContext, void *pParam, void *pValue); 146 int Virtualizer_getParameter (EffectContext *pContext, 147 void *pParam, 148 uint32_t *pValueSize, 149 void *pValue); 150 int Equalizer_setParameter (EffectContext *pContext, void *pParam, void *pValue); 151 int Equalizer_getParameter (EffectContext *pContext, 152 void *pParam, 153 uint32_t *pValueSize, 154 void *pValue); 155 int Volume_setParameter (EffectContext *pContext, void *pParam, void *pValue); 156 int Volume_getParameter (EffectContext *pContext, 157 void *pParam, 158 uint32_t *pValueSize, 159 void *pValue); 160 int Effect_setEnabled(EffectContext *pContext, bool enabled); 161 162 /* Effect Library Interface Implementation */ 163 164 extern "C" int EffectCreate(const effect_uuid_t *uuid, 165 int32_t sessionId, 166 int32_t ioId __unused, 167 effect_handle_t *pHandle){ 168 int ret = 0; 169 int sessionNo; 170 int i; 171 EffectContext *pContext = NULL; 172 bool newBundle = false; 173 SessionContext *pSessionContext; 174 175 ALOGV("\n\tEffectCreate start session %d", sessionId); 176 177 if (pHandle == NULL || uuid == NULL){ 178 ALOGV("\tLVM_ERROR : EffectCreate() called with NULL pointer"); 179 ret = -EINVAL; 180 goto exit; 181 } 182 183 if(LvmInitFlag == LVM_FALSE){ 184 LvmInitFlag = LVM_TRUE; 185 ALOGV("\tEffectCreate - Initializing all global memory"); 186 LvmGlobalBundle_init(); 187 } 188 189 // Find next available sessionNo 190 for(i=0; i<LVM_MAX_SESSIONS; i++){ 191 if((SessionIndex[i] == LVM_UNUSED_SESSION)||(SessionIndex[i] == sessionId)){ 192 sessionNo = i; 193 SessionIndex[i] = sessionId; 194 ALOGV("\tEffectCreate: Allocating SessionNo %d for SessionId %d\n", sessionNo,sessionId); 195 break; 196 } 197 } 198 199 if(i==LVM_MAX_SESSIONS){ 200 ALOGV("\tLVM_ERROR : Cannot find memory to allocate for current session"); 201 ret = -EINVAL; 202 goto exit; 203 } 204 205 pContext = new EffectContext; 206 207 // If this is the first create in this session 208 if(GlobalSessionMemory[sessionNo].bBundledEffectsEnabled == LVM_FALSE){ 209 ALOGV("\tEffectCreate - This is the first effect in current sessionId %d sessionNo %d", 210 sessionId, sessionNo); 211 212 GlobalSessionMemory[sessionNo].bBundledEffectsEnabled = LVM_TRUE; 213 GlobalSessionMemory[sessionNo].pBundledContext = new BundledEffectContext; 214 newBundle = true; 215 216 pContext->pBundledContext = GlobalSessionMemory[sessionNo].pBundledContext; 217 pContext->pBundledContext->SessionNo = sessionNo; 218 pContext->pBundledContext->SessionId = sessionId; 219 pContext->pBundledContext->hInstance = NULL; 220 pContext->pBundledContext->bVolumeEnabled = LVM_FALSE; 221 pContext->pBundledContext->bEqualizerEnabled = LVM_FALSE; 222 pContext->pBundledContext->bBassEnabled = LVM_FALSE; 223 pContext->pBundledContext->bBassTempDisabled = LVM_FALSE; 224 pContext->pBundledContext->bVirtualizerEnabled = LVM_FALSE; 225 pContext->pBundledContext->bVirtualizerTempDisabled = LVM_FALSE; 226 pContext->pBundledContext->nOutputDevice = AUDIO_DEVICE_NONE; 227 pContext->pBundledContext->nVirtualizerForcedDevice = AUDIO_DEVICE_NONE; 228 pContext->pBundledContext->NumberEffectsEnabled = 0; 229 pContext->pBundledContext->NumberEffectsCalled = 0; 230 pContext->pBundledContext->firstVolume = LVM_TRUE; 231 pContext->pBundledContext->volume = 0; 232 233 #ifdef LVM_PCM 234 char fileName[256]; 235 snprintf(fileName, 256, "/data/tmp/bundle_%p_pcm_in.pcm", pContext->pBundledContext); 236 pContext->pBundledContext->PcmInPtr = fopen(fileName, "w"); 237 if (pContext->pBundledContext->PcmInPtr == NULL) { 238 ALOGV("cannot open %s", fileName); 239 ret = -EINVAL; 240 goto exit; 241 } 242 243 snprintf(fileName, 256, "/data/tmp/bundle_%p_pcm_out.pcm", pContext->pBundledContext); 244 pContext->pBundledContext->PcmOutPtr = fopen(fileName, "w"); 245 if (pContext->pBundledContext->PcmOutPtr == NULL) { 246 ALOGV("cannot open %s", fileName); 247 fclose(pContext->pBundledContext->PcmInPtr); 248 pContext->pBundledContext->PcmInPtr = NULL; 249 ret = -EINVAL; 250 goto exit; 251 } 252 #endif 253 254 /* Saved strength is used to return the exact strength that was used in the set to the get 255 * because we map the original strength range of 0:1000 to 1:15, and this will avoid 256 * quantisation like effect when returning 257 */ 258 pContext->pBundledContext->BassStrengthSaved = 0; 259 pContext->pBundledContext->VirtStrengthSaved = 0; 260 pContext->pBundledContext->CurPreset = PRESET_CUSTOM; 261 pContext->pBundledContext->levelSaved = 0; 262 pContext->pBundledContext->bMuteEnabled = LVM_FALSE; 263 pContext->pBundledContext->bStereoPositionEnabled = LVM_FALSE; 264 pContext->pBundledContext->positionSaved = 0; 265 pContext->pBundledContext->workBuffer = NULL; 266 pContext->pBundledContext->frameCount = -1; 267 pContext->pBundledContext->SamplesToExitCountVirt = 0; 268 pContext->pBundledContext->SamplesToExitCountBb = 0; 269 pContext->pBundledContext->SamplesToExitCountEq = 0; 270 271 for (int i = 0; i < FIVEBAND_NUMBANDS; i++) { 272 pContext->pBundledContext->bandGaindB[i] = EQNB_5BandSoftPresets[i]; 273 } 274 275 ALOGV("\tEffectCreate - Calling LvmBundle_init"); 276 ret = LvmBundle_init(pContext); 277 278 if (ret < 0){ 279 ALOGV("\tLVM_ERROR : EffectCreate() Bundle init failed"); 280 goto exit; 281 } 282 } 283 else{ 284 ALOGV("\tEffectCreate - Assigning memory for previously created effect on sessionNo %d", 285 sessionNo); 286 pContext->pBundledContext = 287 GlobalSessionMemory[sessionNo].pBundledContext; 288 } 289 ALOGV("\tEffectCreate - pBundledContext is %p", pContext->pBundledContext); 290 291 pSessionContext = &GlobalSessionMemory[pContext->pBundledContext->SessionNo]; 292 293 // Create each Effect 294 if (memcmp(uuid, &gBassBoostDescriptor.uuid, sizeof(effect_uuid_t)) == 0){ 295 // Create Bass Boost 296 ALOGV("\tEffectCreate - Effect to be created is LVM_BASS_BOOST"); 297 pSessionContext->bBassInstantiated = LVM_TRUE; 298 pContext->pBundledContext->SamplesToExitCountBb = 0; 299 300 pContext->itfe = &gLvmEffectInterface; 301 pContext->EffectType = LVM_BASS_BOOST; 302 } else if (memcmp(uuid, &gVirtualizerDescriptor.uuid, sizeof(effect_uuid_t)) == 0){ 303 // Create Virtualizer 304 ALOGV("\tEffectCreate - Effect to be created is LVM_VIRTUALIZER"); 305 pSessionContext->bVirtualizerInstantiated=LVM_TRUE; 306 pContext->pBundledContext->SamplesToExitCountVirt = 0; 307 308 pContext->itfe = &gLvmEffectInterface; 309 pContext->EffectType = LVM_VIRTUALIZER; 310 } else if (memcmp(uuid, &gEqualizerDescriptor.uuid, sizeof(effect_uuid_t)) == 0){ 311 // Create Equalizer 312 ALOGV("\tEffectCreate - Effect to be created is LVM_EQUALIZER"); 313 pSessionContext->bEqualizerInstantiated = LVM_TRUE; 314 pContext->pBundledContext->SamplesToExitCountEq = 0; 315 316 pContext->itfe = &gLvmEffectInterface; 317 pContext->EffectType = LVM_EQUALIZER; 318 } else if (memcmp(uuid, &gVolumeDescriptor.uuid, sizeof(effect_uuid_t)) == 0){ 319 // Create Volume 320 ALOGV("\tEffectCreate - Effect to be created is LVM_VOLUME"); 321 pSessionContext->bVolumeInstantiated = LVM_TRUE; 322 323 pContext->itfe = &gLvmEffectInterface; 324 pContext->EffectType = LVM_VOLUME; 325 } 326 else{ 327 ALOGV("\tLVM_ERROR : EffectCreate() invalid UUID"); 328 ret = -EINVAL; 329 goto exit; 330 } 331 332 exit: 333 if (ret != 0) { 334 if (pContext != NULL) { 335 if (newBundle) { 336 GlobalSessionMemory[sessionNo].bBundledEffectsEnabled = LVM_FALSE; 337 SessionIndex[sessionNo] = LVM_UNUSED_SESSION; 338 delete pContext->pBundledContext; 339 } 340 delete pContext; 341 } 342 *pHandle = (effect_handle_t)NULL; 343 } else { 344 *pHandle = (effect_handle_t)pContext; 345 } 346 ALOGV("\tEffectCreate end..\n\n"); 347 return ret; 348 } /* end EffectCreate */ 349 350 extern "C" int EffectRelease(effect_handle_t handle){ 351 ALOGV("\n\tEffectRelease start %p", handle); 352 EffectContext * pContext = (EffectContext *)handle; 353 354 ALOGV("\tEffectRelease start handle: %p, context %p", handle, pContext->pBundledContext); 355 if (pContext == NULL){ 356 ALOGV("\tLVM_ERROR : EffectRelease called with NULL pointer"); 357 return -EINVAL; 358 } 359 360 SessionContext *pSessionContext = &GlobalSessionMemory[pContext->pBundledContext->SessionNo]; 361 362 // Clear the instantiated flag for the effect 363 // protect agains the case where an effect is un-instantiated without being disabled 364 if(pContext->EffectType == LVM_BASS_BOOST) { 365 ALOGV("\tEffectRelease LVM_BASS_BOOST Clearing global intstantiated flag"); 366 pSessionContext->bBassInstantiated = LVM_FALSE; 367 if(pContext->pBundledContext->SamplesToExitCountBb > 0){ 368 pContext->pBundledContext->NumberEffectsEnabled--; 369 } 370 pContext->pBundledContext->SamplesToExitCountBb = 0; 371 } else if(pContext->EffectType == LVM_VIRTUALIZER) { 372 ALOGV("\tEffectRelease LVM_VIRTUALIZER Clearing global intstantiated flag"); 373 pSessionContext->bVirtualizerInstantiated = LVM_FALSE; 374 if(pContext->pBundledContext->SamplesToExitCountVirt > 0){ 375 pContext->pBundledContext->NumberEffectsEnabled--; 376 } 377 pContext->pBundledContext->SamplesToExitCountVirt = 0; 378 } else if(pContext->EffectType == LVM_EQUALIZER) { 379 ALOGV("\tEffectRelease LVM_EQUALIZER Clearing global intstantiated flag"); 380 pSessionContext->bEqualizerInstantiated =LVM_FALSE; 381 if(pContext->pBundledContext->SamplesToExitCountEq > 0){ 382 pContext->pBundledContext->NumberEffectsEnabled--; 383 } 384 pContext->pBundledContext->SamplesToExitCountEq = 0; 385 } else if(pContext->EffectType == LVM_VOLUME) { 386 ALOGV("\tEffectRelease LVM_VOLUME Clearing global intstantiated flag"); 387 pSessionContext->bVolumeInstantiated = LVM_FALSE; 388 if (pContext->pBundledContext->bVolumeEnabled == LVM_TRUE){ 389 pContext->pBundledContext->NumberEffectsEnabled--; 390 } 391 } else { 392 ALOGV("\tLVM_ERROR : EffectRelease : Unsupported effect\n\n\n\n\n\n\n"); 393 } 394 395 // Disable effect, in this case ignore errors (return codes) 396 // if an effect has already been disabled 397 Effect_setEnabled(pContext, LVM_FALSE); 398 399 // if all effects are no longer instantiaed free the lvm memory and delete BundledEffectContext 400 if ((pSessionContext->bBassInstantiated == LVM_FALSE) && 401 (pSessionContext->bVolumeInstantiated == LVM_FALSE) && 402 (pSessionContext->bEqualizerInstantiated ==LVM_FALSE) && 403 (pSessionContext->bVirtualizerInstantiated==LVM_FALSE)) 404 { 405 #ifdef LVM_PCM 406 if (pContext->pBundledContext->PcmInPtr != NULL) { 407 fclose(pContext->pBundledContext->PcmInPtr); 408 pContext->pBundledContext->PcmInPtr = NULL; 409 } 410 if (pContext->pBundledContext->PcmOutPtr != NULL) { 411 fclose(pContext->pBundledContext->PcmOutPtr); 412 pContext->pBundledContext->PcmOutPtr = NULL; 413 } 414 #endif 415 416 417 // Clear the SessionIndex 418 for(int i=0; i<LVM_MAX_SESSIONS; i++){ 419 if(SessionIndex[i] == pContext->pBundledContext->SessionId){ 420 SessionIndex[i] = LVM_UNUSED_SESSION; 421 ALOGV("\tEffectRelease: Clearing SessionIndex SessionNo %d for SessionId %d\n", 422 i, pContext->pBundledContext->SessionId); 423 break; 424 } 425 } 426 427 ALOGV("\tEffectRelease: All effects are no longer instantiated\n"); 428 pSessionContext->bBundledEffectsEnabled = LVM_FALSE; 429 pSessionContext->pBundledContext = LVM_NULL; 430 ALOGV("\tEffectRelease: Freeing LVM Bundle memory\n"); 431 LvmEffect_free(pContext); 432 ALOGV("\tEffectRelease: Deleting LVM Bundle context %p\n", pContext->pBundledContext); 433 if (pContext->pBundledContext->workBuffer != NULL) { 434 free(pContext->pBundledContext->workBuffer); 435 } 436 delete pContext->pBundledContext; 437 pContext->pBundledContext = LVM_NULL; 438 } 439 // free the effect context for current effect 440 delete pContext; 441 442 ALOGV("\tEffectRelease end\n"); 443 return 0; 444 445 } /* end EffectRelease */ 446 447 extern "C" int EffectGetDescriptor(const effect_uuid_t *uuid, 448 effect_descriptor_t *pDescriptor) { 449 const effect_descriptor_t *desc = NULL; 450 451 if (pDescriptor == NULL || uuid == NULL){ 452 ALOGV("EffectGetDescriptor() called with NULL pointer"); 453 return -EINVAL; 454 } 455 456 if (memcmp(uuid, &gBassBoostDescriptor.uuid, sizeof(effect_uuid_t)) == 0) { 457 desc = &gBassBoostDescriptor; 458 } else if (memcmp(uuid, &gVirtualizerDescriptor.uuid, sizeof(effect_uuid_t)) == 0) { 459 desc = &gVirtualizerDescriptor; 460 } else if (memcmp(uuid, &gEqualizerDescriptor.uuid, sizeof(effect_uuid_t)) == 0) { 461 desc = &gEqualizerDescriptor; 462 } else if (memcmp(uuid, &gVolumeDescriptor.uuid, sizeof(effect_uuid_t)) == 0) { 463 desc = &gVolumeDescriptor; 464 } 465 466 if (desc == NULL) { 467 return -EINVAL; 468 } 469 470 *pDescriptor = *desc; 471 472 return 0; 473 } /* end EffectGetDescriptor */ 474 475 void LvmGlobalBundle_init(){ 476 ALOGV("\tLvmGlobalBundle_init start"); 477 for(int i=0; i<LVM_MAX_SESSIONS; i++){ 478 GlobalSessionMemory[i].bBundledEffectsEnabled = LVM_FALSE; 479 GlobalSessionMemory[i].bVolumeInstantiated = LVM_FALSE; 480 GlobalSessionMemory[i].bEqualizerInstantiated = LVM_FALSE; 481 GlobalSessionMemory[i].bBassInstantiated = LVM_FALSE; 482 GlobalSessionMemory[i].bVirtualizerInstantiated = LVM_FALSE; 483 GlobalSessionMemory[i].pBundledContext = LVM_NULL; 484 485 SessionIndex[i] = LVM_UNUSED_SESSION; 486 } 487 return; 488 } 489 //---------------------------------------------------------------------------- 490 // LvmBundle_init() 491 //---------------------------------------------------------------------------- 492 // Purpose: Initialize engine with default configuration, creates instance 493 // with all effects disabled. 494 // 495 // Inputs: 496 // pContext: effect engine context 497 // 498 // Outputs: 499 // 500 //---------------------------------------------------------------------------- 501 502 int LvmBundle_init(EffectContext *pContext){ 503 int status; 504 505 ALOGV("\tLvmBundle_init start"); 506 507 pContext->config.inputCfg.accessMode = EFFECT_BUFFER_ACCESS_READ; 508 pContext->config.inputCfg.channels = AUDIO_CHANNEL_OUT_STEREO; 509 pContext->config.inputCfg.format = AUDIO_FORMAT_PCM_16_BIT; 510 pContext->config.inputCfg.samplingRate = 44100; 511 pContext->config.inputCfg.bufferProvider.getBuffer = NULL; 512 pContext->config.inputCfg.bufferProvider.releaseBuffer = NULL; 513 pContext->config.inputCfg.bufferProvider.cookie = NULL; 514 pContext->config.inputCfg.mask = EFFECT_CONFIG_ALL; 515 pContext->config.outputCfg.accessMode = EFFECT_BUFFER_ACCESS_ACCUMULATE; 516 pContext->config.outputCfg.channels = AUDIO_CHANNEL_OUT_STEREO; 517 pContext->config.outputCfg.format = AUDIO_FORMAT_PCM_16_BIT; 518 pContext->config.outputCfg.samplingRate = 44100; 519 pContext->config.outputCfg.bufferProvider.getBuffer = NULL; 520 pContext->config.outputCfg.bufferProvider.releaseBuffer = NULL; 521 pContext->config.outputCfg.bufferProvider.cookie = NULL; 522 pContext->config.outputCfg.mask = EFFECT_CONFIG_ALL; 523 524 CHECK_ARG(pContext != NULL); 525 526 if (pContext->pBundledContext->hInstance != NULL){ 527 ALOGV("\tLvmBundle_init pContext->pBassBoost != NULL " 528 "-> Calling pContext->pBassBoost->free()"); 529 530 LvmEffect_free(pContext); 531 532 ALOGV("\tLvmBundle_init pContext->pBassBoost != NULL " 533 "-> Called pContext->pBassBoost->free()"); 534 } 535 536 LVM_ReturnStatus_en LvmStatus=LVM_SUCCESS; /* Function call status */ 537 LVM_ControlParams_t params; /* Control Parameters */ 538 LVM_InstParams_t InstParams; /* Instance parameters */ 539 LVM_EQNB_BandDef_t BandDefs[MAX_NUM_BANDS]; /* Equaliser band definitions */ 540 LVM_HeadroomParams_t HeadroomParams; /* Headroom parameters */ 541 LVM_HeadroomBandDef_t HeadroomBandDef[LVM_HEADROOM_MAX_NBANDS]; 542 LVM_MemTab_t MemTab; /* Memory allocation table */ 543 bool bMallocFailure = LVM_FALSE; 544 545 /* Set the capabilities */ 546 InstParams.BufferMode = LVM_UNMANAGED_BUFFERS; 547 InstParams.MaxBlockSize = MAX_CALL_SIZE; 548 InstParams.EQNB_NumBands = MAX_NUM_BANDS; 549 InstParams.PSA_Included = LVM_PSA_ON; 550 551 /* Allocate memory, forcing alignment */ 552 LvmStatus = LVM_GetMemoryTable(LVM_NULL, 553 &MemTab, 554 &InstParams); 555 556 LVM_ERROR_CHECK(LvmStatus, "LVM_GetMemoryTable", "LvmBundle_init") 557 if(LvmStatus != LVM_SUCCESS) return -EINVAL; 558 559 ALOGV("\tCreateInstance Succesfully called LVM_GetMemoryTable\n"); 560 561 /* Allocate memory */ 562 for (int i=0; i<LVM_NR_MEMORY_REGIONS; i++){ 563 if (MemTab.Region[i].Size != 0){ 564 MemTab.Region[i].pBaseAddress = malloc(MemTab.Region[i].Size); 565 566 if (MemTab.Region[i].pBaseAddress == LVM_NULL){ 567 ALOGV("\tLVM_ERROR :LvmBundle_init CreateInstance Failed to allocate %" PRIu32 568 " bytes for region %u\n", MemTab.Region[i].Size, i ); 569 bMallocFailure = LVM_TRUE; 570 }else{ 571 ALOGV("\tLvmBundle_init CreateInstance allocated %" PRIu32 572 " bytes for region %u at %p\n", 573 MemTab.Region[i].Size, i, MemTab.Region[i].pBaseAddress); 574 } 575 } 576 } 577 578 /* If one or more of the memory regions failed to allocate, free the regions that were 579 * succesfully allocated and return with an error 580 */ 581 if(bMallocFailure == LVM_TRUE){ 582 for (int i=0; i<LVM_NR_MEMORY_REGIONS; i++){ 583 if (MemTab.Region[i].pBaseAddress == LVM_NULL){ 584 ALOGV("\tLVM_ERROR :LvmBundle_init CreateInstance Failed to allocate %" PRIu32 585 " bytes for region %u Not freeing\n", MemTab.Region[i].Size, i ); 586 }else{ 587 ALOGV("\tLVM_ERROR :LvmBundle_init CreateInstance Failed: but allocated %" PRIu32 588 " bytes for region %u at %p- free\n", 589 MemTab.Region[i].Size, i, MemTab.Region[i].pBaseAddress); 590 free(MemTab.Region[i].pBaseAddress); 591 } 592 } 593 return -EINVAL; 594 } 595 ALOGV("\tLvmBundle_init CreateInstance Succesfully malloc'd memory\n"); 596 597 /* Initialise */ 598 pContext->pBundledContext->hInstance = LVM_NULL; 599 600 /* Init sets the instance handle */ 601 LvmStatus = LVM_GetInstanceHandle(&pContext->pBundledContext->hInstance, 602 &MemTab, 603 &InstParams); 604 605 LVM_ERROR_CHECK(LvmStatus, "LVM_GetInstanceHandle", "LvmBundle_init") 606 if(LvmStatus != LVM_SUCCESS) return -EINVAL; 607 608 ALOGV("\tLvmBundle_init CreateInstance Succesfully called LVM_GetInstanceHandle\n"); 609 610 /* Set the initial process parameters */ 611 /* General parameters */ 612 params.OperatingMode = LVM_MODE_ON; 613 params.SampleRate = LVM_FS_44100; 614 params.SourceFormat = LVM_STEREO; 615 params.SpeakerType = LVM_HEADPHONES; 616 617 pContext->pBundledContext->SampleRate = LVM_FS_44100; 618 619 /* Concert Sound parameters */ 620 params.VirtualizerOperatingMode = LVM_MODE_OFF; 621 params.VirtualizerType = LVM_CONCERTSOUND; 622 params.VirtualizerReverbLevel = 100; 623 params.CS_EffectLevel = LVM_CS_EFFECT_NONE; 624 625 /* N-Band Equaliser parameters */ 626 params.EQNB_OperatingMode = LVM_EQNB_OFF; 627 params.EQNB_NBands = FIVEBAND_NUMBANDS; 628 params.pEQNB_BandDefinition = &BandDefs[0]; 629 630 for (int i=0; i<FIVEBAND_NUMBANDS; i++) 631 { 632 BandDefs[i].Frequency = EQNB_5BandPresetsFrequencies[i]; 633 BandDefs[i].QFactor = EQNB_5BandPresetsQFactors[i]; 634 BandDefs[i].Gain = EQNB_5BandSoftPresets[i]; 635 } 636 637 /* Volume Control parameters */ 638 params.VC_EffectLevel = 0; 639 params.VC_Balance = 0; 640 641 /* Treble Enhancement parameters */ 642 params.TE_OperatingMode = LVM_TE_OFF; 643 params.TE_EffectLevel = 0; 644 645 /* PSA Control parameters */ 646 params.PSA_Enable = LVM_PSA_OFF; 647 params.PSA_PeakDecayRate = (LVM_PSA_DecaySpeed_en)0; 648 649 /* Bass Enhancement parameters */ 650 params.BE_OperatingMode = LVM_BE_OFF; 651 params.BE_EffectLevel = 0; 652 params.BE_CentreFreq = LVM_BE_CENTRE_90Hz; 653 params.BE_HPF = LVM_BE_HPF_ON; 654 655 /* PSA Control parameters */ 656 params.PSA_Enable = LVM_PSA_OFF; 657 params.PSA_PeakDecayRate = LVM_PSA_SPEED_MEDIUM; 658 659 /* TE Control parameters */ 660 params.TE_OperatingMode = LVM_TE_OFF; 661 params.TE_EffectLevel = 0; 662 663 /* Activate the initial settings */ 664 LvmStatus = LVM_SetControlParameters(pContext->pBundledContext->hInstance, 665 ¶ms); 666 667 LVM_ERROR_CHECK(LvmStatus, "LVM_SetControlParameters", "LvmBundle_init") 668 if(LvmStatus != LVM_SUCCESS) return -EINVAL; 669 670 ALOGV("\tLvmBundle_init CreateInstance Succesfully called LVM_SetControlParameters\n"); 671 672 /* Set the headroom parameters */ 673 HeadroomBandDef[0].Limit_Low = 20; 674 HeadroomBandDef[0].Limit_High = 4999; 675 HeadroomBandDef[0].Headroom_Offset = 0; 676 HeadroomBandDef[1].Limit_Low = 5000; 677 HeadroomBandDef[1].Limit_High = 24000; 678 HeadroomBandDef[1].Headroom_Offset = 0; 679 HeadroomParams.pHeadroomDefinition = &HeadroomBandDef[0]; 680 HeadroomParams.Headroom_OperatingMode = LVM_HEADROOM_ON; 681 HeadroomParams.NHeadroomBands = 2; 682 683 LvmStatus = LVM_SetHeadroomParams(pContext->pBundledContext->hInstance, 684 &HeadroomParams); 685 686 LVM_ERROR_CHECK(LvmStatus, "LVM_SetHeadroomParams", "LvmBundle_init") 687 if(LvmStatus != LVM_SUCCESS) return -EINVAL; 688 689 ALOGV("\tLvmBundle_init CreateInstance Succesfully called LVM_SetHeadroomParams\n"); 690 ALOGV("\tLvmBundle_init End"); 691 return 0; 692 } /* end LvmBundle_init */ 693 694 695 //---------------------------------------------------------------------------- 696 // LvmBundle_process() 697 //---------------------------------------------------------------------------- 698 // Purpose: 699 // Apply LVM Bundle effects 700 // 701 // Inputs: 702 // pIn: pointer to stereo 16 bit input data 703 // pOut: pointer to stereo 16 bit output data 704 // frameCount: Frames to process 705 // pContext: effect engine context 706 // strength strength to be applied 707 // 708 // Outputs: 709 // pOut: pointer to updated stereo 16 bit output data 710 // 711 //---------------------------------------------------------------------------- 712 713 int LvmBundle_process(LVM_INT16 *pIn, 714 LVM_INT16 *pOut, 715 int frameCount, 716 EffectContext *pContext){ 717 718 LVM_ControlParams_t ActiveParams; /* Current control Parameters */ 719 LVM_ReturnStatus_en LvmStatus = LVM_SUCCESS; /* Function call status */ 720 LVM_INT16 *pOutTmp; 721 722 if (pContext->config.outputCfg.accessMode == EFFECT_BUFFER_ACCESS_WRITE){ 723 pOutTmp = pOut; 724 }else if (pContext->config.outputCfg.accessMode == EFFECT_BUFFER_ACCESS_ACCUMULATE){ 725 if (pContext->pBundledContext->frameCount != frameCount) { 726 if (pContext->pBundledContext->workBuffer != NULL) { 727 free(pContext->pBundledContext->workBuffer); 728 } 729 pContext->pBundledContext->workBuffer = 730 (LVM_INT16 *)malloc(frameCount * sizeof(LVM_INT16) * 2); 731 pContext->pBundledContext->frameCount = frameCount; 732 } 733 pOutTmp = pContext->pBundledContext->workBuffer; 734 }else{ 735 ALOGV("LVM_ERROR : LvmBundle_process invalid access mode"); 736 return -EINVAL; 737 } 738 739 #ifdef LVM_PCM 740 fwrite(pIn, frameCount*sizeof(LVM_INT16)*2, 1, pContext->pBundledContext->PcmInPtr); 741 fflush(pContext->pBundledContext->PcmInPtr); 742 #endif 743 744 //ALOGV("Calling LVM_Process"); 745 746 /* Process the samples */ 747 LvmStatus = LVM_Process(pContext->pBundledContext->hInstance, /* Instance handle */ 748 pIn, /* Input buffer */ 749 pOutTmp, /* Output buffer */ 750 (LVM_UINT16)frameCount, /* Number of samples to read */ 751 0); /* Audo Time */ 752 753 LVM_ERROR_CHECK(LvmStatus, "LVM_Process", "LvmBundle_process") 754 if(LvmStatus != LVM_SUCCESS) return -EINVAL; 755 756 #ifdef LVM_PCM 757 fwrite(pOutTmp, frameCount*sizeof(LVM_INT16)*2, 1, pContext->pBundledContext->PcmOutPtr); 758 fflush(pContext->pBundledContext->PcmOutPtr); 759 #endif 760 761 if (pContext->config.outputCfg.accessMode == EFFECT_BUFFER_ACCESS_ACCUMULATE){ 762 for (int i=0; i<frameCount*2; i++){ 763 pOut[i] = clamp16((LVM_INT32)pOut[i] + (LVM_INT32)pOutTmp[i]); 764 } 765 } 766 return 0; 767 } /* end LvmBundle_process */ 768 769 //---------------------------------------------------------------------------- 770 // LvmEffect_enable() 771 //---------------------------------------------------------------------------- 772 // Purpose: Enable the effect in the bundle 773 // 774 // Inputs: 775 // pContext: effect engine context 776 // 777 // Outputs: 778 // 779 //---------------------------------------------------------------------------- 780 781 int LvmEffect_enable(EffectContext *pContext){ 782 //ALOGV("\tLvmEffect_enable start"); 783 784 LVM_ControlParams_t ActiveParams; /* Current control Parameters */ 785 LVM_ReturnStatus_en LvmStatus = LVM_SUCCESS; /* Function call status */ 786 787 /* Get the current settings */ 788 LvmStatus = LVM_GetControlParameters(pContext->pBundledContext->hInstance, 789 &ActiveParams); 790 791 LVM_ERROR_CHECK(LvmStatus, "LVM_GetControlParameters", "LvmEffect_enable") 792 if(LvmStatus != LVM_SUCCESS) return -EINVAL; 793 //ALOGV("\tLvmEffect_enable Succesfully called LVM_GetControlParameters\n"); 794 795 if(pContext->EffectType == LVM_BASS_BOOST) { 796 ALOGV("\tLvmEffect_enable : Enabling LVM_BASS_BOOST"); 797 ActiveParams.BE_OperatingMode = LVM_BE_ON; 798 } 799 if(pContext->EffectType == LVM_VIRTUALIZER) { 800 ALOGV("\tLvmEffect_enable : Enabling LVM_VIRTUALIZER"); 801 ActiveParams.VirtualizerOperatingMode = LVM_MODE_ON; 802 } 803 if(pContext->EffectType == LVM_EQUALIZER) { 804 ALOGV("\tLvmEffect_enable : Enabling LVM_EQUALIZER"); 805 ActiveParams.EQNB_OperatingMode = LVM_EQNB_ON; 806 } 807 if(pContext->EffectType == LVM_VOLUME) { 808 ALOGV("\tLvmEffect_enable : Enabling LVM_VOLUME"); 809 } 810 811 LvmStatus = LVM_SetControlParameters(pContext->pBundledContext->hInstance, &ActiveParams); 812 LVM_ERROR_CHECK(LvmStatus, "LVM_SetControlParameters", "LvmEffect_enable") 813 if(LvmStatus != LVM_SUCCESS) return -EINVAL; 814 815 //ALOGV("\tLvmEffect_enable Succesfully called LVM_SetControlParameters\n"); 816 //ALOGV("\tLvmEffect_enable end"); 817 return 0; 818 } 819 820 //---------------------------------------------------------------------------- 821 // LvmEffect_disable() 822 //---------------------------------------------------------------------------- 823 // Purpose: Disable the effect in the bundle 824 // 825 // Inputs: 826 // pContext: effect engine context 827 // 828 // Outputs: 829 // 830 //---------------------------------------------------------------------------- 831 832 int LvmEffect_disable(EffectContext *pContext){ 833 //ALOGV("\tLvmEffect_disable start"); 834 835 LVM_ControlParams_t ActiveParams; /* Current control Parameters */ 836 LVM_ReturnStatus_en LvmStatus = LVM_SUCCESS; /* Function call status */ 837 /* Get the current settings */ 838 LvmStatus = LVM_GetControlParameters(pContext->pBundledContext->hInstance, 839 &ActiveParams); 840 841 LVM_ERROR_CHECK(LvmStatus, "LVM_GetControlParameters", "LvmEffect_disable") 842 if(LvmStatus != LVM_SUCCESS) return -EINVAL; 843 //ALOGV("\tLvmEffect_disable Succesfully called LVM_GetControlParameters\n"); 844 845 if(pContext->EffectType == LVM_BASS_BOOST) { 846 ALOGV("\tLvmEffect_disable : Disabling LVM_BASS_BOOST"); 847 ActiveParams.BE_OperatingMode = LVM_BE_OFF; 848 } 849 if(pContext->EffectType == LVM_VIRTUALIZER) { 850 ALOGV("\tLvmEffect_disable : Disabling LVM_VIRTUALIZER"); 851 ActiveParams.VirtualizerOperatingMode = LVM_MODE_OFF; 852 } 853 if(pContext->EffectType == LVM_EQUALIZER) { 854 ALOGV("\tLvmEffect_disable : Disabling LVM_EQUALIZER"); 855 ActiveParams.EQNB_OperatingMode = LVM_EQNB_OFF; 856 } 857 if(pContext->EffectType == LVM_VOLUME) { 858 ALOGV("\tLvmEffect_disable : Disabling LVM_VOLUME"); 859 } 860 861 LvmStatus = LVM_SetControlParameters(pContext->pBundledContext->hInstance, &ActiveParams); 862 LVM_ERROR_CHECK(LvmStatus, "LVM_SetControlParameters", "LvmEffect_disable") 863 if(LvmStatus != LVM_SUCCESS) return -EINVAL; 864 865 //ALOGV("\tLvmEffect_disable Succesfully called LVM_SetControlParameters\n"); 866 //ALOGV("\tLvmEffect_disable end"); 867 return 0; 868 } 869 870 //---------------------------------------------------------------------------- 871 // LvmEffect_free() 872 //---------------------------------------------------------------------------- 873 // Purpose: Free all memory associated with the Bundle. 874 // 875 // Inputs: 876 // pContext: effect engine context 877 // 878 // Outputs: 879 // 880 //---------------------------------------------------------------------------- 881 882 void LvmEffect_free(EffectContext *pContext){ 883 LVM_ReturnStatus_en LvmStatus=LVM_SUCCESS; /* Function call status */ 884 LVM_ControlParams_t params; /* Control Parameters */ 885 LVM_MemTab_t MemTab; 886 887 /* Free the algorithm memory */ 888 LvmStatus = LVM_GetMemoryTable(pContext->pBundledContext->hInstance, 889 &MemTab, 890 LVM_NULL); 891 892 LVM_ERROR_CHECK(LvmStatus, "LVM_GetMemoryTable", "LvmEffect_free") 893 894 for (int i=0; i<LVM_NR_MEMORY_REGIONS; i++){ 895 if (MemTab.Region[i].Size != 0){ 896 if (MemTab.Region[i].pBaseAddress != NULL){ 897 ALOGV("\tLvmEffect_free - START freeing %" PRIu32 " bytes for region %u at %p\n", 898 MemTab.Region[i].Size, i, MemTab.Region[i].pBaseAddress); 899 900 free(MemTab.Region[i].pBaseAddress); 901 902 ALOGV("\tLvmEffect_free - END freeing %" PRIu32 " bytes for region %u at %p\n", 903 MemTab.Region[i].Size, i, MemTab.Region[i].pBaseAddress); 904 }else{ 905 ALOGV("\tLVM_ERROR : LvmEffect_free - trying to free with NULL pointer %" PRIu32 906 " bytes for region %u at %p ERROR\n", 907 MemTab.Region[i].Size, i, MemTab.Region[i].pBaseAddress); 908 } 909 } 910 } 911 } /* end LvmEffect_free */ 912 913 //---------------------------------------------------------------------------- 914 // Effect_setConfig() 915 //---------------------------------------------------------------------------- 916 // Purpose: Set input and output audio configuration. 917 // 918 // Inputs: 919 // pContext: effect engine context 920 // pConfig: pointer to effect_config_t structure holding input and output 921 // configuration parameters 922 // 923 // Outputs: 924 // 925 //---------------------------------------------------------------------------- 926 927 int Effect_setConfig(EffectContext *pContext, effect_config_t *pConfig){ 928 LVM_Fs_en SampleRate; 929 //ALOGV("\tEffect_setConfig start"); 930 931 CHECK_ARG(pContext != NULL); 932 CHECK_ARG(pConfig != NULL); 933 934 CHECK_ARG(pConfig->inputCfg.samplingRate == pConfig->outputCfg.samplingRate); 935 CHECK_ARG(pConfig->inputCfg.channels == pConfig->outputCfg.channels); 936 CHECK_ARG(pConfig->inputCfg.format == pConfig->outputCfg.format); 937 CHECK_ARG(pConfig->inputCfg.channels == AUDIO_CHANNEL_OUT_STEREO); 938 CHECK_ARG(pConfig->outputCfg.accessMode == EFFECT_BUFFER_ACCESS_WRITE 939 || pConfig->outputCfg.accessMode == EFFECT_BUFFER_ACCESS_ACCUMULATE); 940 CHECK_ARG(pConfig->inputCfg.format == AUDIO_FORMAT_PCM_16_BIT); 941 942 pContext->config = *pConfig; 943 944 switch (pConfig->inputCfg.samplingRate) { 945 case 8000: 946 SampleRate = LVM_FS_8000; 947 pContext->pBundledContext->SamplesPerSecond = 8000*2; // 2 secs Stereo 948 break; 949 case 16000: 950 SampleRate = LVM_FS_16000; 951 pContext->pBundledContext->SamplesPerSecond = 16000*2; // 2 secs Stereo 952 break; 953 case 22050: 954 SampleRate = LVM_FS_22050; 955 pContext->pBundledContext->SamplesPerSecond = 22050*2; // 2 secs Stereo 956 break; 957 case 32000: 958 SampleRate = LVM_FS_32000; 959 pContext->pBundledContext->SamplesPerSecond = 32000*2; // 2 secs Stereo 960 break; 961 case 44100: 962 SampleRate = LVM_FS_44100; 963 pContext->pBundledContext->SamplesPerSecond = 44100*2; // 2 secs Stereo 964 break; 965 case 48000: 966 SampleRate = LVM_FS_48000; 967 pContext->pBundledContext->SamplesPerSecond = 48000*2; // 2 secs Stereo 968 break; 969 default: 970 ALOGV("\tEffect_setConfig invalid sampling rate %d", pConfig->inputCfg.samplingRate); 971 return -EINVAL; 972 } 973 974 if(pContext->pBundledContext->SampleRate != SampleRate){ 975 976 LVM_ControlParams_t ActiveParams; 977 LVM_ReturnStatus_en LvmStatus = LVM_SUCCESS; 978 979 ALOGV("\tEffect_setConfig change sampling rate to %d", SampleRate); 980 981 /* Get the current settings */ 982 LvmStatus = LVM_GetControlParameters(pContext->pBundledContext->hInstance, 983 &ActiveParams); 984 985 LVM_ERROR_CHECK(LvmStatus, "LVM_GetControlParameters", "Effect_setConfig") 986 if(LvmStatus != LVM_SUCCESS) return -EINVAL; 987 988 ActiveParams.SampleRate = SampleRate; 989 990 LvmStatus = LVM_SetControlParameters(pContext->pBundledContext->hInstance, &ActiveParams); 991 992 LVM_ERROR_CHECK(LvmStatus, "LVM_SetControlParameters", "Effect_setConfig") 993 ALOGV("\tEffect_setConfig Succesfully called LVM_SetControlParameters\n"); 994 pContext->pBundledContext->SampleRate = SampleRate; 995 996 }else{ 997 //ALOGV("\tEffect_setConfig keep sampling rate at %d", SampleRate); 998 } 999 1000 //ALOGV("\tEffect_setConfig End...."); 1001 return 0; 1002 } /* end Effect_setConfig */ 1003 1004 //---------------------------------------------------------------------------- 1005 // Effect_getConfig() 1006 //---------------------------------------------------------------------------- 1007 // Purpose: Get input and output audio configuration. 1008 // 1009 // Inputs: 1010 // pContext: effect engine context 1011 // pConfig: pointer to effect_config_t structure holding input and output 1012 // configuration parameters 1013 // 1014 // Outputs: 1015 // 1016 //---------------------------------------------------------------------------- 1017 1018 void Effect_getConfig(EffectContext *pContext, effect_config_t *pConfig) 1019 { 1020 *pConfig = pContext->config; 1021 } /* end Effect_getConfig */ 1022 1023 //---------------------------------------------------------------------------- 1024 // BassGetStrength() 1025 //---------------------------------------------------------------------------- 1026 // Purpose: 1027 // get the effect strength currently being used, what is actually returned is the strengh that was 1028 // previously used in the set, this is because the app uses a strength in the range 0-1000 while 1029 // the bassboost uses 1-15, so to avoid a quantisation the original set value is used. However the 1030 // actual used value is checked to make sure it corresponds to the one being returned 1031 // 1032 // Inputs: 1033 // pContext: effect engine context 1034 // 1035 //---------------------------------------------------------------------------- 1036 1037 uint32_t BassGetStrength(EffectContext *pContext){ 1038 //ALOGV("\tBassGetStrength() (0-1000) -> %d\n", pContext->pBundledContext->BassStrengthSaved); 1039 1040 LVM_ControlParams_t ActiveParams; /* Current control Parameters */ 1041 LVM_ReturnStatus_en LvmStatus = LVM_SUCCESS; /* Function call status */ 1042 /* Get the current settings */ 1043 LvmStatus = LVM_GetControlParameters(pContext->pBundledContext->hInstance, 1044 &ActiveParams); 1045 1046 LVM_ERROR_CHECK(LvmStatus, "LVM_GetControlParameters", "BassGetStrength") 1047 if(LvmStatus != LVM_SUCCESS) return -EINVAL; 1048 1049 //ALOGV("\tBassGetStrength Succesfully returned from LVM_GetControlParameters\n"); 1050 1051 /* Check that the strength returned matches the strength that was set earlier */ 1052 if(ActiveParams.BE_EffectLevel != 1053 (LVM_INT16)((15*pContext->pBundledContext->BassStrengthSaved)/1000)){ 1054 ALOGV("\tLVM_ERROR : BassGetStrength module strength does not match savedStrength %d %d\n", 1055 ActiveParams.BE_EffectLevel, pContext->pBundledContext->BassStrengthSaved); 1056 return -EINVAL; 1057 } 1058 1059 //ALOGV("\tBassGetStrength() (0-15) -> %d\n", ActiveParams.BE_EffectLevel ); 1060 //ALOGV("\tBassGetStrength() (saved) -> %d\n", pContext->pBundledContext->BassStrengthSaved ); 1061 return pContext->pBundledContext->BassStrengthSaved; 1062 } /* end BassGetStrength */ 1063 1064 //---------------------------------------------------------------------------- 1065 // BassSetStrength() 1066 //---------------------------------------------------------------------------- 1067 // Purpose: 1068 // Apply the strength to the BassBosst. Must first be converted from the range 0-1000 to 1-15 1069 // 1070 // Inputs: 1071 // pContext: effect engine context 1072 // strength strength to be applied 1073 // 1074 //---------------------------------------------------------------------------- 1075 1076 void BassSetStrength(EffectContext *pContext, uint32_t strength){ 1077 //ALOGV("\tBassSetStrength(%d)", strength); 1078 1079 pContext->pBundledContext->BassStrengthSaved = (int)strength; 1080 1081 LVM_ControlParams_t ActiveParams; /* Current control Parameters */ 1082 LVM_ReturnStatus_en LvmStatus=LVM_SUCCESS; /* Function call status */ 1083 1084 /* Get the current settings */ 1085 LvmStatus = LVM_GetControlParameters(pContext->pBundledContext->hInstance, 1086 &ActiveParams); 1087 1088 LVM_ERROR_CHECK(LvmStatus, "LVM_GetControlParameters", "BassSetStrength") 1089 //ALOGV("\tBassSetStrength Succesfully returned from LVM_GetControlParameters\n"); 1090 1091 /* Bass Enhancement parameters */ 1092 ActiveParams.BE_EffectLevel = (LVM_INT16)((15*strength)/1000); 1093 ActiveParams.BE_CentreFreq = LVM_BE_CENTRE_90Hz; 1094 1095 //ALOGV("\tBassSetStrength() (0-15) -> %d\n", ActiveParams.BE_EffectLevel ); 1096 1097 /* Activate the initial settings */ 1098 LvmStatus = LVM_SetControlParameters(pContext->pBundledContext->hInstance, &ActiveParams); 1099 1100 LVM_ERROR_CHECK(LvmStatus, "LVM_SetControlParameters", "BassSetStrength") 1101 //ALOGV("\tBassSetStrength Succesfully called LVM_SetControlParameters\n"); 1102 } /* end BassSetStrength */ 1103 1104 //---------------------------------------------------------------------------- 1105 // VirtualizerGetStrength() 1106 //---------------------------------------------------------------------------- 1107 // Purpose: 1108 // get the effect strength currently being used, what is actually returned is the strengh that was 1109 // previously used in the set, this is because the app uses a strength in the range 0-1000 while 1110 // the Virtualizer uses 1-100, so to avoid a quantisation the original set value is used.However the 1111 // actual used value is checked to make sure it corresponds to the one being returned 1112 // 1113 // Inputs: 1114 // pContext: effect engine context 1115 // 1116 //---------------------------------------------------------------------------- 1117 1118 uint32_t VirtualizerGetStrength(EffectContext *pContext){ 1119 //ALOGV("\tVirtualizerGetStrength (0-1000) -> %d\n",pContext->pBundledContext->VirtStrengthSaved); 1120 1121 LVM_ControlParams_t ActiveParams; /* Current control Parameters */ 1122 LVM_ReturnStatus_en LvmStatus = LVM_SUCCESS; /* Function call status */ 1123 1124 LvmStatus = LVM_GetControlParameters(pContext->pBundledContext->hInstance, &ActiveParams); 1125 1126 LVM_ERROR_CHECK(LvmStatus, "LVM_GetControlParameters", "VirtualizerGetStrength") 1127 if(LvmStatus != LVM_SUCCESS) return -EINVAL; 1128 1129 //ALOGV("\tVirtualizerGetStrength Succesfully returned from LVM_GetControlParameters\n"); 1130 //ALOGV("\tVirtualizerGetStrength() (0-100) -> %d\n", ActiveParams.VirtualizerReverbLevel*10); 1131 return pContext->pBundledContext->VirtStrengthSaved; 1132 } /* end getStrength */ 1133 1134 //---------------------------------------------------------------------------- 1135 // VirtualizerSetStrength() 1136 //---------------------------------------------------------------------------- 1137 // Purpose: 1138 // Apply the strength to the Virtualizer. Must first be converted from the range 0-1000 to 1-15 1139 // 1140 // Inputs: 1141 // pContext: effect engine context 1142 // strength strength to be applied 1143 // 1144 //---------------------------------------------------------------------------- 1145 1146 void VirtualizerSetStrength(EffectContext *pContext, uint32_t strength){ 1147 //ALOGV("\tVirtualizerSetStrength(%d)", strength); 1148 LVM_ControlParams_t ActiveParams; /* Current control Parameters */ 1149 LVM_ReturnStatus_en LvmStatus=LVM_SUCCESS; /* Function call status */ 1150 1151 pContext->pBundledContext->VirtStrengthSaved = (int)strength; 1152 1153 /* Get the current settings */ 1154 LvmStatus = LVM_GetControlParameters(pContext->pBundledContext->hInstance,&ActiveParams); 1155 1156 LVM_ERROR_CHECK(LvmStatus, "LVM_GetControlParameters", "VirtualizerSetStrength") 1157 //ALOGV("\tVirtualizerSetStrength Succesfully returned from LVM_GetControlParameters\n"); 1158 1159 /* Virtualizer parameters */ 1160 ActiveParams.CS_EffectLevel = (int)((strength*32767)/1000); 1161 1162 //ALOGV("\tVirtualizerSetStrength() (0-1000) -> %d\n", strength ); 1163 //ALOGV("\tVirtualizerSetStrength() (0- 100) -> %d\n", ActiveParams.CS_EffectLevel ); 1164 1165 /* Activate the initial settings */ 1166 LvmStatus = LVM_SetControlParameters(pContext->pBundledContext->hInstance, &ActiveParams); 1167 LVM_ERROR_CHECK(LvmStatus, "LVM_SetControlParameters", "VirtualizerSetStrength") 1168 //ALOGV("\tVirtualizerSetStrength Succesfully called LVM_SetControlParameters\n\n"); 1169 } /* end setStrength */ 1170 1171 //---------------------------------------------------------------------------- 1172 // VirtualizerIsDeviceSupported() 1173 //---------------------------------------------------------------------------- 1174 // Purpose: 1175 // Check if an audio device type is supported by this implementation 1176 // 1177 // Inputs: 1178 // deviceType the type of device that affects the processing (e.g. for binaural vs transaural) 1179 // Output: 1180 // -EINVAL if the configuration is not supported or it is unknown 1181 // 0 if the configuration is supported 1182 //---------------------------------------------------------------------------- 1183 int VirtualizerIsDeviceSupported(audio_devices_t deviceType) { 1184 switch (deviceType) { 1185 case AUDIO_DEVICE_OUT_WIRED_HEADSET: 1186 case AUDIO_DEVICE_OUT_WIRED_HEADPHONE: 1187 case AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_HEADPHONES: 1188 return 0; 1189 default : 1190 return -EINVAL; 1191 } 1192 } 1193 1194 //---------------------------------------------------------------------------- 1195 // VirtualizerIsConfigurationSupported() 1196 //---------------------------------------------------------------------------- 1197 // Purpose: 1198 // Check if a channel mask + audio device type is supported by this implementation 1199 // 1200 // Inputs: 1201 // channelMask the channel mask of the input to virtualize 1202 // deviceType the type of device that affects the processing (e.g. for binaural vs transaural) 1203 // Output: 1204 // -EINVAL if the configuration is not supported or it is unknown 1205 // 0 if the configuration is supported 1206 //---------------------------------------------------------------------------- 1207 int VirtualizerIsConfigurationSupported(audio_channel_mask_t channelMask, 1208 audio_devices_t deviceType) { 1209 uint32_t channelCount = audio_channel_count_from_out_mask(channelMask); 1210 if ((channelCount == 0) || (channelCount > 2)) { 1211 return -EINVAL; 1212 } 1213 1214 return VirtualizerIsDeviceSupported(deviceType); 1215 } 1216 1217 //---------------------------------------------------------------------------- 1218 // VirtualizerForceVirtualizationMode() 1219 //---------------------------------------------------------------------------- 1220 // Purpose: 1221 // Force the virtualization mode to that of the given audio device 1222 // 1223 // Inputs: 1224 // pContext effect engine context 1225 // forcedDevice the type of device whose virtualization mode we'll always use 1226 // Output: 1227 // -EINVAL if the device is not supported or is unknown 1228 // 0 if the device is supported and the virtualization mode forced 1229 // 1230 //---------------------------------------------------------------------------- 1231 int VirtualizerForceVirtualizationMode(EffectContext *pContext, audio_devices_t forcedDevice) { 1232 ALOGV("VirtualizerForceVirtualizationMode: forcedDev=0x%x enabled=%d tmpDisabled=%d", 1233 forcedDevice, pContext->pBundledContext->bVirtualizerEnabled, 1234 pContext->pBundledContext->bVirtualizerTempDisabled); 1235 int status = 0; 1236 bool useVirtualizer = false; 1237 1238 if (VirtualizerIsDeviceSupported(forcedDevice) != 0) { 1239 // forced device is not supported, make it behave as a reset of forced mode 1240 forcedDevice = AUDIO_DEVICE_NONE; 1241 // but return an error 1242 status = -EINVAL; 1243 } 1244 1245 if (forcedDevice == AUDIO_DEVICE_NONE) { 1246 // disabling forced virtualization mode: 1247 // verify whether the virtualization should be enabled or disabled 1248 if (VirtualizerIsDeviceSupported(pContext->pBundledContext->nOutputDevice) == 0) { 1249 useVirtualizer = (pContext->pBundledContext->bVirtualizerEnabled == LVM_TRUE); 1250 } 1251 pContext->pBundledContext->nVirtualizerForcedDevice = AUDIO_DEVICE_NONE; 1252 } else { 1253 // forcing virtualization mode: here we already know the device is supported 1254 pContext->pBundledContext->nVirtualizerForcedDevice = AUDIO_DEVICE_OUT_WIRED_HEADPHONE; 1255 // only enable for a supported mode, when the effect is enabled 1256 useVirtualizer = (pContext->pBundledContext->bVirtualizerEnabled == LVM_TRUE); 1257 } 1258 1259 if (useVirtualizer) { 1260 if (pContext->pBundledContext->bVirtualizerTempDisabled == LVM_TRUE) { 1261 ALOGV("\tVirtualizerForceVirtualizationMode re-enable LVM_VIRTUALIZER"); 1262 android::LvmEffect_enable(pContext); 1263 pContext->pBundledContext->bVirtualizerTempDisabled = LVM_FALSE; 1264 } else { 1265 ALOGV("\tVirtualizerForceVirtualizationMode leaving LVM_VIRTUALIZER enabled"); 1266 } 1267 } else { 1268 if (pContext->pBundledContext->bVirtualizerTempDisabled == LVM_FALSE) { 1269 ALOGV("\tVirtualizerForceVirtualizationMode disable LVM_VIRTUALIZER"); 1270 android::LvmEffect_disable(pContext); 1271 pContext->pBundledContext->bVirtualizerTempDisabled = LVM_TRUE; 1272 } else { 1273 ALOGV("\tVirtualizerForceVirtualizationMode leaving LVM_VIRTUALIZER disabled"); 1274 } 1275 } 1276 1277 ALOGV("\tafter VirtualizerForceVirtualizationMode: enabled=%d tmpDisabled=%d", 1278 pContext->pBundledContext->bVirtualizerEnabled, 1279 pContext->pBundledContext->bVirtualizerTempDisabled); 1280 1281 return status; 1282 } 1283 //---------------------------------------------------------------------------- 1284 // VirtualizerGetSpeakerAngles() 1285 //---------------------------------------------------------------------------- 1286 // Purpose: 1287 // Get the virtual speaker angles for a channel mask + audio device type 1288 // configuration which is guaranteed to be supported by this implementation 1289 // 1290 // Inputs: 1291 // channelMask: the channel mask of the input to virtualize 1292 // deviceType the type of device that affects the processing (e.g. for binaural vs transaural) 1293 // Input/Output: 1294 // pSpeakerAngles the array of integer where each speaker angle is written as a triplet in the 1295 // following format: 1296 // int32_t a bit mask with a single value selected for each speaker, following 1297 // the convention of the audio_channel_mask_t type 1298 // int32_t a value in degrees expressing the speaker azimuth, where 0 is in front 1299 // of the user, 180 behind, -90 to the left, 90 to the right of the user 1300 // int32_t a value in degrees expressing the speaker elevation, where 0 is the 1301 // horizontal plane, +90 is directly above the user, -90 below 1302 // 1303 //---------------------------------------------------------------------------- 1304 void VirtualizerGetSpeakerAngles(audio_channel_mask_t channelMask __unused, 1305 audio_devices_t deviceType __unused, int32_t *pSpeakerAngles) { 1306 // the channel count is guaranteed to be 1 or 2 1307 // the device is guaranteed to be of type headphone 1308 // this virtualizer is always 2in with speakers at -90 and 90deg of azimuth, 0deg of elevation 1309 *pSpeakerAngles++ = (int32_t) AUDIO_CHANNEL_OUT_FRONT_LEFT; 1310 *pSpeakerAngles++ = -90; // azimuth 1311 *pSpeakerAngles++ = 0; // elevation 1312 *pSpeakerAngles++ = (int32_t) AUDIO_CHANNEL_OUT_FRONT_RIGHT; 1313 *pSpeakerAngles++ = 90; // azimuth 1314 *pSpeakerAngles = 0; // elevation 1315 } 1316 1317 //---------------------------------------------------------------------------- 1318 // VirtualizerGetVirtualizationMode() 1319 //---------------------------------------------------------------------------- 1320 // Purpose: 1321 // Retrieve the current device whose processing mode is used by this effect 1322 // 1323 // Output: 1324 // AUDIO_DEVICE_NONE if the effect is not virtualizing 1325 // or the device type if the effect is virtualizing 1326 //---------------------------------------------------------------------------- 1327 audio_devices_t VirtualizerGetVirtualizationMode(EffectContext *pContext) { 1328 audio_devices_t virtDevice = AUDIO_DEVICE_NONE; 1329 if ((pContext->pBundledContext->bVirtualizerEnabled == LVM_TRUE) 1330 && (pContext->pBundledContext->bVirtualizerTempDisabled == LVM_FALSE)) { 1331 if (pContext->pBundledContext->nVirtualizerForcedDevice != AUDIO_DEVICE_NONE) { 1332 // virtualization mode is forced, return that device 1333 virtDevice = pContext->pBundledContext->nVirtualizerForcedDevice; 1334 } else { 1335 // no forced mode, return the current device 1336 virtDevice = pContext->pBundledContext->nOutputDevice; 1337 } 1338 } 1339 ALOGV("VirtualizerGetVirtualizationMode() returning 0x%x", virtDevice); 1340 return virtDevice; 1341 } 1342 1343 //---------------------------------------------------------------------------- 1344 // EqualizerLimitBandLevels() 1345 //---------------------------------------------------------------------------- 1346 // Purpose: limit all EQ band gains to a value less than 0 dB while 1347 // preserving the relative band levels. 1348 // 1349 // Inputs: 1350 // pContext: effect engine context 1351 // 1352 // Outputs: 1353 // 1354 //---------------------------------------------------------------------------- 1355 void EqualizerLimitBandLevels(EffectContext *pContext) { 1356 LVM_ControlParams_t ActiveParams; /* Current control Parameters */ 1357 LVM_ReturnStatus_en LvmStatus=LVM_SUCCESS; /* Function call status */ 1358 1359 /* Get the current settings */ 1360 LvmStatus = LVM_GetControlParameters(pContext->pBundledContext->hInstance, &ActiveParams); 1361 LVM_ERROR_CHECK(LvmStatus, "LVM_GetControlParameters", "EqualizerLimitBandLevels") 1362 //ALOGV("\tEqualizerLimitBandLevels Succesfully returned from LVM_GetControlParameters\n"); 1363 //ALOGV("\tEqualizerLimitBandLevels just Got -> %d\n", 1364 // ActiveParams.pEQNB_BandDefinition[band].Gain); 1365 1366 // Apply a volume correction to avoid clipping in the EQ based on 2 factors: 1367 // - the maximum EQ band gain: the volume correction is such that the total of volume + max 1368 // band gain is <= 0 dB 1369 // - the average gain in all bands weighted by their proximity to max gain band. 1370 int maxGain = 0; 1371 int avgGain = 0; 1372 int avgCount = 0; 1373 for (int i = 0; i < FIVEBAND_NUMBANDS; i++) { 1374 if (pContext->pBundledContext->bandGaindB[i] >= maxGain) { 1375 int tmpMaxGain = pContext->pBundledContext->bandGaindB[i]; 1376 int tmpAvgGain = 0; 1377 int tmpAvgCount = 0; 1378 for (int j = 0; j < FIVEBAND_NUMBANDS; j++) { 1379 int gain = pContext->pBundledContext->bandGaindB[j]; 1380 // skip current band and gains < 0 dB 1381 if (j == i || gain < 0) 1382 continue; 1383 // no need to continue if one band not processed yet has a higher gain than current 1384 // max 1385 if (gain > tmpMaxGain) { 1386 // force skipping "if (tmpAvgGain >= avgGain)" below as tmpAvgGain is not 1387 // meaningful in this case 1388 tmpAvgGain = -1; 1389 break; 1390 } 1391 1392 int weight = 1; 1393 if (j < (i + 2) && j > (i - 2)) 1394 weight = 4; 1395 tmpAvgGain += weight * gain; 1396 tmpAvgCount += weight; 1397 } 1398 if (tmpAvgGain >= avgGain) { 1399 maxGain = tmpMaxGain; 1400 avgGain = tmpAvgGain; 1401 avgCount = tmpAvgCount; 1402 } 1403 } 1404 ActiveParams.pEQNB_BandDefinition[i].Frequency = EQNB_5BandPresetsFrequencies[i]; 1405 ActiveParams.pEQNB_BandDefinition[i].QFactor = EQNB_5BandPresetsQFactors[i]; 1406 ActiveParams.pEQNB_BandDefinition[i].Gain = pContext->pBundledContext->bandGaindB[i]; 1407 } 1408 1409 int gainCorrection = 0; 1410 if (maxGain + pContext->pBundledContext->volume > 0) { 1411 gainCorrection = maxGain + pContext->pBundledContext->volume; 1412 } 1413 if (avgCount) { 1414 gainCorrection += avgGain/avgCount; 1415 } 1416 1417 ALOGV("EqualizerLimitBandLevels() gainCorrection %d maxGain %d avgGain %d avgCount %d", 1418 gainCorrection, maxGain, avgGain, avgCount); 1419 1420 ActiveParams.VC_EffectLevel = pContext->pBundledContext->volume - gainCorrection; 1421 if (ActiveParams.VC_EffectLevel < -96) { 1422 ActiveParams.VC_EffectLevel = -96; 1423 } 1424 1425 /* Activate the initial settings */ 1426 LvmStatus = LVM_SetControlParameters(pContext->pBundledContext->hInstance, &ActiveParams); 1427 LVM_ERROR_CHECK(LvmStatus, "LVM_SetControlParameters", "EqualizerLimitBandLevels") 1428 //ALOGV("\tEqualizerLimitBandLevels just Set -> %d\n", 1429 // ActiveParams.pEQNB_BandDefinition[band].Gain); 1430 1431 //ALOGV("\tEqualizerLimitBandLevels just set (-96dB -> 0dB) -> %d\n",ActiveParams.VC_EffectLevel ); 1432 if(pContext->pBundledContext->firstVolume == LVM_TRUE){ 1433 LvmStatus = LVM_SetVolumeNoSmoothing(pContext->pBundledContext->hInstance, &ActiveParams); 1434 LVM_ERROR_CHECK(LvmStatus, "LVM_SetVolumeNoSmoothing", "LvmBundle_process") 1435 ALOGV("\tLVM_VOLUME: Disabling Smoothing for first volume change to remove spikes/clicks"); 1436 pContext->pBundledContext->firstVolume = LVM_FALSE; 1437 } 1438 } 1439 1440 1441 //---------------------------------------------------------------------------- 1442 // EqualizerGetBandLevel() 1443 //---------------------------------------------------------------------------- 1444 // Purpose: Retrieve the gain currently being used for the band passed in 1445 // 1446 // Inputs: 1447 // band: band number 1448 // pContext: effect engine context 1449 // 1450 // Outputs: 1451 // 1452 //---------------------------------------------------------------------------- 1453 int32_t EqualizerGetBandLevel(EffectContext *pContext, int32_t band){ 1454 //ALOGV("\tEqualizerGetBandLevel -> %d\n", pContext->pBundledContext->bandGaindB[band] ); 1455 return pContext->pBundledContext->bandGaindB[band] * 100; 1456 } 1457 1458 //---------------------------------------------------------------------------- 1459 // EqualizerSetBandLevel() 1460 //---------------------------------------------------------------------------- 1461 // Purpose: 1462 // Sets gain value for the given band. 1463 // 1464 // Inputs: 1465 // band: band number 1466 // Gain: Gain to be applied in millibels 1467 // pContext: effect engine context 1468 // 1469 // Outputs: 1470 // 1471 //--------------------------------------------------------------------------- 1472 void EqualizerSetBandLevel(EffectContext *pContext, int band, short Gain){ 1473 int gainRounded; 1474 if(Gain > 0){ 1475 gainRounded = (int)((Gain+50)/100); 1476 }else{ 1477 gainRounded = (int)((Gain-50)/100); 1478 } 1479 //ALOGV("\tEqualizerSetBandLevel(%d)->(%d)", Gain, gainRounded); 1480 pContext->pBundledContext->bandGaindB[band] = gainRounded; 1481 pContext->pBundledContext->CurPreset = PRESET_CUSTOM; 1482 1483 EqualizerLimitBandLevels(pContext); 1484 } 1485 1486 //---------------------------------------------------------------------------- 1487 // EqualizerGetCentreFrequency() 1488 //---------------------------------------------------------------------------- 1489 // Purpose: Retrieve the frequency being used for the band passed in 1490 // 1491 // Inputs: 1492 // band: band number 1493 // pContext: effect engine context 1494 // 1495 // Outputs: 1496 // 1497 //---------------------------------------------------------------------------- 1498 int32_t EqualizerGetCentreFrequency(EffectContext *pContext, int32_t band){ 1499 int32_t Frequency =0; 1500 1501 LVM_ControlParams_t ActiveParams; /* Current control Parameters */ 1502 LVM_ReturnStatus_en LvmStatus = LVM_SUCCESS; /* Function call status */ 1503 LVM_EQNB_BandDef_t *BandDef; 1504 /* Get the current settings */ 1505 LvmStatus = LVM_GetControlParameters(pContext->pBundledContext->hInstance, 1506 &ActiveParams); 1507 1508 LVM_ERROR_CHECK(LvmStatus, "LVM_GetControlParameters", "EqualizerGetCentreFrequency") 1509 1510 BandDef = ActiveParams.pEQNB_BandDefinition; 1511 Frequency = (int32_t)BandDef[band].Frequency*1000; // Convert to millibels 1512 1513 //ALOGV("\tEqualizerGetCentreFrequency -> %d\n", Frequency ); 1514 //ALOGV("\tEqualizerGetCentreFrequency Succesfully returned from LVM_GetControlParameters\n"); 1515 return Frequency; 1516 } 1517 1518 //---------------------------------------------------------------------------- 1519 // EqualizerGetBandFreqRange( 1520 //---------------------------------------------------------------------------- 1521 // Purpose: 1522 // 1523 // Gets lower and upper boundaries of a band. 1524 // For the high shelf, the low bound is the band frequency and the high 1525 // bound is Nyquist. 1526 // For the peaking filters, they are the gain[dB]/2 points. 1527 // 1528 // Inputs: 1529 // band: band number 1530 // pContext: effect engine context 1531 // 1532 // Outputs: 1533 // pLow: lower band range 1534 // pLow: upper band range 1535 //---------------------------------------------------------------------------- 1536 int32_t EqualizerGetBandFreqRange(EffectContext *pContext __unused, int32_t band, uint32_t *pLow, 1537 uint32_t *pHi){ 1538 *pLow = bandFreqRange[band][0]; 1539 *pHi = bandFreqRange[band][1]; 1540 return 0; 1541 } 1542 1543 //---------------------------------------------------------------------------- 1544 // EqualizerGetBand( 1545 //---------------------------------------------------------------------------- 1546 // Purpose: 1547 // 1548 // Returns the band with the maximum influence on a given frequency. 1549 // Result is unaffected by whether EQ is enabled or not, or by whether 1550 // changes have been committed or not. 1551 // 1552 // Inputs: 1553 // targetFreq The target frequency, in millihertz. 1554 // pContext: effect engine context 1555 // 1556 // Outputs: 1557 // pLow: lower band range 1558 // pLow: upper band range 1559 //---------------------------------------------------------------------------- 1560 int32_t EqualizerGetBand(EffectContext *pContext __unused, uint32_t targetFreq){ 1561 int band = 0; 1562 1563 if(targetFreq < bandFreqRange[0][0]){ 1564 return -EINVAL; 1565 }else if(targetFreq == bandFreqRange[0][0]){ 1566 return 0; 1567 } 1568 for(int i=0; i<FIVEBAND_NUMBANDS;i++){ 1569 if((targetFreq > bandFreqRange[i][0])&&(targetFreq <= bandFreqRange[i][1])){ 1570 band = i; 1571 } 1572 } 1573 return band; 1574 } 1575 1576 //---------------------------------------------------------------------------- 1577 // EqualizerGetPreset( 1578 //---------------------------------------------------------------------------- 1579 // Purpose: 1580 // 1581 // Gets the currently set preset ID. 1582 // Will return PRESET_CUSTOM in case the EQ parameters have been modified 1583 // manually since a preset was set. 1584 // 1585 // Inputs: 1586 // pContext: effect engine context 1587 // 1588 //---------------------------------------------------------------------------- 1589 int32_t EqualizerGetPreset(EffectContext *pContext){ 1590 return pContext->pBundledContext->CurPreset; 1591 } 1592 1593 //---------------------------------------------------------------------------- 1594 // EqualizerSetPreset( 1595 //---------------------------------------------------------------------------- 1596 // Purpose: 1597 // 1598 // Sets the current preset by ID. 1599 // All the band parameters will be overridden. 1600 // 1601 // Inputs: 1602 // pContext: effect engine context 1603 // preset The preset ID. 1604 // 1605 //---------------------------------------------------------------------------- 1606 void EqualizerSetPreset(EffectContext *pContext, int preset){ 1607 1608 //ALOGV("\tEqualizerSetPreset(%d)", preset); 1609 pContext->pBundledContext->CurPreset = preset; 1610 1611 //ActiveParams.pEQNB_BandDefinition = &BandDefs[0]; 1612 for (int i=0; i<FIVEBAND_NUMBANDS; i++) 1613 { 1614 pContext->pBundledContext->bandGaindB[i] = 1615 EQNB_5BandSoftPresets[i + preset * FIVEBAND_NUMBANDS]; 1616 } 1617 1618 EqualizerLimitBandLevels(pContext); 1619 1620 //ALOGV("\tEqualizerSetPreset Succesfully called LVM_SetControlParameters\n"); 1621 return; 1622 } 1623 1624 int32_t EqualizerGetNumPresets(){ 1625 return sizeof(gEqualizerPresets) / sizeof(PresetConfig); 1626 } 1627 1628 //---------------------------------------------------------------------------- 1629 // EqualizerGetPresetName( 1630 //---------------------------------------------------------------------------- 1631 // Purpose: 1632 // Gets a human-readable name for a preset ID. Will return "Custom" if 1633 // PRESET_CUSTOM is passed. 1634 // 1635 // Inputs: 1636 // preset The preset ID. Must be less than number of presets. 1637 // 1638 //------------------------------------------------------------------------- 1639 const char * EqualizerGetPresetName(int32_t preset){ 1640 //ALOGV("\tEqualizerGetPresetName start(%d)", preset); 1641 if (preset == PRESET_CUSTOM) { 1642 return "Custom"; 1643 } else { 1644 return gEqualizerPresets[preset].name; 1645 } 1646 //ALOGV("\tEqualizerGetPresetName end(%d)", preset); 1647 return 0; 1648 } 1649 1650 //---------------------------------------------------------------------------- 1651 // VolumeSetVolumeLevel() 1652 //---------------------------------------------------------------------------- 1653 // Purpose: 1654 // 1655 // Inputs: 1656 // pContext: effect engine context 1657 // level level to be applied 1658 // 1659 //---------------------------------------------------------------------------- 1660 1661 int VolumeSetVolumeLevel(EffectContext *pContext, int16_t level){ 1662 1663 if (level > 0 || level < -9600) { 1664 return -EINVAL; 1665 } 1666 1667 if (pContext->pBundledContext->bMuteEnabled == LVM_TRUE) { 1668 pContext->pBundledContext->levelSaved = level / 100; 1669 } else { 1670 pContext->pBundledContext->volume = level / 100; 1671 } 1672 1673 EqualizerLimitBandLevels(pContext); 1674 1675 return 0; 1676 } /* end VolumeSetVolumeLevel */ 1677 1678 //---------------------------------------------------------------------------- 1679 // VolumeGetVolumeLevel() 1680 //---------------------------------------------------------------------------- 1681 // Purpose: 1682 // 1683 // Inputs: 1684 // pContext: effect engine context 1685 // 1686 //---------------------------------------------------------------------------- 1687 1688 int VolumeGetVolumeLevel(EffectContext *pContext, int16_t *level){ 1689 1690 if (pContext->pBundledContext->bMuteEnabled == LVM_TRUE) { 1691 *level = pContext->pBundledContext->levelSaved * 100; 1692 } else { 1693 *level = pContext->pBundledContext->volume * 100; 1694 } 1695 return 0; 1696 } /* end VolumeGetVolumeLevel */ 1697 1698 //---------------------------------------------------------------------------- 1699 // VolumeSetMute() 1700 //---------------------------------------------------------------------------- 1701 // Purpose: 1702 // 1703 // Inputs: 1704 // pContext: effect engine context 1705 // mute: enable/disable flag 1706 // 1707 //---------------------------------------------------------------------------- 1708 1709 int32_t VolumeSetMute(EffectContext *pContext, uint32_t mute){ 1710 //ALOGV("\tVolumeSetMute start(%d)", mute); 1711 1712 pContext->pBundledContext->bMuteEnabled = mute; 1713 1714 /* Set appropriate volume level */ 1715 if(pContext->pBundledContext->bMuteEnabled == LVM_TRUE){ 1716 pContext->pBundledContext->levelSaved = pContext->pBundledContext->volume; 1717 pContext->pBundledContext->volume = -96; 1718 }else{ 1719 pContext->pBundledContext->volume = pContext->pBundledContext->levelSaved; 1720 } 1721 1722 EqualizerLimitBandLevels(pContext); 1723 1724 return 0; 1725 } /* end setMute */ 1726 1727 //---------------------------------------------------------------------------- 1728 // VolumeGetMute() 1729 //---------------------------------------------------------------------------- 1730 // Purpose: 1731 // 1732 // Inputs: 1733 // pContext: effect engine context 1734 // 1735 // Ourputs: 1736 // mute: enable/disable flag 1737 //---------------------------------------------------------------------------- 1738 1739 int32_t VolumeGetMute(EffectContext *pContext, uint32_t *mute){ 1740 //ALOGV("\tVolumeGetMute start"); 1741 if((pContext->pBundledContext->bMuteEnabled == LVM_FALSE)|| 1742 (pContext->pBundledContext->bMuteEnabled == LVM_TRUE)){ 1743 *mute = pContext->pBundledContext->bMuteEnabled; 1744 return 0; 1745 }else{ 1746 ALOGV("\tLVM_ERROR : VolumeGetMute read an invalid value from context %d", 1747 pContext->pBundledContext->bMuteEnabled); 1748 return -EINVAL; 1749 } 1750 //ALOGV("\tVolumeGetMute end"); 1751 } /* end getMute */ 1752 1753 int16_t VolumeConvertStereoPosition(int16_t position){ 1754 int16_t convertedPosition = 0; 1755 1756 convertedPosition = (int16_t)(((float)position/1000)*96); 1757 return convertedPosition; 1758 1759 } 1760 1761 //---------------------------------------------------------------------------- 1762 // VolumeSetStereoPosition() 1763 //---------------------------------------------------------------------------- 1764 // Purpose: 1765 // 1766 // Inputs: 1767 // pContext: effect engine context 1768 // position: stereo position 1769 // 1770 // Outputs: 1771 //---------------------------------------------------------------------------- 1772 1773 int VolumeSetStereoPosition(EffectContext *pContext, int16_t position){ 1774 1775 LVM_ControlParams_t ActiveParams; /* Current control Parameters */ 1776 LVM_ReturnStatus_en LvmStatus=LVM_SUCCESS; /* Function call status */ 1777 LVM_INT16 Balance = 0; 1778 1779 1780 1781 pContext->pBundledContext->positionSaved = position; 1782 Balance = VolumeConvertStereoPosition(pContext->pBundledContext->positionSaved); 1783 1784 //ALOGV("\tVolumeSetStereoPosition start pContext->pBundledContext->positionSaved = %d", 1785 //pContext->pBundledContext->positionSaved); 1786 1787 if(pContext->pBundledContext->bStereoPositionEnabled == LVM_TRUE){ 1788 1789 //ALOGV("\tVolumeSetStereoPosition Position to be set is %d %d\n", position, Balance); 1790 pContext->pBundledContext->positionSaved = position; 1791 /* Get the current settings */ 1792 LvmStatus = LVM_GetControlParameters(pContext->pBundledContext->hInstance, &ActiveParams); 1793 LVM_ERROR_CHECK(LvmStatus, "LVM_GetControlParameters", "VolumeSetStereoPosition") 1794 if(LvmStatus != LVM_SUCCESS) return -EINVAL; 1795 //ALOGV("\tVolumeSetStereoPosition Succesfully returned from LVM_GetControlParameters got:" 1796 // " %d\n", ActiveParams.VC_Balance); 1797 1798 /* Volume parameters */ 1799 ActiveParams.VC_Balance = Balance; 1800 //ALOGV("\tVolumeSetStereoPosition() (-96dB -> +96dB) -> %d\n", ActiveParams.VC_Balance ); 1801 1802 /* Activate the initial settings */ 1803 LvmStatus = LVM_SetControlParameters(pContext->pBundledContext->hInstance, &ActiveParams); 1804 LVM_ERROR_CHECK(LvmStatus, "LVM_SetControlParameters", "VolumeSetStereoPosition") 1805 if(LvmStatus != LVM_SUCCESS) return -EINVAL; 1806 1807 //ALOGV("\tVolumeSetStereoPosition Succesfully called LVM_SetControlParameters\n"); 1808 1809 /* Get the current settings */ 1810 LvmStatus = LVM_GetControlParameters(pContext->pBundledContext->hInstance, &ActiveParams); 1811 LVM_ERROR_CHECK(LvmStatus, "LVM_GetControlParameters", "VolumeSetStereoPosition") 1812 if(LvmStatus != LVM_SUCCESS) return -EINVAL; 1813 //ALOGV("\tVolumeSetStereoPosition Succesfully returned from LVM_GetControlParameters got: " 1814 // "%d\n", ActiveParams.VC_Balance); 1815 } 1816 else{ 1817 //ALOGV("\tVolumeSetStereoPosition Position attempting to set, but not enabled %d %d\n", 1818 //position, Balance); 1819 } 1820 //ALOGV("\tVolumeSetStereoPosition end pContext->pBundledContext->positionSaved = %d\n", 1821 //pContext->pBundledContext->positionSaved); 1822 return 0; 1823 } /* end VolumeSetStereoPosition */ 1824 1825 1826 //---------------------------------------------------------------------------- 1827 // VolumeGetStereoPosition() 1828 //---------------------------------------------------------------------------- 1829 // Purpose: 1830 // 1831 // Inputs: 1832 // pContext: effect engine context 1833 // 1834 // Outputs: 1835 // position: stereo position 1836 //---------------------------------------------------------------------------- 1837 1838 int32_t VolumeGetStereoPosition(EffectContext *pContext, int16_t *position){ 1839 //ALOGV("\tVolumeGetStereoPosition start"); 1840 1841 LVM_ControlParams_t ActiveParams; /* Current control Parameters */ 1842 LVM_ReturnStatus_en LvmStatus = LVM_SUCCESS; /* Function call status */ 1843 LVM_INT16 balance; 1844 1845 //ALOGV("\tVolumeGetStereoPosition start pContext->pBundledContext->positionSaved = %d", 1846 //pContext->pBundledContext->positionSaved); 1847 1848 LvmStatus = LVM_GetControlParameters(pContext->pBundledContext->hInstance, &ActiveParams); 1849 LVM_ERROR_CHECK(LvmStatus, "LVM_GetControlParameters", "VolumeGetStereoPosition") 1850 if(LvmStatus != LVM_SUCCESS) return -EINVAL; 1851 1852 //ALOGV("\tVolumeGetStereoPosition -> %d\n", ActiveParams.VC_Balance); 1853 //ALOGV("\tVolumeGetStereoPosition Succesfully returned from LVM_GetControlParameters\n"); 1854 1855 balance = VolumeConvertStereoPosition(pContext->pBundledContext->positionSaved); 1856 1857 if(pContext->pBundledContext->bStereoPositionEnabled == LVM_TRUE){ 1858 if(balance != ActiveParams.VC_Balance){ 1859 return -EINVAL; 1860 } 1861 } 1862 *position = (LVM_INT16)pContext->pBundledContext->positionSaved; // Convert dB to millibels 1863 //ALOGV("\tVolumeGetStereoPosition end returning pContext->pBundledContext->positionSaved =%d\n", 1864 //pContext->pBundledContext->positionSaved); 1865 return 0; 1866 } /* end VolumeGetStereoPosition */ 1867 1868 //---------------------------------------------------------------------------- 1869 // VolumeEnableStereoPosition() 1870 //---------------------------------------------------------------------------- 1871 // Purpose: 1872 // 1873 // Inputs: 1874 // pContext: effect engine context 1875 // mute: enable/disable flag 1876 // 1877 //---------------------------------------------------------------------------- 1878 1879 int32_t VolumeEnableStereoPosition(EffectContext *pContext, uint32_t enabled){ 1880 //ALOGV("\tVolumeEnableStereoPosition start()"); 1881 1882 pContext->pBundledContext->bStereoPositionEnabled = enabled; 1883 1884 LVM_ControlParams_t ActiveParams; /* Current control Parameters */ 1885 LVM_ReturnStatus_en LvmStatus=LVM_SUCCESS; /* Function call status */ 1886 1887 /* Get the current settings */ 1888 LvmStatus = LVM_GetControlParameters(pContext->pBundledContext->hInstance, &ActiveParams); 1889 LVM_ERROR_CHECK(LvmStatus, "LVM_GetControlParameters", "VolumeEnableStereoPosition") 1890 if(LvmStatus != LVM_SUCCESS) return -EINVAL; 1891 1892 //ALOGV("\tVolumeEnableStereoPosition Succesfully returned from LVM_GetControlParameters\n"); 1893 //ALOGV("\tVolumeEnableStereoPosition to %d, position was %d\n", 1894 // enabled, ActiveParams.VC_Balance ); 1895 1896 /* Set appropriate stereo position */ 1897 if(pContext->pBundledContext->bStereoPositionEnabled == LVM_FALSE){ 1898 ActiveParams.VC_Balance = 0; 1899 }else{ 1900 ActiveParams.VC_Balance = 1901 VolumeConvertStereoPosition(pContext->pBundledContext->positionSaved); 1902 } 1903 1904 /* Activate the initial settings */ 1905 LvmStatus = LVM_SetControlParameters(pContext->pBundledContext->hInstance, &ActiveParams); 1906 LVM_ERROR_CHECK(LvmStatus, "LVM_SetControlParameters", "VolumeEnableStereoPosition") 1907 if(LvmStatus != LVM_SUCCESS) return -EINVAL; 1908 1909 //ALOGV("\tVolumeEnableStereoPosition Succesfully called LVM_SetControlParameters\n"); 1910 //ALOGV("\tVolumeEnableStereoPosition end()\n"); 1911 return 0; 1912 } /* end VolumeEnableStereoPosition */ 1913 1914 //---------------------------------------------------------------------------- 1915 // BassBoost_getParameter() 1916 //---------------------------------------------------------------------------- 1917 // Purpose: 1918 // Get a BassBoost parameter 1919 // 1920 // Inputs: 1921 // pBassBoost - handle to instance data 1922 // pParam - pointer to parameter 1923 // pValue - pointer to variable to hold retrieved value 1924 // pValueSize - pointer to value size: maximum size as input 1925 // 1926 // Outputs: 1927 // *pValue updated with parameter value 1928 // *pValueSize updated with actual value size 1929 // 1930 // 1931 // Side Effects: 1932 // 1933 //---------------------------------------------------------------------------- 1934 1935 int BassBoost_getParameter(EffectContext *pContext, 1936 void *pParam, 1937 uint32_t *pValueSize, 1938 void *pValue){ 1939 int status = 0; 1940 int32_t *pParamTemp = (int32_t *)pParam; 1941 int32_t param = *pParamTemp++; 1942 int32_t param2; 1943 char *name; 1944 1945 //ALOGV("\tBassBoost_getParameter start"); 1946 1947 switch (param){ 1948 case BASSBOOST_PARAM_STRENGTH_SUPPORTED: 1949 if (*pValueSize != sizeof(uint32_t)){ 1950 ALOGV("\tLVM_ERROR : BassBoost_getParameter() invalid pValueSize1 %d", *pValueSize); 1951 return -EINVAL; 1952 } 1953 *pValueSize = sizeof(uint32_t); 1954 break; 1955 case BASSBOOST_PARAM_STRENGTH: 1956 if (*pValueSize != sizeof(int16_t)){ 1957 ALOGV("\tLVM_ERROR : BassBoost_getParameter() invalid pValueSize2 %d", *pValueSize); 1958 return -EINVAL; 1959 } 1960 *pValueSize = sizeof(int16_t); 1961 break; 1962 1963 default: 1964 ALOGV("\tLVM_ERROR : BassBoost_getParameter() invalid param %d", param); 1965 return -EINVAL; 1966 } 1967 1968 switch (param){ 1969 case BASSBOOST_PARAM_STRENGTH_SUPPORTED: 1970 *(uint32_t *)pValue = 1; 1971 1972 //ALOGV("\tBassBoost_getParameter() BASSBOOST_PARAM_STRENGTH_SUPPORTED Value is %d", 1973 // *(uint32_t *)pValue); 1974 break; 1975 1976 case BASSBOOST_PARAM_STRENGTH: 1977 *(int16_t *)pValue = BassGetStrength(pContext); 1978 1979 //ALOGV("\tBassBoost_getParameter() BASSBOOST_PARAM_STRENGTH Value is %d", 1980 // *(int16_t *)pValue); 1981 break; 1982 1983 default: 1984 ALOGV("\tLVM_ERROR : BassBoost_getParameter() invalid param %d", param); 1985 status = -EINVAL; 1986 break; 1987 } 1988 1989 //ALOGV("\tBassBoost_getParameter end"); 1990 return status; 1991 } /* end BassBoost_getParameter */ 1992 1993 //---------------------------------------------------------------------------- 1994 // BassBoost_setParameter() 1995 //---------------------------------------------------------------------------- 1996 // Purpose: 1997 // Set a BassBoost parameter 1998 // 1999 // Inputs: 2000 // pBassBoost - handle to instance data 2001 // pParam - pointer to parameter 2002 // pValue - pointer to value 2003 // 2004 // Outputs: 2005 // 2006 //---------------------------------------------------------------------------- 2007 2008 int BassBoost_setParameter (EffectContext *pContext, void *pParam, void *pValue){ 2009 int status = 0; 2010 int16_t strength; 2011 int32_t *pParamTemp = (int32_t *)pParam; 2012 2013 //ALOGV("\tBassBoost_setParameter start"); 2014 2015 switch (*pParamTemp){ 2016 case BASSBOOST_PARAM_STRENGTH: 2017 strength = *(int16_t *)pValue; 2018 //ALOGV("\tBassBoost_setParameter() BASSBOOST_PARAM_STRENGTH value is %d", strength); 2019 //ALOGV("\tBassBoost_setParameter() Calling pBassBoost->BassSetStrength"); 2020 BassSetStrength(pContext, (int32_t)strength); 2021 //ALOGV("\tBassBoost_setParameter() Called pBassBoost->BassSetStrength"); 2022 break; 2023 default: 2024 ALOGV("\tLVM_ERROR : BassBoost_setParameter() invalid param %d", *pParamTemp); 2025 break; 2026 } 2027 2028 //ALOGV("\tBassBoost_setParameter end"); 2029 return status; 2030 } /* end BassBoost_setParameter */ 2031 2032 //---------------------------------------------------------------------------- 2033 // Virtualizer_getParameter() 2034 //---------------------------------------------------------------------------- 2035 // Purpose: 2036 // Get a Virtualizer parameter 2037 // 2038 // Inputs: 2039 // pVirtualizer - handle to instance data 2040 // pParam - pointer to parameter 2041 // pValue - pointer to variable to hold retrieved value 2042 // pValueSize - pointer to value size: maximum size as input 2043 // 2044 // Outputs: 2045 // *pValue updated with parameter value 2046 // *pValueSize updated with actual value size 2047 // 2048 // 2049 // Side Effects: 2050 // 2051 //---------------------------------------------------------------------------- 2052 2053 int Virtualizer_getParameter(EffectContext *pContext, 2054 void *pParam, 2055 uint32_t *pValueSize, 2056 void *pValue){ 2057 int status = 0; 2058 int32_t *pParamTemp = (int32_t *)pParam; 2059 int32_t param = *pParamTemp++; 2060 char *name; 2061 2062 //ALOGV("\tVirtualizer_getParameter start"); 2063 2064 switch (param){ 2065 case VIRTUALIZER_PARAM_STRENGTH_SUPPORTED: 2066 if (*pValueSize != sizeof(uint32_t)){ 2067 ALOGV("\tLVM_ERROR : Virtualizer_getParameter() invalid pValueSize %d",*pValueSize); 2068 return -EINVAL; 2069 } 2070 *pValueSize = sizeof(uint32_t); 2071 break; 2072 case VIRTUALIZER_PARAM_STRENGTH: 2073 if (*pValueSize != sizeof(int16_t)){ 2074 ALOGV("\tLVM_ERROR : Virtualizer_getParameter() invalid pValueSize2 %d",*pValueSize); 2075 return -EINVAL; 2076 } 2077 *pValueSize = sizeof(int16_t); 2078 break; 2079 case VIRTUALIZER_PARAM_VIRTUAL_SPEAKER_ANGLES: 2080 // return value size can only be interpreted as relative to input value, 2081 // deferring validity check to below 2082 break; 2083 case VIRTUALIZER_PARAM_VIRTUALIZATION_MODE: 2084 if (*pValueSize != sizeof(uint32_t)){ 2085 ALOGV("\tLVM_ERROR : Virtualizer_getParameter() invalid pValueSize %d",*pValueSize); 2086 return -EINVAL; 2087 } 2088 *pValueSize = sizeof(uint32_t); 2089 break; 2090 default: 2091 ALOGV("\tLVM_ERROR : Virtualizer_getParameter() invalid param %d", param); 2092 return -EINVAL; 2093 } 2094 2095 switch (param){ 2096 case VIRTUALIZER_PARAM_STRENGTH_SUPPORTED: 2097 *(uint32_t *)pValue = 1; 2098 2099 //ALOGV("\tVirtualizer_getParameter() VIRTUALIZER_PARAM_STRENGTH_SUPPORTED Value is %d", 2100 // *(uint32_t *)pValue); 2101 break; 2102 2103 case VIRTUALIZER_PARAM_STRENGTH: 2104 *(int16_t *)pValue = VirtualizerGetStrength(pContext); 2105 2106 //ALOGV("\tVirtualizer_getParameter() VIRTUALIZER_PARAM_STRENGTH Value is %d", 2107 // *(int16_t *)pValue); 2108 break; 2109 2110 case VIRTUALIZER_PARAM_VIRTUAL_SPEAKER_ANGLES: { 2111 const audio_channel_mask_t channelMask = (audio_channel_mask_t) *pParamTemp++; 2112 const audio_devices_t deviceType = (audio_devices_t) *pParamTemp; 2113 uint32_t nbChannels = audio_channel_count_from_out_mask(channelMask); 2114 if (*pValueSize < 3 * nbChannels * sizeof(int32_t)){ 2115 ALOGV("\tLVM_ERROR : Virtualizer_getParameter() invalid pValueSize %d",*pValueSize); 2116 return -EINVAL; 2117 } 2118 // verify the configuration is supported 2119 status = VirtualizerIsConfigurationSupported(channelMask, deviceType); 2120 if (status == 0) { 2121 ALOGV("VIRTUALIZER_PARAM_VIRTUAL_SPEAKER_ANGLES supports mask=0x%x device=0x%x", 2122 channelMask, deviceType); 2123 // configuration is supported, get the angles 2124 VirtualizerGetSpeakerAngles(channelMask, deviceType, (int32_t *)pValue); 2125 } 2126 } 2127 break; 2128 2129 case VIRTUALIZER_PARAM_VIRTUALIZATION_MODE: 2130 *(uint32_t *)pValue = (uint32_t) VirtualizerGetVirtualizationMode(pContext); 2131 break; 2132 2133 default: 2134 ALOGV("\tLVM_ERROR : Virtualizer_getParameter() invalid param %d", param); 2135 status = -EINVAL; 2136 break; 2137 } 2138 2139 ALOGV("\tVirtualizer_getParameter end returning status=%d", status); 2140 return status; 2141 } /* end Virtualizer_getParameter */ 2142 2143 //---------------------------------------------------------------------------- 2144 // Virtualizer_setParameter() 2145 //---------------------------------------------------------------------------- 2146 // Purpose: 2147 // Set a Virtualizer parameter 2148 // 2149 // Inputs: 2150 // pVirtualizer - handle to instance data 2151 // pParam - pointer to parameter 2152 // pValue - pointer to value 2153 // 2154 // Outputs: 2155 // 2156 //---------------------------------------------------------------------------- 2157 2158 int Virtualizer_setParameter (EffectContext *pContext, void *pParam, void *pValue){ 2159 int status = 0; 2160 int16_t strength; 2161 int32_t *pParamTemp = (int32_t *)pParam; 2162 int32_t param = *pParamTemp++; 2163 2164 //ALOGV("\tVirtualizer_setParameter start"); 2165 2166 switch (param){ 2167 case VIRTUALIZER_PARAM_STRENGTH: 2168 strength = *(int16_t *)pValue; 2169 //ALOGV("\tVirtualizer_setParameter() VIRTUALIZER_PARAM_STRENGTH value is %d", strength); 2170 //ALOGV("\tVirtualizer_setParameter() Calling pVirtualizer->setStrength"); 2171 VirtualizerSetStrength(pContext, (int32_t)strength); 2172 //ALOGV("\tVirtualizer_setParameter() Called pVirtualizer->setStrength"); 2173 break; 2174 2175 case VIRTUALIZER_PARAM_FORCE_VIRTUALIZATION_MODE: { 2176 const audio_devices_t deviceType = *(audio_devices_t *) pValue; 2177 status = VirtualizerForceVirtualizationMode(pContext, deviceType); 2178 //ALOGV("VIRTUALIZER_PARAM_FORCE_VIRTUALIZATION_MODE device=0x%x result=%d", 2179 // deviceType, status); 2180 } 2181 break; 2182 2183 default: 2184 ALOGV("\tLVM_ERROR : Virtualizer_setParameter() invalid param %d", param); 2185 break; 2186 } 2187 2188 //ALOGV("\tVirtualizer_setParameter end"); 2189 return status; 2190 } /* end Virtualizer_setParameter */ 2191 2192 //---------------------------------------------------------------------------- 2193 // Equalizer_getParameter() 2194 //---------------------------------------------------------------------------- 2195 // Purpose: 2196 // Get a Equalizer parameter 2197 // 2198 // Inputs: 2199 // pEqualizer - handle to instance data 2200 // pParam - pointer to parameter 2201 // pValue - pointer to variable to hold retrieved value 2202 // pValueSize - pointer to value size: maximum size as input 2203 // 2204 // Outputs: 2205 // *pValue updated with parameter value 2206 // *pValueSize updated with actual value size 2207 // 2208 // 2209 // Side Effects: 2210 // 2211 //---------------------------------------------------------------------------- 2212 int Equalizer_getParameter(EffectContext *pContext, 2213 void *pParam, 2214 uint32_t *pValueSize, 2215 void *pValue){ 2216 int status = 0; 2217 int bMute = 0; 2218 int32_t *pParamTemp = (int32_t *)pParam; 2219 int32_t param = *pParamTemp++; 2220 int32_t param2; 2221 char *name; 2222 2223 //ALOGV("\tEqualizer_getParameter start"); 2224 2225 switch (param) { 2226 case EQ_PARAM_NUM_BANDS: 2227 case EQ_PARAM_CUR_PRESET: 2228 case EQ_PARAM_GET_NUM_OF_PRESETS: 2229 case EQ_PARAM_BAND_LEVEL: 2230 case EQ_PARAM_GET_BAND: 2231 if (*pValueSize < sizeof(int16_t)) { 2232 ALOGV("\tLVM_ERROR : Equalizer_getParameter() invalid pValueSize 1 %d", *pValueSize); 2233 return -EINVAL; 2234 } 2235 *pValueSize = sizeof(int16_t); 2236 break; 2237 2238 case EQ_PARAM_LEVEL_RANGE: 2239 if (*pValueSize < 2 * sizeof(int16_t)) { 2240 ALOGV("\tLVM_ERROR : Equalizer_getParameter() invalid pValueSize 2 %d", *pValueSize); 2241 return -EINVAL; 2242 } 2243 *pValueSize = 2 * sizeof(int16_t); 2244 break; 2245 case EQ_PARAM_BAND_FREQ_RANGE: 2246 if (*pValueSize < 2 * sizeof(int32_t)) { 2247 ALOGV("\tLVM_ERROR : Equalizer_getParameter() invalid pValueSize 3 %d", *pValueSize); 2248 return -EINVAL; 2249 } 2250 *pValueSize = 2 * sizeof(int32_t); 2251 break; 2252 2253 case EQ_PARAM_CENTER_FREQ: 2254 if (*pValueSize < sizeof(int32_t)) { 2255 ALOGV("\tLVM_ERROR : Equalizer_getParameter() invalid pValueSize 5 %d", *pValueSize); 2256 return -EINVAL; 2257 } 2258 *pValueSize = sizeof(int32_t); 2259 break; 2260 2261 case EQ_PARAM_GET_PRESET_NAME: 2262 break; 2263 2264 case EQ_PARAM_PROPERTIES: 2265 if (*pValueSize < (2 + FIVEBAND_NUMBANDS) * sizeof(uint16_t)) { 2266 ALOGV("\tLVM_ERROR : Equalizer_getParameter() invalid pValueSize 1 %d", *pValueSize); 2267 return -EINVAL; 2268 } 2269 *pValueSize = (2 + FIVEBAND_NUMBANDS) * sizeof(uint16_t); 2270 break; 2271 2272 default: 2273 ALOGV("\tLVM_ERROR : Equalizer_getParameter unknown param %d", param); 2274 return -EINVAL; 2275 } 2276 2277 switch (param) { 2278 case EQ_PARAM_NUM_BANDS: 2279 *(uint16_t *)pValue = (uint16_t)FIVEBAND_NUMBANDS; 2280 //ALOGV("\tEqualizer_getParameter() EQ_PARAM_NUM_BANDS %d", *(int16_t *)pValue); 2281 break; 2282 2283 case EQ_PARAM_LEVEL_RANGE: 2284 *(int16_t *)pValue = -1500; 2285 *((int16_t *)pValue + 1) = 1500; 2286 //ALOGV("\tEqualizer_getParameter() EQ_PARAM_LEVEL_RANGE min %d, max %d", 2287 // *(int16_t *)pValue, *((int16_t *)pValue + 1)); 2288 break; 2289 2290 case EQ_PARAM_BAND_LEVEL: 2291 param2 = *pParamTemp; 2292 if (param2 >= FIVEBAND_NUMBANDS) { 2293 status = -EINVAL; 2294 break; 2295 } 2296 *(int16_t *)pValue = (int16_t)EqualizerGetBandLevel(pContext, param2); 2297 //ALOGV("\tEqualizer_getParameter() EQ_PARAM_BAND_LEVEL band %d, level %d", 2298 // param2, *(int32_t *)pValue); 2299 break; 2300 2301 case EQ_PARAM_CENTER_FREQ: 2302 param2 = *pParamTemp; 2303 if (param2 >= FIVEBAND_NUMBANDS) { 2304 status = -EINVAL; 2305 break; 2306 } 2307 *(int32_t *)pValue = EqualizerGetCentreFrequency(pContext, param2); 2308 //ALOGV("\tEqualizer_getParameter() EQ_PARAM_CENTER_FREQ band %d, frequency %d", 2309 // param2, *(int32_t *)pValue); 2310 break; 2311 2312 case EQ_PARAM_BAND_FREQ_RANGE: 2313 param2 = *pParamTemp; 2314 if (param2 >= FIVEBAND_NUMBANDS) { 2315 status = -EINVAL; 2316 break; 2317 } 2318 EqualizerGetBandFreqRange(pContext, param2, (uint32_t *)pValue, ((uint32_t *)pValue + 1)); 2319 //ALOGV("\tEqualizer_getParameter() EQ_PARAM_BAND_FREQ_RANGE band %d, min %d, max %d", 2320 // param2, *(int32_t *)pValue, *((int32_t *)pValue + 1)); 2321 break; 2322 2323 case EQ_PARAM_GET_BAND: 2324 param2 = *pParamTemp; 2325 *(uint16_t *)pValue = (uint16_t)EqualizerGetBand(pContext, param2); 2326 //ALOGV("\tEqualizer_getParameter() EQ_PARAM_GET_BAND frequency %d, band %d", 2327 // param2, *(uint16_t *)pValue); 2328 break; 2329 2330 case EQ_PARAM_CUR_PRESET: 2331 *(uint16_t *)pValue = (uint16_t)EqualizerGetPreset(pContext); 2332 //ALOGV("\tEqualizer_getParameter() EQ_PARAM_CUR_PRESET %d", *(int32_t *)pValue); 2333 break; 2334 2335 case EQ_PARAM_GET_NUM_OF_PRESETS: 2336 *(uint16_t *)pValue = (uint16_t)EqualizerGetNumPresets(); 2337 //ALOGV("\tEqualizer_getParameter() EQ_PARAM_GET_NUM_OF_PRESETS %d", *(int16_t *)pValue); 2338 break; 2339 2340 case EQ_PARAM_GET_PRESET_NAME: 2341 param2 = *pParamTemp; 2342 if (param2 >= EqualizerGetNumPresets()) { 2343 //if (param2 >= 20) { // AGO FIX 2344 status = -EINVAL; 2345 break; 2346 } 2347 name = (char *)pValue; 2348 strncpy(name, EqualizerGetPresetName(param2), *pValueSize - 1); 2349 name[*pValueSize - 1] = 0; 2350 *pValueSize = strlen(name) + 1; 2351 //ALOGV("\tEqualizer_getParameter() EQ_PARAM_GET_PRESET_NAME preset %d, name %s len %d", 2352 // param2, gEqualizerPresets[param2].name, *pValueSize); 2353 break; 2354 2355 case EQ_PARAM_PROPERTIES: { 2356 int16_t *p = (int16_t *)pValue; 2357 ALOGV("\tEqualizer_getParameter() EQ_PARAM_PROPERTIES"); 2358 p[0] = (int16_t)EqualizerGetPreset(pContext); 2359 p[1] = (int16_t)FIVEBAND_NUMBANDS; 2360 for (int i = 0; i < FIVEBAND_NUMBANDS; i++) { 2361 p[2 + i] = (int16_t)EqualizerGetBandLevel(pContext, i); 2362 } 2363 } break; 2364 2365 default: 2366 ALOGV("\tLVM_ERROR : Equalizer_getParameter() invalid param %d", param); 2367 status = -EINVAL; 2368 break; 2369 } 2370 2371 //GV("\tEqualizer_getParameter end\n"); 2372 return status; 2373 } /* end Equalizer_getParameter */ 2374 2375 //---------------------------------------------------------------------------- 2376 // Equalizer_setParameter() 2377 //---------------------------------------------------------------------------- 2378 // Purpose: 2379 // Set a Equalizer parameter 2380 // 2381 // Inputs: 2382 // pEqualizer - handle to instance data 2383 // pParam - pointer to parameter 2384 // pValue - pointer to value 2385 // 2386 // Outputs: 2387 // 2388 //---------------------------------------------------------------------------- 2389 int Equalizer_setParameter (EffectContext *pContext, void *pParam, void *pValue){ 2390 int status = 0; 2391 int32_t preset; 2392 int32_t band; 2393 int32_t level; 2394 int32_t *pParamTemp = (int32_t *)pParam; 2395 int32_t param = *pParamTemp++; 2396 2397 2398 //ALOGV("\tEqualizer_setParameter start"); 2399 switch (param) { 2400 case EQ_PARAM_CUR_PRESET: 2401 preset = (int32_t)(*(uint16_t *)pValue); 2402 2403 //ALOGV("\tEqualizer_setParameter() EQ_PARAM_CUR_PRESET %d", preset); 2404 if ((preset >= EqualizerGetNumPresets())||(preset < 0)) { 2405 status = -EINVAL; 2406 break; 2407 } 2408 EqualizerSetPreset(pContext, preset); 2409 break; 2410 case EQ_PARAM_BAND_LEVEL: 2411 band = *pParamTemp; 2412 level = (int32_t)(*(int16_t *)pValue); 2413 //ALOGV("\tEqualizer_setParameter() EQ_PARAM_BAND_LEVEL band %d, level %d", band, level); 2414 if (band >= FIVEBAND_NUMBANDS) { 2415 status = -EINVAL; 2416 break; 2417 } 2418 EqualizerSetBandLevel(pContext, band, level); 2419 break; 2420 case EQ_PARAM_PROPERTIES: { 2421 //ALOGV("\tEqualizer_setParameter() EQ_PARAM_PROPERTIES"); 2422 int16_t *p = (int16_t *)pValue; 2423 if ((int)p[0] >= EqualizerGetNumPresets()) { 2424 status = -EINVAL; 2425 break; 2426 } 2427 if (p[0] >= 0) { 2428 EqualizerSetPreset(pContext, (int)p[0]); 2429 } else { 2430 if ((int)p[1] != FIVEBAND_NUMBANDS) { 2431 status = -EINVAL; 2432 break; 2433 } 2434 for (int i = 0; i < FIVEBAND_NUMBANDS; i++) { 2435 EqualizerSetBandLevel(pContext, i, (int)p[2 + i]); 2436 } 2437 } 2438 } break; 2439 default: 2440 ALOGV("\tLVM_ERROR : Equalizer_setParameter() invalid param %d", param); 2441 status = -EINVAL; 2442 break; 2443 } 2444 2445 //ALOGV("\tEqualizer_setParameter end"); 2446 return status; 2447 } /* end Equalizer_setParameter */ 2448 2449 //---------------------------------------------------------------------------- 2450 // Volume_getParameter() 2451 //---------------------------------------------------------------------------- 2452 // Purpose: 2453 // Get a Volume parameter 2454 // 2455 // Inputs: 2456 // pVolume - handle to instance data 2457 // pParam - pointer to parameter 2458 // pValue - pointer to variable to hold retrieved value 2459 // pValueSize - pointer to value size: maximum size as input 2460 // 2461 // Outputs: 2462 // *pValue updated with parameter value 2463 // *pValueSize updated with actual value size 2464 // 2465 // 2466 // Side Effects: 2467 // 2468 //---------------------------------------------------------------------------- 2469 2470 int Volume_getParameter(EffectContext *pContext, 2471 void *pParam, 2472 uint32_t *pValueSize, 2473 void *pValue){ 2474 int status = 0; 2475 int bMute = 0; 2476 int32_t *pParamTemp = (int32_t *)pParam; 2477 int32_t param = *pParamTemp++;; 2478 char *name; 2479 2480 //ALOGV("\tVolume_getParameter start"); 2481 2482 switch (param){ 2483 case VOLUME_PARAM_LEVEL: 2484 case VOLUME_PARAM_MAXLEVEL: 2485 case VOLUME_PARAM_STEREOPOSITION: 2486 if (*pValueSize != sizeof(int16_t)){ 2487 ALOGV("\tLVM_ERROR : Volume_getParameter() invalid pValueSize 1 %d", *pValueSize); 2488 return -EINVAL; 2489 } 2490 *pValueSize = sizeof(int16_t); 2491 break; 2492 2493 case VOLUME_PARAM_MUTE: 2494 case VOLUME_PARAM_ENABLESTEREOPOSITION: 2495 if (*pValueSize < sizeof(int32_t)){ 2496 ALOGV("\tLVM_ERROR : Volume_getParameter() invalid pValueSize 2 %d", *pValueSize); 2497 return -EINVAL; 2498 } 2499 *pValueSize = sizeof(int32_t); 2500 break; 2501 2502 default: 2503 ALOGV("\tLVM_ERROR : Volume_getParameter unknown param %d", param); 2504 return -EINVAL; 2505 } 2506 2507 switch (param){ 2508 case VOLUME_PARAM_LEVEL: 2509 status = VolumeGetVolumeLevel(pContext, (int16_t *)(pValue)); 2510 //ALOGV("\tVolume_getParameter() VOLUME_PARAM_LEVEL Value is %d", 2511 // *(int16_t *)pValue); 2512 break; 2513 2514 case VOLUME_PARAM_MAXLEVEL: 2515 *(int16_t *)pValue = 0; 2516 //ALOGV("\tVolume_getParameter() VOLUME_PARAM_MAXLEVEL Value is %d", 2517 // *(int16_t *)pValue); 2518 break; 2519 2520 case VOLUME_PARAM_STEREOPOSITION: 2521 VolumeGetStereoPosition(pContext, (int16_t *)pValue); 2522 //ALOGV("\tVolume_getParameter() VOLUME_PARAM_STEREOPOSITION Value is %d", 2523 // *(int16_t *)pValue); 2524 break; 2525 2526 case VOLUME_PARAM_MUTE: 2527 status = VolumeGetMute(pContext, (uint32_t *)pValue); 2528 ALOGV("\tVolume_getParameter() VOLUME_PARAM_MUTE Value is %d", 2529 *(uint32_t *)pValue); 2530 break; 2531 2532 case VOLUME_PARAM_ENABLESTEREOPOSITION: 2533 *(int32_t *)pValue = pContext->pBundledContext->bStereoPositionEnabled; 2534 //ALOGV("\tVolume_getParameter() VOLUME_PARAM_ENABLESTEREOPOSITION Value is %d", 2535 // *(uint32_t *)pValue); 2536 break; 2537 2538 default: 2539 ALOGV("\tLVM_ERROR : Volume_getParameter() invalid param %d", param); 2540 status = -EINVAL; 2541 break; 2542 } 2543 2544 //ALOGV("\tVolume_getParameter end"); 2545 return status; 2546 } /* end Volume_getParameter */ 2547 2548 2549 //---------------------------------------------------------------------------- 2550 // Volume_setParameter() 2551 //---------------------------------------------------------------------------- 2552 // Purpose: 2553 // Set a Volume parameter 2554 // 2555 // Inputs: 2556 // pVolume - handle to instance data 2557 // pParam - pointer to parameter 2558 // pValue - pointer to value 2559 // 2560 // Outputs: 2561 // 2562 //---------------------------------------------------------------------------- 2563 2564 int Volume_setParameter (EffectContext *pContext, void *pParam, void *pValue){ 2565 int status = 0; 2566 int16_t level; 2567 int16_t position; 2568 uint32_t mute; 2569 uint32_t positionEnabled; 2570 int32_t *pParamTemp = (int32_t *)pParam; 2571 int32_t param = *pParamTemp++; 2572 2573 //ALOGV("\tVolume_setParameter start"); 2574 2575 switch (param){ 2576 case VOLUME_PARAM_LEVEL: 2577 level = *(int16_t *)pValue; 2578 //ALOGV("\tVolume_setParameter() VOLUME_PARAM_LEVEL value is %d", level); 2579 //ALOGV("\tVolume_setParameter() Calling pVolume->setVolumeLevel"); 2580 status = VolumeSetVolumeLevel(pContext, (int16_t)level); 2581 //ALOGV("\tVolume_setParameter() Called pVolume->setVolumeLevel"); 2582 break; 2583 2584 case VOLUME_PARAM_MUTE: 2585 mute = *(uint32_t *)pValue; 2586 //ALOGV("\tVolume_setParameter() Calling pVolume->setMute, mute is %d", mute); 2587 //ALOGV("\tVolume_setParameter() Calling pVolume->setMute"); 2588 status = VolumeSetMute(pContext, mute); 2589 //ALOGV("\tVolume_setParameter() Called pVolume->setMute"); 2590 break; 2591 2592 case VOLUME_PARAM_ENABLESTEREOPOSITION: 2593 positionEnabled = *(uint32_t *)pValue; 2594 status = VolumeEnableStereoPosition(pContext, positionEnabled); 2595 status = VolumeSetStereoPosition(pContext, pContext->pBundledContext->positionSaved); 2596 //ALOGV("\tVolume_setParameter() VOLUME_PARAM_ENABLESTEREOPOSITION called"); 2597 break; 2598 2599 case VOLUME_PARAM_STEREOPOSITION: 2600 position = *(int16_t *)pValue; 2601 //ALOGV("\tVolume_setParameter() VOLUME_PARAM_STEREOPOSITION value is %d", position); 2602 //ALOGV("\tVolume_setParameter() Calling pVolume->VolumeSetStereoPosition"); 2603 status = VolumeSetStereoPosition(pContext, (int16_t)position); 2604 //ALOGV("\tVolume_setParameter() Called pVolume->VolumeSetStereoPosition"); 2605 break; 2606 2607 default: 2608 ALOGV("\tLVM_ERROR : Volume_setParameter() invalid param %d", param); 2609 break; 2610 } 2611 2612 //ALOGV("\tVolume_setParameter end"); 2613 return status; 2614 } /* end Volume_setParameter */ 2615 2616 /**************************************************************************************** 2617 * Name : LVC_ToDB_s32Tos16() 2618 * Input : Signed 32-bit integer 2619 * Output : Signed 16-bit integer 2620 * MSB (16) = sign bit 2621 * (15->05) = integer part 2622 * (04->01) = decimal part 2623 * Returns : Db value with respect to full scale 2624 * Description : 2625 * Remarks : 2626 ****************************************************************************************/ 2627 2628 LVM_INT16 LVC_ToDB_s32Tos16(LVM_INT32 Lin_fix) 2629 { 2630 LVM_INT16 db_fix; 2631 LVM_INT16 Shift; 2632 LVM_INT16 SmallRemainder; 2633 LVM_UINT32 Remainder = (LVM_UINT32)Lin_fix; 2634 2635 /* Count leading bits, 1 cycle in assembly*/ 2636 for (Shift = 0; Shift<32; Shift++) 2637 { 2638 if ((Remainder & 0x80000000U)!=0) 2639 { 2640 break; 2641 } 2642 Remainder = Remainder << 1; 2643 } 2644 2645 /* 2646 * Based on the approximation equation (for Q11.4 format): 2647 * 2648 * dB = -96 * Shift + 16 * (8 * Remainder - 2 * Remainder^2) 2649 */ 2650 db_fix = (LVM_INT16)(-96 * Shift); /* Six dB steps in Q11.4 format*/ 2651 SmallRemainder = (LVM_INT16)((Remainder & 0x7fffffff) >> 24); 2652 db_fix = (LVM_INT16)(db_fix + SmallRemainder ); 2653 SmallRemainder = (LVM_INT16)(SmallRemainder * SmallRemainder); 2654 db_fix = (LVM_INT16)(db_fix - (LVM_INT16)((LVM_UINT16)SmallRemainder >> 9)); 2655 2656 /* Correct for small offset */ 2657 db_fix = (LVM_INT16)(db_fix - 5); 2658 2659 return db_fix; 2660 } 2661 2662 //---------------------------------------------------------------------------- 2663 // Effect_setEnabled() 2664 //---------------------------------------------------------------------------- 2665 // Purpose: 2666 // Enable or disable effect 2667 // 2668 // Inputs: 2669 // pContext - pointer to effect context 2670 // enabled - true if enabling the effect, false otherwise 2671 // 2672 // Outputs: 2673 // 2674 //---------------------------------------------------------------------------- 2675 2676 int Effect_setEnabled(EffectContext *pContext, bool enabled) 2677 { 2678 ALOGV("\tEffect_setEnabled() type %d, enabled %d", pContext->EffectType, enabled); 2679 2680 if (enabled) { 2681 // Bass boost or Virtualizer can be temporarily disabled if playing over device speaker due 2682 // to their nature. 2683 bool tempDisabled = false; 2684 switch (pContext->EffectType) { 2685 case LVM_BASS_BOOST: 2686 if (pContext->pBundledContext->bBassEnabled == LVM_TRUE) { 2687 ALOGV("\tEffect_setEnabled() LVM_BASS_BOOST is already enabled"); 2688 return -EINVAL; 2689 } 2690 if(pContext->pBundledContext->SamplesToExitCountBb <= 0){ 2691 pContext->pBundledContext->NumberEffectsEnabled++; 2692 } 2693 pContext->pBundledContext->SamplesToExitCountBb = 2694 (LVM_INT32)(pContext->pBundledContext->SamplesPerSecond*0.1); 2695 pContext->pBundledContext->bBassEnabled = LVM_TRUE; 2696 tempDisabled = pContext->pBundledContext->bBassTempDisabled; 2697 break; 2698 case LVM_EQUALIZER: 2699 if (pContext->pBundledContext->bEqualizerEnabled == LVM_TRUE) { 2700 ALOGV("\tEffect_setEnabled() LVM_EQUALIZER is already enabled"); 2701 return -EINVAL; 2702 } 2703 if(pContext->pBundledContext->SamplesToExitCountEq <= 0){ 2704 pContext->pBundledContext->NumberEffectsEnabled++; 2705 } 2706 pContext->pBundledContext->SamplesToExitCountEq = 2707 (LVM_INT32)(pContext->pBundledContext->SamplesPerSecond*0.1); 2708 pContext->pBundledContext->bEqualizerEnabled = LVM_TRUE; 2709 break; 2710 case LVM_VIRTUALIZER: 2711 if (pContext->pBundledContext->bVirtualizerEnabled == LVM_TRUE) { 2712 ALOGV("\tEffect_setEnabled() LVM_VIRTUALIZER is already enabled"); 2713 return -EINVAL; 2714 } 2715 if(pContext->pBundledContext->SamplesToExitCountVirt <= 0){ 2716 pContext->pBundledContext->NumberEffectsEnabled++; 2717 } 2718 pContext->pBundledContext->SamplesToExitCountVirt = 2719 (LVM_INT32)(pContext->pBundledContext->SamplesPerSecond*0.1); 2720 pContext->pBundledContext->bVirtualizerEnabled = LVM_TRUE; 2721 tempDisabled = pContext->pBundledContext->bVirtualizerTempDisabled; 2722 break; 2723 case LVM_VOLUME: 2724 if (pContext->pBundledContext->bVolumeEnabled == LVM_TRUE) { 2725 ALOGV("\tEffect_setEnabled() LVM_VOLUME is already enabled"); 2726 return -EINVAL; 2727 } 2728 pContext->pBundledContext->NumberEffectsEnabled++; 2729 pContext->pBundledContext->bVolumeEnabled = LVM_TRUE; 2730 break; 2731 default: 2732 ALOGV("\tEffect_setEnabled() invalid effect type"); 2733 return -EINVAL; 2734 } 2735 if (!tempDisabled) { 2736 LvmEffect_enable(pContext); 2737 } 2738 } else { 2739 switch (pContext->EffectType) { 2740 case LVM_BASS_BOOST: 2741 if (pContext->pBundledContext->bBassEnabled == LVM_FALSE) { 2742 ALOGV("\tEffect_setEnabled() LVM_BASS_BOOST is already disabled"); 2743 return -EINVAL; 2744 } 2745 pContext->pBundledContext->bBassEnabled = LVM_FALSE; 2746 break; 2747 case LVM_EQUALIZER: 2748 if (pContext->pBundledContext->bEqualizerEnabled == LVM_FALSE) { 2749 ALOGV("\tEffect_setEnabled() LVM_EQUALIZER is already disabled"); 2750 return -EINVAL; 2751 } 2752 pContext->pBundledContext->bEqualizerEnabled = LVM_FALSE; 2753 break; 2754 case LVM_VIRTUALIZER: 2755 if (pContext->pBundledContext->bVirtualizerEnabled == LVM_FALSE) { 2756 ALOGV("\tEffect_setEnabled() LVM_VIRTUALIZER is already disabled"); 2757 return -EINVAL; 2758 } 2759 pContext->pBundledContext->bVirtualizerEnabled = LVM_FALSE; 2760 break; 2761 case LVM_VOLUME: 2762 if (pContext->pBundledContext->bVolumeEnabled == LVM_FALSE) { 2763 ALOGV("\tEffect_setEnabled() LVM_VOLUME is already disabled"); 2764 return -EINVAL; 2765 } 2766 pContext->pBundledContext->bVolumeEnabled = LVM_FALSE; 2767 break; 2768 default: 2769 ALOGV("\tEffect_setEnabled() invalid effect type"); 2770 return -EINVAL; 2771 } 2772 LvmEffect_disable(pContext); 2773 } 2774 2775 return 0; 2776 } 2777 2778 //---------------------------------------------------------------------------- 2779 // LVC_Convert_VolToDb() 2780 //---------------------------------------------------------------------------- 2781 // Purpose: 2782 // Convery volume in Q24 to dB 2783 // 2784 // Inputs: 2785 // vol: Q.24 volume dB 2786 // 2787 //----------------------------------------------------------------------- 2788 2789 int16_t LVC_Convert_VolToDb(uint32_t vol){ 2790 int16_t dB; 2791 2792 dB = LVC_ToDB_s32Tos16(vol <<7); 2793 dB = (dB +8)>>4; 2794 dB = (dB <-96) ? -96 : dB ; 2795 2796 return dB; 2797 } 2798 2799 } // namespace 2800 } // namespace 2801 2802 extern "C" { 2803 /* Effect Control Interface Implementation: Process */ 2804 int Effect_process(effect_handle_t self, 2805 audio_buffer_t *inBuffer, 2806 audio_buffer_t *outBuffer){ 2807 EffectContext * pContext = (EffectContext *) self; 2808 LVM_ReturnStatus_en LvmStatus = LVM_SUCCESS; /* Function call status */ 2809 int status = 0; 2810 int lvmStatus = 0; 2811 LVM_INT16 *in = (LVM_INT16 *)inBuffer->raw; 2812 LVM_INT16 *out = (LVM_INT16 *)outBuffer->raw; 2813 2814 //ALOGV("\tEffect_process Start : Enabled = %d Called = %d (%8d %8d %8d)", 2815 //pContext->pBundledContext->NumberEffectsEnabled,pContext->pBundledContext->NumberEffectsCalled, 2816 // pContext->pBundledContext->SamplesToExitCountBb, 2817 // pContext->pBundledContext->SamplesToExitCountVirt, 2818 // pContext->pBundledContext->SamplesToExitCountEq); 2819 2820 if (pContext == NULL){ 2821 ALOGV("\tLVM_ERROR : Effect_process() ERROR pContext == NULL"); 2822 return -EINVAL; 2823 } 2824 2825 //if(pContext->EffectType == LVM_BASS_BOOST){ 2826 // ALOGV("\tEffect_process: Effect type is BASS_BOOST"); 2827 //}else if(pContext->EffectType == LVM_EQUALIZER){ 2828 // ALOGV("\tEffect_process: Effect type is LVM_EQUALIZER"); 2829 //}else if(pContext->EffectType == LVM_VIRTUALIZER){ 2830 // ALOGV("\tEffect_process: Effect type is LVM_VIRTUALIZER"); 2831 //} 2832 2833 if (inBuffer == NULL || inBuffer->raw == NULL || 2834 outBuffer == NULL || outBuffer->raw == NULL || 2835 inBuffer->frameCount != outBuffer->frameCount){ 2836 ALOGV("\tLVM_ERROR : Effect_process() ERROR NULL INPUT POINTER OR FRAME COUNT IS WRONG"); 2837 return -EINVAL; 2838 } 2839 if ((pContext->pBundledContext->bBassEnabled == LVM_FALSE)&& 2840 (pContext->EffectType == LVM_BASS_BOOST)){ 2841 //ALOGV("\tEffect_process() LVM_BASS_BOOST Effect is not enabled"); 2842 if(pContext->pBundledContext->SamplesToExitCountBb > 0){ 2843 pContext->pBundledContext->SamplesToExitCountBb -= outBuffer->frameCount * 2; // STEREO 2844 //ALOGV("\tEffect_process: Waiting to turn off BASS_BOOST, %d samples left", 2845 // pContext->pBundledContext->SamplesToExitCountBb); 2846 } 2847 if(pContext->pBundledContext->SamplesToExitCountBb <= 0) { 2848 status = -ENODATA; 2849 pContext->pBundledContext->NumberEffectsEnabled--; 2850 ALOGV("\tEffect_process() this is the last frame for LVM_BASS_BOOST"); 2851 } 2852 } 2853 if ((pContext->pBundledContext->bVolumeEnabled == LVM_FALSE)&& 2854 (pContext->EffectType == LVM_VOLUME)){ 2855 //ALOGV("\tEffect_process() LVM_VOLUME Effect is not enabled"); 2856 status = -ENODATA; 2857 pContext->pBundledContext->NumberEffectsEnabled--; 2858 } 2859 if ((pContext->pBundledContext->bEqualizerEnabled == LVM_FALSE)&& 2860 (pContext->EffectType == LVM_EQUALIZER)){ 2861 //ALOGV("\tEffect_process() LVM_EQUALIZER Effect is not enabled"); 2862 if(pContext->pBundledContext->SamplesToExitCountEq > 0){ 2863 pContext->pBundledContext->SamplesToExitCountEq -= outBuffer->frameCount * 2; // STEREO 2864 //ALOGV("\tEffect_process: Waiting to turn off EQUALIZER, %d samples left", 2865 // pContext->pBundledContext->SamplesToExitCountEq); 2866 } 2867 if(pContext->pBundledContext->SamplesToExitCountEq <= 0) { 2868 status = -ENODATA; 2869 pContext->pBundledContext->NumberEffectsEnabled--; 2870 ALOGV("\tEffect_process() this is the last frame for LVM_EQUALIZER"); 2871 } 2872 } 2873 if ((pContext->pBundledContext->bVirtualizerEnabled == LVM_FALSE)&& 2874 (pContext->EffectType == LVM_VIRTUALIZER)){ 2875 //ALOGV("\tEffect_process() LVM_VIRTUALIZER Effect is not enabled"); 2876 if(pContext->pBundledContext->SamplesToExitCountVirt > 0){ 2877 pContext->pBundledContext->SamplesToExitCountVirt -= outBuffer->frameCount * 2;// STEREO 2878 //ALOGV("\tEffect_process: Waiting for to turn off VIRTUALIZER, %d samples left", 2879 // pContext->pBundledContext->SamplesToExitCountVirt); 2880 } 2881 if(pContext->pBundledContext->SamplesToExitCountVirt <= 0) { 2882 status = -ENODATA; 2883 pContext->pBundledContext->NumberEffectsEnabled--; 2884 ALOGV("\tEffect_process() this is the last frame for LVM_VIRTUALIZER"); 2885 } 2886 } 2887 2888 if(status != -ENODATA){ 2889 pContext->pBundledContext->NumberEffectsCalled++; 2890 } 2891 2892 if(pContext->pBundledContext->NumberEffectsCalled == 2893 pContext->pBundledContext->NumberEffectsEnabled){ 2894 //ALOGV("\tEffect_process Calling process with %d effects enabled, %d called: Effect %d", 2895 //pContext->pBundledContext->NumberEffectsEnabled, 2896 //pContext->pBundledContext->NumberEffectsCalled, pContext->EffectType); 2897 2898 if(status == -ENODATA){ 2899 ALOGV("\tEffect_process() processing last frame"); 2900 } 2901 pContext->pBundledContext->NumberEffectsCalled = 0; 2902 /* Process all the available frames, block processing is 2903 handled internalLY by the LVM bundle */ 2904 lvmStatus = android::LvmBundle_process( (LVM_INT16 *)inBuffer->raw, 2905 (LVM_INT16 *)outBuffer->raw, 2906 outBuffer->frameCount, 2907 pContext); 2908 if(lvmStatus != LVM_SUCCESS){ 2909 ALOGV("\tLVM_ERROR : LvmBundle_process returned error %d", lvmStatus); 2910 return lvmStatus; 2911 } 2912 } else { 2913 //ALOGV("\tEffect_process Not Calling process with %d effects enabled, %d called: Effect %d", 2914 //pContext->pBundledContext->NumberEffectsEnabled, 2915 //pContext->pBundledContext->NumberEffectsCalled, pContext->EffectType); 2916 // 2 is for stereo input 2917 if (pContext->config.outputCfg.accessMode == EFFECT_BUFFER_ACCESS_ACCUMULATE) { 2918 for (size_t i=0; i < outBuffer->frameCount*2; i++){ 2919 outBuffer->s16[i] = 2920 clamp16((LVM_INT32)outBuffer->s16[i] + (LVM_INT32)inBuffer->s16[i]); 2921 } 2922 } else if (outBuffer->raw != inBuffer->raw) { 2923 memcpy(outBuffer->raw, inBuffer->raw, outBuffer->frameCount*sizeof(LVM_INT16)*2); 2924 } 2925 } 2926 2927 return status; 2928 } /* end Effect_process */ 2929 2930 /* Effect Control Interface Implementation: Command */ 2931 int Effect_command(effect_handle_t self, 2932 uint32_t cmdCode, 2933 uint32_t cmdSize, 2934 void *pCmdData, 2935 uint32_t *replySize, 2936 void *pReplyData){ 2937 EffectContext * pContext = (EffectContext *) self; 2938 int retsize; 2939 2940 //ALOGV("\t\nEffect_command start"); 2941 2942 if(pContext->EffectType == LVM_BASS_BOOST){ 2943 //ALOGV("\tEffect_command setting command for LVM_BASS_BOOST"); 2944 } 2945 if(pContext->EffectType == LVM_VIRTUALIZER){ 2946 //ALOGV("\tEffect_command setting command for LVM_VIRTUALIZER"); 2947 } 2948 if(pContext->EffectType == LVM_EQUALIZER){ 2949 //ALOGV("\tEffect_command setting command for LVM_EQUALIZER"); 2950 } 2951 if(pContext->EffectType == LVM_VOLUME){ 2952 //ALOGV("\tEffect_command setting command for LVM_VOLUME"); 2953 } 2954 2955 if (pContext == NULL){ 2956 ALOGV("\tLVM_ERROR : Effect_command ERROR pContext == NULL"); 2957 return -EINVAL; 2958 } 2959 2960 //ALOGV("\tEffect_command INPUTS are: command %d cmdSize %d",cmdCode, cmdSize); 2961 2962 // Incase we disable an effect, next time process is 2963 // called the number of effect called could be greater 2964 // pContext->pBundledContext->NumberEffectsCalled = 0; 2965 2966 //ALOGV("\tEffect_command NumberEffectsCalled = %d, NumberEffectsEnabled = %d", 2967 // pContext->pBundledContext->NumberEffectsCalled, 2968 // pContext->pBundledContext->NumberEffectsEnabled); 2969 2970 switch (cmdCode){ 2971 case EFFECT_CMD_INIT: 2972 if (pReplyData == NULL || *replySize != sizeof(int)){ 2973 ALOGV("\tLVM_ERROR, EFFECT_CMD_INIT: ERROR for effect type %d", 2974 pContext->EffectType); 2975 return -EINVAL; 2976 } 2977 *(int *) pReplyData = 0; 2978 //ALOGV("\tEffect_command cmdCode Case: EFFECT_CMD_INIT start"); 2979 if(pContext->EffectType == LVM_BASS_BOOST){ 2980 //ALOGV("\tEffect_command cmdCode Case: EFFECT_CMD_INIT for LVM_BASS_BOOST"); 2981 android::BassSetStrength(pContext, 0); 2982 } 2983 if(pContext->EffectType == LVM_VIRTUALIZER){ 2984 //ALOGV("\tEffect_command cmdCode Case: EFFECT_CMD_INIT for LVM_VIRTUALIZER"); 2985 android::VirtualizerSetStrength(pContext, 0); 2986 } 2987 if(pContext->EffectType == LVM_EQUALIZER){ 2988 //ALOGV("\tEffect_command cmdCode Case: EFFECT_CMD_INIT for LVM_EQUALIZER"); 2989 android::EqualizerSetPreset(pContext, 0); 2990 } 2991 if(pContext->EffectType == LVM_VOLUME){ 2992 //ALOGV("\tEffect_command cmdCode Case: EFFECT_CMD_INIT for LVM_VOLUME"); 2993 *(int *) pReplyData = android::VolumeSetVolumeLevel(pContext, 0); 2994 } 2995 break; 2996 2997 case EFFECT_CMD_SET_CONFIG: 2998 //ALOGV("\tEffect_command cmdCode Case: EFFECT_CMD_SET_CONFIG start"); 2999 if (pCmdData == NULL|| 3000 cmdSize != sizeof(effect_config_t)|| 3001 pReplyData == NULL|| 3002 *replySize != sizeof(int)){ 3003 ALOGV("\tLVM_ERROR : Effect_command cmdCode Case: " 3004 "EFFECT_CMD_SET_CONFIG: ERROR"); 3005 return -EINVAL; 3006 } 3007 *(int *) pReplyData = android::Effect_setConfig(pContext, (effect_config_t *) pCmdData); 3008 //ALOGV("\tEffect_command cmdCode Case: EFFECT_CMD_SET_CONFIG end"); 3009 break; 3010 3011 case EFFECT_CMD_GET_CONFIG: 3012 if (pReplyData == NULL || 3013 *replySize != sizeof(effect_config_t)) { 3014 ALOGV("\tLVM_ERROR : Effect_command cmdCode Case: " 3015 "EFFECT_CMD_GET_CONFIG: ERROR"); 3016 return -EINVAL; 3017 } 3018 3019 android::Effect_getConfig(pContext, (effect_config_t *)pReplyData); 3020 break; 3021 3022 case EFFECT_CMD_RESET: 3023 //ALOGV("\tEffect_command cmdCode Case: EFFECT_CMD_RESET start"); 3024 android::Effect_setConfig(pContext, &pContext->config); 3025 //ALOGV("\tEffect_command cmdCode Case: EFFECT_CMD_RESET end"); 3026 break; 3027 3028 case EFFECT_CMD_GET_PARAM:{ 3029 //ALOGV("\tEffect_command cmdCode Case: EFFECT_CMD_GET_PARAM start"); 3030 3031 if(pContext->EffectType == LVM_BASS_BOOST){ 3032 if (pCmdData == NULL || 3033 cmdSize < (sizeof(effect_param_t) + sizeof(int32_t)) || 3034 pReplyData == NULL || 3035 *replySize < (sizeof(effect_param_t) + sizeof(int32_t))){ 3036 ALOGV("\tLVM_ERROR : BassBoost_command cmdCode Case: " 3037 "EFFECT_CMD_GET_PARAM: ERROR"); 3038 return -EINVAL; 3039 } 3040 effect_param_t *p = (effect_param_t *)pCmdData; 3041 3042 memcpy(pReplyData, pCmdData, sizeof(effect_param_t) + p->psize); 3043 3044 p = (effect_param_t *)pReplyData; 3045 3046 int voffset = ((p->psize - 1) / sizeof(int32_t) + 1) * sizeof(int32_t); 3047 3048 p->status = android::BassBoost_getParameter(pContext, 3049 p->data, 3050 &p->vsize, 3051 p->data + voffset); 3052 3053 *replySize = sizeof(effect_param_t) + voffset + p->vsize; 3054 3055 //ALOGV("\tBassBoost_command EFFECT_CMD_GET_PARAM " 3056 // "*pCmdData %d, *replySize %d, *pReplyData %d ", 3057 // *(int32_t *)((char *)pCmdData + sizeof(effect_param_t)), 3058 // *replySize, 3059 // *(int16_t *)((char *)pReplyData + sizeof(effect_param_t) + voffset)); 3060 } 3061 3062 if(pContext->EffectType == LVM_VIRTUALIZER){ 3063 if (pCmdData == NULL || 3064 cmdSize < (sizeof(effect_param_t) + sizeof(int32_t)) || 3065 pReplyData == NULL || 3066 *replySize < (sizeof(effect_param_t) + sizeof(int32_t))){ 3067 ALOGV("\tLVM_ERROR : Virtualizer_command cmdCode Case: " 3068 "EFFECT_CMD_GET_PARAM: ERROR"); 3069 return -EINVAL; 3070 } 3071 effect_param_t *p = (effect_param_t *)pCmdData; 3072 3073 memcpy(pReplyData, pCmdData, sizeof(effect_param_t) + p->psize); 3074 3075 p = (effect_param_t *)pReplyData; 3076 3077 int voffset = ((p->psize - 1) / sizeof(int32_t) + 1) * sizeof(int32_t); 3078 3079 p->status = android::Virtualizer_getParameter(pContext, 3080 (void *)p->data, 3081 &p->vsize, 3082 p->data + voffset); 3083 *replySize = sizeof(effect_param_t) + voffset + p->vsize; 3084 3085 //ALOGV("\tVirtualizer_command EFFECT_CMD_GET_PARAM " 3086 // "*pCmdData %d, *replySize %d, *pReplyData %d ", 3087 // *(int32_t *)((char *)pCmdData + sizeof(effect_param_t)), 3088 // *replySize, 3089 // *(int16_t *)((char *)pReplyData + sizeof(effect_param_t) + voffset)); 3090 } 3091 if(pContext->EffectType == LVM_EQUALIZER){ 3092 //ALOGV("\tEqualizer_command cmdCode Case: " 3093 // "EFFECT_CMD_GET_PARAM start"); 3094 if (pCmdData == NULL || 3095 cmdSize < (sizeof(effect_param_t) + sizeof(int32_t)) || 3096 pReplyData == NULL || 3097 *replySize < (int) (sizeof(effect_param_t) + sizeof(int32_t))) { 3098 ALOGV("\tLVM_ERROR : Equalizer_command cmdCode Case: " 3099 "EFFECT_CMD_GET_PARAM"); 3100 return -EINVAL; 3101 } 3102 effect_param_t *p = (effect_param_t *)pCmdData; 3103 3104 memcpy(pReplyData, pCmdData, sizeof(effect_param_t) + p->psize); 3105 3106 p = (effect_param_t *)pReplyData; 3107 3108 int voffset = ((p->psize - 1) / sizeof(int32_t) + 1) * sizeof(int32_t); 3109 3110 p->status = android::Equalizer_getParameter(pContext, 3111 p->data, 3112 &p->vsize, 3113 p->data + voffset); 3114 3115 *replySize = sizeof(effect_param_t) + voffset + p->vsize; 3116 3117 //ALOGV("\tEqualizer_command EFFECT_CMD_GET_PARAM *pCmdData %d, *replySize %d, " 3118 // "*pReplyData %08x %08x", 3119 // *(int32_t *)((char *)pCmdData + sizeof(effect_param_t)), *replySize, 3120 // *(int32_t *)((char *)pReplyData + sizeof(effect_param_t) + voffset), 3121 // *(int32_t *)((char *)pReplyData + sizeof(effect_param_t) + voffset + 3122 // sizeof(int32_t))); 3123 } 3124 if(pContext->EffectType == LVM_VOLUME){ 3125 //ALOGV("\tVolume_command cmdCode Case: EFFECT_CMD_GET_PARAM start"); 3126 if (pCmdData == NULL || 3127 cmdSize < (sizeof(effect_param_t) + sizeof(int32_t)) || 3128 pReplyData == NULL || 3129 *replySize < (int) (sizeof(effect_param_t) + sizeof(int32_t))){ 3130 ALOGV("\tLVM_ERROR : Volume_command cmdCode Case: " 3131 "EFFECT_CMD_GET_PARAM: ERROR"); 3132 return -EINVAL; 3133 } 3134 effect_param_t *p = (effect_param_t *)pCmdData; 3135 3136 memcpy(pReplyData, pCmdData, sizeof(effect_param_t) + p->psize); 3137 3138 p = (effect_param_t *)pReplyData; 3139 3140 int voffset = ((p->psize - 1) / sizeof(int32_t) + 1) * sizeof(int32_t); 3141 3142 p->status = android::Volume_getParameter(pContext, 3143 (void *)p->data, 3144 &p->vsize, 3145 p->data + voffset); 3146 3147 *replySize = sizeof(effect_param_t) + voffset + p->vsize; 3148 3149 //ALOGV("\tVolume_command EFFECT_CMD_GET_PARAM " 3150 // "*pCmdData %d, *replySize %d, *pReplyData %d ", 3151 // *(int32_t *)((char *)pCmdData + sizeof(effect_param_t)), 3152 // *replySize, 3153 // *(int16_t *)((char *)pReplyData + sizeof(effect_param_t) + voffset)); 3154 } 3155 //ALOGV("\tEffect_command cmdCode Case: EFFECT_CMD_GET_PARAM end"); 3156 } break; 3157 case EFFECT_CMD_SET_PARAM:{ 3158 //ALOGV("\tEffect_command cmdCode Case: EFFECT_CMD_SET_PARAM start"); 3159 if(pContext->EffectType == LVM_BASS_BOOST){ 3160 //ALOGV("\tBassBoost_command EFFECT_CMD_SET_PARAM param %d, *replySize %d, value %d", 3161 // *(int32_t *)((char *)pCmdData + sizeof(effect_param_t)), 3162 // *replySize, 3163 // *(int16_t *)((char *)pCmdData + sizeof(effect_param_t) + sizeof(int32_t))); 3164 3165 if (pCmdData == NULL|| 3166 cmdSize != (sizeof(effect_param_t) + sizeof(int32_t) +sizeof(int16_t))|| 3167 pReplyData == NULL|| 3168 *replySize != sizeof(int32_t)){ 3169 ALOGV("\tLVM_ERROR : BassBoost_command cmdCode Case: " 3170 "EFFECT_CMD_SET_PARAM: ERROR"); 3171 return -EINVAL; 3172 } 3173 effect_param_t *p = (effect_param_t *) pCmdData; 3174 3175 if (p->psize != sizeof(int32_t)){ 3176 ALOGV("\tLVM_ERROR : BassBoost_command cmdCode Case: " 3177 "EFFECT_CMD_SET_PARAM: ERROR, psize is not sizeof(int32_t)"); 3178 return -EINVAL; 3179 } 3180 3181 //ALOGV("\tnBassBoost_command cmdSize is %d\n" 3182 // "\tsizeof(effect_param_t) is %d\n" 3183 // "\tp->psize is %d\n" 3184 // "\tp->vsize is %d" 3185 // "\n", 3186 // cmdSize, sizeof(effect_param_t), p->psize, p->vsize ); 3187 3188 *(int *)pReplyData = android::BassBoost_setParameter(pContext, 3189 (void *)p->data, 3190 p->data + p->psize); 3191 } 3192 if(pContext->EffectType == LVM_VIRTUALIZER){ 3193 // Warning this log will fail to properly read an int32_t value, assumes int16_t 3194 //ALOGV("\tVirtualizer_command EFFECT_CMD_SET_PARAM param %d, *replySize %d, value %d", 3195 // *(int32_t *)((char *)pCmdData + sizeof(effect_param_t)), 3196 // *replySize, 3197 // *(int16_t *)((char *)pCmdData + sizeof(effect_param_t) + sizeof(int32_t))); 3198 3199 if (pCmdData == NULL || 3200 // legal parameters are int16_t or int32_t 3201 cmdSize > (sizeof(effect_param_t) + sizeof(int32_t) +sizeof(int32_t)) || 3202 cmdSize < (sizeof(effect_param_t) + sizeof(int32_t) +sizeof(int16_t)) || 3203 pReplyData == NULL || 3204 *replySize != sizeof(int32_t)){ 3205 ALOGV("\tLVM_ERROR : Virtualizer_command cmdCode Case: " 3206 "EFFECT_CMD_SET_PARAM: ERROR"); 3207 return -EINVAL; 3208 } 3209 effect_param_t *p = (effect_param_t *) pCmdData; 3210 3211 if (p->psize != sizeof(int32_t)){ 3212 ALOGV("\tLVM_ERROR : Virtualizer_command cmdCode Case: " 3213 "EFFECT_CMD_SET_PARAM: ERROR, psize is not sizeof(int32_t)"); 3214 return -EINVAL; 3215 } 3216 3217 //ALOGV("\tnVirtualizer_command cmdSize is %d\n" 3218 // "\tsizeof(effect_param_t) is %d\n" 3219 // "\tp->psize is %d\n" 3220 // "\tp->vsize is %d" 3221 // "\n", 3222 // cmdSize, sizeof(effect_param_t), p->psize, p->vsize ); 3223 3224 *(int *)pReplyData = android::Virtualizer_setParameter(pContext, 3225 (void *)p->data, 3226 p->data + p->psize); 3227 } 3228 if(pContext->EffectType == LVM_EQUALIZER){ 3229 //ALOGV("\tEqualizer_command cmdCode Case: " 3230 // "EFFECT_CMD_SET_PARAM start"); 3231 //ALOGV("\tEqualizer_command EFFECT_CMD_SET_PARAM param %d, *replySize %d, value %d ", 3232 // *(int32_t *)((char *)pCmdData + sizeof(effect_param_t)), 3233 // *replySize, 3234 // *(int16_t *)((char *)pCmdData + sizeof(effect_param_t) + sizeof(int32_t))); 3235 3236 if (pCmdData == NULL || cmdSize < (sizeof(effect_param_t) + sizeof(int32_t)) || 3237 pReplyData == NULL || *replySize != sizeof(int32_t)) { 3238 ALOGV("\tLVM_ERROR : Equalizer_command cmdCode Case: " 3239 "EFFECT_CMD_SET_PARAM: ERROR"); 3240 return -EINVAL; 3241 } 3242 effect_param_t *p = (effect_param_t *) pCmdData; 3243 3244 *(int *)pReplyData = android::Equalizer_setParameter(pContext, 3245 (void *)p->data, 3246 p->data + p->psize); 3247 } 3248 if(pContext->EffectType == LVM_VOLUME){ 3249 //ALOGV("\tVolume_command cmdCode Case: EFFECT_CMD_SET_PARAM start"); 3250 //ALOGV("\tVolume_command EFFECT_CMD_SET_PARAM param %d, *replySize %d, value %d ", 3251 // *(int32_t *)((char *)pCmdData + sizeof(effect_param_t)), 3252 // *replySize, 3253 // *(int16_t *)((char *)pCmdData + sizeof(effect_param_t) +sizeof(int32_t))); 3254 3255 if ( pCmdData == NULL|| 3256 cmdSize < (sizeof(effect_param_t) + sizeof(int32_t))|| 3257 pReplyData == NULL|| 3258 *replySize != sizeof(int32_t)){ 3259 ALOGV("\tLVM_ERROR : Volume_command cmdCode Case: " 3260 "EFFECT_CMD_SET_PARAM: ERROR"); 3261 return -EINVAL; 3262 } 3263 effect_param_t *p = (effect_param_t *) pCmdData; 3264 3265 *(int *)pReplyData = android::Volume_setParameter(pContext, 3266 (void *)p->data, 3267 p->data + p->psize); 3268 } 3269 //ALOGV("\tEffect_command cmdCode Case: EFFECT_CMD_SET_PARAM end"); 3270 } break; 3271 3272 case EFFECT_CMD_ENABLE: 3273 ALOGV("\tEffect_command cmdCode Case: EFFECT_CMD_ENABLE start"); 3274 if (pReplyData == NULL || *replySize != sizeof(int)){ 3275 ALOGV("\tLVM_ERROR : Effect_command cmdCode Case: EFFECT_CMD_ENABLE: ERROR"); 3276 return -EINVAL; 3277 } 3278 3279 *(int *)pReplyData = android::Effect_setEnabled(pContext, LVM_TRUE); 3280 break; 3281 3282 case EFFECT_CMD_DISABLE: 3283 //ALOGV("\tEffect_command cmdCode Case: EFFECT_CMD_DISABLE start"); 3284 if (pReplyData == NULL || *replySize != sizeof(int)){ 3285 ALOGV("\tLVM_ERROR : Effect_command cmdCode Case: EFFECT_CMD_DISABLE: ERROR"); 3286 return -EINVAL; 3287 } 3288 *(int *)pReplyData = android::Effect_setEnabled(pContext, LVM_FALSE); 3289 break; 3290 3291 case EFFECT_CMD_SET_DEVICE: 3292 { 3293 ALOGV("\tEffect_command cmdCode Case: EFFECT_CMD_SET_DEVICE start"); 3294 uint32_t device = *(uint32_t *)pCmdData; 3295 pContext->pBundledContext->nOutputDevice = (audio_devices_t) device; 3296 3297 if (pContext->EffectType == LVM_BASS_BOOST) { 3298 if((device == AUDIO_DEVICE_OUT_SPEAKER) || 3299 (device == AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT) || 3300 (device == AUDIO_DEVICE_OUT_BLUETOOTH_A2DP_SPEAKER)){ 3301 ALOGV("\tEFFECT_CMD_SET_DEVICE device is invalid for LVM_BASS_BOOST %d", 3302 *(int32_t *)pCmdData); 3303 ALOGV("\tEFFECT_CMD_SET_DEVICE temporary disable LVM_BAS_BOOST"); 3304 3305 // If a device doesnt support bassboost the effect must be temporarily disabled 3306 // the effect must still report its original state as this can only be changed 3307 // by the ENABLE/DISABLE command 3308 3309 if (pContext->pBundledContext->bBassEnabled == LVM_TRUE) { 3310 ALOGV("\tEFFECT_CMD_SET_DEVICE disable LVM_BASS_BOOST %d", 3311 *(int32_t *)pCmdData); 3312 android::LvmEffect_disable(pContext); 3313 } 3314 pContext->pBundledContext->bBassTempDisabled = LVM_TRUE; 3315 } else { 3316 ALOGV("\tEFFECT_CMD_SET_DEVICE device is valid for LVM_BASS_BOOST %d", 3317 *(int32_t *)pCmdData); 3318 3319 // If a device supports bassboost and the effect has been temporarily disabled 3320 // previously then re-enable it 3321 3322 if (pContext->pBundledContext->bBassEnabled == LVM_TRUE) { 3323 ALOGV("\tEFFECT_CMD_SET_DEVICE re-enable LVM_BASS_BOOST %d", 3324 *(int32_t *)pCmdData); 3325 android::LvmEffect_enable(pContext); 3326 } 3327 pContext->pBundledContext->bBassTempDisabled = LVM_FALSE; 3328 } 3329 } 3330 if (pContext->EffectType == LVM_VIRTUALIZER) { 3331 if (pContext->pBundledContext->nVirtualizerForcedDevice == AUDIO_DEVICE_NONE) { 3332 // default case unless configuration is forced 3333 if (android::VirtualizerIsDeviceSupported(device) != 0) { 3334 ALOGV("\tEFFECT_CMD_SET_DEVICE device is invalid for LVM_VIRTUALIZER %d", 3335 *(int32_t *)pCmdData); 3336 ALOGV("\tEFFECT_CMD_SET_DEVICE temporary disable LVM_VIRTUALIZER"); 3337 3338 //If a device doesnt support virtualizer the effect must be temporarily 3339 // disabled the effect must still report its original state as this can 3340 // only be changed by the ENABLE/DISABLE command 3341 3342 if (pContext->pBundledContext->bVirtualizerEnabled == LVM_TRUE) { 3343 ALOGV("\tEFFECT_CMD_SET_DEVICE disable LVM_VIRTUALIZER %d", 3344 *(int32_t *)pCmdData); 3345 android::LvmEffect_disable(pContext); 3346 } 3347 pContext->pBundledContext->bVirtualizerTempDisabled = LVM_TRUE; 3348 } else { 3349 ALOGV("\tEFFECT_CMD_SET_DEVICE device is valid for LVM_VIRTUALIZER %d", 3350 *(int32_t *)pCmdData); 3351 3352 // If a device supports virtualizer and the effect has been temporarily 3353 // disabled previously then re-enable it 3354 3355 if(pContext->pBundledContext->bVirtualizerEnabled == LVM_TRUE){ 3356 ALOGV("\tEFFECT_CMD_SET_DEVICE re-enable LVM_VIRTUALIZER %d", 3357 *(int32_t *)pCmdData); 3358 android::LvmEffect_enable(pContext); 3359 } 3360 pContext->pBundledContext->bVirtualizerTempDisabled = LVM_FALSE; 3361 } 3362 } // else virtualization mode is forced to a certain device, nothing to do 3363 } 3364 ALOGV("\tEffect_command cmdCode Case: EFFECT_CMD_SET_DEVICE end"); 3365 break; 3366 } 3367 case EFFECT_CMD_SET_VOLUME: 3368 { 3369 uint32_t leftVolume, rightVolume; 3370 int16_t leftdB, rightdB; 3371 int16_t maxdB, pandB; 3372 int32_t vol_ret[2] = {1<<24,1<<24}; // Apply no volume 3373 int status = 0; 3374 LVM_ControlParams_t ActiveParams; /* Current control Parameters */ 3375 LVM_ReturnStatus_en LvmStatus=LVM_SUCCESS; /* Function call status */ 3376 3377 // if pReplyData is NULL, VOL_CTRL is delegated to another effect 3378 if(pReplyData == LVM_NULL){ 3379 break; 3380 } 3381 3382 if (pCmdData == NULL || 3383 cmdSize != 2 * sizeof(uint32_t)) { 3384 ALOGV("\tLVM_ERROR : Effect_command cmdCode Case: " 3385 "EFFECT_CMD_SET_VOLUME: ERROR"); 3386 return -EINVAL; 3387 } 3388 3389 leftVolume = ((*(uint32_t *)pCmdData)); 3390 rightVolume = ((*((uint32_t *)pCmdData + 1))); 3391 3392 if(leftVolume == 0x1000000){ 3393 leftVolume -= 1; 3394 } 3395 if(rightVolume == 0x1000000){ 3396 rightVolume -= 1; 3397 } 3398 3399 // Convert volume to dB 3400 leftdB = android::LVC_Convert_VolToDb(leftVolume); 3401 rightdB = android::LVC_Convert_VolToDb(rightVolume); 3402 3403 pandB = rightdB - leftdB; 3404 3405 // Calculate max volume in dB 3406 maxdB = leftdB; 3407 if(rightdB > maxdB){ 3408 maxdB = rightdB; 3409 } 3410 //ALOGV("\tEFFECT_CMD_SET_VOLUME Session: %d, SessionID: %d VOLUME is %d dB (%d), " 3411 // "effect is %d", 3412 //pContext->pBundledContext->SessionNo, pContext->pBundledContext->SessionId, 3413 //(int32_t)maxdB, maxVol<<7, pContext->EffectType); 3414 //ALOGV("\tEFFECT_CMD_SET_VOLUME: Left is %d, Right is %d", leftVolume, rightVolume); 3415 //ALOGV("\tEFFECT_CMD_SET_VOLUME: Left %ddB, Right %ddB, Position %ddB", 3416 // leftdB, rightdB, pandB); 3417 3418 memcpy(pReplyData, vol_ret, sizeof(int32_t)*2); 3419 android::VolumeSetVolumeLevel(pContext, (int16_t)(maxdB*100)); 3420 3421 /* Get the current settings */ 3422 LvmStatus =LVM_GetControlParameters(pContext->pBundledContext->hInstance,&ActiveParams); 3423 LVM_ERROR_CHECK(LvmStatus, "LVM_GetControlParameters", "VolumeSetStereoPosition") 3424 if(LvmStatus != LVM_SUCCESS) return -EINVAL; 3425 3426 /* Volume parameters */ 3427 ActiveParams.VC_Balance = pandB; 3428 ALOGV("\t\tVolumeSetStereoPosition() (-96dB -> +96dB)-> %d\n", ActiveParams.VC_Balance ); 3429 3430 /* Activate the initial settings */ 3431 LvmStatus =LVM_SetControlParameters(pContext->pBundledContext->hInstance,&ActiveParams); 3432 LVM_ERROR_CHECK(LvmStatus, "LVM_SetControlParameters", "VolumeSetStereoPosition") 3433 if(LvmStatus != LVM_SUCCESS) return -EINVAL; 3434 break; 3435 } 3436 case EFFECT_CMD_SET_AUDIO_MODE: 3437 break; 3438 default: 3439 return -EINVAL; 3440 } 3441 3442 //ALOGV("\tEffect_command end...\n\n"); 3443 return 0; 3444 } /* end Effect_command */ 3445 3446 /* Effect Control Interface Implementation: get_descriptor */ 3447 int Effect_getDescriptor(effect_handle_t self, 3448 effect_descriptor_t *pDescriptor) 3449 { 3450 EffectContext * pContext = (EffectContext *) self; 3451 const effect_descriptor_t *desc; 3452 3453 if (pContext == NULL || pDescriptor == NULL) { 3454 ALOGV("Effect_getDescriptor() invalid param"); 3455 return -EINVAL; 3456 } 3457 3458 switch(pContext->EffectType) { 3459 case LVM_BASS_BOOST: 3460 desc = &android::gBassBoostDescriptor; 3461 break; 3462 case LVM_VIRTUALIZER: 3463 desc = &android::gVirtualizerDescriptor; 3464 break; 3465 case LVM_EQUALIZER: 3466 desc = &android::gEqualizerDescriptor; 3467 break; 3468 case LVM_VOLUME: 3469 desc = &android::gVolumeDescriptor; 3470 break; 3471 default: 3472 return -EINVAL; 3473 } 3474 3475 *pDescriptor = *desc; 3476 3477 return 0; 3478 } /* end Effect_getDescriptor */ 3479 3480 // effect_handle_t interface implementation for effect 3481 const struct effect_interface_s gLvmEffectInterface = { 3482 Effect_process, 3483 Effect_command, 3484 Effect_getDescriptor, 3485 NULL, 3486 }; /* end gLvmEffectInterface */ 3487 3488 // This is the only symbol that needs to be exported 3489 __attribute__ ((visibility ("default"))) 3490 audio_effect_library_t AUDIO_EFFECT_LIBRARY_INFO_SYM = { 3491 .tag = AUDIO_EFFECT_LIBRARY_TAG, 3492 .version = EFFECT_LIBRARY_API_VERSION, 3493 .name = "Effect Bundle Library", 3494 .implementor = "NXP Software Ltd.", 3495 .create_effect = android::EffectCreate, 3496 .release_effect = android::EffectRelease, 3497 .get_descriptor = android::EffectGetDescriptor, 3498 }; 3499 3500 } 3501