LVCS_BypassMix.c revision 2c8e5cab3faa6d360e222b7a6c40a80083d021ac
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 $Author: nxp007753 $ 212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent $Revision: 1246 $ 222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent $Date: 2010-07-16 11:07:10 +0200 (Fri, 16 Jul 2010) $ 232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent*************************************************************************************/ 252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/ 272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* Includes */ 292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/ 312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include "LVCS.h" 332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include "LVCS_Private.h" 342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include "LVCS_BypassMix.h" 352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include "VectorArithmetic.h" 362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include "LVCS_Tables.h" 372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/ 392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* Function Prototypes */ 412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/****************************************************************************************/ 432c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVM_INT32 LVCS_MixerCallback( LVCS_Handle_t hInstance, 442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent void *pGeneralPurpose, 452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 CallbackParam); 462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/ 482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION: LVCS_BypassMixInit */ 502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION: */ 522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* Initialises the bypass mixer module */ 532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* The overall gain of the processed path is set by the gains in the individual */ 552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* processing blocks and by the effect level gain. */ 562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* The unprocessed path must have matching gain for the processed path to ensure */ 582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* as they are mixed together the correct effect is achieved, this is the value */ 592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* UnprocLoss. */ 602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* The overall gain is corrected by a combination of a shift with saturation and a */ 622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* linear scaler, loss. The loss ensures the sum in the mixer does not saturate */ 632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* and also corrects for any excess gain in the shift. */ 642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS: */ 662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* hInstance Instance Handle */ 672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* pParams Initialisation parameters */ 682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* RETURNS: */ 702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* LVCS_Success Always succeeds */ 712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* NOTES: */ 732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/ 752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 762c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVCS_ReturnStatus_en LVCS_BypassMixInit(LVCS_Handle_t hInstance, 772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVCS_Params_t *pParams) 782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{ 792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_UINT16 Offset; 812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_UINT32 Gain; 822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVCS_Instance_t *pInstance = (LVCS_Instance_t *)hInstance; 832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVCS_BypassMix_t *pConfig = (LVCS_BypassMix_t *)&pInstance->BypassMix; 842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent const Gain_t *pOutputGainTable; 852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT32 Current; 862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Set the transition gain 902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if ((pParams->OperatingMode == LVCS_ON) && 922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (pInstance->bTimerDone == LVM_TRUE) 932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent && (LVC_Mixer_GetTarget(&pInstance->MSBypassMixer.MixerStream[1]) != 0x7FFF) /* this indicates an off->on transtion */ 942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent ) 952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->TransitionGain = pParams->EffectLevel; 972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent else 992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 1002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* Select no effect level */ 1012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->TransitionGain = 0; 1022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 1052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Calculate the output gain table offset 1062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 1072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent Offset = (LVM_UINT16)(pParams->SpeakerType + (pParams->SourceFormat*(1+LVCS_EX_HEADPHONES))); 1082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pOutputGainTable = (Gain_t*)&LVCS_OutputGainTable[0]; 1092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 1112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Setup the mixer gain for the processed path 1122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 1132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent Gain = (LVM_UINT32)(pOutputGainTable[Offset].Loss * pInstance->TransitionGain); 1142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pConfig->Mixer_Instance.MixerStream[0].CallbackParam = 0; 1162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pConfig->Mixer_Instance.MixerStream[0].pCallbackHandle = LVM_NULL; 1172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pConfig->Mixer_Instance.MixerStream[0].pCallBack = LVM_NULL; 1182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pConfig->Mixer_Instance.MixerStream[0].CallbackSet=1; 1192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent Current = LVC_Mixer_GetCurrent(&pConfig->Mixer_Instance.MixerStream[0]); 1202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVC_Mixer_Init(&pConfig->Mixer_Instance.MixerStream[0],(LVM_INT32)(Gain >> 15),Current); 1212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVC_Mixer_VarSlope_SetTimeConstant(&pConfig->Mixer_Instance.MixerStream[0],LVCS_BYPASS_MIXER_TC,pParams->SampleRate,2); 1222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 1232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Setup the mixer gain for the unprocessed path 1242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 1252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent Gain = (LVM_UINT32)(pOutputGainTable[Offset].Loss * (0x7FFF - pInstance->TransitionGain)); 1262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent Gain = (LVM_UINT32)pOutputGainTable[Offset].UnprocLoss * (Gain >> 15); 1272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent Current = LVC_Mixer_GetCurrent(&pConfig->Mixer_Instance.MixerStream[1]); 1282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVC_Mixer_Init(&pConfig->Mixer_Instance.MixerStream[1],(LVM_INT32)(Gain >> 15),Current); 1292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVC_Mixer_VarSlope_SetTimeConstant(&pConfig->Mixer_Instance.MixerStream[1],LVCS_BYPASS_MIXER_TC,pParams->SampleRate,2); 1302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pConfig->Mixer_Instance.MixerStream[1].CallbackParam = 0; 1312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pConfig->Mixer_Instance.MixerStream[1].pCallbackHandle = hInstance; 1322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pConfig->Mixer_Instance.MixerStream[1].CallbackSet=1; 1332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pConfig->Mixer_Instance.MixerStream[1].pCallBack = LVCS_MixerCallback; 1342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 1362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Setup the output gain shift 1372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 1382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pConfig->Output_Shift = pOutputGainTable[Offset].Shift; 1392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 1422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Correct gain for the effect level 1432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 1442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 1452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 GainCorrect; 1472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT32 Gain1; 1482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT32 Gain2; 1492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent Gain1 = LVC_Mixer_GetTarget(&pConfig->Mixer_Instance.MixerStream[0]); 1512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent Gain2 = LVC_Mixer_GetTarget(&pConfig->Mixer_Instance.MixerStream[1]); 1522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 1532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Calculate the gain correction 1542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 1552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if (pInstance->Params.CompressorMode == LVM_MODE_ON) 1562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 1572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent GainCorrect = (LVM_INT16)( pInstance->VolCorrect.GainMin 1582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent - (((LVM_INT32)pInstance->VolCorrect.GainMin * (LVM_INT32)pInstance->TransitionGain) >> 15) 1592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent + (((LVM_INT32)pInstance->VolCorrect.GainFull * (LVM_INT32)pInstance->TransitionGain) >> 15) ); 1602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 1622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Apply the gain correction and shift, note the result is in Q3.13 format 1632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 1642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent Gain1 = (Gain1 * GainCorrect) << 4; 1652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent Gain2 = (Gain2 * GainCorrect) << 4; 1662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent else 1682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 1692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent Gain1 = Gain1 << 16; 1702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent Gain2 = Gain2 << 16; 1712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 1762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Set the gain values 1772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 1782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pConfig->Output_Shift = pConfig->Output_Shift; 1792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVC_Mixer_SetTarget(&pConfig->Mixer_Instance.MixerStream[0],Gain1>>16); 1802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVC_Mixer_VarSlope_SetTimeConstant(&pConfig->Mixer_Instance.MixerStream[0],LVCS_BYPASS_MIXER_TC,pParams->SampleRate,2); 1812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVC_Mixer_SetTarget(&pConfig->Mixer_Instance.MixerStream[1],Gain2>>16); 1822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVC_Mixer_VarSlope_SetTimeConstant(&pConfig->Mixer_Instance.MixerStream[1],LVCS_BYPASS_MIXER_TC,pParams->SampleRate,2); 1832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent return(LVCS_SUCCESS); 1862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent} 1882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/ 1902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 1912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION: LVCS_BypassMixer */ 1922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 1932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* DESCRIPTION: */ 1942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* Apply Bypass Mix. */ 1952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 1962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* This mixes the processed and unprocessed data streams together to correct the */ 1972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* overall system gain and allow progressive control of the Concert Sound effect. */ 1982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 1992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* When the bypass mixer is enabled the output is the processed signal only and */ 2002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* without gain correction. */ 2012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 2022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* PARAMETERS: */ 2032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* hInstance Instance Handle */ 2042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* pProcessed Pointer to the processed data */ 2052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* pUnprocessed Pointer to the unprocessed data */ 2062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* pOutData Pointer to the output data */ 2072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* NumSamples Number of samples to process */ 2082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 2092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* RETURNS: */ 2102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* LVCS_Success Always succeeds */ 2112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 2122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* NOTES: */ 2132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 2142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/ 2152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2162c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVCS_ReturnStatus_en LVCS_BypassMixer(LVCS_Handle_t hInstance, 2172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent const LVM_INT16 *pProcessed, 2182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent const LVM_INT16 *pUnprocessed, 2192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 *pOutData, 2202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_UINT16 NumSamples) 2212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{ 2222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVCS_Instance_t *pInstance = (LVCS_Instance_t *)hInstance; 2242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVCS_BypassMix_t *pConfig = (LVCS_BypassMix_t *)&pInstance->BypassMix; 2252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 2272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Check if the bypass mixer is enabled 2282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 2292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if ((pInstance->Params.OperatingMode & LVCS_BYPASSMIXSWITCH) != 0) 2302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 2312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 2322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Apply the bypass mix 2332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 2342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVC_MixSoft_2St_D16C31_SAT(&pConfig->Mixer_Instance, 2352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pProcessed, 2362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (LVM_INT16 *) pUnprocessed, 2372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pOutData, 2382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (LVM_INT16)(2*NumSamples)); 2392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 2412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Apply output gain correction shift 2422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 2432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent Shift_Sat_v16xv16 ((LVM_INT16)pConfig->Output_Shift, 2442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (LVM_INT16*)pOutData, 2452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (LVM_INT16*)pOutData, 2462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (LVM_INT16)(2*NumSamples)); /* Left and right*/ 2472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 2482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent return(LVCS_SUCCESS); 2502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent} 2512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/ 2542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 2552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* FUNCTION: LVCS_MixerCallback */ 2562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* */ 2572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/************************************************************************************/ 2582c8e5cab3faa6d360e222b7a6c40a80083d021acEric LaurentLVM_INT32 LVCS_MixerCallback(LVCS_Handle_t hInstance, 2592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent void *pGeneralPurpose, 2602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 CallbackParam) 2612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{ 2622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVCS_Instance_t *pInstance = (LVCS_Instance_t *)hInstance; 2632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT32 Target1; 2642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent Target1 = LVC_Mixer_GetTarget(&pInstance->MSBypassMixer.MixerStream[0]); 2662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (void)pGeneralPurpose; 2672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* 2692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Off transition has completed in Headphone mode 2702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 2712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if ((pInstance->OutputDevice == LVCS_HEADPHONE) && 2722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (pInstance->bInOperatingModeTransition) && 2732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (Target1 == 0x0000)&& /* this indicates an on->off transition */ 2742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (CallbackParam == 0)) 2752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 2762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* Set operating mode to OFF */ 2772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->Params.OperatingMode = LVCS_OFF; 2782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* Exit transition state */ 2802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->bInOperatingModeTransition = LVM_FALSE; 2812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* Signal to the bundle */ 2832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if((*pInstance->Capabilities.CallBack) != LVM_NULL){ 2842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (*pInstance->Capabilities.CallBack)(pInstance->Capabilities.pBundleInstance, 2852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_NULL, 2862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (ALGORITHM_CS_ID | LVCS_EVENT_ALGOFF)); 2872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 2882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 2892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if ((pInstance->OutputDevice == LVCS_HEADPHONE) && 2922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (Target1 == 1) && 2932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (pInstance->bTimerDone == LVM_TRUE)){ 2942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent /* Exit transition state */ 2962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstance->bInOperatingModeTransition = LVM_FALSE; 2972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 2982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 2992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent return 1; 3002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent} 3012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 3022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 3032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 304