Home | History | Annotate | Download | only in audio
      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