| /* |
| * Copyright (C) 2004-2010 NXP Software |
| * Copyright (C) 2010 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #include "LVPSA.h" |
| #include "LVPSA_Private.h" |
| #include "InstAlloc.h" |
| |
| /****************************************************************************************/ |
| /* */ |
| /* FUNCTION: LVEQNB_Memory */ |
| /* */ |
| /* DESCRIPTION: */ |
| /* This function is used for memory allocation and free. It can be called in */ |
| /* two ways: */ |
| /* */ |
| /* hInstance = NULL Returns the memory requirements */ |
| /* hInstance = Instance handle Returns the memory requirements and */ |
| /* allocated base addresses for the instance */ |
| /* */ |
| /* When this function is called for memory allocation (hInstance=NULL) the memory */ |
| /* base address pointers are NULL on return. */ |
| /* */ |
| /* When the function is called for free (hInstance = Instance Handle) the memory */ |
| /* table returns the allocated memory and base addresses used during initialisation. */ |
| /* */ |
| /* PARAMETERS: */ |
| /* hInstance Instance Handle */ |
| /* pMemoryTable Pointer to an empty memory definition table */ |
| /* InitParams Pointer to the instance init parameters */ |
| /* */ |
| /* RETURNS: */ |
| /* LVPSA_OK Succeeds */ |
| /* otherwise Error due to bad parameters */ |
| /* */ |
| /****************************************************************************************/ |
| LVPSA_RETURN LVPSA_Memory ( pLVPSA_Handle_t hInstance, |
| LVPSA_MemTab_t *pMemoryTable, |
| LVPSA_InitParams_t *pInitParams ) |
| { |
| LVM_UINT32 ii; |
| LVM_UINT32 BufferLength; |
| INST_ALLOC Instance; |
| INST_ALLOC Scratch; |
| INST_ALLOC Data; |
| INST_ALLOC Coef; |
| LVPSA_InstancePr_t *pLVPSA_Inst = (LVPSA_InstancePr_t*)hInstance; |
| |
| |
| InstAlloc_Init( &Instance , LVM_NULL); |
| InstAlloc_Init( &Scratch , LVM_NULL); |
| InstAlloc_Init( &Data , LVM_NULL); |
| InstAlloc_Init( &Coef , LVM_NULL); |
| |
| |
| if((pMemoryTable == LVM_NULL) || (pInitParams == LVM_NULL)) |
| { |
| return(LVPSA_ERROR_NULLADDRESS); |
| } |
| |
| |
| /* |
| * Fill in the memory table |
| */ |
| if (hInstance == LVM_NULL) |
| { |
| |
| /* Check init parameter */ |
| if( (pInitParams->SpectralDataBufferDuration > LVPSA_MAXBUFFERDURATION) || |
| (pInitParams->SpectralDataBufferDuration == 0) || |
| (pInitParams->MaxInputBlockSize > LVPSA_MAXINPUTBLOCKSIZE) || |
| (pInitParams->MaxInputBlockSize == 0) || |
| (pInitParams->nBands < LVPSA_NBANDSMIN) || |
| (pInitParams->nBands > LVPSA_NBANDSMAX) || |
| (pInitParams->pFiltersParams == 0)) |
| { |
| return(LVPSA_ERROR_INVALIDPARAM); |
| } |
| for(ii = 0; ii < pInitParams->nBands; ii++) |
| { |
| if((pInitParams->pFiltersParams[ii].CenterFrequency > LVPSA_MAXCENTERFREQ) || |
| (pInitParams->pFiltersParams[ii].PostGain > LVPSA_MAXPOSTGAIN) || |
| (pInitParams->pFiltersParams[ii].PostGain < LVPSA_MINPOSTGAIN) || |
| (pInitParams->pFiltersParams[ii].QFactor < LVPSA_MINQFACTOR) || |
| (pInitParams->pFiltersParams[ii].QFactor > LVPSA_MAXQFACTOR)) |
| { |
| return(LVPSA_ERROR_INVALIDPARAM); |
| } |
| } |
| |
| /* |
| * Instance memory |
| */ |
| |
| InstAlloc_AddMember( &Instance, sizeof(LVPSA_InstancePr_t) ); |
| InstAlloc_AddMember( &Instance, pInitParams->nBands * sizeof(LVM_UINT16) ); |
| InstAlloc_AddMember( &Instance, pInitParams->nBands * sizeof(LVPSA_FilterParam_t) ); |
| |
| { |
| /* for avoiding QAC warnings as MUL32x32INTO32 works on LVM_INT32 only*/ |
| LVM_INT32 SDBD=(LVM_INT32)pInitParams->SpectralDataBufferDuration; |
| LVM_INT32 IRTI=(LVM_INT32)LVPSA_InternalRefreshTimeInv; |
| LVM_INT32 BL; |
| |
| MUL32x32INTO32(SDBD,IRTI,BL,LVPSA_InternalRefreshTimeShift) |
| BufferLength=(LVM_UINT32)BL; |
| } |
| |
| |
| if((BufferLength * LVPSA_InternalRefreshTime) != pInitParams->SpectralDataBufferDuration) |
| { |
| BufferLength++; |
| } |
| InstAlloc_AddMember( &Instance, pInitParams->nBands * BufferLength * sizeof(LVM_UINT8) ); |
| InstAlloc_AddMember( &Instance, pInitParams->nBands * sizeof(LVM_UINT8) ); |
| InstAlloc_AddMember( &Instance, pInitParams->nBands * sizeof(LVPSA_BPFilterPrecision_en) ); |
| pMemoryTable->Region[LVPSA_MEMREGION_INSTANCE].Size = InstAlloc_GetTotal(&Instance); |
| pMemoryTable->Region[LVPSA_MEMREGION_INSTANCE].Type = LVPSA_PERSISTENT; |
| pMemoryTable->Region[LVPSA_MEMREGION_INSTANCE].pBaseAddress = LVM_NULL; |
| |
| /* |
| * Scratch memory |
| */ |
| InstAlloc_AddMember( &Scratch, 2 * pInitParams->MaxInputBlockSize * sizeof(LVM_INT16) ); |
| pMemoryTable->Region[LVPSA_MEMREGION_SCRATCH].Size = InstAlloc_GetTotal(&Scratch); |
| pMemoryTable->Region[LVPSA_MEMREGION_SCRATCH].Type = LVPSA_SCRATCH; |
| pMemoryTable->Region[LVPSA_MEMREGION_SCRATCH].pBaseAddress = LVM_NULL; |
| |
| /* |
| * Persistent coefficients memory |
| */ |
| InstAlloc_AddMember( &Coef, pInitParams->nBands * sizeof(Biquad_Instance_t) ); |
| InstAlloc_AddMember( &Coef, pInitParams->nBands * sizeof(QPD_State_t) ); |
| pMemoryTable->Region[LVPSA_MEMREGION_PERSISTENT_COEF].Size = InstAlloc_GetTotal(&Coef); |
| pMemoryTable->Region[LVPSA_MEMREGION_PERSISTENT_COEF].Type = LVPSA_PERSISTENT_COEF; |
| pMemoryTable->Region[LVPSA_MEMREGION_PERSISTENT_COEF].pBaseAddress = LVM_NULL; |
| |
| /* |
| * Persistent data memory |
| */ |
| InstAlloc_AddMember( &Data, pInitParams->nBands * sizeof(Biquad_1I_Order2_Taps_t) ); |
| InstAlloc_AddMember( &Data, pInitParams->nBands * sizeof(QPD_Taps_t) ); |
| pMemoryTable->Region[LVPSA_MEMREGION_PERSISTENT_DATA].Size = InstAlloc_GetTotal(&Data); |
| pMemoryTable->Region[LVPSA_MEMREGION_PERSISTENT_DATA].Type = LVPSA_PERSISTENT_DATA; |
| pMemoryTable->Region[LVPSA_MEMREGION_PERSISTENT_DATA].pBaseAddress = LVM_NULL; |
| |
| } |
| else |
| { |
| /* Read back memory allocation table */ |
| *pMemoryTable = pLVPSA_Inst->MemoryTable; |
| } |
| |
| return(LVPSA_OK); |
| } |
| |