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#ifndef _VECTOR_ARITHMETIC_H_
19#define _VECTOR_ARITHMETIC_H_
20
21
22#ifdef __cplusplus
23extern "C" {
24#endif /* __cplusplus */
25
26#include "LVM_Types.h"
27
28/**********************************************************************************
29    VARIOUS FUNCTIONS
30***********************************************************************************/
31
32#ifdef BUILD_FLOAT
33void LoadConst_Float(          const LVM_FLOAT val,
34                               LVM_FLOAT *dst,
35                               LVM_INT16 n );
36#else
37void LoadConst_16(            const LVM_INT16 val,
38                                    LVM_INT16 *dst,
39                                    LVM_INT16 n );
40
41void LoadConst_32(            const LVM_INT32 val,
42                                    LVM_INT32 *dst,
43                                    LVM_INT16 n );
44#endif
45
46#ifdef BUILD_FLOAT
47void Copy_Float(                 const LVM_FLOAT *src,
48                                 LVM_FLOAT *dst,
49                                 LVM_INT16 n );
50#else
51void Copy_16(                 const LVM_INT16 *src,
52                                    LVM_INT16 *dst,
53                                    LVM_INT16 n );
54#endif
55
56/*********************************************************************************
57 * note: In Mult3s_16x16() saturation of result is not taken care when           *
58 *       overflow occurs.                                                        *
59 *       For example when *src = 0x8000, val = *0x8000                           *
60 *       The function gives the output as 0x8000 instead of 0x7fff               *
61 *       This is the only case which will give wrong result.                     *
62 *       For more information refer to Vector_Arithmetic.doc in /doc folder      *
63 *********************************************************************************/
64#ifdef BUILD_FLOAT
65void Mult3s_Float(            const LVM_FLOAT *src,
66                              const LVM_FLOAT val,
67                              LVM_FLOAT *dst,
68                              LVM_INT16 n);
69#else
70void Mult3s_16x16(            const LVM_INT16 *src,
71                              const LVM_INT16 val,
72                              LVM_INT16 *dst,
73                              LVM_INT16 n);
74#endif
75
76/*********************************************************************************
77 * note: In Mult3s_32x16() saturation of result is not taken care when           *
78 *       overflow occurs.                                                        *
79 *       For example when *src = 0x8000000, val = *0x8000                        *
80 *       The function gives the output as 0x8000000 instead of 0x7fffffff        *
81 *       This is the only extreme condition which is giving unexpected result    *
82 *       For more information refer to Vector_Arithmetic.doc in /doc folder      *
83 *********************************************************************************/
84void Mult3s_32x16(            const LVM_INT32  *src,
85                              const LVM_INT16 val,
86                                    LVM_INT32  *dst,
87                                    LVM_INT16 n);
88#ifdef BUILD_FLOAT
89void DelayMix_Float(const LVM_FLOAT *src,           /* Source 1, to be delayed */
90                    LVM_FLOAT *delay,         /* Delay buffer */
91                    LVM_INT16 size,           /* Delay size */
92                    LVM_FLOAT *dst,           /* Source/destination */
93                    LVM_INT16 *pOffset,       /* Delay offset */
94                    LVM_INT16 n)  ;            /* Number of stereo samples */
95#else
96void DelayMix_16x16(          const LVM_INT16 *src,
97                                    LVM_INT16 *delay,
98                                    LVM_INT16 size,
99                                    LVM_INT16 *dst,
100                                    LVM_INT16 *pOffset,
101                                    LVM_INT16 n);
102#endif
103void DelayWrite_32(           const LVM_INT32  *src,               /* Source 1, to be delayed */
104                                    LVM_INT32  *delay,             /* Delay buffer */
105                                    LVM_UINT16 size,               /* Delay size */
106                                    LVM_UINT16 *pOffset,           /* Delay offset */
107                                    LVM_INT16 n);
108#ifdef BUILD_FLOAT
109void Add2_Sat_Float(          const LVM_FLOAT *src,
110                              LVM_FLOAT *dst,
111                              LVM_INT16 n );
112#else
113void Add2_Sat_16x16(          const LVM_INT16 *src,
114                                    LVM_INT16 *dst,
115                                    LVM_INT16 n );
116
117void Add2_Sat_32x32(          const LVM_INT32  *src,
118                                    LVM_INT32  *dst,
119                                    LVM_INT16 n );
120#endif
121#ifdef BUILD_FLOAT
122void Mac3s_Sat_Float(         const LVM_FLOAT *src,
123                              const LVM_FLOAT val,
124                              LVM_FLOAT *dst,
125                              LVM_INT16 n);
126#else
127void Mac3s_Sat_16x16(         const LVM_INT16 *src,
128                              const LVM_INT16 val,
129                                    LVM_INT16 *dst,
130                                    LVM_INT16 n);
131
132void Mac3s_Sat_32x16(         const LVM_INT32  *src,
133                              const LVM_INT16 val,
134                                    LVM_INT32  *dst,
135                                    LVM_INT16 n);
136#endif
137void DelayAllPass_Sat_32x16To32(    LVM_INT32  *delay,              /* Delay buffer */
138                                    LVM_UINT16 size,                /* Delay size */
139                                    LVM_INT16 coeff,                /* All pass filter coefficient */
140                                    LVM_UINT16 DelayOffset,         /* Simple delay offset */
141                                    LVM_UINT16 *pAllPassOffset,     /* All pass filter delay offset */
142                                    LVM_INT32  *dst,                /* Source/destination */
143                                    LVM_INT16 n);
144
145/**********************************************************************************
146    SHIFT FUNCTIONS
147***********************************************************************************/
148#ifdef BUILD_FLOAT
149void Shift_Sat_Float (const   LVM_INT16   val,
150                      const   LVM_FLOAT   *src,
151                      LVM_FLOAT   *dst,
152                      LVM_INT16   n);
153#else
154void Shift_Sat_v16xv16 (      const LVM_INT16 val,
155                              const LVM_INT16 *src,
156                                    LVM_INT16 *dst,
157                                    LVM_INT16 n);
158
159void Shift_Sat_v32xv32 (      const LVM_INT16 val,
160                              const LVM_INT32 *src,
161                                    LVM_INT32 *dst,
162                                    LVM_INT16 n);
163#endif
164/**********************************************************************************
165    AUDIO FORMAT CONVERSION FUNCTIONS
166***********************************************************************************/
167#ifdef BUILD_FLOAT
168void MonoTo2I_Float( const LVM_FLOAT     *src,
169                     LVM_FLOAT     *dst,
170                     LVM_INT16 n);
171#else
172void MonoTo2I_16(             const LVM_INT16 *src,
173                                    LVM_INT16 *dst,
174                                    LVM_INT16 n);
175
176void MonoTo2I_32(             const LVM_INT32  *src,
177                                    LVM_INT32  *dst,
178                                    LVM_INT16 n);
179#endif
180#ifdef BUILD_FLOAT
181void From2iToMono_Float(         const LVM_FLOAT  *src,
182                                 LVM_FLOAT  *dst,
183                                 LVM_INT16 n);
184#else
185void From2iToMono_32(         const LVM_INT32  *src,
186                                    LVM_INT32  *dst,
187                                    LVM_INT16 n);
188#endif
189#ifdef BUILD_FLOAT
190void MSTo2i_Sat_Float(        const LVM_FLOAT *srcM,
191                              const LVM_FLOAT *srcS,
192                              LVM_FLOAT *dst,
193                              LVM_INT16 n );
194#else
195void MSTo2i_Sat_16x16(        const LVM_INT16 *srcM,
196                              const LVM_INT16 *srcS,
197                                    LVM_INT16 *dst,
198                                    LVM_INT16 n );
199#endif
200#ifdef BUILD_FLOAT
201void From2iToMS_Float(        const LVM_FLOAT *src,
202                              LVM_FLOAT *dstM,
203                              LVM_FLOAT *dstS,
204                              LVM_INT16 n );
205#else
206void From2iToMS_16x16(        const LVM_INT16 *src,
207                                    LVM_INT16 *dstM,
208                                    LVM_INT16 *dstS,
209                                    LVM_INT16 n );
210#endif
211#ifdef BUILD_FLOAT
212void JoinTo2i_Float(          const LVM_FLOAT  *srcL,
213                              const LVM_FLOAT  *srcR,
214                              LVM_FLOAT  *dst,
215                              LVM_INT16 n );
216#else
217void From2iToMono_16(         const LVM_INT16 *src,
218                                    LVM_INT16 *dst,
219                                    LVM_INT16 n);
220void JoinTo2i_32x32(          const LVM_INT32  *srcL,
221                              const LVM_INT32  *srcR,
222                              LVM_INT32  *dst,
223                              LVM_INT16 n );
224#endif
225
226/**********************************************************************************
227    DATA TYPE CONVERSION FUNCTIONS
228***********************************************************************************/
229
230void Int16LShiftToInt32_16x32(const LVM_INT16 *src,
231                                    LVM_INT32  *dst,
232                                    LVM_INT16 n,
233                                    LVM_INT16 shift );
234
235void Int32RShiftToInt16_Sat_32x16(const  LVM_INT32  *src,
236                                    LVM_INT16 *dst,
237                                    LVM_INT16 n,
238                                    LVM_INT16 shift );
239
240#ifdef __cplusplus
241}
242#endif /* __cplusplus */
243
244
245/**********************************************************************************/
246
247#endif  /* _VECTOR_ARITHMETIC_H_ */
248
249/**********************************************************************************/
250