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 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 } 336