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#include "VectorArithmetic.h" 272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include "LVDBE_Coeffs.h" 282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include "LVDBE_Tables.h" 292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/ 312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION: LVDBE_GetParameters */ 332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION: */ 352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* Request the Dynamic Bass Enhancement parameters. The current parameter set is */ 362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* returned via the parameter pointer. */ 372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS: */ 392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* hInstance Instance handle */ 402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* pParams Pointer to an empty parameter structure */ 412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* RETURNS: */ 432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* LVDBE_SUCCESS Always succeeds */ 442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* NOTES: */ 462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* 1. This function may be interrupted by the LVDBE_Process function */ 472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/ 492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 502c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVDBE_ReturnStatus_en LVDBE_GetParameters(LVDBE_Handle_t hInstance, 512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVDBE_Params_t *pParams) 522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{ 532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVDBE_Instance_t *pInstance =(LVDBE_Instance_t *)hInstance; 552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *pParams = pInstance->Params; 572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent return(LVDBE_SUCCESS); 592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent} 602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/ 632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION: LVDBE_GetCapabilities */ 652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION: Dynamic Bass Enhnacement capabilities. The current capabilities are */ 672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* returned via the pointer. */ 682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS: */ 702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* hInstance Instance handle */ 712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* pCapabilities Pointer to an empty capability structure */ 722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* RETURNS: */ 742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* LVDBE_Success Always succeeds */ 752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* NOTES: */ 772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* 1. This function may be interrupted by the LVDBE_Process function */ 782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/ 802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 812c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVDBE_ReturnStatus_en LVDBE_GetCapabilities(LVDBE_Handle_t hInstance, 822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVDBE_Capabilities_t *pCapabilities) 832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{ 842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVDBE_Instance_t *pInstance =(LVDBE_Instance_t *)hInstance; 862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *pCapabilities = pInstance->Capabilities; 882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent return(LVDBE_SUCCESS); 902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent} 912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/ 942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION: LVDBE_SetFilters */ 962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION: */ 982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* Sets the filter coefficients and clears the data history */ 992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 1002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS: */ 1012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* pInstance Pointer to the instance */ 1022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* pParams Initialisation parameters */ 1032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 1042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/ 1052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid LVDBE_SetFilters(LVDBE_Instance_t *pInstance, 1072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVDBE_Params_t *pParams) 1082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{ 1092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 1112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Calculate the table offsets 1122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 1132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_UINT16 Offset = (LVM_UINT16)((LVM_UINT16)pParams->SampleRate + (LVM_UINT16)(pParams->CentreFrequency * (1+LVDBE_FS_48000))); 1142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 1172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Setup the high pass filter 1182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 11909d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent LoadConst_16(0, /* Clear the history, value 0 */ 12009d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent (void *)&pInstance->pData->HPFTaps, /* Destination Cast to void: \ 12109d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent no dereferencing in function*/ 12209d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent sizeof(pInstance->pData->HPFTaps)/sizeof(LVM_INT16)); /* Number of words */ 123c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent BQ_2I_D32F32Cll_TRC_WRA_01_Init(&pInstance->pCoef->HPFInstance, /* Initialise the filter */ 1242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent &pInstance->pData->HPFTaps, 1252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (BQ_C32_Coefs_t *)&LVDBE_HPF_Table[Offset]); 1262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 1292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Setup the band pass filter 1302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 13109d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent LoadConst_16(0, /* Clear the history, value 0 */ 13209d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent (void *)&pInstance->pData->BPFTaps, /* Destination Cast to void:\ 13309d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent no dereferencing in function*/ 13409d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent sizeof(pInstance->pData->BPFTaps)/sizeof(LVM_INT16)); /* Number of words */ 135c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent BP_1I_D32F32Cll_TRC_WRA_02_Init(&pInstance->pCoef->BPFInstance, /* Initialise the filter */ 1362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent &pInstance->pData->BPFTaps, 1372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (BP_C32_Coefs_t *)&LVDBE_BPF_Table[Offset]); 1382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent} 1402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/ 1442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 1452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION: LVDBE_SetAGC */ 1462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 1472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION: */ 1482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* Sets the AGC gain level and attack and decay times constants. */ 1492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 1502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS: */ 1512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* pInstance Pointer to the instance */ 1522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* pParams Initialisation parameters */ 1532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 1542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/ 1552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid LVDBE_SetAGC(LVDBE_Instance_t *pInstance, 1572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVDBE_Params_t *pParams) 1582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{ 1592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 1612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Get the attack and decay time constants 1622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 1632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->pData->AGCInstance.AGC_Attack = LVDBE_AGC_ATTACK_Table[(LVM_UINT16)pParams->SampleRate]; /* Attack multiplier */ 1642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->pData->AGCInstance.AGC_Decay = LVDBE_AGC_DECAY_Table[(LVM_UINT16)pParams->SampleRate]; /* Decay multipler */ 1652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 1682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Get the boost gain 1692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 1702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if (pParams->HPFSelect == LVDBE_HPF_ON) 1712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 1722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->pData->AGCInstance.AGC_MaxGain = LVDBE_AGC_HPFGAIN_Table[(LVM_UINT16)pParams->EffectLevel]; /* High pass filter on */ 1732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent else 1752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 1762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->pData->AGCInstance.AGC_MaxGain = LVDBE_AGC_GAIN_Table[(LVM_UINT16)pParams->EffectLevel]; /* High pass filter off */ 1772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->pData->AGCInstance.AGC_GainShift = AGC_GAIN_SHIFT; 1792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->pData->AGCInstance.AGC_Target = AGC_TARGETLEVEL; 1802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent} 1822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/ 1852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 1862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION: LVDBE_SetVolume */ 1872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 1882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION: */ 1892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* Converts the input volume demand from dBs to linear. */ 1902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 1912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS: */ 1922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* pInstance Pointer to the instance */ 1932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* pParams Initialisation parameters */ 1942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 1952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* NOTES: */ 1962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* 1. The volume should have the following settings: */ 1972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 1982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DBE Vol Control Volume setting */ 1992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* === =========== =================== */ 2002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* Off Off HeadroomdB */ 2012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* Off On VolumedB+HeadroomdB */ 2022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* On Off HeadroomdB */ 2032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* On On VolumedB+HeadroomdB */ 2042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 2052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/ 2062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid LVDBE_SetVolume(LVDBE_Instance_t *pInstance, 2082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVDBE_Params_t *pParams) 2092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{ 2102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_UINT16 dBShifts; /* 6dB shifts */ 2122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_UINT16 dBOffset; /* Table offset */ 2132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 Volume = 0; /* Required volume in dBs */ 2142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 2162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Apply the volume if enabled 2172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 2182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if (pParams->VolumeControl == LVDBE_VOLUME_ON) 2192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 2202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 2212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Limit the gain to the maximum allowed 2222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 2232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if (pParams->VolumedB > VOLUME_MAX) 2242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 2252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent Volume = VOLUME_MAX; 2262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 2272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent else 2282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 2292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent Volume = pParams->VolumedB; 2302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 2312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 2322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 2352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Calculate the required gain and shifts 2362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 2372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent dBOffset = (LVM_UINT16)(6 + Volume % 6); /* Get the dBs 0-5 */ 2382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent dBShifts = (LVM_UINT16)(Volume / -6); /* Get the 6dB shifts */ 2392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 2422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * When DBE is enabled use AGC volume 2432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 2442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->pData->AGCInstance.Target = ((LVM_INT32)LVDBE_VolumeTable[dBOffset] << 16); 2452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->pData->AGCInstance.Target = pInstance->pData->AGCInstance.Target >> dBShifts; 2462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->pData->AGCInstance.VolumeTC = LVDBE_VolumeTCTable[(LVM_UINT16)pParams->SampleRate]; /* Volume update time constant */ 2482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->pData->AGCInstance.VolumeShift = VOLUME_SHIFT+1; 2492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 2512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * When DBE is disabled use the bypass volume control 2522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 2532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if(dBShifts > 0) 2542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 2552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVC_Mixer_SetTarget(&pInstance->pData->BypassVolume.MixerStream[0],(((LVM_INT32)LVDBE_VolumeTable[dBOffset]) >> dBShifts)); 2562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 2572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent else 2582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 2592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVC_Mixer_SetTarget(&pInstance->pData->BypassVolume.MixerStream[0],(LVM_INT32)LVDBE_VolumeTable[dBOffset]); 2602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 2612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->pData->BypassVolume.MixerStream[0].CallbackSet = 1; 2632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVC_Mixer_VarSlope_SetTimeConstant(&pInstance->pData->BypassVolume.MixerStream[0], 2642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVDBE_MIXER_TC, 2652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (LVM_Fs_en)pInstance->Params.SampleRate, 2662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2); 2672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent} 2682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/ 2712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 2722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION: LVDBE_Control */ 2732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 2742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION: */ 2752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* Sets or changes the Bass Enhancement parameters. Changing the parameters while the */ 2762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* module is processing signals may have the following side effects: */ 2772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 2782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* General parameters: */ 2792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* =================== */ 2802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* OperatingMode: Changing the mode of operation may cause a change in volume */ 2812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* level or cause pops and clicks. */ 2822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 2832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* SampleRate: Changing the sample rate may cause pops and clicks. */ 2842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 2852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* EffectLevel: Changing the effect level may cause pops and clicks */ 2862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 2872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* CentreFrequency: Changing the centre frequency may cause pops and clicks */ 2882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 2892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* HPFSelect: Selecting/de-selecting the high pass filter may cause pops and */ 2902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* clicks */ 2912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 2922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* VolumedB Changing the volume setting will have no side effects */ 2932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 2942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 2952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS: */ 2962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* hInstance Instance handle */ 2972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* pParams Pointer to a parameter structure */ 2982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 2992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* RETURNS: */ 3002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* LVDBE_SUCCESS Always succeeds */ 3012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 3022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* NOTES: */ 3032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* 1. This function must not be interrupted by the LVDBE_Process function */ 3042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 3052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/ 3062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 3072c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVDBE_ReturnStatus_en LVDBE_Control(LVDBE_Handle_t hInstance, 3082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVDBE_Params_t *pParams) 3092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{ 3102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 3112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVDBE_Instance_t *pInstance =(LVDBE_Instance_t *)hInstance; 312c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVMixer3_2St_st *pBypassMixer_Instance = &pInstance->pData->BypassMixer; 3132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 3142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 3152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 3162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Update the filters 3172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 3182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if ((pInstance->Params.SampleRate != pParams->SampleRate) || 3192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (pInstance->Params.CentreFrequency != pParams->CentreFrequency)) 3202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 3212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVDBE_SetFilters(pInstance, /* Instance pointer */ 3222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pParams); /* New parameters */ 3232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 3242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 3252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 3262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 3272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Update the AGC is the effect level has changed 3282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 3292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if ((pInstance->Params.SampleRate != pParams->SampleRate) || 3302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (pInstance->Params.EffectLevel != pParams->EffectLevel) || 3312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (pInstance->Params.HPFSelect != pParams->HPFSelect)) 3322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 3332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVDBE_SetAGC(pInstance, /* Instance pointer */ 3342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pParams); /* New parameters */ 335c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 336c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVC_Mixer_SetTimeConstant(&pBypassMixer_Instance->MixerStream[0], 337c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVDBE_BYPASS_MIXER_TC,pParams->SampleRate,2); 338c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 339c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVC_Mixer_SetTimeConstant(&pBypassMixer_Instance->MixerStream[1], 340c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVDBE_BYPASS_MIXER_TC,pParams->SampleRate,2); 341c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 342c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 3432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 3442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 3452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 3462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 3472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Update the Volume if the volume demand has changed 3482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 3492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if ((pInstance->Params.VolumedB != pParams->VolumedB) || 3502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (pInstance->Params.SampleRate != pParams->SampleRate) || 3512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (pInstance->Params.HeadroomdB != pParams->HeadroomdB) || 3522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (pInstance->Params.VolumeControl != pParams->VolumeControl)) 3532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 3542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVDBE_SetVolume(pInstance, /* Instance pointer */ 3552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pParams); /* New parameters */ 3562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 3572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 3582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if (pInstance->Params.OperatingMode==LVDBE_ON && pParams->OperatingMode==LVDBE_OFF) 3592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 360c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVC_Mixer_SetTarget(&pInstance->pData->BypassMixer.MixerStream[0],0); 361c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVC_Mixer_SetTarget(&pInstance->pData->BypassMixer.MixerStream[1],0x00007FFF); 3622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 3632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if (pInstance->Params.OperatingMode==LVDBE_OFF && pParams->OperatingMode==LVDBE_ON) 3642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 365c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVC_Mixer_SetTarget(&pInstance->pData->BypassMixer.MixerStream[0],0x00007FFF); 366c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVC_Mixer_SetTarget(&pInstance->pData->BypassMixer.MixerStream[1],0); 3672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 3682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 3692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 3702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Update the instance parameters 3712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 3722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->Params = *pParams; 3732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 3742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 3752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent return(LVDBE_SUCCESS); 3762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent} 377