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 32 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 146t_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 201f_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 */ 289struct 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 */ 299void *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 327void st_rate_stop (void *opaque) 328{ 329 qemu_free (opaque); 330} 331 332void mixeng_clear (struct st_sample *buf, int len) 333{ 334 memset (buf, 0, len * sizeof (struct st_sample)); 335} 336