symbian-qemu-0.9.1-12/qemu-symbian-svp/audio/mixeng.c
changeset 1 2fb8b9db1c86
equal deleted inserted replaced
0:ffa851df0825 1:2fb8b9db1c86
       
     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 16 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 }