Annotation of qemu/audio/mixeng.c, revision 1.1.1.7

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.