(linenum→info "unix/slp.c:2238")

qemu/0.9.1/audio/mixeng.c

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