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
Core_MixSoft_1St_D32C31_WRA(Mix_1St_Cll_FLOAT_t * pInstance,const LVM_FLOAT * src,LVM_FLOAT * dst,LVM_INT16 n)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
Core_MixSoft_1St_D32C31_WRA(Mix_1St_Cll_t * pInstance,const LVM_INT32 * src,LVM_INT32 * dst,LVM_INT16 n)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