1 /* 2 * Copyright (C) 2004-2010 NXP Software 3 * Copyright (C) 2010 The Android Open Source Project 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18 /********************************************************************************** 19 INCLUDE FILES 20 ***********************************************************************************/ 21 22 #include "Mixer_private.h" 23 #include "LVM_Macros.h" 24 25 /********************************************************************************** 26 FUNCTION CORE_MIXSOFT_1ST_D32C31_WRA 27 ***********************************************************************************/ 28 #ifdef BUILD_FLOAT 29 void Core_MixSoft_1St_D32C31_WRA( Mix_1St_Cll_FLOAT_t *pInstance, 30 const LVM_FLOAT *src, 31 LVM_FLOAT *dst, 32 LVM_INT16 n) 33 { 34 LVM_FLOAT Temp1,Temp2; 35 LVM_INT16 OutLoop; 36 LVM_INT16 InLoop; 37 LVM_FLOAT TargetTimesOneMinAlpha; 38 LVM_FLOAT CurrentTimesAlpha; 39 40 LVM_INT16 ii; 41 42 InLoop = (LVM_INT16)(n >> 2); /* Process per 4 samples */ 43 OutLoop = (LVM_INT16)(n - (InLoop << 2)); 44 45 TargetTimesOneMinAlpha = (1.0f - pInstance->Alpha) * pInstance->Target; /* float * float in float */ 46 if (pInstance->Target >= pInstance->Current) 47 { 48 TargetTimesOneMinAlpha += (LVM_FLOAT)(2.0f / 2147483647.0f); /* Ceil*/ 49 } 50 51 if (OutLoop != 0) 52 { 53 CurrentTimesAlpha = (pInstance->Current * pInstance->Alpha); 54 pInstance->Current = TargetTimesOneMinAlpha + CurrentTimesAlpha; 55 56 for (ii = OutLoop; ii != 0; ii--) 57 { 58 Temp1 = *src; 59 src++; 60 61 Temp2 = Temp1 * (pInstance->Current); 62 *dst = Temp2; 63 dst++; 64 } 65 } 66 67 for (ii = InLoop; ii != 0; ii--) 68 { 69 CurrentTimesAlpha = pInstance->Current * pInstance->Alpha; 70 pInstance->Current = TargetTimesOneMinAlpha + CurrentTimesAlpha; 71 72 Temp1 = *src; 73 src++; 74 75 Temp2 = Temp1 * (pInstance->Current); 76 *dst = Temp2; 77 dst++; 78 79 Temp1 = *src; 80 src++; 81 82 Temp2 = Temp1 * (pInstance->Current); 83 *dst = Temp2; 84 dst++; 85 86 Temp1 = *src; 87 src++; 88 89 Temp2 = Temp1 * (pInstance->Current); 90 *dst = Temp2; 91 dst++; 92 93 Temp1 = *src; 94 src++; 95 Temp2 = Temp1 * (pInstance->Current); 96 *dst = Temp2; 97 dst++; 98 } 99 } 100 #else 101 void Core_MixSoft_1St_D32C31_WRA( Mix_1St_Cll_t *pInstance, 102 const LVM_INT32 *src, 103 LVM_INT32 *dst, 104 LVM_INT16 n) 105 { 106 LVM_INT32 Temp1,Temp2; 107 LVM_INT16 OutLoop; 108 LVM_INT16 InLoop; 109 LVM_INT32 TargetTimesOneMinAlpha; 110 LVM_INT32 CurrentTimesAlpha; 111 LVM_INT16 CurrentShort; 112 LVM_INT16 ii; 113 114 InLoop = (LVM_INT16)(n >> 2); /* Process per 4 samples */ 115 OutLoop = (LVM_INT16)(n - (InLoop << 2)); 116 117 MUL32x32INTO32((0x7FFFFFFF-pInstance->Alpha),pInstance->Target,TargetTimesOneMinAlpha,31) /* Q31 * Q31 in Q31 */ 118 if (pInstance->Target >= pInstance->Current) 119 { 120 TargetTimesOneMinAlpha +=2; /* Ceil*/ 121 } 122 123 if (OutLoop!=0) 124 { 125 MUL32x32INTO32(pInstance->Current,pInstance->Alpha,CurrentTimesAlpha,31) /* Q31 * Q31 in Q31 */ 126 pInstance->Current = TargetTimesOneMinAlpha + CurrentTimesAlpha; /* Q31 + Q31 into Q31*/ 127 CurrentShort = (LVM_INT16)(pInstance->Current>>16); /* From Q31 to Q15*/ 128 129 for (ii = OutLoop; ii != 0; ii--) 130 { 131 Temp1=*src; 132 src++; 133 134 MUL32x16INTO32(Temp1,CurrentShort,Temp2,15) 135 *dst = Temp2; 136 dst++; 137 } 138 } 139 140 for (ii = InLoop; ii != 0; ii--) 141 { 142 MUL32x32INTO32(pInstance->Current,pInstance->Alpha,CurrentTimesAlpha,31) /* Q31 * Q31 in Q31 */ 143 pInstance->Current = TargetTimesOneMinAlpha + CurrentTimesAlpha; /* Q31 + Q31 into Q31*/ 144 CurrentShort = (LVM_INT16)(pInstance->Current>>16); /* From Q31 to Q15*/ 145 Temp1=*src; 146 src++; 147 148 MUL32x16INTO32(Temp1,CurrentShort,Temp2,15) 149 *dst = Temp2; 150 dst++; 151 152 Temp1=*src; 153 src++; 154 155 MUL32x16INTO32(Temp1,CurrentShort,Temp2,15) 156 *dst = Temp2; 157 dst++; 158 159 Temp1=*src; 160 src++; 161 162 MUL32x16INTO32(Temp1,CurrentShort,Temp2,15) 163 *dst = Temp2; 164 dst++; 165 166 Temp1=*src; 167 src++; 168 MUL32x16INTO32(Temp1,CurrentShort,Temp2,15) 169 *dst = Temp2; 170 dst++; 171 } 172 } 173 #endif 174 /**********************************************************************************/ 175