12c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* 22c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Copyright (C) 2004-2010 NXP Software 32c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Copyright (C) 2010 The Android Open Source Project 42c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * 52c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Licensed under the Apache License, Version 2.0 (the "License"); 62c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * you may not use this file except in compliance with the License. 72c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * You may obtain a copy of the License at 82c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * 92c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * http://www.apache.org/licenses/LICENSE-2.0 102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * 112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Unless required by applicable law or agreed to in writing, software 122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * distributed under the License is distributed on an "AS IS" BASIS, 132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * See the License for the specific language governing permissions and 152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * limitations under the License. 162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include "LVPSA.h" 192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include "LVPSA_Private.h" 202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include "InstAlloc.h" 212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/ 232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION: LVPSA_Init */ 252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION: */ 272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* Initialize the LVPSA module */ 282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS: */ 312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* phInstance Pointer to pointer to the instance */ 322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* InitParams Init parameters structure */ 332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* ControlParams Control parameters structure */ 342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* pMemoryTable Memory table that contains memory areas definition */ 352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* RETURNS: */ 382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* LVPSA_OK Succeeds */ 392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* otherwise Error due to bad parameters */ 402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/ 422c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVPSA_RETURN LVPSA_Init ( pLVPSA_Handle_t *phInstance, 432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVPSA_InitParams_t *pInitParams, 442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVPSA_ControlParams_t *pControlParams, 452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVPSA_MemTab_t *pMemoryTable ) 462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{ 472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVPSA_InstancePr_t *pLVPSA_Inst; 482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVPSA_RETURN errorCode = LVPSA_OK; 492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_UINT32 ii; 502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent extern LVM_INT16 LVPSA_GainTable[]; 512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_UINT32 BufferLength = 0; 522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* Ints_Alloc instances, needed for memory alignment management */ 542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent INST_ALLOC Instance; 552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent INST_ALLOC Scratch; 562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent INST_ALLOC Data; 572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent INST_ALLOC Coef; 582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* Check parameters */ 602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if((phInstance == LVM_NULL) || (pInitParams == LVM_NULL) || (pControlParams == LVM_NULL) || (pMemoryTable == LVM_NULL)) 612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent return(LVPSA_ERROR_NULLADDRESS); 632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if( (pInitParams->SpectralDataBufferDuration > LVPSA_MAXBUFFERDURATION) || 652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (pInitParams->SpectralDataBufferDuration == 0) || 662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (pInitParams->MaxInputBlockSize > LVPSA_MAXINPUTBLOCKSIZE) || 672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (pInitParams->MaxInputBlockSize == 0) || 682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (pInitParams->nBands < LVPSA_NBANDSMIN) || 692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (pInitParams->nBands > LVPSA_NBANDSMAX) || 702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (pInitParams->pFiltersParams == 0)) 712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent return(LVPSA_ERROR_INVALIDPARAM); 732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent for(ii = 0; ii < pInitParams->nBands; ii++) 752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if((pInitParams->pFiltersParams[ii].CenterFrequency > LVPSA_MAXCENTERFREQ) || 772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (pInitParams->pFiltersParams[ii].PostGain > LVPSA_MAXPOSTGAIN) || 782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (pInitParams->pFiltersParams[ii].PostGain < LVPSA_MINPOSTGAIN) || 792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (pInitParams->pFiltersParams[ii].QFactor < LVPSA_MINQFACTOR) || 802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (pInitParams->pFiltersParams[ii].QFactor > LVPSA_MAXQFACTOR)) 812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent return(LVPSA_ERROR_INVALIDPARAM); 832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /*Inst_Alloc instances initialization */ 882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent InstAlloc_Init( &Instance , pMemoryTable->Region[LVPSA_MEMREGION_INSTANCE].pBaseAddress); 892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent InstAlloc_Init( &Scratch , pMemoryTable->Region[LVPSA_MEMREGION_SCRATCH].pBaseAddress); 902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent InstAlloc_Init( &Data , pMemoryTable->Region[LVPSA_MEMREGION_PERSISTENT_DATA].pBaseAddress); 912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent InstAlloc_Init( &Coef , pMemoryTable->Region[LVPSA_MEMREGION_PERSISTENT_COEF].pBaseAddress); 922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* Set the instance handle if not already initialised */ 952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if (*phInstance == LVM_NULL) 962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *phInstance = InstAlloc_AddMember( &Instance, sizeof(LVPSA_InstancePr_t) ); 982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pLVPSA_Inst =(LVPSA_InstancePr_t*)*phInstance; 1002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* Check the memory table for NULL pointers */ 1032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent for (ii = 0; ii < LVPSA_NR_MEMORY_REGIONS; ii++) 1042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 1052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if (pMemoryTable->Region[ii].Size!=0) 1062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 1072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if (pMemoryTable->Region[ii].pBaseAddress==LVM_NULL) 1082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 1092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent return(LVPSA_ERROR_NULLADDRESS); 1102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pLVPSA_Inst->MemoryTable.Region[ii] = pMemoryTable->Region[ii]; 1122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* Initialize module's internal parameters */ 1162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pLVPSA_Inst->bControlPending = LVM_FALSE; 1172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pLVPSA_Inst->nBands = pInitParams->nBands; 1182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pLVPSA_Inst->MaxInputBlockSize = pInitParams->MaxInputBlockSize; 1192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pLVPSA_Inst->SpectralDataBufferDuration = pInitParams->SpectralDataBufferDuration; 1202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pLVPSA_Inst->CurrentParams.Fs = LVM_FS_DUMMY; 1212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pLVPSA_Inst->CurrentParams.LevelDetectionSpeed = LVPSA_SPEED_DUMMY; 1222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { /* for avoiding QAC warnings */ 1242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT32 SDBD=(LVM_INT32)pLVPSA_Inst->SpectralDataBufferDuration; 1252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT32 IRTI=(LVM_INT32)LVPSA_InternalRefreshTimeInv; 1262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT32 BL; 1272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent MUL32x32INTO32(SDBD,IRTI,BL,LVPSA_InternalRefreshTimeShift) 1292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent BufferLength=(LVM_UINT32)BL; 1312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if((BufferLength * LVPSA_InternalRefreshTime) != pLVPSA_Inst->SpectralDataBufferDuration) 1342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 1352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pLVPSA_Inst->SpectralDataBufferLength = BufferLength + 1; 1362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent else 1382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 1392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pLVPSA_Inst->SpectralDataBufferLength = BufferLength; 1402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* Assign the pointers */ 1442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pLVPSA_Inst->pPostGains = InstAlloc_AddMember( &Instance, pInitParams->nBands * sizeof(LVM_UINT16) ); 1462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pLVPSA_Inst->pFiltersParams = InstAlloc_AddMember( &Instance, pInitParams->nBands * sizeof(LVPSA_FilterParam_t) ); 1472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pLVPSA_Inst->pSpectralDataBufferStart = InstAlloc_AddMember( &Instance, pInitParams->nBands * pLVPSA_Inst->SpectralDataBufferLength * sizeof(LVM_UINT8) ); 1482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pLVPSA_Inst->pPreviousPeaks = InstAlloc_AddMember( &Instance, pInitParams->nBands * sizeof(LVM_UINT8) ); 1492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pLVPSA_Inst->pBPFiltersPrecision = InstAlloc_AddMember( &Instance, pInitParams->nBands * sizeof(LVPSA_BPFilterPrecision_en) ); 1502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pLVPSA_Inst->pBP_Instances = InstAlloc_AddMember( &Coef, pInitParams->nBands * sizeof(Biquad_Instance_t) ); 1522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pLVPSA_Inst->pQPD_States = InstAlloc_AddMember( &Coef, pInitParams->nBands * sizeof(QPD_State_t) ); 1532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pLVPSA_Inst->pBP_Taps = InstAlloc_AddMember( &Data, pInitParams->nBands * sizeof(Biquad_1I_Order2_Taps_t) ); 1552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pLVPSA_Inst->pQPD_Taps = InstAlloc_AddMember( &Data, pInitParams->nBands * sizeof(QPD_Taps_t) ); 1562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* Copy filters parameters in the private instance */ 1592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent for(ii = 0; ii < pLVPSA_Inst->nBands; ii++) 1602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 1612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pLVPSA_Inst->pFiltersParams[ii] = pInitParams->pFiltersParams[ii]; 1622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* Set Post filters gains*/ 1652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent for(ii = 0; ii < pLVPSA_Inst->nBands; ii++) 1662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 1672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pLVPSA_Inst->pPostGains[ii] =(LVM_UINT16) LVPSA_GainTable[pInitParams->pFiltersParams[ii].PostGain + 15]; 1682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pLVPSA_Inst->pSpectralDataBufferWritePointer = pLVPSA_Inst->pSpectralDataBufferStart; 1702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* Initialize control dependant internal parameters */ 1732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent errorCode = LVPSA_Control (*phInstance, pControlParams); 1742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if(errorCode!=0) 1762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 1772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent return errorCode; 1782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent errorCode = LVPSA_ApplyNewSettings (pLVPSA_Inst); 1812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if(errorCode!=0) 1832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 1842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent return errorCode; 1852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent return(errorCode); 1882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent} 1892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 190