1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25: #include "qemu-common.h"
26: #include "audio.h"
27:
28: #define AUDIO_CAP "mixeng"
29: #include "audio_int.h"
30:
31: #define NOVOL
32:
33:
34: #define ENDIAN_CONVERSION natural
35: #define ENDIAN_CONVERT(v) (v)
36:
37:
38: #define IN_T int8_t
39: #define IN_MIN SCHAR_MIN
40: #define IN_MAX SCHAR_MAX
41: #define SIGNED
42: #define SHIFT 8
43: #include "mixeng_template.h"
44: #undef SIGNED
45: #undef IN_MAX
46: #undef IN_MIN
47: #undef IN_T
48: #undef SHIFT
49:
50:
51: #define IN_T uint8_t
52: #define IN_MIN 0
53: #define IN_MAX UCHAR_MAX
54: #define SHIFT 8
55: #include "mixeng_template.h"
56: #undef IN_MAX
57: #undef IN_MIN
58: #undef IN_T
59: #undef SHIFT
60:
61: #undef ENDIAN_CONVERT
62: #undef ENDIAN_CONVERSION
63:
64:
65: #define IN_T int16_t
66: #define IN_MIN SHRT_MIN
67: #define IN_MAX SHRT_MAX
68: #define SIGNED
69: #define SHIFT 16
70: #define ENDIAN_CONVERSION natural
71: #define ENDIAN_CONVERT(v) (v)
72: #include "mixeng_template.h"
73: #undef ENDIAN_CONVERT
74: #undef ENDIAN_CONVERSION
75: #define ENDIAN_CONVERSION swap
76: #define ENDIAN_CONVERT(v) bswap16 (v)
77: #include "mixeng_template.h"
78: #undef ENDIAN_CONVERT
79: #undef ENDIAN_CONVERSION
80: #undef SIGNED
81: #undef IN_MAX
82: #undef IN_MIN
83: #undef IN_T
84: #undef SHIFT
85:
86:
87: #define IN_T uint16_t
88: #define IN_MIN 0
89: #define IN_MAX USHRT_MAX
90: #define SHIFT 16
91: #define ENDIAN_CONVERSION natural
92: #define ENDIAN_CONVERT(v) (v)
93: #include "mixeng_template.h"
94: #undef ENDIAN_CONVERT
95: #undef ENDIAN_CONVERSION
96: #define ENDIAN_CONVERSION swap
97: #define ENDIAN_CONVERT(v) bswap16 (v)
98: #include "mixeng_template.h"
99: #undef ENDIAN_CONVERT
100: #undef ENDIAN_CONVERSION
101: #undef IN_MAX
102: #undef IN_MIN
103: #undef IN_T
104: #undef SHIFT
105:
106:
107: #define IN_T int32_t
108: #define IN_MIN INT32_MIN
109: #define IN_MAX INT32_MAX
110: #define SIGNED
111: #define SHIFT 32
112: #define ENDIAN_CONVERSION natural
113: #define ENDIAN_CONVERT(v) (v)
114: #include "mixeng_template.h"
115: #undef ENDIAN_CONVERT
116: #undef ENDIAN_CONVERSION
117: #define ENDIAN_CONVERSION swap
118: #define ENDIAN_CONVERT(v) bswap32 (v)
119: #include "mixeng_template.h"
120: #undef ENDIAN_CONVERT
121: #undef ENDIAN_CONVERSION
122: #undef SIGNED
123: #undef IN_MAX
124: #undef IN_MIN
125: #undef IN_T
126: #undef SHIFT
127:
128:
129: #define IN_T uint32_t
130: #define IN_MIN 0
131: #define IN_MAX UINT32_MAX
132: #define SHIFT 32
133: #define ENDIAN_CONVERSION natural
134: #define ENDIAN_CONVERT(v) (v)
135: #include "mixeng_template.h"
136: #undef ENDIAN_CONVERT
137: #undef ENDIAN_CONVERSION
138: #define ENDIAN_CONVERSION swap
139: #define ENDIAN_CONVERT(v) bswap32 (v)
140: #include "mixeng_template.h"
141: #undef ENDIAN_CONVERT
142: #undef ENDIAN_CONVERSION
143: #undef IN_MAX
144: #undef IN_MIN
145: #undef IN_T
146: #undef SHIFT
147:
148: t_sample *mixeng_conv[2][2][2][3] = {
149: {
150: {
151: {
152: conv_natural_uint8_t_to_mono,
153: conv_natural_uint16_t_to_mono,
154: conv_natural_uint32_t_to_mono
155: },
156: {
157: conv_natural_uint8_t_to_mono,
158: conv_swap_uint16_t_to_mono,
159: conv_swap_uint32_t_to_mono,
160: }
161: },
162: {
163: {
164: conv_natural_int8_t_to_mono,
165: conv_natural_int16_t_to_mono,
166: conv_natural_int32_t_to_mono
167: },
168: {
169: conv_natural_int8_t_to_mono,
170: conv_swap_int16_t_to_mono,
171: conv_swap_int32_t_to_mono
172: }
173: }
174: },
175: {
176: {
177: {
178: conv_natural_uint8_t_to_stereo,
179: conv_natural_uint16_t_to_stereo,
180: conv_natural_uint32_t_to_stereo
181: },
182: {
183: conv_natural_uint8_t_to_stereo,
184: conv_swap_uint16_t_to_stereo,
185: conv_swap_uint32_t_to_stereo
186: }
187: },
188: {
189: {
190: conv_natural_int8_t_to_stereo,
191: conv_natural_int16_t_to_stereo,
192: conv_natural_int32_t_to_stereo
193: },
194: {
195: conv_natural_int8_t_to_stereo,
196: conv_swap_int16_t_to_stereo,
197: conv_swap_int32_t_to_stereo,
198: }
199: }
200: }
201: };
202:
203: f_sample *mixeng_clip[2][2][2][3] = {
204: {
205: {
206: {
207: clip_natural_uint8_t_from_mono,
208: clip_natural_uint16_t_from_mono,
209: clip_natural_uint32_t_from_mono
210: },
211: {
212: clip_natural_uint8_t_from_mono,
213: clip_swap_uint16_t_from_mono,
214: clip_swap_uint32_t_from_mono
215: }
216: },
217: {
218: {
219: clip_natural_int8_t_from_mono,
220: clip_natural_int16_t_from_mono,
221: clip_natural_int32_t_from_mono
222: },
223: {
224: clip_natural_int8_t_from_mono,
225: clip_swap_int16_t_from_mono,
226: clip_swap_int32_t_from_mono
227: }
228: }
229: },
230: {
231: {
232: {
233: clip_natural_uint8_t_from_stereo,
234: clip_natural_uint16_t_from_stereo,
235: clip_natural_uint32_t_from_stereo
236: },
237: {
238: clip_natural_uint8_t_from_stereo,
239: clip_swap_uint16_t_from_stereo,
240: clip_swap_uint32_t_from_stereo
241: }
242: },
243: {
244: {
245: clip_natural_int8_t_from_stereo,
246: clip_natural_int16_t_from_stereo,
247: clip_natural_int32_t_from_stereo
248: },
249: {
250: clip_natural_int8_t_from_stereo,
251: clip_swap_int16_t_from_stereo,
252: clip_swap_int32_t_from_stereo
253: }
254: }
255: }
256: };
257:
258:
259:
260:
261:
262:
263:
264:
265:
266:
267:
268:
269:
270:
271:
272:
273:
274:
275:
276:
277:
278:
279:
280:
281:
282:
283:
284:
285:
286:
287:
288:
289:
290:
291: struct rate {
292: uint64_t opos;
293: uint64_t opos_inc;
294: uint32_t ipos;
295: st_sample_t ilast;
296: };
297:
298:
299:
300:
301: void *st_rate_start (int inrate, int outrate)
302: {
303: struct rate *rate = audio_calloc (AUDIO_FUNC, 1, sizeof (*rate));
304:
305: if (!rate) {
306: dolog ("Could not allocate resampler (%zu bytes)\n", sizeof (*rate));
307: return NULL;
308: }
309:
310: rate->opos = 0;
311:
312:
313: rate->opos_inc = ((uint64_t) inrate << 32) / outrate;
314:
315: rate->ipos = 0;
316: rate->ilast.l = 0;
317: rate->ilast.r = 0;
318: return rate;
319: }
320:
321: #define NAME st_rate_flow_mix
322: #define OP(a, b) a += b
323: #include "rate_template.h"
324:
325: #define NAME st_rate_flow
326: #define OP(a, b) a = b
327: #include "rate_template.h"
328:
329: void st_rate_stop (void *opaque)
330: {
331: qemu_free (opaque);
332: }
333:
334: void mixeng_clear (st_sample_t *buf, int len)
335: {
336: memset (buf, 0, len * sizeof (st_sample_t));
337: }