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

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.1.8 ! root       36: #define BSIZE 8
        !            37: #define ITYPE int
1.1.1.2   root       38: #define IN_MIN SCHAR_MIN
                     39: #define IN_MAX SCHAR_MAX
1.1       root       40: #define SIGNED
1.1.1.2   root       41: #define SHIFT 8
1.1       root       42: #include "mixeng_template.h"
                     43: #undef SIGNED
                     44: #undef IN_MAX
                     45: #undef IN_MIN
1.1.1.8 ! root       46: #undef BSIZE
        !            47: #undef ITYPE
1.1.1.2   root       48: #undef SHIFT
1.1       root       49: 
1.1.1.2   root       50: /* Unsigned 8 bit */
1.1.1.8 ! root       51: #define BSIZE 8
        !            52: #define ITYPE uint
1.1       root       53: #define IN_MIN 0
                     54: #define IN_MAX UCHAR_MAX
1.1.1.2   root       55: #define SHIFT 8
1.1       root       56: #include "mixeng_template.h"
                     57: #undef IN_MAX
                     58: #undef IN_MIN
1.1.1.8 ! root       59: #undef BSIZE
        !            60: #undef ITYPE
1.1.1.2   root       61: #undef SHIFT
                     62: 
                     63: #undef ENDIAN_CONVERT
                     64: #undef ENDIAN_CONVERSION
1.1       root       65: 
1.1.1.2   root       66: /* Signed 16 bit */
1.1.1.8 ! root       67: #define BSIZE 16
        !            68: #define ITYPE int
1.1       root       69: #define IN_MIN SHRT_MIN
                     70: #define IN_MAX SHRT_MAX
                     71: #define SIGNED
1.1.1.2   root       72: #define SHIFT 16
                     73: #define ENDIAN_CONVERSION natural
                     74: #define ENDIAN_CONVERT(v) (v)
1.1       root       75: #include "mixeng_template.h"
1.1.1.2   root       76: #undef ENDIAN_CONVERT
                     77: #undef ENDIAN_CONVERSION
                     78: #define ENDIAN_CONVERSION swap
                     79: #define ENDIAN_CONVERT(v) bswap16 (v)
                     80: #include "mixeng_template.h"
                     81: #undef ENDIAN_CONVERT
                     82: #undef ENDIAN_CONVERSION
1.1       root       83: #undef SIGNED
                     84: #undef IN_MAX
                     85: #undef IN_MIN
1.1.1.8 ! root       86: #undef BSIZE
        !            87: #undef ITYPE
1.1.1.2   root       88: #undef SHIFT
1.1       root       89: 
1.1.1.3   root       90: /* Unsigned 16 bit */
1.1.1.8 ! root       91: #define BSIZE 16
        !            92: #define ITYPE uint
1.1       root       93: #define IN_MIN 0
                     94: #define IN_MAX USHRT_MAX
1.1.1.2   root       95: #define SHIFT 16
                     96: #define ENDIAN_CONVERSION natural
                     97: #define ENDIAN_CONVERT(v) (v)
                     98: #include "mixeng_template.h"
                     99: #undef ENDIAN_CONVERT
                    100: #undef ENDIAN_CONVERSION
                    101: #define ENDIAN_CONVERSION swap
                    102: #define ENDIAN_CONVERT(v) bswap16 (v)
1.1       root      103: #include "mixeng_template.h"
1.1.1.2   root      104: #undef ENDIAN_CONVERT
                    105: #undef ENDIAN_CONVERSION
1.1       root      106: #undef IN_MAX
                    107: #undef IN_MIN
1.1.1.8 ! root      108: #undef BSIZE
        !           109: #undef ITYPE
1.1.1.2   root      110: #undef SHIFT
1.1       root      111: 
1.1.1.3   root      112: /* Signed 32 bit */
1.1.1.8 ! root      113: #define BSIZE 32
        !           114: #define ITYPE int
1.1.1.3   root      115: #define IN_MIN INT32_MIN
                    116: #define IN_MAX INT32_MAX
                    117: #define SIGNED
                    118: #define SHIFT 32
                    119: #define ENDIAN_CONVERSION natural
                    120: #define ENDIAN_CONVERT(v) (v)
                    121: #include "mixeng_template.h"
                    122: #undef ENDIAN_CONVERT
                    123: #undef ENDIAN_CONVERSION
                    124: #define ENDIAN_CONVERSION swap
                    125: #define ENDIAN_CONVERT(v) bswap32 (v)
                    126: #include "mixeng_template.h"
                    127: #undef ENDIAN_CONVERT
                    128: #undef ENDIAN_CONVERSION
                    129: #undef SIGNED
                    130: #undef IN_MAX
                    131: #undef IN_MIN
1.1.1.8 ! root      132: #undef BSIZE
        !           133: #undef ITYPE
1.1.1.3   root      134: #undef SHIFT
                    135: 
1.1.1.5   root      136: /* Unsigned 32 bit */
1.1.1.8 ! root      137: #define BSIZE 32
        !           138: #define ITYPE uint
1.1.1.3   root      139: #define IN_MIN 0
                    140: #define IN_MAX UINT32_MAX
                    141: #define SHIFT 32
                    142: #define ENDIAN_CONVERSION natural
                    143: #define ENDIAN_CONVERT(v) (v)
                    144: #include "mixeng_template.h"
                    145: #undef ENDIAN_CONVERT
                    146: #undef ENDIAN_CONVERSION
                    147: #define ENDIAN_CONVERSION swap
                    148: #define ENDIAN_CONVERT(v) bswap32 (v)
                    149: #include "mixeng_template.h"
                    150: #undef ENDIAN_CONVERT
                    151: #undef ENDIAN_CONVERSION
                    152: #undef IN_MAX
                    153: #undef IN_MIN
1.1.1.8 ! root      154: #undef BSIZE
        !           155: #undef ITYPE
1.1.1.3   root      156: #undef SHIFT
                    157: 
                    158: t_sample *mixeng_conv[2][2][2][3] = {
1.1       root      159:     {
                    160:         {
1.1.1.2   root      161:             {
                    162:                 conv_natural_uint8_t_to_mono,
1.1.1.3   root      163:                 conv_natural_uint16_t_to_mono,
                    164:                 conv_natural_uint32_t_to_mono
1.1.1.2   root      165:             },
                    166:             {
                    167:                 conv_natural_uint8_t_to_mono,
1.1.1.3   root      168:                 conv_swap_uint16_t_to_mono,
                    169:                 conv_swap_uint32_t_to_mono,
1.1.1.2   root      170:             }
1.1       root      171:         },
                    172:         {
1.1.1.2   root      173:             {
                    174:                 conv_natural_int8_t_to_mono,
1.1.1.3   root      175:                 conv_natural_int16_t_to_mono,
                    176:                 conv_natural_int32_t_to_mono
1.1.1.2   root      177:             },
                    178:             {
                    179:                 conv_natural_int8_t_to_mono,
1.1.1.3   root      180:                 conv_swap_int16_t_to_mono,
                    181:                 conv_swap_int32_t_to_mono
1.1.1.2   root      182:             }
1.1       root      183:         }
                    184:     },
                    185:     {
                    186:         {
1.1.1.2   root      187:             {
                    188:                 conv_natural_uint8_t_to_stereo,
1.1.1.3   root      189:                 conv_natural_uint16_t_to_stereo,
                    190:                 conv_natural_uint32_t_to_stereo
1.1.1.2   root      191:             },
                    192:             {
                    193:                 conv_natural_uint8_t_to_stereo,
1.1.1.3   root      194:                 conv_swap_uint16_t_to_stereo,
                    195:                 conv_swap_uint32_t_to_stereo
1.1.1.2   root      196:             }
1.1       root      197:         },
                    198:         {
1.1.1.2   root      199:             {
                    200:                 conv_natural_int8_t_to_stereo,
1.1.1.3   root      201:                 conv_natural_int16_t_to_stereo,
                    202:                 conv_natural_int32_t_to_stereo
1.1.1.2   root      203:             },
                    204:             {
                    205:                 conv_natural_int8_t_to_stereo,
1.1.1.3   root      206:                 conv_swap_int16_t_to_stereo,
                    207:                 conv_swap_int32_t_to_stereo,
1.1.1.2   root      208:             }
1.1       root      209:         }
                    210:     }
                    211: };
                    212: 
1.1.1.3   root      213: f_sample *mixeng_clip[2][2][2][3] = {
1.1       root      214:     {
                    215:         {
1.1.1.2   root      216:             {
                    217:                 clip_natural_uint8_t_from_mono,
1.1.1.3   root      218:                 clip_natural_uint16_t_from_mono,
                    219:                 clip_natural_uint32_t_from_mono
1.1.1.2   root      220:             },
                    221:             {
                    222:                 clip_natural_uint8_t_from_mono,
1.1.1.3   root      223:                 clip_swap_uint16_t_from_mono,
                    224:                 clip_swap_uint32_t_from_mono
1.1.1.2   root      225:             }
1.1       root      226:         },
                    227:         {
1.1.1.2   root      228:             {
                    229:                 clip_natural_int8_t_from_mono,
1.1.1.3   root      230:                 clip_natural_int16_t_from_mono,
                    231:                 clip_natural_int32_t_from_mono
1.1.1.2   root      232:             },
                    233:             {
                    234:                 clip_natural_int8_t_from_mono,
1.1.1.3   root      235:                 clip_swap_int16_t_from_mono,
                    236:                 clip_swap_int32_t_from_mono
1.1.1.2   root      237:             }
1.1       root      238:         }
                    239:     },
                    240:     {
                    241:         {
1.1.1.2   root      242:             {
                    243:                 clip_natural_uint8_t_from_stereo,
1.1.1.3   root      244:                 clip_natural_uint16_t_from_stereo,
                    245:                 clip_natural_uint32_t_from_stereo
1.1.1.2   root      246:             },
                    247:             {
                    248:                 clip_natural_uint8_t_from_stereo,
1.1.1.3   root      249:                 clip_swap_uint16_t_from_stereo,
                    250:                 clip_swap_uint32_t_from_stereo
1.1.1.2   root      251:             }
1.1       root      252:         },
                    253:         {
1.1.1.2   root      254:             {
                    255:                 clip_natural_int8_t_from_stereo,
1.1.1.3   root      256:                 clip_natural_int16_t_from_stereo,
                    257:                 clip_natural_int32_t_from_stereo
1.1.1.2   root      258:             },
                    259:             {
                    260:                 clip_natural_int8_t_from_stereo,
1.1.1.3   root      261:                 clip_swap_int16_t_from_stereo,
                    262:                 clip_swap_int32_t_from_stereo
1.1.1.2   root      263:             }
1.1       root      264:         }
                    265:     }
                    266: };
                    267: 
                    268: /*
                    269:  * August 21, 1998
                    270:  * Copyright 1998 Fabrice Bellard.
                    271:  *
                    272:  * [Rewrote completly the code of Lance Norskog And Sundry
                    273:  * Contributors with a more efficient algorithm.]
                    274:  *
                    275:  * This source code is freely redistributable and may be used for
1.1.1.2   root      276:  * any purpose.  This copyright notice must be maintained.
                    277:  * Lance Norskog And Sundry Contributors are not responsible for
                    278:  * the consequences of using this software.
1.1       root      279:  */
                    280: 
                    281: /*
                    282:  * Sound Tools rate change effect file.
                    283:  */
                    284: /*
                    285:  * Linear Interpolation.
                    286:  *
                    287:  * The use of fractional increment allows us to use no buffer. It
                    288:  * avoid the problems at the end of the buffer we had with the old
                    289:  * method which stored a possibly big buffer of size
                    290:  * lcm(in_rate,out_rate).
                    291:  *
                    292:  * Limited to 16 bit samples and sampling frequency <= 65535 Hz. If
                    293:  * the input & output frequencies are equal, a delay of one sample is
                    294:  * introduced.  Limited to processing 32-bit count worth of samples.
                    295:  *
                    296:  * 1 << FRAC_BITS evaluating to zero in several places.  Changed with
                    297:  * an (unsigned long) cast to make it safe.  MarkMLl 2/1/99
                    298:  */
                    299: 
                    300: /* Private data */
1.1.1.2   root      301: struct rate {
1.1       root      302:     uint64_t opos;
                    303:     uint64_t opos_inc;
                    304:     uint32_t ipos;              /* position in the input stream (integer) */
1.1.1.4   root      305:     struct st_sample ilast;          /* last sample in the input stream */
1.1.1.2   root      306: };
1.1       root      307: 
                    308: /*
                    309:  * Prepare processing.
                    310:  */
                    311: void *st_rate_start (int inrate, int outrate)
                    312: {
1.1.1.2   root      313:     struct rate *rate = audio_calloc (AUDIO_FUNC, 1, sizeof (*rate));
1.1       root      314: 
                    315:     if (!rate) {
1.1.1.2   root      316:         dolog ("Could not allocate resampler (%zu bytes)\n", sizeof (*rate));
                    317:         return NULL;
1.1       root      318:     }
                    319: 
                    320:     rate->opos = 0;
                    321: 
                    322:     /* increment */
1.1.1.2   root      323:     rate->opos_inc = ((uint64_t) inrate << 32) / outrate;
1.1       root      324: 
                    325:     rate->ipos = 0;
                    326:     rate->ilast.l = 0;
                    327:     rate->ilast.r = 0;
                    328:     return rate;
                    329: }
                    330: 
1.1.1.2   root      331: #define NAME st_rate_flow_mix
                    332: #define OP(a, b) a += b
                    333: #include "rate_template.h"
                    334: 
                    335: #define NAME st_rate_flow
                    336: #define OP(a, b) a = b
                    337: #include "rate_template.h"
1.1       root      338: 
                    339: void st_rate_stop (void *opaque)
                    340: {
1.1.1.7   root      341:     g_free (opaque);
1.1       root      342: }
1.1.1.2   root      343: 
1.1.1.4   root      344: void mixeng_clear (struct st_sample *buf, int len)
1.1.1.2   root      345: {
1.1.1.4   root      346:     memset (buf, 0, len * sizeof (struct st_sample));
1.1.1.2   root      347: }
1.1.1.6   root      348: 
                    349: void mixeng_volume (struct st_sample *buf, int len, struct mixeng_volume *vol)
                    350: {
                    351: #ifdef CONFIG_MIXEMU
                    352:     if (vol->mute) {
                    353:         mixeng_clear (buf, len);
                    354:         return;
                    355:     }
                    356: 
                    357:     while (len--) {
                    358: #ifdef FLOAT_MIXENG
                    359:         buf->l = buf->l * vol->l;
                    360:         buf->r = buf->r * vol->r;
                    361: #else
                    362:         buf->l = (buf->l * vol->l) >> 32;
                    363:         buf->r = (buf->r * vol->r) >> 32;
                    364: #endif
                    365:         buf += 1;
                    366:     }
                    367: #else
                    368:     (void) buf;
                    369:     (void) len;
                    370:     (void) vol;
                    371: #endif
                    372: }

unix.superglobalmegacorp.com

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