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/* */ 212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* Includes */ 222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/ 242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include "VectorArithmetic.h" 262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include "ScalarArithmetic.h" 272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include "LVM_Coeffs.h" 282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include "LVM_Tables.h" 292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include "LVM_Private.h" 302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/ 322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION: LVM_SetControlParameters */ 342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION: */ 362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* Sets or changes the LifeVibes module parameters. */ 372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS: */ 392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* hInstance Instance handle */ 402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* pParams Pointer to a parameter structure */ 412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* RETURNS: */ 432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* LVM_SUCCESS Succeeded */ 442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* LVM_NULLADDRESS When hInstance, pParams or any control pointers are NULL */ 452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* LVM_OUTOFRANGE When any of the control parameters are out of range */ 462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* NOTES: */ 482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* 1. This function may be interrupted by the LVM_Process function */ 492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/ 512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 522c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVM_ReturnStatus_en LVM_SetControlParameters(LVM_Handle_t hInstance, 532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_ControlParams_t *pParams) 542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{ 552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_Instance_t *pInstance =(LVM_Instance_t *)hInstance; 562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if ((pParams == LVM_NULL) || (hInstance == LVM_NULL)) 592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent return (LVM_NULLADDRESS); 612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->NewParams = *pParams; 642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if( 662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* General parameters */ 672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent ((pParams->OperatingMode != LVM_MODE_OFF) && (pParams->OperatingMode != LVM_MODE_ON)) || 682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent ((pParams->SampleRate != LVM_FS_8000) && (pParams->SampleRate != LVM_FS_11025) && (pParams->SampleRate != LVM_FS_12000) && 692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (pParams->SampleRate != LVM_FS_16000) && (pParams->SampleRate != LVM_FS_22050) && (pParams->SampleRate != LVM_FS_24000) && 702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (pParams->SampleRate != LVM_FS_32000) && (pParams->SampleRate != LVM_FS_44100) && (pParams->SampleRate != LVM_FS_48000)) || 712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent ((pParams->SourceFormat != LVM_STEREO) && (pParams->SourceFormat != LVM_MONOINSTEREO) && (pParams->SourceFormat != LVM_MONO)) || 722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (pParams->SpeakerType > LVM_EX_HEADPHONES)) 732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent return (LVM_OUTOFRANGE); 752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Cinema Sound parameters 792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if((pParams->VirtualizerOperatingMode != LVM_MODE_OFF) && (pParams->VirtualizerOperatingMode != LVM_MODE_ON)) 812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent return (LVM_OUTOFRANGE); 832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if(pParams->VirtualizerType != LVM_CONCERTSOUND) 862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent return (LVM_OUTOFRANGE); 882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if(pParams->VirtualizerReverbLevel > LVM_VIRTUALIZER_MAX_REVERB_LEVEL) 912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent return (LVM_OUTOFRANGE); 932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if(pParams->CS_EffectLevel < LVM_CS_MIN_EFFECT_LEVEL) 962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent return (LVM_OUTOFRANGE); 982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 1012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * N-Band Equalizer 1022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 1032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if(pParams->EQNB_NBands > pInstance->InstParams.EQNB_NumBands) 1042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 1052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent return (LVM_OUTOFRANGE); 1062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* Definition pointer */ 1092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if ((pParams->pEQNB_BandDefinition == LVM_NULL) && 1102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (pParams->EQNB_NBands != 0)) 1112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 1122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent return (LVM_NULLADDRESS); 1132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 1162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Copy the filter definitions for the Equaliser 1172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 1182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 1192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 i; 1202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if (pParams->EQNB_NBands != 0) 1222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 1232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent for (i=0; i<pParams->EQNB_NBands; i++) 1242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 1252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->pEQNB_BandDefs[i] = pParams->pEQNB_BandDefinition[i]; 1262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->NewParams.pEQNB_BandDefinition = pInstance->pEQNB_BandDefs; 1282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if( /* N-Band Equaliser parameters */ 1312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent ((pParams->EQNB_OperatingMode != LVM_EQNB_OFF) && (pParams->EQNB_OperatingMode != LVM_EQNB_ON)) || 1322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (pParams->EQNB_NBands > pInstance->InstParams.EQNB_NumBands)) 1332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 1342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent return (LVM_OUTOFRANGE); 1352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* Band parameters*/ 1372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 1382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 i; 1392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent for(i = 0; i < pParams->EQNB_NBands; i++) 1402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 1412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if(((pParams->pEQNB_BandDefinition[i].Frequency < LVM_EQNB_MIN_BAND_FREQ) || 1422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (pParams->pEQNB_BandDefinition[i].Frequency > LVM_EQNB_MAX_BAND_FREQ)) || 1432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent ((pParams->pEQNB_BandDefinition[i].Gain < LVM_EQNB_MIN_BAND_GAIN) || 1442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (pParams->pEQNB_BandDefinition[i].Gain > LVM_EQNB_MAX_BAND_GAIN)) || 1452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent ((pParams->pEQNB_BandDefinition[i].QFactor < LVM_EQNB_MIN_QFACTOR) || 1462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (pParams->pEQNB_BandDefinition[i].QFactor > LVM_EQNB_MAX_QFACTOR))) 1472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 1482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent return (LVM_OUTOFRANGE); 1492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 1542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Bass Enhancement parameters 1552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 1562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if(((pParams->BE_OperatingMode != LVM_BE_OFF) && (pParams->BE_OperatingMode != LVM_BE_ON)) || 1572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent ((pParams->BE_EffectLevel < LVM_BE_MIN_EFFECTLEVEL ) || (pParams->BE_EffectLevel > LVM_BE_MAX_EFFECTLEVEL ))|| 1582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent ((pParams->BE_CentreFreq != LVM_BE_CENTRE_55Hz) && (pParams->BE_CentreFreq != LVM_BE_CENTRE_66Hz) && 1592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (pParams->BE_CentreFreq != LVM_BE_CENTRE_78Hz) && (pParams->BE_CentreFreq != LVM_BE_CENTRE_90Hz)) || 1602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent ((pParams->BE_HPF != LVM_BE_HPF_OFF) && (pParams->BE_HPF != LVM_BE_HPF_ON))) 1612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 1622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent return (LVM_OUTOFRANGE); 1632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 1662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Volume Control parameters 1672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 1682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if((pParams->VC_EffectLevel < LVM_VC_MIN_EFFECTLEVEL ) || (pParams->VC_EffectLevel > LVM_VC_MAX_EFFECTLEVEL )) 1692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 1702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent return (LVM_OUTOFRANGE); 1712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if((pParams->VC_Balance < LVM_VC_BALANCE_MIN ) || (pParams->VC_Balance > LVM_VC_BALANCE_MAX )) 1732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 1742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent return (LVM_OUTOFRANGE); 1752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 1782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * PSA parameters 1792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 1802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if( (pParams->PSA_PeakDecayRate > LVPSA_SPEED_HIGH) || 1812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (pParams->PSA_Enable > LVM_PSA_ON)) 1822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 1832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent return (LVM_OUTOFRANGE); 1842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 1882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Set the flag to indicate there are new parameters to use 1892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * 1902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Protect the copy of the new parameters from interrupts to avoid possible problems 1912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * with loss control parameters. This problem can occur if this control function is called more 1922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * than once before a call to the process function. If the process function interrupts 1932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * the copy to NewParams then one frame may have mixed parameters, some old and some new. 1942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 1952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->ControlPending = LVM_TRUE; 1962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent return(LVM_SUCCESS); 1982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent} 1992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/ 2022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 2032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION: LVM_GetControlParameters */ 2042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 2052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION: */ 2062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* Request the LifeVibes module parameters. The current parameter set is returned */ 2072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* via the parameter pointer. */ 2082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 2092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS: */ 2102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* hInstance Instance handle */ 2112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* pParams Pointer to an empty parameter structure */ 2122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 2132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* RETURNS: */ 2142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* LVM_SUCCESS Succeeded */ 2152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* LVM_NULLADDRESS when any of hInstance or pParams is NULL */ 2162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 2172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* NOTES: */ 2182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* 1. This function may be interrupted by the LVM_Process function */ 2192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 2202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/ 2212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2222c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVM_ReturnStatus_en LVM_GetControlParameters(LVM_Handle_t hInstance, 2232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_ControlParams_t *pParams) 2242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{ 2252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_Instance_t *pInstance =(LVM_Instance_t *)hInstance; 2262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 2292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Check pointer 2302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 2312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if ((pParams == LVM_NULL) || (hInstance == LVM_NULL)) 2322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 2332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent return (LVM_NULLADDRESS); 2342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 2352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *pParams = pInstance->NewParams; 2362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 2382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Copy the filter definitions for the Equaliser 2392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 2402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 2412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 i; 2422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if (pInstance->NewParams.EQNB_NBands != 0) 2442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent for (i=0; i<pInstance->NewParams.EQNB_NBands; i++) 2452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 2462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->pEQNB_UserDefs[i] = pInstance->pEQNB_BandDefs[i]; 2472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 2482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pParams->pEQNB_BandDefinition = pInstance->pEQNB_UserDefs; 2492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 2502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent return(LVM_SUCCESS); 2522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent} 2532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/ 2562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 2572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION: LVM_SetTrebleBoost */ 2582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 2592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION: */ 2602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* Enable the treble boost when the settings are appropriate, i.e. non-zero gain */ 2612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* and the sample rate is high enough for the effect to be heard. */ 2622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 2632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS: */ 2642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* pInstance Pointer to the instance structure */ 2652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* pParams Pointer to the parameters to use */ 2662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 2672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/ 2682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid LVM_SetTrebleBoost(LVM_Instance_t *pInstance, 2692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_ControlParams_t *pParams) 2702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{ 2712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent extern FO_C16_LShx_Coefs_t LVM_TrebleBoostCoefs[]; 2722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 Offset; 2732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 EffectLevel = 0; 2742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 2762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Load the coefficients 2772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 2782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if ((pParams->TE_OperatingMode == LVM_TE_ON) && 2792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (pParams->SampleRate >= TrebleBoostMinRate) && 2802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (pParams->OperatingMode == LVM_MODE_ON) && 2812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (pParams->TE_EffectLevel > 0)) 2822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 2832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if((pParams->TE_EffectLevel == LVM_TE_LOW_MIPS) && 2842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent ((pParams->SpeakerType == LVM_HEADPHONES)|| 2852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (pParams->SpeakerType == LVM_EX_HEADPHONES))) 2862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 2872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->TE_Active = LVM_FALSE; 2882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 2892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent else 2902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 2912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent EffectLevel = pParams->TE_EffectLevel; 2922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->TE_Active = LVM_TRUE; 2932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 2942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if(pInstance->TE_Active == LVM_TRUE) 2962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 2972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 2982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Load the coefficients and enabled the treble boost 2992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 3002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent Offset = (LVM_INT16)(EffectLevel - 1 + TrebleBoostSteps * (pParams->SampleRate - TrebleBoostMinRate)); 3012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent FO_2I_D16F32Css_LShx_TRC_WRA_01_Init(&pInstance->pTE_State->TrebleBoost_State, 3022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent &pInstance->pTE_Taps->TrebleBoost_Taps, 3032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent &LVM_TrebleBoostCoefs[Offset]); 3042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 3052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 3062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Clear the taps 3072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 30809d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent LoadConst_16((LVM_INT16)0, /* Value */ 30909d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent (void *)&pInstance->pTE_Taps->TrebleBoost_Taps, /* Destination.\ 31009d5ca3766d4bab91cdaad7206716a5747ebad77Eric Laurent Cast to void: no dereferencing in function */ 3112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (LVM_UINT16)(sizeof(pInstance->pTE_Taps->TrebleBoost_Taps)/sizeof(LVM_INT16))); /* Number of words */ 3122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 3132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 3142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent else 3152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 3162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 3172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Disable the treble boost 3182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 3192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->TE_Active = LVM_FALSE; 3202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 3212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 3222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent return; 3232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent} 3242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 3252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 3262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/ 3272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 3282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION: LVM_SetVolume */ 3292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 3302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION: */ 3312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* Converts the input volume demand from dBs to linear. */ 3322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 3332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS: */ 3342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* pInstance Pointer to the instance */ 3352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* pParams Initialisation parameters */ 3362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 3372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/ 3382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid LVM_SetVolume(LVM_Instance_t *pInstance, 3392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_ControlParams_t *pParams) 3402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{ 3412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 3422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_UINT16 dBShifts; /* 6dB shifts */ 3432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_UINT16 dBOffset; /* Table offset */ 3442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 Volume = 0; /* Required volume in dBs */ 3452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 3462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 3472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Limit the gain to the maximum allowed 3482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 3492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if (pParams->VC_EffectLevel > 0) 3502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 3512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent Volume = 0; 3522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 3532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent else 3542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 3552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent Volume = pParams->VC_EffectLevel; 3562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 3572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 3582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* Compensate this volume in PSA plot */ 3592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if(Volume > -60) /* Limit volume loss to PSA Limits*/ 3602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->PSA_GainOffset=(LVM_INT16)(-Volume);/* Loss is compensated by Gain*/ 3612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent else 3622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->PSA_GainOffset=(LVM_INT16)60;/* Loss is compensated by Gain*/ 3632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 3642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->VC_AVLFixedVolume = 0; 3652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 3662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 3672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Set volume control and AVL volumes according to headroom and volume user setting 3682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 3692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if(pParams->OperatingMode == LVM_MODE_ON) 3702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 3712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* Default Situation with no AVL and no RS */ 3722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if(pParams->EQNB_OperatingMode == LVM_EQNB_ON) 3732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 3742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if(Volume > -pInstance->Headroom) 3752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent Volume = (LVM_INT16)-pInstance->Headroom; 3762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 3772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 3782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 3792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 3802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Activate volume control if necessary 3812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 3822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->VC_Active = LVM_TRUE; 3832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if (Volume != 0) 3842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 3852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->VC_VolumedB = Volume; 3862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 3872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent else 3882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 3892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->VC_VolumedB = 0; 3902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 3912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 3922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 3932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Calculate the required gain and shifts 3942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 3952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent dBOffset = (LVM_UINT16)((-Volume) % 6); /* Get the dBs 0-5 */ 3962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent dBShifts = (LVM_UINT16)(Volume / -6); /* Get the 6dB shifts */ 3972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 3982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 3992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 4002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Set the parameters 4012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 4022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if(dBShifts == 0) 4032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 4042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVC_Mixer_SetTarget(&pInstance->VC_Volume.MixerStream[0], 4052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (LVM_INT32)LVM_VolumeTable[dBOffset]); 4062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 4072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent else 4082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 4092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVC_Mixer_SetTarget(&pInstance->VC_Volume.MixerStream[0], 4102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (((LVM_INT32)LVM_VolumeTable[dBOffset])>>dBShifts)); 4112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 4122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->VC_Volume.MixerStream[0].CallbackSet = 1; 4132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if(pInstance->NoSmoothVolume == LVM_TRUE) 4142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 4152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVC_Mixer_SetTimeConstant(&pInstance->VC_Volume.MixerStream[0],0,pInstance->Params.SampleRate,2); 4162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 4172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent else 4182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 4192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVC_Mixer_VarSlope_SetTimeConstant(&pInstance->VC_Volume.MixerStream[0],LVM_VC_MIXER_TIME,pInstance->Params.SampleRate,2); 4202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 4212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent} 4222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 4232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 4242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/ 4252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 4262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION: LVM_SetHeadroom */ 4272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 4282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION: */ 4292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* Find suitable headroom based on EQ settings. */ 4302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 4312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS: */ 4322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* pInstance Pointer to the instance */ 4332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* pParams Initialisation parameters */ 4342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 4352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* RETURNS: */ 4362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* void Nothing */ 4372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 4382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* NOTES: */ 4392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 4402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/ 4412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid LVM_SetHeadroom(LVM_Instance_t *pInstance, 4422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_ControlParams_t *pParams) 4432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{ 4442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 ii, jj; 4452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 Headroom = 0; 4462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 MaxGain = 0; 4472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 4482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 4492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if ((pParams->EQNB_OperatingMode == LVEQNB_ON) && (pInstance->HeadroomParams.Headroom_OperatingMode == LVM_HEADROOM_ON)) 4502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 4512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* Find typical headroom value */ 4522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent for(jj = 0; jj < pInstance->HeadroomParams.NHeadroomBands; jj++) 4532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 4542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent MaxGain = 0; 4552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent for( ii = 0; ii < pParams->EQNB_NBands; ii++) 4562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 4572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if((pParams->pEQNB_BandDefinition[ii].Frequency >= pInstance->HeadroomParams.pHeadroomDefinition[jj].Limit_Low) && 4582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (pParams->pEQNB_BandDefinition[ii].Frequency <= pInstance->HeadroomParams.pHeadroomDefinition[jj].Limit_High)) 4592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 4602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if(pParams->pEQNB_BandDefinition[ii].Gain > MaxGain) 4612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 4622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent MaxGain = pParams->pEQNB_BandDefinition[ii].Gain; 4632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 4642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 4652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 4662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 4672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if((MaxGain - pInstance->HeadroomParams.pHeadroomDefinition[jj].Headroom_Offset) > Headroom){ 4682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent Headroom = (LVM_INT16)(MaxGain - pInstance->HeadroomParams.pHeadroomDefinition[jj].Headroom_Offset); 4692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 4702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 4712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 4722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* Saturate */ 4732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if(Headroom < 0) 4742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent Headroom = 0; 4752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 4762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->Headroom = (LVM_UINT16)Headroom ; 4772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 4782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent} 4792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 4802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 4812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/ 4822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 4832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION: LVM_ApplyNewSettings */ 4842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 4852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION: */ 4862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* Applies changes to parametres. This function makes no assumptions about what */ 4872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* each module needs for initialisation and hence passes all parameters to all the */ 4882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* the modules in turn. */ 4892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 4902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 4912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS: */ 4922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* hInstance Instance handle */ 4932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 4942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* RETURNS: */ 4952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* LVM_Success Succeeded */ 4962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 4972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/ 4982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 4992c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVM_ReturnStatus_en LVM_ApplyNewSettings(LVM_Handle_t hInstance) 5002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{ 5012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_Instance_t *pInstance =(LVM_Instance_t *)hInstance; 5022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_ControlParams_t LocalParams; 5032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 Count = 5; 5042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 5052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 5062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 5072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Copy the new parameters but make sure they didn't change while copying 5082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 5092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent do 5102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 5112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->ControlPending = LVM_FALSE; 5122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LocalParams = pInstance->NewParams; 5132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->HeadroomParams = pInstance->NewHeadroomParams; 5142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent Count--; 5152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } while ((pInstance->ControlPending != LVM_FALSE) && 5162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (Count > 0)); 5172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 5182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* Clear all internal data if format change*/ 5192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if(LocalParams.SourceFormat != pInstance->Params.SourceFormat) 5202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 5212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_ClearAudioBuffers(pInstance); 5222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->ControlPending = LVM_FALSE; 5232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 5242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 5252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 5262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Update the treble boost if required 5272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 5282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if ((pInstance->Params.SampleRate != LocalParams.SampleRate) || 5292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (pInstance->Params.TE_EffectLevel != LocalParams.TE_EffectLevel) || 5302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (pInstance->Params.TE_OperatingMode != LocalParams.TE_OperatingMode) || 5312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (pInstance->Params.OperatingMode != LocalParams.OperatingMode) || 5322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (pInstance->Params.SpeakerType != LocalParams.SpeakerType)) 5332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 5342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_SetTrebleBoost(pInstance, 5352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent &LocalParams); 5362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 5372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 5382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 5392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Update the headroom if required 5402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 5412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_SetHeadroom(pInstance, /* Instance pointer */ 5422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent &LocalParams); /* New parameters */ 5432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 5442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 5452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Update the volume if required 5462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 5472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 5482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_SetVolume(pInstance, /* Instance pointer */ 5492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent &LocalParams); /* New parameters */ 5502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 5512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* Apply balance changes*/ 5522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if(pInstance->Params.VC_Balance != LocalParams.VC_Balance) 5532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 5542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* Configure Mixer module for gradual changes to volume*/ 5552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if(LocalParams.VC_Balance < 0) 5562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 5572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT32 Target; 5582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* Drop in right channel volume*/ 5592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent Target = LVM_MAXINT_16; 5602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVC_Mixer_SetTarget(&pInstance->VC_BalanceMix.MixerStream[0],Target); 5612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVC_Mixer_VarSlope_SetTimeConstant(&pInstance->VC_BalanceMix.MixerStream[0],LVM_VC_MIXER_TIME,LocalParams.SampleRate,1); 5622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 5632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent Target = dB_to_Lin32((LVM_INT16)(LocalParams.VC_Balance<<4)); 5642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVC_Mixer_SetTarget(&pInstance->VC_BalanceMix.MixerStream[1],Target); 5652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVC_Mixer_VarSlope_SetTimeConstant(&pInstance->VC_BalanceMix.MixerStream[1],LVM_VC_MIXER_TIME,LocalParams.SampleRate,1); 5662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 5672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent else if(LocalParams.VC_Balance >0) 5682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 5692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT32 Target; 5702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* Drop in left channel volume*/ 5712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent Target = dB_to_Lin32((LVM_INT16)((-LocalParams.VC_Balance)<<4)); 5722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVC_Mixer_SetTarget(&pInstance->VC_BalanceMix.MixerStream[0],Target); 5732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVC_Mixer_VarSlope_SetTimeConstant(&pInstance->VC_BalanceMix.MixerStream[0],LVM_VC_MIXER_TIME,LocalParams.SampleRate,1); 5742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 5752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent Target = LVM_MAXINT_16; 5762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVC_Mixer_SetTarget(&pInstance->VC_BalanceMix.MixerStream[1],Target); 5772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVC_Mixer_VarSlope_SetTimeConstant(&pInstance->VC_BalanceMix.MixerStream[1],LVM_VC_MIXER_TIME,LocalParams.SampleRate,1); 5782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 5792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent else 5802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 5812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT32 Target; 5822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* No drop*/ 5832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent Target = LVM_MAXINT_16; 5842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVC_Mixer_SetTarget(&pInstance->VC_BalanceMix.MixerStream[0],Target); 5852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVC_Mixer_VarSlope_SetTimeConstant(&pInstance->VC_BalanceMix.MixerStream[0],LVM_VC_MIXER_TIME,LocalParams.SampleRate,1); 5862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 5872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVC_Mixer_SetTarget(&pInstance->VC_BalanceMix.MixerStream[1],Target); 5882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVC_Mixer_VarSlope_SetTimeConstant(&pInstance->VC_BalanceMix.MixerStream[1],LVM_VC_MIXER_TIME,LocalParams.SampleRate,1); 5892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 5902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 5912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 5922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Update the bass enhancement 5932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 5942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 5952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVDBE_ReturnStatus_en DBE_Status; 5962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVDBE_Params_t DBE_Params; 5972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVDBE_Handle_t *hDBEInstance = pInstance->hDBEInstance; 5982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 5992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 6002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 6012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Set the new parameters 6022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 6032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if(LocalParams.OperatingMode == LVM_MODE_OFF) 6042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 6052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent DBE_Params.OperatingMode = LVDBE_OFF; 6062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 6072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent else 6082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 6092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent DBE_Params.OperatingMode = (LVDBE_Mode_en)LocalParams.BE_OperatingMode; 6102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 6112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent DBE_Params.SampleRate = (LVDBE_Fs_en)LocalParams.SampleRate; 6122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent DBE_Params.EffectLevel = LocalParams.BE_EffectLevel; 6132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent DBE_Params.CentreFrequency = (LVDBE_CentreFreq_en)LocalParams.BE_CentreFreq; 6142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent DBE_Params.HPFSelect = (LVDBE_FilterSelect_en)LocalParams.BE_HPF; 6152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent DBE_Params.HeadroomdB = 0; 6162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent DBE_Params.VolumeControl = LVDBE_VOLUME_OFF; 6172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent DBE_Params.VolumedB = 0; 6182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 6192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 6202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Make the changes 6212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 6222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent DBE_Status = LVDBE_Control(hDBEInstance, 6232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent &DBE_Params); 6242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 6252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 6262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 6272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Quit if the changes were not accepted 6282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 6292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if (DBE_Status != LVDBE_SUCCESS) 6302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 6312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent return((LVM_ReturnStatus_en)DBE_Status); 6322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 6332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 6342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 6352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 6362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Set the control flag 6372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 6382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->DBE_Active = LVM_TRUE; 6392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 6402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 6412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 6422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Update the N-Band Equaliser 6432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 6442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 6452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVEQNB_ReturnStatus_en EQNB_Status; 6462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVEQNB_Params_t EQNB_Params; 6472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVEQNB_Handle_t *hEQNBInstance = pInstance->hEQNBInstance; 6482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 6492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 6502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 6512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Set the new parameters 6522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 6532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 6542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if(LocalParams.OperatingMode == LVM_MODE_OFF) 6552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 6562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent EQNB_Params.OperatingMode = LVEQNB_BYPASS; 6572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 6582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent else 6592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 6602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent EQNB_Params.OperatingMode = (LVEQNB_Mode_en)LocalParams.EQNB_OperatingMode; 6612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 6622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 6632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent EQNB_Params.SampleRate = (LVEQNB_Fs_en)LocalParams.SampleRate; 6642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent EQNB_Params.NBands = LocalParams.EQNB_NBands; 6652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent EQNB_Params.pBandDefinition = (LVEQNB_BandDef_t *)LocalParams.pEQNB_BandDefinition; 6662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if (LocalParams.SourceFormat == LVM_STEREO) /* Mono format not supported */ 6672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 6682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent EQNB_Params.SourceFormat = LVEQNB_STEREO; 6692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 6702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent else 6712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 6722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent EQNB_Params.SourceFormat = LVEQNB_MONOINSTEREO; /* Force to Mono-in-Stereo mode */ 6732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 6742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 6752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 6762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 6772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Set the control flag 6782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 6792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if ((LocalParams.OperatingMode == LVM_MODE_ON) && 6802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (LocalParams.EQNB_OperatingMode == LVM_EQNB_ON)) 6812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 6822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->EQNB_Active = LVM_TRUE; 6832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 6842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent else 6852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 6862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent EQNB_Params.OperatingMode = LVEQNB_BYPASS; 6872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 6882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 6892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 6902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Make the changes 6912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 6922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent EQNB_Status = LVEQNB_Control(hEQNBInstance, 6932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent &EQNB_Params); 6942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 6952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 6962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 6972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Quit if the changes were not accepted 6982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 6992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if (EQNB_Status != LVEQNB_SUCCESS) 7002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 7012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent return((LVM_ReturnStatus_en)EQNB_Status); 7022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 7032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 7042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 7052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 7062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 7072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 7082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Update concert sound 7092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 7102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 7112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVCS_ReturnStatus_en CS_Status; 7122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVCS_Params_t CS_Params; 7132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVCS_Handle_t *hCSInstance = pInstance->hCSInstance; 7142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_Mode_en CompressorMode=LVM_MODE_ON; 7152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 7162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 7172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Set the new parameters 7182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 7192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if(LocalParams.VirtualizerOperatingMode == LVM_MODE_ON) 7202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 7212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent CS_Params.OperatingMode = LVCS_ON; 7222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 7232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent else 7242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 7252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent CS_Params.OperatingMode = LVCS_OFF; 7262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 7272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 7282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if((LocalParams.TE_OperatingMode == LVM_TE_ON) && (LocalParams.TE_EffectLevel == LVM_TE_LOW_MIPS)) 7292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 7302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent CS_Params.SpeakerType = LVCS_EX_HEADPHONES; 7312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 7322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent else 7332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 7342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent CS_Params.SpeakerType = LVCS_HEADPHONES; 7352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 7362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 7372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if (LocalParams.SourceFormat == LVM_STEREO) /* Mono format not supported */ 7382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 7392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent CS_Params.SourceFormat = LVCS_STEREO; 7402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 7412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent else 7422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 7432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent CS_Params.SourceFormat = LVCS_MONOINSTEREO; /* Force to Mono-in-Stereo mode */ 7442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 7452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent CS_Params.SampleRate = LocalParams.SampleRate; 7462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent CS_Params.ReverbLevel = LocalParams.VirtualizerReverbLevel; 7472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent CS_Params.EffectLevel = LocalParams.CS_EffectLevel; 7482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 7492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 7502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 7512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Set the control flag 7522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 7532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if ((LocalParams.OperatingMode == LVM_MODE_ON) && 7542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (LocalParams.VirtualizerOperatingMode != LVCS_OFF)) 7552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 7562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->CS_Active = LVM_TRUE; 7572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 7582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent else 7592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 7602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent CS_Params.OperatingMode = LVCS_OFF; 7612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 7622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 7632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent CS_Params.CompressorMode=CompressorMode; 7642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 7652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 7662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Make the changes 7672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 7682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent CS_Status = LVCS_Control(hCSInstance, 7692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent &CS_Params); 7702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 7712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 7722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 7732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Quit if the changes were not accepted 7742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 7752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if (CS_Status != LVCS_SUCCESS) 7762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 7772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent return((LVM_ReturnStatus_en)CS_Status); 7782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 7792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 7802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 7812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 7822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 7832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Update the Power Spectrum Analyser 7842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 7852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 7862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVPSA_RETURN PSA_Status; 7872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVPSA_ControlParams_t PSA_Params; 7882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pLVPSA_Handle_t *hPSAInstance = pInstance->hPSAInstance; 7892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 7902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 7912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 7922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Set the new parameters 7932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 7942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent PSA_Params.Fs = LocalParams.SampleRate; 7952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent PSA_Params.LevelDetectionSpeed = (LVPSA_LevelDetectSpeed_en)LocalParams.PSA_PeakDecayRate; 7962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 7972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 7982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Make the changes 7992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 8002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if(pInstance->InstParams.PSA_Included==LVM_PSA_ON) 8012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 8022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent PSA_Status = LVPSA_Control(hPSAInstance, 8032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent &PSA_Params); 8042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 8052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if (PSA_Status != LVPSA_OK) 8062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 8072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent return((LVM_ReturnStatus_en)PSA_Status); 8082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 8092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 8102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 8112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Apply new settings 8122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 8132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent PSA_Status = LVPSA_ApplyNewSettings ((LVPSA_InstancePr_t*)hPSAInstance); 8142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if(PSA_Status != LVPSA_OK) 8152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 8162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent return((LVM_ReturnStatus_en)PSA_Status); 8172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 8182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 8192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 8202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 8212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 8222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Update the parameters and clear the flag 8232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 824d918324d44aa48b3b064ea9b87d0c520c38f15a9Eric Laurent pInstance->NoSmoothVolume = LVM_FALSE; 8252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->Params = LocalParams; 8262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 8272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 8282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent return(LVM_SUCCESS); 8292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent} 8302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 8312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 8322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/ 8332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 8342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION: LVM_SetHeadroomParams */ 8352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 8362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION: */ 8372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* This function is used to set the automatiuc headroom management parameters. */ 8382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 8392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS: */ 8402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* hInstance Instance Handle */ 8412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* pHeadroomParams Pointer to headroom parameter structure */ 8422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 8432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* RETURNS: */ 8442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* LVM_Success Succeeded */ 8452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 8462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* NOTES: */ 8472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* 1. This function may be interrupted by the LVM_Process function */ 8482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 8492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/ 8502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 8512c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVM_ReturnStatus_en LVM_SetHeadroomParams(LVM_Handle_t hInstance, 8522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_HeadroomParams_t *pHeadroomParams) 8532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{ 8542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_Instance_t *pInstance =(LVM_Instance_t *)hInstance; 8552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_UINT16 ii, NBands; 8562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 8572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* Check for NULL pointers */ 8582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if ((hInstance == LVM_NULL) || (pHeadroomParams == LVM_NULL)) 8592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 8602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent return (LVM_NULLADDRESS); 8612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 8622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if ((pHeadroomParams->NHeadroomBands != 0) && (pHeadroomParams->pHeadroomDefinition == LVM_NULL)) 8632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 8642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent return (LVM_NULLADDRESS); 8652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 8662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 8672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* Consider only the LVM_HEADROOM_MAX_NBANDS first bands*/ 8682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if (pHeadroomParams->NHeadroomBands > LVM_HEADROOM_MAX_NBANDS) 8692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 8702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent NBands = LVM_HEADROOM_MAX_NBANDS; 8712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 8722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent else 8732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 8742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent NBands = pHeadroomParams->NHeadroomBands; 8752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 8762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->NewHeadroomParams.NHeadroomBands = NBands; 8772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 8782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* Copy settings in memory */ 8792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent for(ii = 0; ii < NBands; ii++) 8802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 8812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->pHeadroom_BandDefs[ii] = pHeadroomParams->pHeadroomDefinition[ii]; 8822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 8832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 8842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->NewHeadroomParams.pHeadroomDefinition = pInstance->pHeadroom_BandDefs; 8852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->NewHeadroomParams.Headroom_OperatingMode = pHeadroomParams->Headroom_OperatingMode; 8862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->ControlPending = LVM_TRUE; 8872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 8882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent return(LVM_SUCCESS); 8892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent} 8902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 8912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/ 8922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 8932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION: LVM_GetHeadroomParams */ 8942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 8952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION: */ 8962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* This function is used to get the automatic headroom management parameters. */ 8972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 8982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS: */ 8992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* hInstance Instance Handle */ 9002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* pHeadroomParams Pointer to headroom parameter structure (output) */ 9012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 9022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* RETURNS: */ 9032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* LVM_SUCCESS Succeeded */ 9042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* LVM_NULLADDRESS When hInstance or pHeadroomParams are NULL */ 9052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 9062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* NOTES: */ 9072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* 1. This function may be interrupted by the LVM_Process function */ 9082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 9092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/ 9102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 9112c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVM_ReturnStatus_en LVM_GetHeadroomParams(LVM_Handle_t hInstance, 9122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_HeadroomParams_t *pHeadroomParams) 9132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{ 9142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_Instance_t *pInstance =(LVM_Instance_t *)hInstance; 9152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_UINT16 ii; 9162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 9172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* Check for NULL pointers */ 9182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if ((hInstance == LVM_NULL) || (pHeadroomParams == LVM_NULL)) 9192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 9202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent return (LVM_NULLADDRESS); 9212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 9222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 9232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pHeadroomParams->NHeadroomBands = pInstance->NewHeadroomParams.NHeadroomBands; 9242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 9252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 9262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* Copy settings in memory */ 9272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent for(ii = 0; ii < pInstance->NewHeadroomParams.NHeadroomBands; ii++) 9282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 9292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->pHeadroom_UserDefs[ii] = pInstance->pHeadroom_BandDefs[ii]; 9302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 9312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 9322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 9332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pHeadroomParams->pHeadroomDefinition = pInstance->pHeadroom_UserDefs; 9342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pHeadroomParams->Headroom_OperatingMode = pInstance->NewHeadroomParams.Headroom_OperatingMode; 9352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent return(LVM_SUCCESS); 9362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent} 9372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 9382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/ 9392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 9402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION: LVM_AlgoCallBack */ 9412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 9422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION: */ 9432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* This is the callback function of the algorithm. */ 9442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 9452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS: */ 9462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* pBundleHandle Pointer to the Instance Handle */ 9472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* pData Pointer to the data */ 9482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* callbackId ID of the callback */ 9492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 9502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* NOTES: */ 9512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* 1. This function may be interrupted by the LVM_Process function */ 9522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 9532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/ 9542c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVM_INT32 LVM_AlgoCallBack( void *pBundleHandle, 9552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent void *pData, 9562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 callbackId) 9572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{ 9582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_Instance_t *pInstance =(LVM_Instance_t *)pBundleHandle; 9592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 9602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (void) pData; 9612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 9622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent switch(callbackId & 0xFF00){ 9632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent case ALGORITHM_CS_ID: 9642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent switch(callbackId & 0x00FF) 9652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 9662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent case LVCS_EVENT_ALGOFF: 9672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->CS_Active = LVM_FALSE; 9682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent break; 9692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent default: 9702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent break; 9712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 9722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent break; 9732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent case ALGORITHM_EQNB_ID: 9742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent switch(callbackId & 0x00FF) 9752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 9762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent case LVEQNB_EVENT_ALGOFF: 9772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->EQNB_Active = LVM_FALSE; 9782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent break; 9792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent default: 9802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent break; 9812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 9822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent break; 9832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent default: 9842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent break; 9852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 9862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 9872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent return 0; 9882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent} 9892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 9902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/ 9912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 9922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION: LVM_VCCallBack */ 9932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 9942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION: */ 9952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* This is the callback function of the Volume control. */ 9962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 9972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS: */ 9982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* pBundleHandle Pointer to the Instance Handle */ 9992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* pGeneralPurpose Pointer to the data */ 10002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* CallBackParam ID of the callback */ 10012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 10022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* NOTES: */ 10032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* 1. This function may be interrupted by the LVM_Process function */ 10042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 10052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/ 10062c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVM_INT32 LVM_VCCallBack(void* pBundleHandle, 10072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent void* pGeneralPurpose, 10082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent short CallBackParam) 10092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{ 10102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_Instance_t *pInstance =(LVM_Instance_t *)pBundleHandle; 10112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT32 Target; 10122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 10132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (void) pGeneralPurpose; 10142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (void) CallBackParam; 10152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 10162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* When volume mixer has reached 0 dB target then stop it to avoid 10172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent unnecessary processing. */ 10182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent Target = LVC_Mixer_GetTarget(&pInstance->VC_Volume.MixerStream[0]); 10192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 10202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if(Target == 0x7FFF) 10212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 10222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->VC_Active = LVM_FALSE; 10232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 10242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent return 1; 10252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent} 1026