/* * Copyright (C) 2004-2010 NXP Software * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /****************************************************************************************/ /* */ /* Includes */ /* */ /****************************************************************************************/ #include #include #include "LVDBE.h" #include "LVDBE_Private.h" /****************************************************************************************/ /* */ /* FUNCTION: LVDBE_Init */ /* */ /* DESCRIPTION: */ /* Create and initialisation function for the Bass Enhancement module */ /* */ /* PARAMETERS: */ /* phInstance Pointer to instance handle */ /* pCapabilities Pointer to the initialisation capabilities */ /* pScratch Pointer to the bundle scratch buffer */ /* */ /* RETURNS: */ /* LVDBE_SUCCESS Initialisation succeeded */ /* LVDBE_NULLADDRESS One or more memory has a NULL pointer - malloc failure */ /* */ /* NOTES: */ /* 1. This function must not be interrupted by the LVDBE_Process function */ /* */ /****************************************************************************************/ LVDBE_ReturnStatus_en LVDBE_Init(LVDBE_Handle_t* phInstance, LVDBE_Capabilities_t* pCapabilities, void* pScratch) { LVDBE_Instance_t* pInstance; LVMixer3_1St_FLOAT_st* pMixer_Instance; LVMixer3_2St_FLOAT_st* pBypassMixer_Instance; LVM_FLOAT MixGain; /* * Create the instance handle if not already initialised */ if (*phInstance == LVM_NULL) { *phInstance = new LVDBE_Instance_t{}; } pInstance = (LVDBE_Instance_t*)*phInstance; /* * Save the memory table in the instance structure */ pInstance->Capabilities = *pCapabilities; pInstance->pScratch = pScratch; /* * Set the default instance parameters */ pInstance->Params.CentreFrequency = LVDBE_CENTRE_55HZ; pInstance->Params.EffectLevel = 0; pInstance->Params.HeadroomdB = 0; pInstance->Params.HPFSelect = LVDBE_HPF_OFF; pInstance->Params.OperatingMode = LVDBE_OFF; pInstance->Params.SampleRate = LVDBE_FS_8000; pInstance->Params.VolumeControl = LVDBE_VOLUME_OFF; pInstance->Params.VolumedB = 0; pInstance->Params.NrChannels = FCC_2; /* * Create pointer to data and coef memory */ pInstance->pData = (LVDBE_Data_FLOAT_t*)calloc(1, sizeof(*(pInstance->pData))); if (pInstance->pData == NULL) { return LVDBE_NULLADDRESS; } /* * Create biquad instance */ pInstance->pHPFBiquad.reset( new android::audio_utils::BiquadFilter(pInstance->Params.NrChannels)); pInstance->pBPFBiquad.reset(new android::audio_utils::BiquadFilter(FCC_1)); /* * Initialise the filters */ LVDBE_SetFilters(pInstance, /* Set the filter taps and coefficients */ &pInstance->Params); /* * Initialise the AGC */ LVDBE_SetAGC(pInstance, /* Set the AGC gain */ &pInstance->Params); pInstance->pData->AGCInstance.AGC_Gain = pInstance->pData->AGCInstance.AGC_MaxGain; /* Default to the bass boost setting */ // initialize the mixer with some fixes values since otherwise LVDBE_SetVolume ends up // reading uninitialized data pMixer_Instance = &pInstance->pData->BypassVolume; LVC_Mixer_Init(&pMixer_Instance->MixerStream[0], 1.0, 1.0); /* * Initialise the volume */ LVDBE_SetVolume(pInstance, /* Set the Volume */ &pInstance->Params); pInstance->pData->AGCInstance.Volume = pInstance->pData->AGCInstance.Target; /* Initialise as the target */ MixGain = LVC_Mixer_GetTarget(&pMixer_Instance->MixerStream[0]); LVC_Mixer_Init(&pMixer_Instance->MixerStream[0], MixGain, MixGain); /* Configure the mixer process path */ pMixer_Instance->MixerStream[0].CallbackParam = 0; pMixer_Instance->MixerStream[0].pCallbackHandle = LVM_NULL; pMixer_Instance->MixerStream[0].pCallBack = LVM_NULL; pMixer_Instance->MixerStream[0].CallbackSet = 0; /* * Initialise the clicks minimisation BypassMixer */ pBypassMixer_Instance = &pInstance->pData->BypassMixer; /* * Setup the mixer gain for the processed path */ pBypassMixer_Instance->MixerStream[0].CallbackParam = 0; pBypassMixer_Instance->MixerStream[0].pCallbackHandle = LVM_NULL; pBypassMixer_Instance->MixerStream[0].pCallBack = LVM_NULL; pBypassMixer_Instance->MixerStream[0].CallbackSet = 0; LVC_Mixer_Init(&pBypassMixer_Instance->MixerStream[0], 0, 0); LVC_Mixer_SetTimeConstant(&pBypassMixer_Instance->MixerStream[0], LVDBE_BYPASS_MIXER_TC, (LVM_Fs_en)pInstance->Params.SampleRate, 2); /* * Setup the mixer gain for the unprocessed path */ pBypassMixer_Instance->MixerStream[1].CallbackParam = 0; pBypassMixer_Instance->MixerStream[1].pCallbackHandle = LVM_NULL; pBypassMixer_Instance->MixerStream[1].pCallBack = LVM_NULL; pBypassMixer_Instance->MixerStream[1].CallbackSet = 0; LVC_Mixer_Init(&pBypassMixer_Instance->MixerStream[1], 1.0, 1.0); LVC_Mixer_SetTimeConstant(&pBypassMixer_Instance->MixerStream[1], LVDBE_BYPASS_MIXER_TC, (LVM_Fs_en)pInstance->Params.SampleRate, 2); return (LVDBE_SUCCESS); } /****************************************************************************************/ /* */ /* FUNCTION: LVDBE_DeInit */ /* */ /* DESCRIPTION: */ /* Free the memories created during LVDBE_Init including instance handle */ /* */ /* PARAMETERS: */ /* phInstance Pointer to instance handle */ /* */ /****************************************************************************************/ void LVDBE_DeInit(LVDBE_Handle_t* phInstance) { LVDBE_Instance_t* pInstance = (LVDBE_Instance_t*)*phInstance; if (pInstance == LVM_NULL) { return; } if (pInstance->pData != LVM_NULL) { free(pInstance->pData); pInstance->pData = LVM_NULL; } delete pInstance; *phInstance = LVM_NULL; }