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 INCLUDE FILES 202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent***********************************************************************************/ 212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include "LVC_Mixer_Private.h" 232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include "ScalarArithmetic.h" 242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#include "LVM_Macros.h" 252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/********************************************************************************** 272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent FUNCTION LVC_Core_MixSoft_1St_2i_D16C31_WRA 282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent***********************************************************************************/ 292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentvoid LVC_Core_MixSoft_1St_2i_D16C31_WRA( LVMixer3_st *ptrInstance1, 312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVMixer3_st *ptrInstance2, 322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent const LVM_INT16 *src, 332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 *dst, 342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 n) 352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent{ 362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 OutLoop; 372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 InLoop; 382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 CurrentShortL; 392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT16 CurrentShortR; 402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT32 ii; 412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent Mix_Private_st *pInstanceL=(Mix_Private_st *)(ptrInstance1->PrivateParams); 422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent Mix_Private_st *pInstanceR=(Mix_Private_st *)(ptrInstance2->PrivateParams); 432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT32 DeltaL=pInstanceL->Delta; 452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT32 CurrentL=pInstanceL->Current; 462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT32 TargetL=pInstanceL->Target; 472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT32 DeltaR=pInstanceR->Delta; 492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT32 CurrentR=pInstanceR->Current; 502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT32 TargetR=pInstanceR->Target; 512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT32 Temp; 532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent InLoop = (LVM_INT16)(n >> 2); /* Process per 4 samples */ 552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent OutLoop = (LVM_INT16)(n - (InLoop << 2)); 562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if (OutLoop) 582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if(CurrentL<TargetL) 602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent ADD2_SAT_32x32(CurrentL,DeltaL,Temp); /* Q31 + Q31 into Q31*/ 622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent CurrentL=Temp; 632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if (CurrentL > TargetL) 642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent CurrentL = TargetL; 652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent else 672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent CurrentL -= DeltaL; /* Q31 + Q31 into Q31*/ 692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if (CurrentL < TargetL) 702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent CurrentL = TargetL; 712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if(CurrentR<TargetR) 742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent ADD2_SAT_32x32(CurrentR,DeltaR,Temp); /* Q31 + Q31 into Q31*/ 762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent CurrentR=Temp; 772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if (CurrentR > TargetR) 782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent CurrentR = TargetR; 792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent else 812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent CurrentR -= DeltaR; /* Q31 + Q31 into Q31*/ 832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if (CurrentR < TargetR) 842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent CurrentR = TargetR; 852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent CurrentShortL = (LVM_INT16)(CurrentL>>16); /* From Q31 to Q15*/ 882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent CurrentShortR = (LVM_INT16)(CurrentR>>16); /* From Q31 to Q15*/ 892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent for (ii = OutLoop*2; ii != 0; ii-=2) 912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *(dst++) = (LVM_INT16)(((LVM_INT32)*(src++) * (LVM_INT32)CurrentShortL)>>15); /* Q15*Q15>>15 into Q15 */ 932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *(dst++) = (LVM_INT16)(((LVM_INT32)*(src++) * (LVM_INT32)CurrentShortR)>>15); /* Q15*Q15>>15 into Q15 */ 942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent for (ii = InLoop*2; ii != 0; ii-=2) 982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if(CurrentL<TargetL) 1002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 1012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent ADD2_SAT_32x32(CurrentL,DeltaL,Temp); /* Q31 + Q31 into Q31*/ 1022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent CurrentL=Temp; 1032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if (CurrentL > TargetL) 1042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent CurrentL = TargetL; 1052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent else 1072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 1082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent CurrentL -= DeltaL; /* Q31 + Q31 into Q31*/ 1092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if (CurrentL < TargetL) 1102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent CurrentL = TargetL; 1112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if(CurrentR<TargetR) 1142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 1152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent ADD2_SAT_32x32(CurrentR,DeltaR,Temp); /* Q31 + Q31 into Q31*/ 1162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent CurrentR=Temp; 1172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if (CurrentR > TargetR) 1182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent CurrentR = TargetR; 1192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent else 1212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent { 1222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent CurrentR -= DeltaR; /* Q31 + Q31 into Q31*/ 1232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if (CurrentR < TargetR) 1242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent CurrentR = TargetR; 1252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent CurrentShortL = (LVM_INT16)(CurrentL>>16); /* From Q31 to Q15*/ 1282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent CurrentShortR = (LVM_INT16)(CurrentR>>16); /* From Q31 to Q15*/ 1292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *(dst++) = (LVM_INT16)(((LVM_INT32)*(src++) * (LVM_INT32)CurrentShortL)>>15); /* Q15*Q15>>15 into Q15 */ 1312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *(dst++) = (LVM_INT16)(((LVM_INT32)*(src++) * (LVM_INT32)CurrentShortR)>>15); /* Q15*Q15>>15 into Q15 */ 1322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *(dst++) = (LVM_INT16)(((LVM_INT32)*(src++) * (LVM_INT32)CurrentShortL)>>15); 1332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *(dst++) = (LVM_INT16)(((LVM_INT32)*(src++) * (LVM_INT32)CurrentShortR)>>15); 1342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *(dst++) = (LVM_INT16)(((LVM_INT32)*(src++) * (LVM_INT32)CurrentShortL)>>15); 1352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *(dst++) = (LVM_INT16)(((LVM_INT32)*(src++) * (LVM_INT32)CurrentShortR)>>15); 1362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *(dst++) = (LVM_INT16)(((LVM_INT32)*(src++) * (LVM_INT32)CurrentShortL)>>15); 1372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent *(dst++) = (LVM_INT16)(((LVM_INT32)*(src++) * (LVM_INT32)CurrentShortR)>>15); 1382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstanceL->Current=CurrentL; 1402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent pInstanceR->Current=CurrentR; 1412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent} 1432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/**********************************************************************************/ 144