/* * 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. */ #include "LVM_Types.h" #include "LVM_Macros.h" #include "LVC_Mixer_Private.h" /************************************************************************/ /* FUNCTION: */ /* LVMixer3_Init */ /* */ /* DESCRIPTION: */ /* This intialization function intializes the private instance */ /* paramters for a given Audio Stream based on TargetGain and */ /* CurrentGain */ /* This function caclulates the "Shift" required to provide the */ /* integer part of TargetGain and fractional gain values "Target" and */ /* "Current" based on maximum(TargetGain,CurrentGain) */ /* E.g. CurrentGain=1.9 and TargetGain=2.5 then based on */ /* MaxGain of 2.5, Shift = 2, Current=1.9/4=0.475, Target=2.5/4=0.625 */ /* Therefore integer gain of 4 is provided by Left Shift of 2 and */ /* fraction gain is provided through Current=0.475 and Target=0.625 */ /* PARAMETERS: */ /* pStream - ptr to Instance Parameter Structure LVMixer3_st for an*/ /* Audio Stream */ /* TargetGain - TargetGain value in Q 16.15 format */ /* CurrentGain - CurrentGain value in Q 16.15 format */ /* */ /* RETURNS: */ /* void */ /* */ /************************************************************************/ void LVC_Mixer_Init( LVMixer3_st *pStream, LVM_INT32 TargetGain, LVM_INT32 CurrentGain) { LVM_INT16 Shift=0; LVM_INT32 MaxGain=TargetGain; // MaxGain is in Q16.15 format Mix_Private_st *pInstance=(Mix_Private_st *)pStream->PrivateParams; if(CurrentGain>MaxGain) MaxGain=CurrentGain; // MaxGain=max(CurrentGain,TargetGain) MaxGain=MaxGain>>15; // MaxGain in Q31.0 format i.e Integer part only while(MaxGain>0){ // Update Shift required to provide integer gain Shift++; MaxGain=MaxGain>>1; } pInstance->Target=TargetGain<<(16-Shift); // Update fractional gain Target pInstance->Current=CurrentGain<<(16-Shift); // Update fractional gain Current pInstance->Shift=Shift; // Update Shift }