|
1 /* |
|
2 * QEMU Mixing engine |
|
3 * |
|
4 * Copyright (c) 2004-2005 Vassili Karpov (malc) |
|
5 * Copyright (c) 1998 Fabrice Bellard |
|
6 * |
|
7 * Permission is hereby granted, free of charge, to any person obtaining a copy |
|
8 * of this software and associated documentation files (the "Software"), to deal |
|
9 * in the Software without restriction, including without limitation the rights |
|
10 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|
11 * copies of the Software, and to permit persons to whom the Software is |
|
12 * furnished to do so, subject to the following conditions: |
|
13 * |
|
14 * The above copyright notice and this permission notice shall be included in |
|
15 * all copies or substantial portions of the Software. |
|
16 * |
|
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|
18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
|
20 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|
21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|
22 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
|
23 * THE SOFTWARE. |
|
24 */ |
|
25 #include "qemu-common.h" |
|
26 #include "audio.h" |
|
27 |
|
28 #define AUDIO_CAP "mixeng" |
|
29 #include "audio_int.h" |
|
30 |
|
31 /* 8 bit */ |
|
32 #define ENDIAN_CONVERSION natural |
|
33 #define ENDIAN_CONVERT(v) (v) |
|
34 |
|
35 /* Signed 8 bit */ |
|
36 #define IN_T int8_t |
|
37 #define IN_MIN SCHAR_MIN |
|
38 #define IN_MAX SCHAR_MAX |
|
39 #define SIGNED |
|
40 #define SHIFT 8 |
|
41 #include "mixeng_template.h" |
|
42 #undef SIGNED |
|
43 #undef IN_MAX |
|
44 #undef IN_MIN |
|
45 #undef IN_T |
|
46 #undef SHIFT |
|
47 |
|
48 /* Unsigned 8 bit */ |
|
49 #define IN_T uint8_t |
|
50 #define IN_MIN 0 |
|
51 #define IN_MAX UCHAR_MAX |
|
52 #define SHIFT 8 |
|
53 #include "mixeng_template.h" |
|
54 #undef IN_MAX |
|
55 #undef IN_MIN |
|
56 #undef IN_T |
|
57 #undef SHIFT |
|
58 |
|
59 #undef ENDIAN_CONVERT |
|
60 #undef ENDIAN_CONVERSION |
|
61 |
|
62 /* Signed 16 bit */ |
|
63 #define IN_T int16_t |
|
64 #define IN_MIN SHRT_MIN |
|
65 #define IN_MAX SHRT_MAX |
|
66 #define SIGNED |
|
67 #define SHIFT 16 |
|
68 #define ENDIAN_CONVERSION natural |
|
69 #define ENDIAN_CONVERT(v) (v) |
|
70 #include "mixeng_template.h" |
|
71 #undef ENDIAN_CONVERT |
|
72 #undef ENDIAN_CONVERSION |
|
73 #define ENDIAN_CONVERSION swap |
|
74 #define ENDIAN_CONVERT(v) bswap16 (v) |
|
75 #include "mixeng_template.h" |
|
76 #undef ENDIAN_CONVERT |
|
77 #undef ENDIAN_CONVERSION |
|
78 #undef SIGNED |
|
79 #undef IN_MAX |
|
80 #undef IN_MIN |
|
81 #undef IN_T |
|
82 #undef SHIFT |
|
83 |
|
84 /* Unsigned 16 bit */ |
|
85 #define IN_T uint16_t |
|
86 #define IN_MIN 0 |
|
87 #define IN_MAX USHRT_MAX |
|
88 #define SHIFT 16 |
|
89 #define ENDIAN_CONVERSION natural |
|
90 #define ENDIAN_CONVERT(v) (v) |
|
91 #include "mixeng_template.h" |
|
92 #undef ENDIAN_CONVERT |
|
93 #undef ENDIAN_CONVERSION |
|
94 #define ENDIAN_CONVERSION swap |
|
95 #define ENDIAN_CONVERT(v) bswap16 (v) |
|
96 #include "mixeng_template.h" |
|
97 #undef ENDIAN_CONVERT |
|
98 #undef ENDIAN_CONVERSION |
|
99 #undef IN_MAX |
|
100 #undef IN_MIN |
|
101 #undef IN_T |
|
102 #undef SHIFT |
|
103 |
|
104 /* Signed 32 bit */ |
|
105 #define IN_T int32_t |
|
106 #define IN_MIN INT32_MIN |
|
107 #define IN_MAX INT32_MAX |
|
108 #define SIGNED |
|
109 #define SHIFT 32 |
|
110 #define ENDIAN_CONVERSION natural |
|
111 #define ENDIAN_CONVERT(v) (v) |
|
112 #include "mixeng_template.h" |
|
113 #undef ENDIAN_CONVERT |
|
114 #undef ENDIAN_CONVERSION |
|
115 #define ENDIAN_CONVERSION swap |
|
116 #define ENDIAN_CONVERT(v) bswap32 (v) |
|
117 #include "mixeng_template.h" |
|
118 #undef ENDIAN_CONVERT |
|
119 #undef ENDIAN_CONVERSION |
|
120 #undef SIGNED |
|
121 #undef IN_MAX |
|
122 #undef IN_MIN |
|
123 #undef IN_T |
|
124 #undef SHIFT |
|
125 |
|
126 /* Unsigned 16 bit */ |
|
127 #define IN_T uint32_t |
|
128 #define IN_MIN 0 |
|
129 #define IN_MAX UINT32_MAX |
|
130 #define SHIFT 32 |
|
131 #define ENDIAN_CONVERSION natural |
|
132 #define ENDIAN_CONVERT(v) (v) |
|
133 #include "mixeng_template.h" |
|
134 #undef ENDIAN_CONVERT |
|
135 #undef ENDIAN_CONVERSION |
|
136 #define ENDIAN_CONVERSION swap |
|
137 #define ENDIAN_CONVERT(v) bswap32 (v) |
|
138 #include "mixeng_template.h" |
|
139 #undef ENDIAN_CONVERT |
|
140 #undef ENDIAN_CONVERSION |
|
141 #undef IN_MAX |
|
142 #undef IN_MIN |
|
143 #undef IN_T |
|
144 #undef SHIFT |
|
145 |
|
146 t_sample *mixeng_conv[2][2][2][3] = { |
|
147 { |
|
148 { |
|
149 { |
|
150 conv_natural_uint8_t_to_mono, |
|
151 conv_natural_uint16_t_to_mono, |
|
152 conv_natural_uint32_t_to_mono |
|
153 }, |
|
154 { |
|
155 conv_natural_uint8_t_to_mono, |
|
156 conv_swap_uint16_t_to_mono, |
|
157 conv_swap_uint32_t_to_mono, |
|
158 } |
|
159 }, |
|
160 { |
|
161 { |
|
162 conv_natural_int8_t_to_mono, |
|
163 conv_natural_int16_t_to_mono, |
|
164 conv_natural_int32_t_to_mono |
|
165 }, |
|
166 { |
|
167 conv_natural_int8_t_to_mono, |
|
168 conv_swap_int16_t_to_mono, |
|
169 conv_swap_int32_t_to_mono |
|
170 } |
|
171 } |
|
172 }, |
|
173 { |
|
174 { |
|
175 { |
|
176 conv_natural_uint8_t_to_stereo, |
|
177 conv_natural_uint16_t_to_stereo, |
|
178 conv_natural_uint32_t_to_stereo |
|
179 }, |
|
180 { |
|
181 conv_natural_uint8_t_to_stereo, |
|
182 conv_swap_uint16_t_to_stereo, |
|
183 conv_swap_uint32_t_to_stereo |
|
184 } |
|
185 }, |
|
186 { |
|
187 { |
|
188 conv_natural_int8_t_to_stereo, |
|
189 conv_natural_int16_t_to_stereo, |
|
190 conv_natural_int32_t_to_stereo |
|
191 }, |
|
192 { |
|
193 conv_natural_int8_t_to_stereo, |
|
194 conv_swap_int16_t_to_stereo, |
|
195 conv_swap_int32_t_to_stereo, |
|
196 } |
|
197 } |
|
198 } |
|
199 }; |
|
200 |
|
201 f_sample *mixeng_clip[2][2][2][3] = { |
|
202 { |
|
203 { |
|
204 { |
|
205 clip_natural_uint8_t_from_mono, |
|
206 clip_natural_uint16_t_from_mono, |
|
207 clip_natural_uint32_t_from_mono |
|
208 }, |
|
209 { |
|
210 clip_natural_uint8_t_from_mono, |
|
211 clip_swap_uint16_t_from_mono, |
|
212 clip_swap_uint32_t_from_mono |
|
213 } |
|
214 }, |
|
215 { |
|
216 { |
|
217 clip_natural_int8_t_from_mono, |
|
218 clip_natural_int16_t_from_mono, |
|
219 clip_natural_int32_t_from_mono |
|
220 }, |
|
221 { |
|
222 clip_natural_int8_t_from_mono, |
|
223 clip_swap_int16_t_from_mono, |
|
224 clip_swap_int32_t_from_mono |
|
225 } |
|
226 } |
|
227 }, |
|
228 { |
|
229 { |
|
230 { |
|
231 clip_natural_uint8_t_from_stereo, |
|
232 clip_natural_uint16_t_from_stereo, |
|
233 clip_natural_uint32_t_from_stereo |
|
234 }, |
|
235 { |
|
236 clip_natural_uint8_t_from_stereo, |
|
237 clip_swap_uint16_t_from_stereo, |
|
238 clip_swap_uint32_t_from_stereo |
|
239 } |
|
240 }, |
|
241 { |
|
242 { |
|
243 clip_natural_int8_t_from_stereo, |
|
244 clip_natural_int16_t_from_stereo, |
|
245 clip_natural_int32_t_from_stereo |
|
246 }, |
|
247 { |
|
248 clip_natural_int8_t_from_stereo, |
|
249 clip_swap_int16_t_from_stereo, |
|
250 clip_swap_int32_t_from_stereo |
|
251 } |
|
252 } |
|
253 } |
|
254 }; |
|
255 |
|
256 /* |
|
257 * August 21, 1998 |
|
258 * Copyright 1998 Fabrice Bellard. |
|
259 * |
|
260 * [Rewrote completly the code of Lance Norskog And Sundry |
|
261 * Contributors with a more efficient algorithm.] |
|
262 * |
|
263 * This source code is freely redistributable and may be used for |
|
264 * any purpose. This copyright notice must be maintained. |
|
265 * Lance Norskog And Sundry Contributors are not responsible for |
|
266 * the consequences of using this software. |
|
267 */ |
|
268 |
|
269 /* |
|
270 * Sound Tools rate change effect file. |
|
271 */ |
|
272 /* |
|
273 * Linear Interpolation. |
|
274 * |
|
275 * The use of fractional increment allows us to use no buffer. It |
|
276 * avoid the problems at the end of the buffer we had with the old |
|
277 * method which stored a possibly big buffer of size |
|
278 * lcm(in_rate,out_rate). |
|
279 * |
|
280 * Limited to 16 bit samples and sampling frequency <= 65535 Hz. If |
|
281 * the input & output frequencies are equal, a delay of one sample is |
|
282 * introduced. Limited to processing 32-bit count worth of samples. |
|
283 * |
|
284 * 1 << FRAC_BITS evaluating to zero in several places. Changed with |
|
285 * an (unsigned long) cast to make it safe. MarkMLl 2/1/99 |
|
286 */ |
|
287 |
|
288 /* Private data */ |
|
289 struct rate { |
|
290 uint64_t opos; |
|
291 uint64_t opos_inc; |
|
292 uint32_t ipos; /* position in the input stream (integer) */ |
|
293 struct st_sample ilast; /* last sample in the input stream */ |
|
294 }; |
|
295 |
|
296 /* |
|
297 * Prepare processing. |
|
298 */ |
|
299 void *st_rate_start (int inrate, int outrate) |
|
300 { |
|
301 struct rate *rate = audio_calloc (AUDIO_FUNC, 1, sizeof (*rate)); |
|
302 |
|
303 if (!rate) { |
|
304 dolog ("Could not allocate resampler (%zu bytes)\n", sizeof (*rate)); |
|
305 return NULL; |
|
306 } |
|
307 |
|
308 rate->opos = 0; |
|
309 |
|
310 /* increment */ |
|
311 rate->opos_inc = ((uint64_t) inrate << 32) / outrate; |
|
312 |
|
313 rate->ipos = 0; |
|
314 rate->ilast.l = 0; |
|
315 rate->ilast.r = 0; |
|
316 return rate; |
|
317 } |
|
318 |
|
319 #define NAME st_rate_flow_mix |
|
320 #define OP(a, b) a += b |
|
321 #include "rate_template.h" |
|
322 |
|
323 #define NAME st_rate_flow |
|
324 #define OP(a, b) a = b |
|
325 #include "rate_template.h" |
|
326 |
|
327 void st_rate_stop (void *opaque) |
|
328 { |
|
329 qemu_free (opaque); |
|
330 } |
|
331 |
|
332 void mixeng_clear (struct st_sample *buf, int len) |
|
333 { |
|
334 memset (buf, 0, len * sizeof (struct st_sample)); |
|
335 } |