|
|
1.1 root 1: /*
2: * QEMU Mixing engine
3: *
1.1.1.2 root 4: * Copyright (c) 2004-2005 Vassili Karpov (malc)
1.1 root 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: */
1.1.1.3 root 25: #include "qemu-common.h"
26: #include "audio.h"
1.1 root 27:
1.1.1.2 root 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 */
1.1 root 36: #define IN_T int8_t
1.1.1.2 root 37: #define IN_MIN SCHAR_MIN
38: #define IN_MAX SCHAR_MAX
1.1 root 39: #define SIGNED
1.1.1.2 root 40: #define SHIFT 8
1.1 root 41: #include "mixeng_template.h"
42: #undef SIGNED
43: #undef IN_MAX
44: #undef IN_MIN
45: #undef IN_T
1.1.1.2 root 46: #undef SHIFT
1.1 root 47:
1.1.1.2 root 48: /* Unsigned 8 bit */
1.1 root 49: #define IN_T uint8_t
50: #define IN_MIN 0
51: #define IN_MAX UCHAR_MAX
1.1.1.2 root 52: #define SHIFT 8
1.1 root 53: #include "mixeng_template.h"
54: #undef IN_MAX
55: #undef IN_MIN
56: #undef IN_T
1.1.1.2 root 57: #undef SHIFT
58:
59: #undef ENDIAN_CONVERT
60: #undef ENDIAN_CONVERSION
1.1 root 61:
1.1.1.2 root 62: /* Signed 16 bit */
1.1 root 63: #define IN_T int16_t
64: #define IN_MIN SHRT_MIN
65: #define IN_MAX SHRT_MAX
66: #define SIGNED
1.1.1.2 root 67: #define SHIFT 16
68: #define ENDIAN_CONVERSION natural
69: #define ENDIAN_CONVERT(v) (v)
1.1 root 70: #include "mixeng_template.h"
1.1.1.2 root 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
1.1 root 78: #undef SIGNED
79: #undef IN_MAX
80: #undef IN_MIN
81: #undef IN_T
1.1.1.2 root 82: #undef SHIFT
1.1 root 83:
1.1.1.3 root 84: /* Unsigned 16 bit */
1.1 root 85: #define IN_T uint16_t
86: #define IN_MIN 0
87: #define IN_MAX USHRT_MAX
1.1.1.2 root 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)
1.1 root 96: #include "mixeng_template.h"
1.1.1.2 root 97: #undef ENDIAN_CONVERT
98: #undef ENDIAN_CONVERSION
1.1 root 99: #undef IN_MAX
100: #undef IN_MIN
101: #undef IN_T
1.1.1.2 root 102: #undef SHIFT
1.1 root 103:
1.1.1.3 root 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:
1.1.1.5 root 126: /* Unsigned 32 bit */
1.1.1.3 root 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] = {
1.1 root 147: {
148: {
1.1.1.2 root 149: {
150: conv_natural_uint8_t_to_mono,
1.1.1.3 root 151: conv_natural_uint16_t_to_mono,
152: conv_natural_uint32_t_to_mono
1.1.1.2 root 153: },
154: {
155: conv_natural_uint8_t_to_mono,
1.1.1.3 root 156: conv_swap_uint16_t_to_mono,
157: conv_swap_uint32_t_to_mono,
1.1.1.2 root 158: }
1.1 root 159: },
160: {
1.1.1.2 root 161: {
162: conv_natural_int8_t_to_mono,
1.1.1.3 root 163: conv_natural_int16_t_to_mono,
164: conv_natural_int32_t_to_mono
1.1.1.2 root 165: },
166: {
167: conv_natural_int8_t_to_mono,
1.1.1.3 root 168: conv_swap_int16_t_to_mono,
169: conv_swap_int32_t_to_mono
1.1.1.2 root 170: }
1.1 root 171: }
172: },
173: {
174: {
1.1.1.2 root 175: {
176: conv_natural_uint8_t_to_stereo,
1.1.1.3 root 177: conv_natural_uint16_t_to_stereo,
178: conv_natural_uint32_t_to_stereo
1.1.1.2 root 179: },
180: {
181: conv_natural_uint8_t_to_stereo,
1.1.1.3 root 182: conv_swap_uint16_t_to_stereo,
183: conv_swap_uint32_t_to_stereo
1.1.1.2 root 184: }
1.1 root 185: },
186: {
1.1.1.2 root 187: {
188: conv_natural_int8_t_to_stereo,
1.1.1.3 root 189: conv_natural_int16_t_to_stereo,
190: conv_natural_int32_t_to_stereo
1.1.1.2 root 191: },
192: {
193: conv_natural_int8_t_to_stereo,
1.1.1.3 root 194: conv_swap_int16_t_to_stereo,
195: conv_swap_int32_t_to_stereo,
1.1.1.2 root 196: }
1.1 root 197: }
198: }
199: };
200:
1.1.1.3 root 201: f_sample *mixeng_clip[2][2][2][3] = {
1.1 root 202: {
203: {
1.1.1.2 root 204: {
205: clip_natural_uint8_t_from_mono,
1.1.1.3 root 206: clip_natural_uint16_t_from_mono,
207: clip_natural_uint32_t_from_mono
1.1.1.2 root 208: },
209: {
210: clip_natural_uint8_t_from_mono,
1.1.1.3 root 211: clip_swap_uint16_t_from_mono,
212: clip_swap_uint32_t_from_mono
1.1.1.2 root 213: }
1.1 root 214: },
215: {
1.1.1.2 root 216: {
217: clip_natural_int8_t_from_mono,
1.1.1.3 root 218: clip_natural_int16_t_from_mono,
219: clip_natural_int32_t_from_mono
1.1.1.2 root 220: },
221: {
222: clip_natural_int8_t_from_mono,
1.1.1.3 root 223: clip_swap_int16_t_from_mono,
224: clip_swap_int32_t_from_mono
1.1.1.2 root 225: }
1.1 root 226: }
227: },
228: {
229: {
1.1.1.2 root 230: {
231: clip_natural_uint8_t_from_stereo,
1.1.1.3 root 232: clip_natural_uint16_t_from_stereo,
233: clip_natural_uint32_t_from_stereo
1.1.1.2 root 234: },
235: {
236: clip_natural_uint8_t_from_stereo,
1.1.1.3 root 237: clip_swap_uint16_t_from_stereo,
238: clip_swap_uint32_t_from_stereo
1.1.1.2 root 239: }
1.1 root 240: },
241: {
1.1.1.2 root 242: {
243: clip_natural_int8_t_from_stereo,
1.1.1.3 root 244: clip_natural_int16_t_from_stereo,
245: clip_natural_int32_t_from_stereo
1.1.1.2 root 246: },
247: {
248: clip_natural_int8_t_from_stereo,
1.1.1.3 root 249: clip_swap_int16_t_from_stereo,
250: clip_swap_int32_t_from_stereo
1.1.1.2 root 251: }
1.1 root 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
1.1.1.2 root 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.
1.1 root 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 */
1.1.1.2 root 289: struct rate {
1.1 root 290: uint64_t opos;
291: uint64_t opos_inc;
292: uint32_t ipos; /* position in the input stream (integer) */
1.1.1.4 root 293: struct st_sample ilast; /* last sample in the input stream */
1.1.1.2 root 294: };
1.1 root 295:
296: /*
297: * Prepare processing.
298: */
299: void *st_rate_start (int inrate, int outrate)
300: {
1.1.1.2 root 301: struct rate *rate = audio_calloc (AUDIO_FUNC, 1, sizeof (*rate));
1.1 root 302:
303: if (!rate) {
1.1.1.2 root 304: dolog ("Could not allocate resampler (%zu bytes)\n", sizeof (*rate));
305: return NULL;
1.1 root 306: }
307:
308: rate->opos = 0;
309:
310: /* increment */
1.1.1.2 root 311: rate->opos_inc = ((uint64_t) inrate << 32) / outrate;
1.1 root 312:
313: rate->ipos = 0;
314: rate->ilast.l = 0;
315: rate->ilast.r = 0;
316: return rate;
317: }
318:
1.1.1.2 root 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"
1.1 root 326:
327: void st_rate_stop (void *opaque)
328: {
1.1.1.7 ! root 329: g_free (opaque);
1.1 root 330: }
1.1.1.2 root 331:
1.1.1.4 root 332: void mixeng_clear (struct st_sample *buf, int len)
1.1.1.2 root 333: {
1.1.1.4 root 334: memset (buf, 0, len * sizeof (struct st_sample));
1.1.1.2 root 335: }
1.1.1.6 root 336:
337: void mixeng_volume (struct st_sample *buf, int len, struct mixeng_volume *vol)
338: {
339: #ifdef CONFIG_MIXEMU
340: if (vol->mute) {
341: mixeng_clear (buf, len);
342: return;
343: }
344:
345: while (len--) {
346: #ifdef FLOAT_MIXENG
347: buf->l = buf->l * vol->l;
348: buf->r = buf->r * vol->r;
349: #else
350: buf->l = (buf->l * vol->l) >> 32;
351: buf->r = (buf->r * vol->r) >> 32;
352: #endif
353: buf += 1;
354: }
355: #else
356: (void) buf;
357: (void) len;
358: (void) vol;
359: #endif
360: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.