1 /* 2 * Copyright (C) 2004-2010 NXP Software 3 * Copyright (C) 2010 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 /************************************************************************************/ 19 /* */ 20 /* Includes */ 21 /* */ 22 /************************************************************************************/ 23 24 #include "LVM_Private.h" 25 #include "LVM_Tables.h" 26 #include "VectorArithmetic.h" 27 #include "InstAlloc.h" 28 29 /****************************************************************************************/ 30 /* */ 31 /* FUNCTION: LVM_GetMemoryTable */ 32 /* */ 33 /* DESCRIPTION: */ 34 /* This function is used for memory allocation and free. It can be called in */ 35 /* two ways: */ 36 /* */ 37 /* hInstance = NULL Returns the memory requirements */ 38 /* hInstance = Instance handle Returns the memory requirements and */ 39 /* allocated base addresses for the instance */ 40 /* */ 41 /* When this function is called for memory allocation (hInstance=NULL) the memory */ 42 /* base address pointers are NULL on return. */ 43 /* */ 44 /* When the function is called for free (hInstance = Instance Handle) the memory */ 45 /* table returns the allocated memory and base addresses used during initialisation. */ 46 /* */ 47 /* PARAMETERS: */ 48 /* hInstance Instance Handle */ 49 /* pMemoryTable Pointer to an empty memory definition table */ 50 /* pCapabilities Pointer to the default capabilities */ 51 /* */ 52 /* RETURNS: */ 53 /* LVM_SUCCESS Succeeded */ 54 /* LVM_NULLADDRESS When one of pMemoryTable or pInstParams is NULL */ 55 /* LVM_OUTOFRANGE When any of the Instance parameters are out of range */ 56 /* */ 57 /* NOTES: */ 58 /* 1. This function may be interrupted by the LVM_Process function */ 59 /* 2. The scratch memory is the largest required by any of the sub-modules plus any */ 60 /* additional scratch requirements of the bundle */ 61 /* */ 62 /****************************************************************************************/ 63 64 LVM_ReturnStatus_en LVM_GetMemoryTable(LVM_Handle_t hInstance, 65 LVM_MemTab_t *pMemoryTable, 66 LVM_InstParams_t *pInstParams) 67 { 68 69 LVM_Instance_t *pInstance = (LVM_Instance_t *)hInstance; 70 LVM_UINT32 AlgScratchSize; 71 LVM_UINT32 BundleScratchSize; 72 LVM_UINT16 InternalBlockSize; 73 INST_ALLOC AllocMem[LVM_NR_MEMORY_REGIONS]; 74 LVM_INT16 i; 75 76 77 /* 78 * Check parameters 79 */ 80 if(pMemoryTable == LVM_NULL) 81 { 82 return LVM_NULLADDRESS; 83 } 84 85 86 /* 87 * Return memory table if the instance has already been created 88 */ 89 if (hInstance != LVM_NULL) 90 { 91 /* Read back memory allocation table */ 92 *pMemoryTable = pInstance->MemoryTable; 93 return(LVM_SUCCESS); 94 } 95 96 if(pInstParams == LVM_NULL) 97 { 98 return LVM_NULLADDRESS; 99 } 100 101 /* 102 * Power Spectrum Analyser 103 */ 104 if(pInstParams->PSA_Included > LVM_PSA_ON) 105 { 106 return (LVM_OUTOFRANGE); 107 } 108 109 /* 110 * Check the instance parameters 111 */ 112 if( (pInstParams->BufferMode != LVM_MANAGED_BUFFERS) && (pInstParams->BufferMode != LVM_UNMANAGED_BUFFERS) ) 113 { 114 return (LVM_OUTOFRANGE); 115 } 116 117 /* N-Band Equalizer */ 118 if( pInstParams->EQNB_NumBands > 32 ) 119 { 120 return (LVM_OUTOFRANGE); 121 } 122 123 if(pInstParams->BufferMode == LVM_MANAGED_BUFFERS) 124 { 125 if( (pInstParams->MaxBlockSize < LVM_MIN_MAXBLOCKSIZE ) || (pInstParams->MaxBlockSize > LVM_MANAGED_MAX_MAXBLOCKSIZE ) ) 126 { 127 return (LVM_OUTOFRANGE); 128 } 129 } 130 else 131 { 132 if( (pInstParams->MaxBlockSize < LVM_MIN_MAXBLOCKSIZE ) || (pInstParams->MaxBlockSize > LVM_UNMANAGED_MAX_MAXBLOCKSIZE) ) 133 { 134 return (LVM_OUTOFRANGE); 135 } 136 } 137 138 /* 139 * Initialise the AllocMem structures 140 */ 141 for (i=0; i<LVM_NR_MEMORY_REGIONS; i++) 142 { 143 InstAlloc_Init(&AllocMem[i], LVM_NULL); 144 } 145 InternalBlockSize = (LVM_UINT16)((pInstParams->MaxBlockSize) & MIN_INTERNAL_BLOCKMASK); /* Force to a multiple of MIN_INTERNAL_BLOCKSIZE */ 146 147 if (InternalBlockSize < MIN_INTERNAL_BLOCKSIZE) 148 { 149 InternalBlockSize = MIN_INTERNAL_BLOCKSIZE; 150 } 151 152 /* Maximum Internal Black Size should not be more than MAX_INTERNAL_BLOCKSIZE*/ 153 if(InternalBlockSize > MAX_INTERNAL_BLOCKSIZE) 154 { 155 InternalBlockSize = MAX_INTERNAL_BLOCKSIZE; 156 } 157 158 /* 159 * Bundle requirements 160 */ 161 InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_SLOW_DATA], 162 sizeof(LVM_Instance_t)); 163 164 165 /* 166 * Set the algorithm and bundle scratch requirements 167 */ 168 AlgScratchSize = 0; 169 if (pInstParams->BufferMode == LVM_MANAGED_BUFFERS) 170 { 171 BundleScratchSize = 6 * (MIN_INTERNAL_BLOCKSIZE + InternalBlockSize) * sizeof(LVM_INT16); 172 InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_TEMPORARY_FAST], /* Scratch buffer */ 173 BundleScratchSize); 174 InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_SLOW_DATA], 175 sizeof(LVM_Buffer_t)); 176 } 177 178 /* 179 * Treble Enhancement requirements 180 */ 181 InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_FAST_DATA], 182 sizeof(LVM_TE_Data_t)); 183 InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_FAST_COEF], 184 sizeof(LVM_TE_Coefs_t)); 185 186 /* 187 * N-Band Equalizer requirements 188 */ 189 InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_FAST_DATA], /* Local storage */ 190 (pInstParams->EQNB_NumBands * sizeof(LVM_EQNB_BandDef_t))); 191 InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_FAST_DATA], /* User storage */ 192 (pInstParams->EQNB_NumBands * sizeof(LVM_EQNB_BandDef_t))); 193 194 /* 195 * Concert Sound requirements 196 */ 197 { 198 LVCS_MemTab_t CS_MemTab; 199 LVCS_Capabilities_t CS_Capabilities; 200 201 /* 202 * Set the capabilities 203 */ 204 CS_Capabilities.MaxBlockSize = InternalBlockSize; 205 206 /* 207 * Get the memory requirements 208 */ 209 LVCS_Memory(LVM_NULL, 210 &CS_MemTab, 211 &CS_Capabilities); 212 213 /* 214 * Update the memory allocation structures 215 */ 216 InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_FAST_DATA], 217 CS_MemTab.Region[LVM_MEMREGION_PERSISTENT_FAST_DATA].Size); 218 InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_FAST_COEF], 219 CS_MemTab.Region[LVM_MEMREGION_PERSISTENT_FAST_COEF].Size); 220 if (CS_MemTab.Region[LVM_MEMREGION_TEMPORARY_FAST].Size > AlgScratchSize) AlgScratchSize = CS_MemTab.Region[LVM_MEMREGION_TEMPORARY_FAST].Size; 221 222 } 223 224 225 /* 226 * Dynamic Bass Enhancement requirements 227 */ 228 { 229 LVDBE_MemTab_t DBE_MemTab; 230 LVDBE_Capabilities_t DBE_Capabilities; 231 232 /* 233 * Set the capabilities 234 */ 235 #if defined(BUILD_FLOAT) && defined(HIGHER_FS) 236 DBE_Capabilities.SampleRate = LVDBE_CAP_FS_8000 | LVDBE_CAP_FS_11025 | LVDBE_CAP_FS_12000 | LVDBE_CAP_FS_16000 | LVDBE_CAP_FS_22050 | LVDBE_CAP_FS_24000 | LVDBE_CAP_FS_32000 | LVDBE_CAP_FS_44100 | LVDBE_CAP_FS_48000 | LVDBE_CAP_FS_96000 | LVDBE_CAP_FS_192000; 237 #else 238 DBE_Capabilities.SampleRate = LVDBE_CAP_FS_8000 | LVDBE_CAP_FS_11025 | LVDBE_CAP_FS_12000 | LVDBE_CAP_FS_16000 | LVDBE_CAP_FS_22050 | LVDBE_CAP_FS_24000 | LVDBE_CAP_FS_32000 | LVDBE_CAP_FS_44100 | LVDBE_CAP_FS_48000; 239 #endif 240 DBE_Capabilities.CentreFrequency = LVDBE_CAP_CENTRE_55Hz | LVDBE_CAP_CENTRE_55Hz | LVDBE_CAP_CENTRE_66Hz | LVDBE_CAP_CENTRE_78Hz | LVDBE_CAP_CENTRE_90Hz; 241 DBE_Capabilities.MaxBlockSize = InternalBlockSize; 242 243 /* 244 * Get the memory requirements 245 */ 246 LVDBE_Memory(LVM_NULL, 247 &DBE_MemTab, 248 249 &DBE_Capabilities); 250 /* 251 * Update the bundle table 252 */ 253 InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_FAST_DATA], 254 DBE_MemTab.Region[LVM_MEMREGION_PERSISTENT_FAST_DATA].Size); 255 InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_FAST_COEF], 256 DBE_MemTab.Region[LVM_MEMREGION_PERSISTENT_FAST_COEF].Size); 257 if (DBE_MemTab.Region[LVM_MEMREGION_TEMPORARY_FAST].Size > AlgScratchSize) AlgScratchSize = DBE_MemTab.Region[LVM_MEMREGION_TEMPORARY_FAST].Size; 258 259 } 260 261 262 /* 263 * N-Band equaliser requirements 264 */ 265 { 266 LVEQNB_MemTab_t EQNB_MemTab; /* For N-Band Equaliser */ 267 LVEQNB_Capabilities_t EQNB_Capabilities; 268 269 /* 270 * Set the capabilities 271 */ 272 #if defined(BUILD_FLOAT) && defined(HIGHER_FS) 273 EQNB_Capabilities.SampleRate = LVEQNB_CAP_FS_8000 | LVEQNB_CAP_FS_11025 | LVEQNB_CAP_FS_12000 | LVEQNB_CAP_FS_16000 | LVEQNB_CAP_FS_22050 | LVEQNB_CAP_FS_24000 | LVEQNB_CAP_FS_32000 | LVEQNB_CAP_FS_44100 | LVEQNB_CAP_FS_48000 | LVEQNB_CAP_FS_96000 | LVEQNB_CAP_FS_192000; 274 #else 275 EQNB_Capabilities.SampleRate = LVEQNB_CAP_FS_8000 | LVEQNB_CAP_FS_11025 | LVEQNB_CAP_FS_12000 | LVEQNB_CAP_FS_16000 | LVEQNB_CAP_FS_22050 | LVEQNB_CAP_FS_24000 | LVEQNB_CAP_FS_32000 | LVEQNB_CAP_FS_44100 | LVEQNB_CAP_FS_48000; 276 #endif 277 EQNB_Capabilities.SourceFormat = LVEQNB_CAP_STEREO | LVEQNB_CAP_MONOINSTEREO; 278 EQNB_Capabilities.MaxBlockSize = InternalBlockSize; 279 EQNB_Capabilities.MaxBands = pInstParams->EQNB_NumBands; 280 281 /* 282 * Get the memory requirements 283 */ 284 LVEQNB_Memory(LVM_NULL, 285 &EQNB_MemTab, 286 &EQNB_Capabilities); 287 288 /* 289 * Update the bundle table 290 */ 291 InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_FAST_DATA], 292 EQNB_MemTab.Region[LVM_MEMREGION_PERSISTENT_FAST_DATA].Size); 293 InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_FAST_COEF], 294 EQNB_MemTab.Region[LVM_MEMREGION_PERSISTENT_FAST_COEF].Size); 295 if (EQNB_MemTab.Region[LVM_MEMREGION_TEMPORARY_FAST].Size > AlgScratchSize) AlgScratchSize = EQNB_MemTab.Region[LVM_MEMREGION_TEMPORARY_FAST].Size; 296 297 } 298 299 /* 300 * Headroom management memory allocation 301 */ 302 InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_FAST_DATA], 303 (LVM_HEADROOM_MAX_NBANDS * sizeof(LVM_HeadroomBandDef_t))); 304 InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_FAST_DATA], 305 (LVM_HEADROOM_MAX_NBANDS * sizeof(LVM_HeadroomBandDef_t))); 306 307 308 /* 309 * Spectrum Analyzer memory requirements 310 */ 311 { 312 pLVPSA_Handle_t hPSAInst = LVM_NULL; 313 LVPSA_MemTab_t PSA_MemTab; 314 LVPSA_InitParams_t PSA_InitParams; 315 LVPSA_FilterParam_t FiltersParams[9]; 316 LVPSA_RETURN PSA_Status; 317 318 if(pInstParams->PSA_Included == LVM_PSA_ON) 319 { 320 PSA_InitParams.SpectralDataBufferDuration = (LVM_UINT16) 500; 321 PSA_InitParams.MaxInputBlockSize = (LVM_UINT16) 1000; 322 PSA_InitParams.nBands = (LVM_UINT16) 9; 323 324 PSA_InitParams.pFiltersParams = &FiltersParams[0]; 325 for(i = 0; i < PSA_InitParams.nBands; i++) 326 { 327 FiltersParams[i].CenterFrequency = (LVM_UINT16) 1000; 328 FiltersParams[i].QFactor = (LVM_UINT16) 25; 329 FiltersParams[i].PostGain = (LVM_INT16) 0; 330 } 331 332 /* 333 * Get the memory requirements 334 */ 335 PSA_Status = LVPSA_Memory (hPSAInst, 336 &PSA_MemTab, 337 &PSA_InitParams); 338 339 if (PSA_Status != LVPSA_OK) 340 { 341 return((LVM_ReturnStatus_en) LVM_ALGORITHMPSA); 342 } 343 344 /* 345 * Update the bundle table 346 */ 347 /* Slow Data */ 348 InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_SLOW_DATA], 349 PSA_MemTab.Region[LVM_PERSISTENT_SLOW_DATA].Size); 350 351 /* Fast Data */ 352 InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_FAST_DATA], 353 PSA_MemTab.Region[LVM_PERSISTENT_FAST_DATA].Size); 354 355 /* Fast Coef */ 356 InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_FAST_COEF], 357 PSA_MemTab.Region[LVM_PERSISTENT_FAST_COEF].Size); 358 359 /* Fast Temporary */ 360 InstAlloc_AddMember(&AllocMem[LVM_TEMPORARY_FAST], 361 MAX_INTERNAL_BLOCKSIZE * sizeof(LVM_INT16)); 362 363 if (PSA_MemTab.Region[LVM_TEMPORARY_FAST].Size > AlgScratchSize) 364 { 365 AlgScratchSize = PSA_MemTab.Region[LVM_TEMPORARY_FAST].Size; 366 } 367 } 368 } 369 370 /* 371 * Return the memory table 372 */ 373 pMemoryTable->Region[LVM_MEMREGION_PERSISTENT_SLOW_DATA].Size = InstAlloc_GetTotal(&AllocMem[LVM_MEMREGION_PERSISTENT_SLOW_DATA]); 374 pMemoryTable->Region[LVM_MEMREGION_PERSISTENT_SLOW_DATA].Type = LVM_PERSISTENT_SLOW_DATA; 375 pMemoryTable->Region[LVM_MEMREGION_PERSISTENT_SLOW_DATA].pBaseAddress = LVM_NULL; 376 377 pMemoryTable->Region[LVM_MEMREGION_PERSISTENT_FAST_DATA].Size = InstAlloc_GetTotal(&AllocMem[LVM_MEMREGION_PERSISTENT_FAST_DATA]); 378 pMemoryTable->Region[LVM_MEMREGION_PERSISTENT_FAST_DATA].Type = LVM_PERSISTENT_FAST_DATA; 379 pMemoryTable->Region[LVM_MEMREGION_PERSISTENT_FAST_DATA].pBaseAddress = LVM_NULL; 380 if (pMemoryTable->Region[LVM_MEMREGION_PERSISTENT_FAST_DATA].Size < 4) 381 { 382 pMemoryTable->Region[LVM_MEMREGION_PERSISTENT_FAST_DATA].Size = 0; 383 } 384 385 pMemoryTable->Region[LVM_MEMREGION_PERSISTENT_FAST_COEF].Size = InstAlloc_GetTotal(&AllocMem[LVM_MEMREGION_PERSISTENT_FAST_COEF]); 386 pMemoryTable->Region[LVM_MEMREGION_PERSISTENT_FAST_COEF].Type = LVM_PERSISTENT_FAST_COEF; 387 pMemoryTable->Region[LVM_MEMREGION_PERSISTENT_FAST_COEF].pBaseAddress = LVM_NULL; 388 if (pMemoryTable->Region[LVM_MEMREGION_PERSISTENT_FAST_COEF].Size < 4) 389 { 390 pMemoryTable->Region[LVM_MEMREGION_PERSISTENT_FAST_COEF].Size = 0; 391 } 392 393 InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_TEMPORARY_FAST], 394 AlgScratchSize); 395 pMemoryTable->Region[LVM_MEMREGION_TEMPORARY_FAST].Size = InstAlloc_GetTotal(&AllocMem[LVM_MEMREGION_TEMPORARY_FAST]); 396 pMemoryTable->Region[LVM_MEMREGION_TEMPORARY_FAST].Type = LVM_TEMPORARY_FAST; 397 pMemoryTable->Region[LVM_MEMREGION_TEMPORARY_FAST].pBaseAddress = LVM_NULL; 398 if (pMemoryTable->Region[LVM_MEMREGION_TEMPORARY_FAST].Size < 4) 399 { 400 pMemoryTable->Region[LVM_MEMREGION_TEMPORARY_FAST].Size = 0; 401 } 402 403 return(LVM_SUCCESS); 404 405 } 406 407 408 /****************************************************************************************/ 409 /* */ 410 /* FUNCTION: LVM_GetInstanceHandle */ 411 /* */ 412 /* DESCRIPTION: */ 413 /* This function is used to create a bundle instance. It returns the created instance */ 414 /* handle through phInstance. All parameters are set to their default, inactive state. */ 415 /* */ 416 /* PARAMETERS: */ 417 /* phInstance pointer to the instance handle */ 418 /* pMemoryTable Pointer to the memory definition table */ 419 /* pInstParams Pointer to the initialisation capabilities */ 420 /* */ 421 /* RETURNS: */ 422 /* LVM_SUCCESS Initialisation succeeded */ 423 /* LVM_OUTOFRANGE When any of the Instance parameters are out of range */ 424 /* LVM_NULLADDRESS When one of phInstance, pMemoryTable or pInstParams are NULL*/ 425 /* */ 426 /* NOTES: */ 427 /* 1. This function must not be interrupted by the LVM_Process function */ 428 /* */ 429 /****************************************************************************************/ 430 431 LVM_ReturnStatus_en LVM_GetInstanceHandle(LVM_Handle_t *phInstance, 432 LVM_MemTab_t *pMemoryTable, 433 LVM_InstParams_t *pInstParams) 434 { 435 436 LVM_ReturnStatus_en Status = LVM_SUCCESS; 437 LVM_Instance_t *pInstance; 438 INST_ALLOC AllocMem[LVM_NR_MEMORY_REGIONS]; 439 LVM_INT16 i; 440 LVM_UINT16 InternalBlockSize; 441 LVM_INT32 BundleScratchSize; 442 443 444 /* 445 * Check valid points have been given 446 */ 447 if ((phInstance == LVM_NULL) || (pMemoryTable == LVM_NULL) || (pInstParams == LVM_NULL)) 448 { 449 return (LVM_NULLADDRESS); 450 } 451 452 /* 453 * Check the memory table for NULL pointers 454 */ 455 for (i=0; i<LVM_NR_MEMORY_REGIONS; i++) 456 { 457 if ((pMemoryTable->Region[i].Size != 0) && 458 (pMemoryTable->Region[i].pBaseAddress==LVM_NULL)) 459 { 460 return(LVM_NULLADDRESS); 461 } 462 } 463 464 /* 465 * Check the instance parameters 466 */ 467 if( (pInstParams->BufferMode != LVM_MANAGED_BUFFERS) && (pInstParams->BufferMode != LVM_UNMANAGED_BUFFERS) ) 468 { 469 return (LVM_OUTOFRANGE); 470 } 471 472 if( pInstParams->EQNB_NumBands > 32 ) 473 { 474 return (LVM_OUTOFRANGE); 475 } 476 477 if(pInstParams->BufferMode == LVM_MANAGED_BUFFERS) 478 { 479 if( (pInstParams->MaxBlockSize < LVM_MIN_MAXBLOCKSIZE ) || (pInstParams->MaxBlockSize > LVM_MANAGED_MAX_MAXBLOCKSIZE ) ) 480 { 481 return (LVM_OUTOFRANGE); 482 } 483 } 484 else 485 { 486 if( (pInstParams->MaxBlockSize < LVM_MIN_MAXBLOCKSIZE ) || (pInstParams->MaxBlockSize > LVM_UNMANAGED_MAX_MAXBLOCKSIZE) ) 487 { 488 return (LVM_OUTOFRANGE); 489 } 490 } 491 492 if(pInstParams->PSA_Included > LVM_PSA_ON) 493 { 494 return (LVM_OUTOFRANGE); 495 } 496 497 /* 498 * Initialise the AllocMem structures 499 */ 500 for (i=0; i<LVM_NR_MEMORY_REGIONS; i++) 501 { 502 InstAlloc_Init(&AllocMem[i], 503 pMemoryTable->Region[i].pBaseAddress); 504 } 505 506 507 /* 508 * Set the instance handle 509 */ 510 *phInstance = (LVM_Handle_t)InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_SLOW_DATA], 511 sizeof(LVM_Instance_t)); 512 pInstance =(LVM_Instance_t *)*phInstance; 513 514 515 /* 516 * Save the memory table, parameters and capabilities 517 */ 518 pInstance->MemoryTable = *pMemoryTable; 519 pInstance->InstParams = *pInstParams; 520 521 522 /* 523 * Set the bundle scratch memory and initialse the buffer management 524 */ 525 InternalBlockSize = (LVM_UINT16)((pInstParams->MaxBlockSize) & MIN_INTERNAL_BLOCKMASK); /* Force to a multiple of MIN_INTERNAL_BLOCKSIZE */ 526 if (InternalBlockSize < MIN_INTERNAL_BLOCKSIZE) 527 { 528 InternalBlockSize = MIN_INTERNAL_BLOCKSIZE; 529 } 530 531 /* Maximum Internal Black Size should not be more than MAX_INTERNAL_BLOCKSIZE*/ 532 if(InternalBlockSize > MAX_INTERNAL_BLOCKSIZE) 533 { 534 InternalBlockSize = MAX_INTERNAL_BLOCKSIZE; 535 } 536 pInstance->InternalBlockSize = (LVM_INT16)InternalBlockSize; 537 538 539 /* 540 * Common settings for managed and unmanaged buffers 541 */ 542 pInstance->SamplesToProcess = 0; /* No samples left to process */ 543 if (pInstParams->BufferMode == LVM_MANAGED_BUFFERS) 544 { 545 /* 546 * Managed buffers required 547 */ 548 pInstance->pBufferManagement = InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_SLOW_DATA], 549 sizeof(LVM_Buffer_t)); 550 BundleScratchSize = (LVM_INT32)(6 * (MIN_INTERNAL_BLOCKSIZE + InternalBlockSize) * sizeof(LVM_INT16)); 551 pInstance->pBufferManagement->pScratch = InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_TEMPORARY_FAST], /* Scratch 1 buffer */ 552 (LVM_UINT32)BundleScratchSize); 553 #ifdef BUILD_FLOAT 554 LoadConst_Float(0, /* Clear the input delay buffer */ 555 (LVM_FLOAT *)&pInstance->pBufferManagement->InDelayBuffer, 556 (LVM_INT16)(2 * MIN_INTERNAL_BLOCKSIZE)); 557 #else 558 LoadConst_16(0, /* Clear the input delay buffer */ 559 (LVM_INT16 *)&pInstance->pBufferManagement->InDelayBuffer, 560 (LVM_INT16)(2 * MIN_INTERNAL_BLOCKSIZE)); 561 #endif 562 pInstance->pBufferManagement->InDelaySamples = MIN_INTERNAL_BLOCKSIZE; /* Set the number of delay samples */ 563 pInstance->pBufferManagement->OutDelaySamples = 0; /* No samples in the output buffer */ 564 pInstance->pBufferManagement->BufferState = LVM_FIRSTCALL; /* Set the state ready for the first call */ 565 } 566 567 568 /* 569 * Set default parameters 570 */ 571 pInstance->Params.OperatingMode = LVM_MODE_OFF; 572 pInstance->Params.SampleRate = LVM_FS_8000; 573 pInstance->Params.SourceFormat = LVM_MONO; 574 pInstance->Params.SpeakerType = LVM_HEADPHONES; 575 pInstance->Params.VC_EffectLevel = 0; 576 pInstance->Params.VC_Balance = 0; 577 578 /* 579 * Set callback 580 */ 581 pInstance->CallBack = LVM_AlgoCallBack; 582 583 584 /* 585 * DC removal filter 586 */ 587 DC_2I_D16_TRC_WRA_01_Init(&pInstance->DC_RemovalInstance); 588 589 590 /* 591 * Treble Enhancement 592 */ 593 pInstance->pTE_Taps = (LVM_TE_Data_t *)InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_FAST_DATA], 594 sizeof(LVM_TE_Data_t)); 595 596 pInstance->pTE_State = (LVM_TE_Coefs_t *)InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_FAST_COEF], 597 sizeof(LVM_TE_Coefs_t)); 598 pInstance->Params.TE_OperatingMode = LVM_TE_OFF; 599 pInstance->Params.TE_EffectLevel = 0; 600 pInstance->TE_Active = LVM_FALSE; 601 602 603 /* 604 * Set the volume control and initialise Current to Target 605 */ 606 pInstance->VC_Volume.MixerStream[0].CallbackParam = 0; 607 pInstance->VC_Volume.MixerStream[0].CallbackSet = 0; 608 pInstance->VC_Volume.MixerStream[0].pCallbackHandle = pInstance; 609 pInstance->VC_Volume.MixerStream[0].pCallBack = LVM_VCCallBack; 610 611 /* In managed buffering, start with low signal level as delay in buffer management causes a click*/ 612 if (pInstParams->BufferMode == LVM_MANAGED_BUFFERS) 613 { 614 #ifdef BUILD_FLOAT 615 LVC_Mixer_Init(&pInstance->VC_Volume.MixerStream[0], 0, 0); 616 #else 617 LVC_Mixer_Init(&pInstance->VC_Volume.MixerStream[0],0,0); 618 #endif 619 } 620 else 621 { 622 #ifdef BUILD_FLOAT 623 LVC_Mixer_Init(&pInstance->VC_Volume.MixerStream[0], LVM_MAXFLOAT, LVM_MAXFLOAT); 624 #else 625 LVC_Mixer_Init(&pInstance->VC_Volume.MixerStream[0],LVM_MAXINT_16,LVM_MAXINT_16); 626 #endif 627 } 628 629 #ifdef BUILD_FLOAT 630 LVC_Mixer_SetTimeConstant(&pInstance->VC_Volume.MixerStream[0],0,LVM_FS_8000,2); 631 #else 632 LVC_Mixer_SetTimeConstant(&pInstance->VC_Volume.MixerStream[0], 0, LVM_FS_8000, 2); 633 #endif 634 635 pInstance->VC_VolumedB = 0; 636 pInstance->VC_AVLFixedVolume = 0; 637 pInstance->VC_Active = LVM_FALSE; 638 639 pInstance->VC_BalanceMix.MixerStream[0].CallbackParam = 0; 640 pInstance->VC_BalanceMix.MixerStream[0].CallbackSet = 0; 641 pInstance->VC_BalanceMix.MixerStream[0].pCallbackHandle = pInstance; 642 pInstance->VC_BalanceMix.MixerStream[0].pCallBack = LVM_VCCallBack; 643 #ifdef BUILD_FLOAT 644 LVC_Mixer_Init(&pInstance->VC_BalanceMix.MixerStream[0], LVM_MAXFLOAT, LVM_MAXFLOAT); 645 #else 646 LVC_Mixer_Init(&pInstance->VC_BalanceMix.MixerStream[0],LVM_MAXINT_16,LVM_MAXINT_16); 647 #endif 648 LVC_Mixer_VarSlope_SetTimeConstant(&pInstance->VC_BalanceMix.MixerStream[0],LVM_VC_MIXER_TIME,LVM_FS_8000,2); 649 650 pInstance->VC_BalanceMix.MixerStream[1].CallbackParam = 0; 651 pInstance->VC_BalanceMix.MixerStream[1].CallbackSet = 0; 652 pInstance->VC_BalanceMix.MixerStream[1].pCallbackHandle = pInstance; 653 pInstance->VC_BalanceMix.MixerStream[1].pCallBack = LVM_VCCallBack; 654 #ifdef BUILD_FLOAT 655 LVC_Mixer_Init(&pInstance->VC_BalanceMix.MixerStream[1], LVM_MAXFLOAT, LVM_MAXFLOAT); 656 #else 657 LVC_Mixer_Init(&pInstance->VC_BalanceMix.MixerStream[1],LVM_MAXINT_16,LVM_MAXINT_16); 658 #endif 659 LVC_Mixer_VarSlope_SetTimeConstant(&pInstance->VC_BalanceMix.MixerStream[1],LVM_VC_MIXER_TIME,LVM_FS_8000,2); 660 661 /* 662 * Set the default EQNB pre-gain and pointer to the band definitions 663 */ 664 pInstance->pEQNB_BandDefs = InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_FAST_DATA], 665 (pInstParams->EQNB_NumBands * sizeof(LVM_EQNB_BandDef_t))); 666 pInstance->pEQNB_UserDefs = InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_FAST_DATA], 667 (pInstParams->EQNB_NumBands * sizeof(LVM_EQNB_BandDef_t))); 668 669 670 /* 671 * Initialise the Concert Sound module 672 */ 673 { 674 LVCS_Handle_t hCSInstance; /* Instance handle */ 675 LVCS_MemTab_t CS_MemTab; /* Memory table */ 676 LVCS_Capabilities_t CS_Capabilities; /* Initial capabilities */ 677 LVCS_ReturnStatus_en LVCS_Status; /* Function call status */ 678 679 /* 680 * Set default parameters 681 */ 682 pInstance->Params.VirtualizerReverbLevel = 100; 683 pInstance->Params.VirtualizerType = LVM_CONCERTSOUND; 684 pInstance->Params.VirtualizerOperatingMode = LVM_MODE_OFF; 685 pInstance->CS_Active = LVM_FALSE; 686 687 /* 688 * Set the initialisation capabilities 689 */ 690 CS_Capabilities.MaxBlockSize = (LVM_UINT16)InternalBlockSize; 691 CS_Capabilities.CallBack = pInstance->CallBack; 692 CS_Capabilities.pBundleInstance = (void*)pInstance; 693 694 695 /* 696 * Get the memory requirements and then set the address pointers, forcing alignment 697 */ 698 LVCS_Status = LVCS_Memory(LVM_NULL, /* Get the memory requirements */ 699 &CS_MemTab, 700 &CS_Capabilities); 701 CS_MemTab.Region[LVCS_MEMREGION_PERSISTENT_SLOW_DATA].pBaseAddress = &pInstance->CS_Instance; 702 CS_MemTab.Region[LVCS_MEMREGION_PERSISTENT_FAST_DATA].pBaseAddress = (void *)InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_FAST_DATA], 703 CS_MemTab.Region[LVCS_MEMREGION_PERSISTENT_FAST_DATA].Size); 704 CS_MemTab.Region[LVCS_MEMREGION_PERSISTENT_FAST_COEF].pBaseAddress = (void *)InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_FAST_COEF], 705 CS_MemTab.Region[LVCS_MEMREGION_PERSISTENT_FAST_COEF].Size); 706 CS_MemTab.Region[LVCS_MEMREGION_TEMPORARY_FAST].pBaseAddress = (void *)InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_TEMPORARY_FAST], 707 0); 708 709 /* 710 * Initialise the Concert Sound instance and save the instance handle 711 */ 712 hCSInstance = LVM_NULL; /* Set to NULL to return handle */ 713 LVCS_Status = LVCS_Init(&hCSInstance, /* Initiailse */ 714 &CS_MemTab, 715 &CS_Capabilities); 716 if (LVCS_Status != LVCS_SUCCESS) return((LVM_ReturnStatus_en)LVCS_Status); 717 pInstance->hCSInstance = hCSInstance; /* Save the instance handle */ 718 719 } 720 721 /* 722 * Initialise the Bass Enhancement module 723 */ 724 { 725 LVDBE_Handle_t hDBEInstance; /* Instance handle */ 726 LVDBE_MemTab_t DBE_MemTab; /* Memory table */ 727 LVDBE_Capabilities_t DBE_Capabilities; /* Initial capabilities */ 728 LVDBE_ReturnStatus_en LVDBE_Status; /* Function call status */ 729 730 731 /* 732 * Set the initialisation parameters 733 */ 734 pInstance->Params.BE_OperatingMode = LVM_BE_OFF; 735 pInstance->Params.BE_CentreFreq = LVM_BE_CENTRE_55Hz; 736 pInstance->Params.BE_EffectLevel = 0; 737 pInstance->Params.BE_HPF = LVM_BE_HPF_OFF; 738 739 pInstance->DBE_Active = LVM_FALSE; 740 741 742 743 /* 744 * Set the initialisation capabilities 745 */ 746 #if defined(BUILD_FLOAT) && defined(HIGHER_FS) 747 DBE_Capabilities.SampleRate = LVDBE_CAP_FS_8000 | LVDBE_CAP_FS_11025 | LVDBE_CAP_FS_12000 | LVDBE_CAP_FS_16000 | LVDBE_CAP_FS_22050 | LVDBE_CAP_FS_24000 | LVDBE_CAP_FS_32000 | LVDBE_CAP_FS_44100 | LVDBE_CAP_FS_48000 | LVDBE_CAP_FS_96000 | LVDBE_CAP_FS_192000; 748 #else 749 DBE_Capabilities.SampleRate = LVDBE_CAP_FS_8000 | LVDBE_CAP_FS_11025 | LVDBE_CAP_FS_12000 | LVDBE_CAP_FS_16000 | LVDBE_CAP_FS_22050 | LVDBE_CAP_FS_24000 | LVDBE_CAP_FS_32000 | LVDBE_CAP_FS_44100 | LVDBE_CAP_FS_48000; 750 #endif 751 DBE_Capabilities.CentreFrequency = LVDBE_CAP_CENTRE_55Hz | LVDBE_CAP_CENTRE_55Hz | LVDBE_CAP_CENTRE_66Hz | LVDBE_CAP_CENTRE_78Hz | LVDBE_CAP_CENTRE_90Hz; 752 DBE_Capabilities.MaxBlockSize = (LVM_UINT16)InternalBlockSize; 753 754 755 /* 756 * Get the memory requirements and then set the address pointers 757 */ 758 LVDBE_Status = LVDBE_Memory(LVM_NULL, /* Get the memory requirements */ 759 &DBE_MemTab, 760 &DBE_Capabilities); 761 DBE_MemTab.Region[LVDBE_MEMREGION_INSTANCE].pBaseAddress = &pInstance->DBE_Instance; 762 DBE_MemTab.Region[LVDBE_MEMREGION_PERSISTENT_DATA].pBaseAddress = (void *)InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_FAST_DATA], 763 DBE_MemTab.Region[LVDBE_MEMREGION_PERSISTENT_DATA].Size); 764 DBE_MemTab.Region[LVDBE_MEMREGION_PERSISTENT_COEF].pBaseAddress = (void *)InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_FAST_COEF], 765 DBE_MemTab.Region[LVDBE_MEMREGION_PERSISTENT_COEF].Size); 766 DBE_MemTab.Region[LVDBE_MEMREGION_SCRATCH].pBaseAddress = (void *)InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_TEMPORARY_FAST], 767 0); 768 769 770 /* 771 * Initialise the Dynamic Bass Enhancement instance and save the instance handle 772 */ 773 hDBEInstance = LVM_NULL; /* Set to NULL to return handle */ 774 LVDBE_Status = LVDBE_Init(&hDBEInstance, /* Initiailse */ 775 &DBE_MemTab, 776 &DBE_Capabilities); 777 if (LVDBE_Status != LVDBE_SUCCESS) return((LVM_ReturnStatus_en)LVDBE_Status); 778 pInstance->hDBEInstance = hDBEInstance; /* Save the instance handle */ 779 } 780 781 782 /* 783 * Initialise the N-Band Equaliser module 784 */ 785 { 786 LVEQNB_Handle_t hEQNBInstance; /* Instance handle */ 787 LVEQNB_MemTab_t EQNB_MemTab; /* Memory table */ 788 LVEQNB_Capabilities_t EQNB_Capabilities; /* Initial capabilities */ 789 LVEQNB_ReturnStatus_en LVEQNB_Status; /* Function call status */ 790 791 792 /* 793 * Set the initialisation parameters 794 */ 795 pInstance->Params.EQNB_OperatingMode = LVM_EQNB_OFF; 796 pInstance->Params.EQNB_NBands = 0; 797 pInstance->Params.pEQNB_BandDefinition = LVM_NULL; 798 pInstance->EQNB_Active = LVM_FALSE; 799 800 801 /* 802 * Set the initialisation capabilities 803 */ 804 #if defined(BUILD_FLOAT) && defined(HIGHER_FS) 805 EQNB_Capabilities.SampleRate = LVEQNB_CAP_FS_8000 | LVEQNB_CAP_FS_11025 | LVEQNB_CAP_FS_12000 | LVEQNB_CAP_FS_16000 | LVEQNB_CAP_FS_22050 | LVEQNB_CAP_FS_24000 | LVEQNB_CAP_FS_32000 | LVEQNB_CAP_FS_44100 | LVEQNB_CAP_FS_48000 | LVEQNB_CAP_FS_96000 | LVEQNB_CAP_FS_192000; 806 #else 807 EQNB_Capabilities.SampleRate = LVEQNB_CAP_FS_8000 | LVEQNB_CAP_FS_11025 | LVEQNB_CAP_FS_12000 | LVEQNB_CAP_FS_16000 | LVEQNB_CAP_FS_22050 | LVEQNB_CAP_FS_24000 | LVEQNB_CAP_FS_32000 | LVEQNB_CAP_FS_44100 | LVEQNB_CAP_FS_48000; 808 #endif 809 EQNB_Capabilities.MaxBlockSize = (LVM_UINT16)InternalBlockSize; 810 EQNB_Capabilities.MaxBands = pInstParams->EQNB_NumBands; 811 EQNB_Capabilities.SourceFormat = LVEQNB_CAP_STEREO | LVEQNB_CAP_MONOINSTEREO; 812 EQNB_Capabilities.CallBack = pInstance->CallBack; 813 EQNB_Capabilities.pBundleInstance = (void*)pInstance; 814 815 816 /* 817 * Get the memory requirements and then set the address pointers, forcing alignment 818 */ 819 LVEQNB_Status = LVEQNB_Memory(LVM_NULL, /* Get the memory requirements */ 820 &EQNB_MemTab, 821 &EQNB_Capabilities); 822 EQNB_MemTab.Region[LVEQNB_MEMREGION_INSTANCE].pBaseAddress = &pInstance->EQNB_Instance; 823 EQNB_MemTab.Region[LVEQNB_MEMREGION_PERSISTENT_DATA].pBaseAddress = (void *)InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_FAST_DATA], 824 EQNB_MemTab.Region[LVEQNB_MEMREGION_PERSISTENT_DATA].Size); 825 EQNB_MemTab.Region[LVEQNB_MEMREGION_PERSISTENT_COEF].pBaseAddress = (void *)InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_FAST_COEF], 826 EQNB_MemTab.Region[LVEQNB_MEMREGION_PERSISTENT_COEF].Size); 827 EQNB_MemTab.Region[LVEQNB_MEMREGION_SCRATCH].pBaseAddress = (void *)InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_TEMPORARY_FAST], 828 0); 829 830 831 /* 832 * Initialise the Dynamic Bass Enhancement instance and save the instance handle 833 */ 834 hEQNBInstance = LVM_NULL; /* Set to NULL to return handle */ 835 LVEQNB_Status = LVEQNB_Init(&hEQNBInstance, /* Initiailse */ 836 &EQNB_MemTab, 837 &EQNB_Capabilities); 838 if (LVEQNB_Status != LVEQNB_SUCCESS) return((LVM_ReturnStatus_en)LVEQNB_Status); 839 pInstance->hEQNBInstance = hEQNBInstance; /* Save the instance handle */ 840 } 841 842 /* 843 * Headroom management memory allocation 844 */ 845 { 846 pInstance->pHeadroom_BandDefs = InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_FAST_DATA], 847 (LVM_HEADROOM_MAX_NBANDS * sizeof(LVM_HeadroomBandDef_t))); 848 pInstance->pHeadroom_UserDefs = InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_FAST_DATA], 849 (LVM_HEADROOM_MAX_NBANDS * sizeof(LVM_HeadroomBandDef_t))); 850 851 /* Headroom management parameters initialisation */ 852 pInstance->NewHeadroomParams.NHeadroomBands = 2; 853 pInstance->NewHeadroomParams.pHeadroomDefinition = pInstance->pHeadroom_BandDefs; 854 pInstance->NewHeadroomParams.pHeadroomDefinition[0].Limit_Low = 20; 855 pInstance->NewHeadroomParams.pHeadroomDefinition[0].Limit_High = 4999; 856 pInstance->NewHeadroomParams.pHeadroomDefinition[0].Headroom_Offset = 3; 857 pInstance->NewHeadroomParams.pHeadroomDefinition[1].Limit_Low = 5000; 858 pInstance->NewHeadroomParams.pHeadroomDefinition[1].Limit_High = 24000; 859 pInstance->NewHeadroomParams.pHeadroomDefinition[1].Headroom_Offset = 4; 860 pInstance->NewHeadroomParams.Headroom_OperatingMode = LVM_HEADROOM_ON; 861 862 pInstance->Headroom =0; 863 } 864 865 866 /* 867 * Initialise the PSA module 868 */ 869 { 870 pLVPSA_Handle_t hPSAInstance = LVM_NULL; /* Instance handle */ 871 LVPSA_MemTab_t PSA_MemTab; 872 LVPSA_RETURN PSA_Status; /* Function call status */ 873 LVPSA_FilterParam_t FiltersParams[9]; 874 875 if(pInstParams->PSA_Included==LVM_PSA_ON) 876 { 877 pInstance->PSA_InitParams.SpectralDataBufferDuration = (LVM_UINT16) 500; 878 pInstance->PSA_InitParams.MaxInputBlockSize = (LVM_UINT16) 2048; 879 pInstance->PSA_InitParams.nBands = (LVM_UINT16) 9; 880 pInstance->PSA_InitParams.pFiltersParams = &FiltersParams[0]; 881 for(i = 0; i < pInstance->PSA_InitParams.nBands; i++) 882 { 883 FiltersParams[i].CenterFrequency = (LVM_UINT16) 1000; 884 FiltersParams[i].QFactor = (LVM_UINT16) 100; 885 FiltersParams[i].PostGain = (LVM_INT16) 0; 886 } 887 888 /*Get the memory requirements and then set the address pointers*/ 889 PSA_Status = LVPSA_Memory (hPSAInstance, 890 &PSA_MemTab, 891 &pInstance->PSA_InitParams); 892 893 if (PSA_Status != LVPSA_OK) 894 { 895 return((LVM_ReturnStatus_en) LVM_ALGORITHMPSA); 896 } 897 898 /* Slow Data */ 899 PSA_MemTab.Region[LVM_PERSISTENT_SLOW_DATA].pBaseAddress = (void *)InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_SLOW_DATA], 900 PSA_MemTab.Region[LVM_PERSISTENT_SLOW_DATA].Size); 901 902 903 /* Fast Data */ 904 PSA_MemTab.Region[LVM_PERSISTENT_FAST_DATA].pBaseAddress = (void *)InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_FAST_DATA], 905 PSA_MemTab.Region[LVM_PERSISTENT_FAST_DATA].Size); 906 907 908 /* Fast Coef */ 909 PSA_MemTab.Region[LVM_PERSISTENT_FAST_COEF].pBaseAddress = (void *)InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_PERSISTENT_FAST_COEF], 910 PSA_MemTab.Region[LVM_PERSISTENT_FAST_COEF].Size); 911 912 /* Fast Temporary */ 913 #ifdef BUILD_FLOAT 914 pInstance->pPSAInput = InstAlloc_AddMember(&AllocMem[LVM_TEMPORARY_FAST], 915 (LVM_UINT32) MAX_INTERNAL_BLOCKSIZE * \ 916 sizeof(LVM_FLOAT)); 917 #else 918 pInstance->pPSAInput = InstAlloc_AddMember(&AllocMem[LVM_TEMPORARY_FAST], 919 (LVM_UINT32) MAX_INTERNAL_BLOCKSIZE * sizeof(LVM_INT16)); 920 #endif 921 PSA_MemTab.Region[LVM_TEMPORARY_FAST].pBaseAddress = (void *)InstAlloc_AddMember(&AllocMem[LVM_MEMREGION_TEMPORARY_FAST],0); 922 923 924 /*Initialise PSA instance and save the instance handle*/ 925 pInstance->PSA_ControlParams.Fs = LVM_FS_48000; 926 pInstance->PSA_ControlParams.LevelDetectionSpeed = LVPSA_SPEED_MEDIUM; 927 PSA_Status = LVPSA_Init (&hPSAInstance, 928 &pInstance->PSA_InitParams, 929 &pInstance->PSA_ControlParams, 930 &PSA_MemTab); 931 932 if (PSA_Status != LVPSA_OK) 933 { 934 return((LVM_ReturnStatus_en) LVM_ALGORITHMPSA); 935 } 936 937 pInstance->hPSAInstance = hPSAInstance; /* Save the instance handle */ 938 pInstance->PSA_GainOffset = 0; 939 } 940 else 941 { 942 pInstance->hPSAInstance = LVM_NULL; 943 } 944 945 /* 946 * Set the initialisation parameters. 947 */ 948 pInstance->Params.PSA_PeakDecayRate = LVM_PSA_SPEED_MEDIUM; 949 pInstance->Params.PSA_Enable = LVM_PSA_OFF; 950 } 951 952 /* 953 * Copy the initial parameters to the new parameters for correct readback of 954 * the settings. 955 */ 956 pInstance->NewParams = pInstance->Params; 957 958 959 /* 960 * Create configuration number 961 */ 962 pInstance->ConfigurationNumber = 0x00000000; 963 pInstance->ConfigurationNumber += LVM_CS_MASK; 964 pInstance->ConfigurationNumber += LVM_EQNB_MASK; 965 pInstance->ConfigurationNumber += LVM_DBE_MASK; 966 pInstance->ConfigurationNumber += LVM_VC_MASK; 967 pInstance->ConfigurationNumber += LVM_PSA_MASK; 968 969 if(((pInstance->ConfigurationNumber & LVM_CS_MASK)!=0) || 970 ((pInstance->ConfigurationNumber & LVM_DBE_MASK)!=0) || 971 ((pInstance->ConfigurationNumber & LVM_EQNB_MASK)!=0)|| 972 ((pInstance->ConfigurationNumber & LVM_TE_MASK)!=0) || 973 ((pInstance->ConfigurationNumber & LVM_VC_MASK)!=0)) 974 { 975 pInstance->BlickSizeMultiple = 4; 976 } 977 else 978 { 979 pInstance->BlickSizeMultiple = 1; 980 } 981 982 return(Status); 983 } 984 985 986 /****************************************************************************************/ 987 /* */ 988 /* FUNCTION: LVM_ClearAudioBuffers */ 989 /* */ 990 /* DESCRIPTION: */ 991 /* This function is used to clear the internal audio buffers of the bundle. */ 992 /* */ 993 /* PARAMETERS: */ 994 /* hInstance Instance handle */ 995 /* */ 996 /* RETURNS: */ 997 /* LVM_SUCCESS Initialisation succeeded */ 998 /* LVM_NULLADDRESS Instance or scratch memory has a NULL pointer */ 999 /* */ 1000 /* NOTES: */ 1001 /* 1. This function must not be interrupted by the LVM_Process function */ 1002 /* */ 1003 /****************************************************************************************/ 1004 1005 LVM_ReturnStatus_en LVM_ClearAudioBuffers(LVM_Handle_t hInstance) 1006 { 1007 LVM_MemTab_t MemTab; /* Memory table */ 1008 LVM_InstParams_t InstParams; /* Instance parameters */ 1009 LVM_ControlParams_t Params; /* Control Parameters */ 1010 LVM_Instance_t *pInstance = (LVM_Instance_t *)hInstance; /* Pointer to Instance */ 1011 LVM_HeadroomParams_t HeadroomParams; 1012 1013 1014 if(hInstance == LVM_NULL){ 1015 return LVM_NULLADDRESS; 1016 } 1017 1018 /* Save the control parameters */ /* coverity[unchecked_value] */ /* Do not check return value internal function calls */ 1019 LVM_GetControlParameters(hInstance, &Params); 1020 1021 /*Save the headroom parameters*/ 1022 LVM_GetHeadroomParams(hInstance, &HeadroomParams); 1023 1024 /* Retrieve allocated buffers in memtab */ 1025 LVM_GetMemoryTable(hInstance, &MemTab, LVM_NULL); 1026 1027 /* Save the instance parameters */ 1028 InstParams = pInstance->InstParams; 1029 1030 /* Call LVM_GetInstanceHandle to re-initialise the bundle */ 1031 LVM_GetInstanceHandle( &hInstance, 1032 &MemTab, 1033 &InstParams); 1034 1035 /* Restore control parameters */ /* coverity[unchecked_value] */ /* Do not check return value internal function calls */ 1036 LVM_SetControlParameters(hInstance, &Params); 1037 1038 /*Restore the headroom parameters*/ 1039 LVM_SetHeadroomParams(hInstance, &HeadroomParams); 1040 1041 /* DC removal filter */ 1042 DC_2I_D16_TRC_WRA_01_Init(&pInstance->DC_RemovalInstance); 1043 1044 return LVM_SUCCESS; 1045 } 1046 1047 1048 1049