]> git.proxmox.com Git - mirror_qemu.git/blame - audio/mixeng.c
Fix 64-bit host register corruption.
[mirror_qemu.git] / audio / mixeng.c
CommitLineData
85571bc7
FB
1/*
2 * QEMU Mixing engine
3 *
1d14ffa9 4 * Copyright (c) 2004-2005 Vassili Karpov (malc)
85571bc7
FB
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 "vl.h"
85571bc7 26
1d14ffa9
FB
27#define AUDIO_CAP "mixeng"
28#include "audio_int.h"
29
30#define NOVOL
31
32/* 8 bit */
33#define ENDIAN_CONVERSION natural
34#define ENDIAN_CONVERT(v) (v)
35
36/* Signed 8 bit */
85571bc7 37#define IN_T int8_t
1d14ffa9
FB
38#define IN_MIN SCHAR_MIN
39#define IN_MAX SCHAR_MAX
85571bc7 40#define SIGNED
1d14ffa9 41#define SHIFT 8
85571bc7
FB
42#include "mixeng_template.h"
43#undef SIGNED
44#undef IN_MAX
45#undef IN_MIN
46#undef IN_T
1d14ffa9 47#undef SHIFT
85571bc7 48
1d14ffa9 49/* Unsigned 8 bit */
85571bc7
FB
50#define IN_T uint8_t
51#define IN_MIN 0
52#define IN_MAX UCHAR_MAX
1d14ffa9 53#define SHIFT 8
85571bc7
FB
54#include "mixeng_template.h"
55#undef IN_MAX
56#undef IN_MIN
57#undef IN_T
1d14ffa9
FB
58#undef SHIFT
59
60#undef ENDIAN_CONVERT
61#undef ENDIAN_CONVERSION
85571bc7 62
1d14ffa9 63/* Signed 16 bit */
85571bc7
FB
64#define IN_T int16_t
65#define IN_MIN SHRT_MIN
66#define IN_MAX SHRT_MAX
67#define SIGNED
1d14ffa9
FB
68#define SHIFT 16
69#define ENDIAN_CONVERSION natural
70#define ENDIAN_CONVERT(v) (v)
85571bc7 71#include "mixeng_template.h"
1d14ffa9
FB
72#undef ENDIAN_CONVERT
73#undef ENDIAN_CONVERSION
74#define ENDIAN_CONVERSION swap
75#define ENDIAN_CONVERT(v) bswap16 (v)
76#include "mixeng_template.h"
77#undef ENDIAN_CONVERT
78#undef ENDIAN_CONVERSION
85571bc7
FB
79#undef SIGNED
80#undef IN_MAX
81#undef IN_MIN
82#undef IN_T
1d14ffa9 83#undef SHIFT
85571bc7
FB
84
85#define IN_T uint16_t
86#define IN_MIN 0
87#define IN_MAX USHRT_MAX
1d14ffa9
FB
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)
85571bc7 96#include "mixeng_template.h"
1d14ffa9
FB
97#undef ENDIAN_CONVERT
98#undef ENDIAN_CONVERSION
85571bc7
FB
99#undef IN_MAX
100#undef IN_MIN
101#undef IN_T
1d14ffa9 102#undef SHIFT
85571bc7 103
1d14ffa9 104t_sample *mixeng_conv[2][2][2][2] = {
85571bc7
FB
105 {
106 {
1d14ffa9
FB
107 {
108 conv_natural_uint8_t_to_mono,
109 conv_natural_uint16_t_to_mono
110 },
111 {
112 conv_natural_uint8_t_to_mono,
113 conv_swap_uint16_t_to_mono
114 }
85571bc7
FB
115 },
116 {
1d14ffa9
FB
117 {
118 conv_natural_int8_t_to_mono,
119 conv_natural_int16_t_to_mono
120 },
121 {
122 conv_natural_int8_t_to_mono,
123 conv_swap_int16_t_to_mono
124 }
85571bc7
FB
125 }
126 },
127 {
128 {
1d14ffa9
FB
129 {
130 conv_natural_uint8_t_to_stereo,
131 conv_natural_uint16_t_to_stereo
132 },
133 {
134 conv_natural_uint8_t_to_stereo,
135 conv_swap_uint16_t_to_stereo
136 }
85571bc7
FB
137 },
138 {
1d14ffa9
FB
139 {
140 conv_natural_int8_t_to_stereo,
141 conv_natural_int16_t_to_stereo
142 },
143 {
144 conv_natural_int8_t_to_stereo,
145 conv_swap_int16_t_to_stereo
146 }
85571bc7
FB
147 }
148 }
149};
150
1d14ffa9 151f_sample *mixeng_clip[2][2][2][2] = {
85571bc7
FB
152 {
153 {
1d14ffa9
FB
154 {
155 clip_natural_uint8_t_from_mono,
156 clip_natural_uint16_t_from_mono
157 },
158 {
159 clip_natural_uint8_t_from_mono,
160 clip_swap_uint16_t_from_mono
161 }
85571bc7
FB
162 },
163 {
1d14ffa9
FB
164 {
165 clip_natural_int8_t_from_mono,
166 clip_natural_int16_t_from_mono
167 },
168 {
169 clip_natural_int8_t_from_mono,
170 clip_swap_int16_t_from_mono
171 }
85571bc7
FB
172 }
173 },
174 {
175 {
1d14ffa9
FB
176 {
177 clip_natural_uint8_t_from_stereo,
178 clip_natural_uint16_t_from_stereo
179 },
180 {
181 clip_natural_uint8_t_from_stereo,
182 clip_swap_uint16_t_from_stereo
183 }
85571bc7
FB
184 },
185 {
1d14ffa9
FB
186 {
187 clip_natural_int8_t_from_stereo,
188 clip_natural_int16_t_from_stereo
189 },
190 {
191 clip_natural_int8_t_from_stereo,
192 clip_swap_int16_t_from_stereo
193 }
85571bc7
FB
194 }
195 }
196};
197
198/*
199 * August 21, 1998
200 * Copyright 1998 Fabrice Bellard.
201 *
202 * [Rewrote completly the code of Lance Norskog And Sundry
203 * Contributors with a more efficient algorithm.]
204 *
205 * This source code is freely redistributable and may be used for
1d14ffa9
FB
206 * any purpose. This copyright notice must be maintained.
207 * Lance Norskog And Sundry Contributors are not responsible for
208 * the consequences of using this software.
85571bc7
FB
209 */
210
211/*
212 * Sound Tools rate change effect file.
213 */
214/*
215 * Linear Interpolation.
216 *
217 * The use of fractional increment allows us to use no buffer. It
218 * avoid the problems at the end of the buffer we had with the old
219 * method which stored a possibly big buffer of size
220 * lcm(in_rate,out_rate).
221 *
222 * Limited to 16 bit samples and sampling frequency <= 65535 Hz. If
223 * the input & output frequencies are equal, a delay of one sample is
224 * introduced. Limited to processing 32-bit count worth of samples.
225 *
226 * 1 << FRAC_BITS evaluating to zero in several places. Changed with
227 * an (unsigned long) cast to make it safe. MarkMLl 2/1/99
228 */
229
230/* Private data */
c0fe3827 231struct rate {
85571bc7
FB
232 uint64_t opos;
233 uint64_t opos_inc;
234 uint32_t ipos; /* position in the input stream (integer) */
235 st_sample_t ilast; /* last sample in the input stream */
c0fe3827 236};
85571bc7
FB
237
238/*
239 * Prepare processing.
240 */
241void *st_rate_start (int inrate, int outrate)
242{
c0fe3827 243 struct rate *rate = audio_calloc (AUDIO_FUNC, 1, sizeof (*rate));
85571bc7
FB
244
245 if (!rate) {
e7cad338 246 dolog ("Could not allocate resampler (%zu bytes)\n", sizeof (*rate));
1d14ffa9 247 return NULL;
85571bc7
FB
248 }
249
250 rate->opos = 0;
251
252 /* increment */
1d14ffa9 253 rate->opos_inc = ((uint64_t) inrate << 32) / outrate;
85571bc7
FB
254
255 rate->ipos = 0;
256 rate->ilast.l = 0;
257 rate->ilast.r = 0;
258 return rate;
259}
260
1d14ffa9
FB
261#define NAME st_rate_flow_mix
262#define OP(a, b) a += b
263#include "rate_template.h"
85571bc7 264
1d14ffa9
FB
265#define NAME st_rate_flow
266#define OP(a, b) a = b
267#include "rate_template.h"
85571bc7
FB
268
269void st_rate_stop (void *opaque)
270{
271 qemu_free (opaque);
272}
1d14ffa9
FB
273
274void mixeng_clear (st_sample_t *buf, int len)
275{
276 memset (buf, 0, len * sizeof (st_sample_t));
277}