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
Core_MixSoft_1St_D32C31_WRA(Mix_1St_Cll_t * pInstance,const LVM_INT32 * src,LVM_INT32 * dst,LVM_INT16 n)29 void Core_MixSoft_1St_D32C31_WRA( Mix_1St_Cll_t *pInstance,
30 const LVM_INT32 *src,
31 LVM_INT32 *dst,
32 LVM_INT16 n)
33 {
34 LVM_INT32 Temp1,Temp2;
35 LVM_INT16 OutLoop;
36 LVM_INT16 InLoop;
37 LVM_INT32 TargetTimesOneMinAlpha;
38 LVM_INT32 CurrentTimesAlpha;
39 LVM_INT16 CurrentShort;
40 LVM_INT16 ii;
41
42 InLoop = (LVM_INT16)(n >> 2); /* Process per 4 samples */
43 OutLoop = (LVM_INT16)(n - (InLoop << 2));
44
45 MUL32x32INTO32((0x7FFFFFFF-pInstance->Alpha),pInstance->Target,TargetTimesOneMinAlpha,31) /* Q31 * Q31 in Q31 */
46 if (pInstance->Target >= pInstance->Current)
47 {
48 TargetTimesOneMinAlpha +=2; /* Ceil*/
49 }
50
51 if (OutLoop!=0)
52 {
53 MUL32x32INTO32(pInstance->Current,pInstance->Alpha,CurrentTimesAlpha,31) /* Q31 * Q31 in Q31 */
54 pInstance->Current = TargetTimesOneMinAlpha + CurrentTimesAlpha; /* Q31 + Q31 into Q31*/
55 CurrentShort = (LVM_INT16)(pInstance->Current>>16); /* From Q31 to Q15*/
56
57 for (ii = OutLoop; ii != 0; ii--)
58 {
59 Temp1=*src;
60 src++;
61
62 MUL32x16INTO32(Temp1,CurrentShort,Temp2,15)
63 *dst = Temp2;
64 dst++;
65 }
66 }
67
68 for (ii = InLoop; ii != 0; ii--)
69 {
70 MUL32x32INTO32(pInstance->Current,pInstance->Alpha,CurrentTimesAlpha,31) /* Q31 * Q31 in Q31 */
71 pInstance->Current = TargetTimesOneMinAlpha + CurrentTimesAlpha; /* Q31 + Q31 into Q31*/
72 CurrentShort = (LVM_INT16)(pInstance->Current>>16); /* From Q31 to Q15*/
73 Temp1=*src;
74 src++;
75
76 MUL32x16INTO32(Temp1,CurrentShort,Temp2,15)
77 *dst = Temp2;
78 dst++;
79
80 Temp1=*src;
81 src++;
82
83 MUL32x16INTO32(Temp1,CurrentShort,Temp2,15)
84 *dst = Temp2;
85 dst++;
86
87 Temp1=*src;
88 src++;
89
90 MUL32x16INTO32(Temp1,CurrentShort,Temp2,15)
91 *dst = Temp2;
92 dst++;
93
94 Temp1=*src;
95 src++;
96 MUL32x16INTO32(Temp1,CurrentShort,Temp2,15)
97 *dst = Temp2;
98 dst++;
99 }
100 }
101
102
103 /**********************************************************************************/
104