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 "AGC.h" 282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include "LVDBE_Coeffs.h" /* Filter coefficients */ 292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/********************************************************************************************/ 322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION: LVDBE_Process */ 342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION: */ 362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* Process function for the Bass Enhancement module. */ 372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* Data can be processed in two formats, stereo or mono-in-stereo. Data in mono */ 392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* format is not supported, the calling routine must convert the mono stream to */ 402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* mono-in-stereo. */ 412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* ___________ */ 422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* ________ | | ________ */ 432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* | | _____ |------------------------->| | | | */ 442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* | 16-bit | | | | ________ | | | 32-bit | */ 452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* -+-->| to |-->| HPF |--| | | _____ | AGC Mixer |-->| to |--| */ 462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* | | 32-bit | |_____| | | Stereo | | | | | | 16-bit | | */ 472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* | |________| |-->| to |-->| BPF |-->| | |________| 0 */ 482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* | | Mono | |_____| |___________| \--> */ 492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* | |________| */ 502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* | _________ 0 */ 512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* | | | | */ 522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* |----------------------------------------------------| Volume |-----------------| */ 532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* | Control | */ 542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* |_________| */ 552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS: */ 572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* hInstance Instance handle */ 582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* pInData Pointer to the input data */ 592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* pOutData Pointer to the output data */ 602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* NumSamples Number of samples in the input buffer */ 612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* RETURNS: */ 632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* LVDBE_SUCCESS Succeeded */ 642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* LVDBE_TOOMANYSAMPLES NumSamples was larger than the maximum block size */ 652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* NOTES: */ 672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* 1. The input and output data must be 32-bit format. The input is scaled by a shift */ 682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* when converting from 16-bit format, this scaling allows for internal headroom in the */ 692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* bass enhancement algorithm. */ 702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* 2. For a 16-bit implementation the converstion to 32-bit is removed and replaced with */ 712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* the headroom loss. This headroom loss is compensated in the volume control so the */ 722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* overall end to end gain is odB. */ 732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/********************************************************************************************/ 752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 762c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVDBE_ReturnStatus_en LVDBE_Process(LVDBE_Handle_t hInstance, 772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent const LVM_INT16 *pInData, 782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 *pOutData, 792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_UINT16 NumSamples) 802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{ 812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVDBE_Instance_t *pInstance =(LVDBE_Instance_t *)hInstance; 832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT32 *pScratch = (LVM_INT32 *)pInstance->MemoryTable.Region[LVDBE_MEMREGION_SCRATCH].pBaseAddress; 84c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT32 *pMono; 852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 *pInput = (LVM_INT16 *)pInData; 862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 88c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* Scratch for Volume Control starts at offset of 2*NumSamples short values from pScratch */ 89c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVM_INT16 *pScratchVol = (LVM_INT16 *)(&pScratch[NumSamples]); 90c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 91c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* Scratch for Mono path starts at offset of 2*NumSamples 32-bit values from pScratch */ 92c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pMono = &pScratch[2*NumSamples]; 93c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Check the number of samples is not too large 962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if (NumSamples > pInstance->Capabilities.MaxBlockSize) 982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent return(LVDBE_TOOMANYSAMPLES); 1002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 1032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Check if the algorithm is enabled 1042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 105c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* DBE path is processed when DBE is ON or during On/Off transitions */ 106c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if ((pInstance->Params.OperatingMode == LVDBE_ON)|| 107c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent (LVC_Mixer_GetCurrent(&pInstance->pData->BypassMixer.MixerStream[0]) 108c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent !=LVC_Mixer_GetTarget(&pInstance->pData->BypassMixer.MixerStream[0]))) 1092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 1102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 1122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Convert 16-bit samples to 32-bit and scale 1132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * (For a 16-bit implementation apply headroom loss here) 1142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 115c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Int16LShiftToInt32_16x32(pInput, /* Source 16-bit data */ 116c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pScratch, /* Dest. 32-bit data */ 117c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent (LVM_INT16)(2*NumSamples), /* Left and right */ 118c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVDBE_SCALESHIFT); /* Shift scale */ 1192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 1222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Apply the high pass filter if selected 1232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 1242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if (pInstance->Params.HPFSelect == LVDBE_HPF_ON) 1252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 126c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent BQ_2I_D32F32C30_TRC_WRA_01(&pInstance->pCoef->HPFInstance,/* Filter instance */ 127c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent (LVM_INT32 *)pScratch, /* Source */ 128c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent (LVM_INT32 *)pScratch, /* Destination */ 129c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent (LVM_INT16)NumSamples); /* Number of samples */ 1302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 1342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Create the mono stream 1352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 136c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent From2iToMono_32(pScratch, /* Stereo source */ 137c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pMono, /* Mono destination */ 138c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent (LVM_INT16)NumSamples); /* Number of samples */ 1392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 1422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Apply the band pass filter 1432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 144c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent BP_1I_D32F32C30_TRC_WRA_02(&pInstance->pCoef->BPFInstance, /* Filter instance */ 145c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent (LVM_INT32 *)pMono, /* Source */ 146c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent (LVM_INT32 *)pMono, /* Destination */ 147c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent (LVM_INT16)NumSamples); /* Number of samples */ 1482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 1512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Apply the AGC and mix 1522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 153c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent AGC_MIX_VOL_2St1Mon_D32_WRA(&pInstance->pData->AGCInstance, /* Instance pointer */ 154c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pScratch, /* Stereo source */ 155c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pMono, /* Mono band pass source */ 156c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pScratch, /* Stereo destination */ 157c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent NumSamples); /* Number of samples */ 1582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 1602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Convert 32-bit samples to 16-bit and saturate 1612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * (Not required for 16-bit implemenations) 1622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 163c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent Int32RShiftToInt16_Sat_32x16(pScratch, /* Source 32-bit data */ 164c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent (LVM_INT16 *)pScratch, /* Dest. 16-bit data */ 165c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent (LVM_INT16)(2*NumSamples), /* Left and right */ 166c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVDBE_SCALESHIFT); /* Shift scale */ 1672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 169c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 170c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* Bypass Volume path is processed when DBE is OFF or during On/Off transitions */ 171c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent if ((pInstance->Params.OperatingMode == LVDBE_OFF)|| 172c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent (LVC_Mixer_GetCurrent(&pInstance->pData->BypassMixer.MixerStream[1]) 173c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent !=LVC_Mixer_GetTarget(&pInstance->pData->BypassMixer.MixerStream[1]))) 1742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 1752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 1772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * The algorithm is disabled but volume management is required to compensate for 1782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * headroom and volume (if enabled) 1792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 1802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVC_MixSoft_1St_D16C31_SAT(&pInstance->pData->BypassVolume, 1812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInData, 182c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pScratchVol, 183c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent (LVM_INT16)(2*NumSamples)); /* Left and right */ 1842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 187c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent /* 188c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent * Mix DBE processed path and bypass volume path 189c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent */ 190c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent LVC_MixSoft_2St_D16C31_SAT(&pInstance->pData->BypassMixer, 191c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent (LVM_INT16 *) pScratch, 192c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pScratchVol, 193c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent pOutData, 194c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent (LVM_INT16)(2*NumSamples)); 195c59c6fd7f859b4010d788db89b8d4d76bbb70e57Eric Laurent 1962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent return(LVDBE_SUCCESS); 1972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent} 1982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 208