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/****************************************************************************************/ 192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* Includes */ 212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/ 232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include "LVDBE.h" 252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include "LVDBE_Private.h" 262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/ 282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION: LVDBE_Memory */ 302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION: */ 322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* This function is used for memory allocation and free. It can be called in */ 332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* two ways: */ 342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* hInstance = NULL Returns the memory requirements */ 362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* hInstance = Instance handle Returns the memory requirements and */ 372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* allocated base addresses for the instance */ 382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* When this function is called for memory allocation (hInstance=NULL) the memory */ 402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* base address pointers are NULL on return. */ 412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* When the function is called for free (hInstance = Instance Handle) the memory */ 432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* table returns the allocated memory and base addresses used during initialisation. */ 442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS: */ 462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* hInstance Instance Handle */ 472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* pMemoryTable Pointer to an empty memory definition table */ 482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* pCapabilities Pointer to the instance capabilities */ 492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* RETURNS: */ 512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* LVDBE_SUCCESS Succeeded */ 522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* NOTES: */ 542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* 1. This function may be interrupted by the LVDBE_Process function */ 552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/ 572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 582c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVDBE_ReturnStatus_en LVDBE_Memory(LVDBE_Handle_t hInstance, 592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVDBE_MemTab_t *pMemoryTable, 602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVDBE_Capabilities_t *pCapabilities) 612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{ 622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_UINT32 ScratchSize; 642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVDBE_Instance_t *pInstance = (LVDBE_Instance_t *)hInstance; 652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Fill in the memory table 692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if (hInstance == LVM_NULL) 712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Instance memory 742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pMemoryTable->Region[LVDBE_MEMREGION_INSTANCE].Size = sizeof(LVDBE_Instance_t); 762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pMemoryTable->Region[LVDBE_MEMREGION_INSTANCE].Alignment = LVDBE_INSTANCE_ALIGN; 772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pMemoryTable->Region[LVDBE_MEMREGION_INSTANCE].Type = LVDBE_PERSISTENT; 782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pMemoryTable->Region[LVDBE_MEMREGION_INSTANCE].pBaseAddress = LVM_NULL; 792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Data memory 822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 83d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri#ifdef BUILD_FLOAT 84d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pMemoryTable->Region[LVDBE_MEMREGION_PERSISTENT_DATA].Size = sizeof(LVDBE_Data_FLOAT_t); 85d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri#else 862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pMemoryTable->Region[LVDBE_MEMREGION_PERSISTENT_DATA].Size = sizeof(LVDBE_Data_t); 87d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri#endif 882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pMemoryTable->Region[LVDBE_MEMREGION_PERSISTENT_DATA].Alignment = LVDBE_PERSISTENT_DATA_ALIGN; 892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pMemoryTable->Region[LVDBE_MEMREGION_PERSISTENT_DATA].Type = LVDBE_PERSISTENT_DATA; 902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pMemoryTable->Region[LVDBE_MEMREGION_PERSISTENT_DATA].pBaseAddress = LVM_NULL; 912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Coef memory 942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 95d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri#ifdef BUILD_FLOAT 96d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pMemoryTable->Region[LVDBE_MEMREGION_PERSISTENT_COEF].Size = sizeof(LVDBE_Coef_FLOAT_t); 97d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri#else 98d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pMemoryTable->Region[LVDBE_MEMREGION_PERSISTENT_COEF].Size = sizeof(LVDBE_Coef_t); 99d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri#endif 1002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pMemoryTable->Region[LVDBE_MEMREGION_PERSISTENT_COEF].Alignment = LVDBE_PERSISTENT_COEF_ALIGN; 1012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pMemoryTable->Region[LVDBE_MEMREGION_PERSISTENT_COEF].Type = LVDBE_PERSISTENT_COEF; 1022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pMemoryTable->Region[LVDBE_MEMREGION_PERSISTENT_COEF].pBaseAddress = LVM_NULL; 1032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 1052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Scratch memory 1062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 107d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri#ifdef BUILD_FLOAT 108d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri ScratchSize = (LVM_UINT32)(LVDBE_SCRATCHBUFFERS_INPLACE*sizeof(LVM_FLOAT) * \ 109d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri pCapabilities->MaxBlockSize); 110d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri#else /*BUILD_FLOAT*/ 1112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent ScratchSize = (LVM_UINT32)(LVDBE_SCRATCHBUFFERS_INPLACE*sizeof(LVM_INT16)*pCapabilities->MaxBlockSize); 112d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri#endif 1132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pMemoryTable->Region[LVDBE_MEMREGION_SCRATCH].Size = ScratchSize; 1142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pMemoryTable->Region[LVDBE_MEMREGION_SCRATCH].Alignment = LVDBE_SCRATCH_ALIGN; 1152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pMemoryTable->Region[LVDBE_MEMREGION_SCRATCH].Type = LVDBE_SCRATCH; 1162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pMemoryTable->Region[LVDBE_MEMREGION_SCRATCH].pBaseAddress = LVM_NULL; 1172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent else 1192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 1202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* Read back memory allocation table */ 1212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *pMemoryTable = pInstance->MemoryTable; 1222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent return(LVDBE_SUCCESS); 1252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent} 1262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/ 1292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 1302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION: LVDBE_Init */ 1312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 1322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION: */ 1332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* Create and initialisation function for the Dynamic Bass Enhancement module */ 1342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 1352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* This function can be used to create an algorithm instance by calling with */ 1362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* hInstance set to NULL. In this case the algorithm returns the new instance */ 1372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* handle. */ 1382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 1392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* This function can be used to force a full re-initialisation of the algorithm */ 1402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* by calling with hInstance = Instance Handle. In this case the memory table */ 1412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* should be correct for the instance, this can be ensured by calling the function */ 1422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DBE_Memory before calling this function. */ 1432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 1442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS: */ 1452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* hInstance Instance handle */ 1462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* pMemoryTable Pointer to the memory definition table */ 1472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* pCapabilities Pointer to the instance capabilities */ 1482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 1492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* RETURNS: */ 1502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* LVDBE_SUCCESS Initialisation succeeded */ 1512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* LVDBE_ALIGNMENTERROR Instance or scratch memory on incorrect alignment */ 1522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* LVDBE_NULLADDRESS Instance or scratch memory has a NULL pointer */ 1532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 1542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* NOTES: */ 1552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* 1. The instance handle is the pointer to the base address of the first memory */ 1562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* region. */ 1572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* 2. This function must not be interrupted by the LVDBE_Process function */ 1582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 1592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/ 1602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1612c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVDBE_ReturnStatus_en LVDBE_Init(LVDBE_Handle_t *phInstance, 1622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVDBE_MemTab_t *pMemoryTable, 1632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVDBE_Capabilities_t *pCapabilities) 1642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{ 1652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVDBE_Instance_t *pInstance; 167d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri#ifdef BUILD_FLOAT 168d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVMixer3_1St_FLOAT_st *pMixer_Instance; 169d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVMixer3_2St_FLOAT_st *pBypassMixer_Instance; 170d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVM_FLOAT MixGain; 171d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri#else 1722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVMixer3_1St_st *pMixer_Instance; 173c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVMixer3_2St_st *pBypassMixer_Instance; 1742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT32 MixGain; 175d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri#endif 176d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVM_INT16 i; 1772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 1802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Set the instance handle if not already initialised 1812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 1822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if (*phInstance == LVM_NULL) 1832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 1842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *phInstance = (LVDBE_Handle_t)pMemoryTable->Region[LVDBE_MEMREGION_INSTANCE].pBaseAddress; 1852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance =(LVDBE_Instance_t *)*phInstance; 1872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 1902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Check the memory table for NULL pointers and incorrectly aligned data 1912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 1922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent for (i=0; i<LVDBE_NR_MEMORY_REGIONS; i++) 1932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 1942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if (pMemoryTable->Region[i].Size!=0) 1952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 1962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if (pMemoryTable->Region[i].pBaseAddress==LVM_NULL) 1972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 1982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent return(LVDBE_NULLADDRESS); 1992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 200b302bd5d288be2d3363b80053ca2392560b00b25Ashok Bhat if (((uintptr_t)pMemoryTable->Region[i].pBaseAddress % pMemoryTable->Region[i].Alignment)!=0){ 2012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent return(LVDBE_ALIGNMENTERROR); 2022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 2032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 2042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 2052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 2082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Save the memory table in the instance structure 2092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 2102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->Capabilities = *pCapabilities; 2112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 2142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Save the memory table in the instance structure 2152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 2162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->MemoryTable = *pMemoryTable; 2172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 2202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Set the default instance parameters 2212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 2222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->Params.CentreFrequency = LVDBE_CENTRE_55HZ; 2232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->Params.EffectLevel = 0; 2242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->Params.HeadroomdB = 0; 2252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->Params.HPFSelect = LVDBE_HPF_OFF; 2262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->Params.OperatingMode = LVDBE_OFF; 2272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->Params.SampleRate = LVDBE_FS_8000; 2282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->Params.VolumeControl = LVDBE_VOLUME_OFF; 2292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->Params.VolumedB = 0; 2302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 2332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Set pointer to data and coef memory 2342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 2352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->pData = pMemoryTable->Region[LVDBE_MEMREGION_PERSISTENT_DATA].pBaseAddress; 2362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->pCoef = pMemoryTable->Region[LVDBE_MEMREGION_PERSISTENT_COEF].pBaseAddress; 2372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 2402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Initialise the filters 2412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 242c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVDBE_SetFilters(pInstance, /* Set the filter taps and coefficients */ 2432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent &pInstance->Params); 2442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 2472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Initialise the AGC 2482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 2492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVDBE_SetAGC(pInstance, /* Set the AGC gain */ 2502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent &pInstance->Params); 251c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pInstance->pData->AGCInstance.AGC_Gain = pInstance->pData->AGCInstance.AGC_MaxGain; 252c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* Default to the bass boost setting */ 2532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 25497bb6e89845cb6d85f4d34a4efcc1de2ce585336Marco Nelissen // initialize the mixer with some fixes values since otherwise LVDBE_SetVolume ends up 25597bb6e89845cb6d85f4d34a4efcc1de2ce585336Marco Nelissen // reading uninitialized data 25697bb6e89845cb6d85f4d34a4efcc1de2ce585336Marco Nelissen pMixer_Instance = &pInstance->pData->BypassVolume; 257d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri#ifndef BUILD_FLOAT 25897bb6e89845cb6d85f4d34a4efcc1de2ce585336Marco Nelissen LVC_Mixer_Init(&pMixer_Instance->MixerStream[0],0x00007FFF,0x00007FFF); 259d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri#else 260d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVC_Mixer_Init(&pMixer_Instance->MixerStream[0], 1.0, 1.0); 261d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri#endif 2622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 2642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Initialise the volume 2652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 2662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVDBE_SetVolume(pInstance, /* Set the Volume */ 2672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent &pInstance->Params); 2682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 269c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pInstance->pData->AGCInstance.Volume = pInstance->pData->AGCInstance.Target; 270c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* Initialise as the target */ 271d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri#ifndef BUILD_FLOAT 2722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent MixGain = LVC_Mixer_GetTarget(&pMixer_Instance->MixerStream[0]); 2732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVC_Mixer_Init(&pMixer_Instance->MixerStream[0],MixGain,MixGain); 274d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri#else 275d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri MixGain = LVC_Mixer_GetTarget(&pMixer_Instance->MixerStream[0]); 276d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVC_Mixer_Init(&pMixer_Instance->MixerStream[0], MixGain, MixGain); 277d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri#endif 2782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* Configure the mixer process path */ 2802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pMixer_Instance->MixerStream[0].CallbackParam = 0; 2812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pMixer_Instance->MixerStream[0].pCallbackHandle = LVM_NULL; 2822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pMixer_Instance->MixerStream[0].pCallBack = LVM_NULL; 2832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pMixer_Instance->MixerStream[0].CallbackSet = 0; 2842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 286c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * Initialise the clicks minimisation BypassMixer 2872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 288c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 289c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pBypassMixer_Instance = &pInstance->pData->BypassMixer; 290c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 291c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* 292c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * Setup the mixer gain for the processed path 293c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent */ 294c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pBypassMixer_Instance->MixerStream[0].CallbackParam = 0; 295c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pBypassMixer_Instance->MixerStream[0].pCallbackHandle = LVM_NULL; 296c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pBypassMixer_Instance->MixerStream[0].pCallBack = LVM_NULL; 297c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pBypassMixer_Instance->MixerStream[0].CallbackSet=0; 298d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 299c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVC_Mixer_Init(&pBypassMixer_Instance->MixerStream[0],0,0); 300c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVC_Mixer_SetTimeConstant(&pBypassMixer_Instance->MixerStream[0], 301cf06be50b28837b2fc39233871ce069e0a74ad01George Burgess IV LVDBE_BYPASS_MIXER_TC,(LVM_Fs_en)pInstance->Params.SampleRate,2); 302d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri 303c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* 304c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * Setup the mixer gain for the unprocessed path 305c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent */ 306c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pBypassMixer_Instance->MixerStream[1].CallbackParam = 0; 307c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pBypassMixer_Instance->MixerStream[1].pCallbackHandle = LVM_NULL; 308c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pBypassMixer_Instance->MixerStream[1].pCallBack = LVM_NULL; 309c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pBypassMixer_Instance->MixerStream[1].CallbackSet=0; 310d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri#ifndef BUILD_FLOAT 311c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVC_Mixer_Init(&pBypassMixer_Instance->MixerStream[1],0x00007FFF,0x00007FFF); 312c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVC_Mixer_SetTimeConstant(&pBypassMixer_Instance->MixerStream[1], 313cf06be50b28837b2fc39233871ce069e0a74ad01George Burgess IV LVDBE_BYPASS_MIXER_TC,(LVM_Fs_en)pInstance->Params.SampleRate,2); 314d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri#else 315d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVC_Mixer_Init(&pBypassMixer_Instance->MixerStream[1], 1.0, 1.0); 316d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVC_Mixer_SetTimeConstant(&pBypassMixer_Instance->MixerStream[1], 317d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri LVDBE_BYPASS_MIXER_TC,(LVM_Fs_en)pInstance->Params.SampleRate, 2); 318d7d013446a64c6de9f0f2dfe098a721b140e0b48Ramesh Katuri#endif 3192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 3202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent return(LVDBE_SUCCESS); 3212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent} 322