18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/*
28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * QEMU Mixing engine
38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *
48b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Copyright (c) 2004-2005 Vassili Karpov (malc)
58b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Copyright (c) 1998 Fabrice Bellard
68b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *
78b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Permission is hereby granted, free of charge, to any person obtaining a copy
88b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * of this software and associated documentation files (the "Software"), to deal
98b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * in the Software without restriction, including without limitation the rights
108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * copies of the Software, and to permit persons to whom the Software is
128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * furnished to do so, subject to the following conditions:
138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *
148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * The above copyright notice and this permission notice shall be included in
158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * all copies or substantial portions of the Software.
168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *
178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * THE SOFTWARE.
248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
255d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner#include "qemu-common.h"
268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "audio.h"
278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define AUDIO_CAP "mixeng"
298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "audio_int.h"
308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* 8 bit */
328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ENDIAN_CONVERSION natural
338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ENDIAN_CONVERT(v) (v)
348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Signed 8 bit */
368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IN_T int8_t
378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IN_MIN SCHAR_MIN
388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IN_MAX SCHAR_MAX
398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define SIGNED
408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define SHIFT 8
418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "mixeng_template.h"
428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef SIGNED
438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef IN_MAX
448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef IN_MIN
458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef IN_T
468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef SHIFT
478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Unsigned 8 bit */
498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IN_T uint8_t
508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IN_MIN 0
518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IN_MAX UCHAR_MAX
528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define SHIFT 8
538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "mixeng_template.h"
548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef IN_MAX
558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef IN_MIN
568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef IN_T
578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef SHIFT
588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef ENDIAN_CONVERT
608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef ENDIAN_CONVERSION
618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Signed 16 bit */
638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IN_T int16_t
648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IN_MIN SHRT_MIN
658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IN_MAX SHRT_MAX
668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define SIGNED
678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define SHIFT 16
688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ENDIAN_CONVERSION natural
698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ENDIAN_CONVERT(v) (v)
708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "mixeng_template.h"
718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef ENDIAN_CONVERT
728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef ENDIAN_CONVERSION
738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ENDIAN_CONVERSION swap
748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ENDIAN_CONVERT(v) bswap16 (v)
758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "mixeng_template.h"
768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef ENDIAN_CONVERT
778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef ENDIAN_CONVERSION
788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef SIGNED
798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef IN_MAX
808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef IN_MIN
818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef IN_T
828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef SHIFT
838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Unsigned 16 bit */
858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IN_T uint16_t
868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IN_MIN 0
878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IN_MAX USHRT_MAX
888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define SHIFT 16
898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ENDIAN_CONVERSION natural
908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ENDIAN_CONVERT(v) (v)
918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "mixeng_template.h"
928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef ENDIAN_CONVERT
938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef ENDIAN_CONVERSION
948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ENDIAN_CONVERSION swap
958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ENDIAN_CONVERT(v) bswap16 (v)
968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "mixeng_template.h"
978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef ENDIAN_CONVERT
988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef ENDIAN_CONVERSION
998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef IN_MAX
1008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef IN_MIN
1018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef IN_T
1028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef SHIFT
1038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Signed 32 bit */
1058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IN_T int32_t
1068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IN_MIN INT32_MIN
1078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IN_MAX INT32_MAX
1088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define SIGNED
1098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define SHIFT 32
1108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ENDIAN_CONVERSION natural
1118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ENDIAN_CONVERT(v) (v)
1128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "mixeng_template.h"
1138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef ENDIAN_CONVERT
1148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef ENDIAN_CONVERSION
1158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ENDIAN_CONVERSION swap
1168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ENDIAN_CONVERT(v) bswap32 (v)
1178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "mixeng_template.h"
1188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef ENDIAN_CONVERT
1198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef ENDIAN_CONVERSION
1208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef SIGNED
1218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef IN_MAX
1228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef IN_MIN
1238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef IN_T
1248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef SHIFT
1258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1265d0e37bc290d1743cb5acf76eb6608f1303f27ddDavid 'Digit' Turner/* Unsigned 32 bit */
1278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IN_T uint32_t
1288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IN_MIN 0
1298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define IN_MAX UINT32_MAX
1308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define SHIFT 32
1318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ENDIAN_CONVERSION natural
1328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ENDIAN_CONVERT(v) (v)
1338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "mixeng_template.h"
1348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef ENDIAN_CONVERT
1358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef ENDIAN_CONVERSION
1368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ENDIAN_CONVERSION swap
1378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define ENDIAN_CONVERT(v) bswap32 (v)
1388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "mixeng_template.h"
1398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef ENDIAN_CONVERT
1408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef ENDIAN_CONVERSION
1418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef IN_MAX
1428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef IN_MIN
1438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef IN_T
1448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#undef SHIFT
1458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectt_sample *mixeng_conv[2][2][2][3] = {
1478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    {
1488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        {
1498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
1508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                conv_natural_uint8_t_to_mono,
1518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                conv_natural_uint16_t_to_mono,
1528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                conv_natural_uint32_t_to_mono
1538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            },
1548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
1558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                conv_natural_uint8_t_to_mono,
1568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                conv_swap_uint16_t_to_mono,
1578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                conv_swap_uint32_t_to_mono,
1588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
1598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        },
1608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        {
1618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
1628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                conv_natural_int8_t_to_mono,
1638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                conv_natural_int16_t_to_mono,
1648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                conv_natural_int32_t_to_mono
1658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            },
1668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
1678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                conv_natural_int8_t_to_mono,
1688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                conv_swap_int16_t_to_mono,
1698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                conv_swap_int32_t_to_mono
1708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
1718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
1728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    },
1738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    {
1748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        {
1758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
1768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                conv_natural_uint8_t_to_stereo,
1778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                conv_natural_uint16_t_to_stereo,
1788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                conv_natural_uint32_t_to_stereo
1798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            },
1808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
1818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                conv_natural_uint8_t_to_stereo,
1828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                conv_swap_uint16_t_to_stereo,
1838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                conv_swap_uint32_t_to_stereo
1848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
1858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        },
1868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        {
1878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
1888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                conv_natural_int8_t_to_stereo,
1898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                conv_natural_int16_t_to_stereo,
1908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                conv_natural_int32_t_to_stereo
1918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            },
1928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
1938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                conv_natural_int8_t_to_stereo,
1948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                conv_swap_int16_t_to_stereo,
1958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                conv_swap_int32_t_to_stereo,
1968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
1978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
1988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
1998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project};
2008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectf_sample *mixeng_clip[2][2][2][3] = {
2028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    {
2038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        {
2048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
2058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                clip_natural_uint8_t_from_mono,
2068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                clip_natural_uint16_t_from_mono,
2078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                clip_natural_uint32_t_from_mono
2088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            },
2098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
2108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                clip_natural_uint8_t_from_mono,
2118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                clip_swap_uint16_t_from_mono,
2128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                clip_swap_uint32_t_from_mono
2138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
2148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        },
2158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        {
2168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
2178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                clip_natural_int8_t_from_mono,
2188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                clip_natural_int16_t_from_mono,
2198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                clip_natural_int32_t_from_mono
2208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            },
2218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
2228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                clip_natural_int8_t_from_mono,
2238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                clip_swap_int16_t_from_mono,
2248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                clip_swap_int32_t_from_mono
2258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
2268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
2278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    },
2288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    {
2298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        {
2308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
2318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                clip_natural_uint8_t_from_stereo,
2328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                clip_natural_uint16_t_from_stereo,
2338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                clip_natural_uint32_t_from_stereo
2348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            },
2358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
2368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                clip_natural_uint8_t_from_stereo,
2378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                clip_swap_uint16_t_from_stereo,
2388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                clip_swap_uint32_t_from_stereo
2398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
2408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        },
2418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        {
2428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
2438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                clip_natural_int8_t_from_stereo,
2448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                clip_natural_int16_t_from_stereo,
2458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                clip_natural_int32_t_from_stereo
2468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            },
2478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            {
2488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                clip_natural_int8_t_from_stereo,
2498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                clip_swap_int16_t_from_stereo,
2508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                clip_swap_int32_t_from_stereo
2518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
2528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
2538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
2548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project};
2558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/*
2578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * August 21, 1998
2588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Copyright 1998 Fabrice Bellard.
2598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *
2608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * [Rewrote completly the code of Lance Norskog And Sundry
2618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Contributors with a more efficient algorithm.]
2628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *
2638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * This source code is freely redistributable and may be used for
2648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * any purpose.  This copyright notice must be maintained.
2658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Lance Norskog And Sundry Contributors are not responsible for
2668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * the consequences of using this software.
2678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
2688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/*
2708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Sound Tools rate change effect file.
2718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
2728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/*
2738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Linear Interpolation.
2748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *
2758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * The use of fractional increment allows us to use no buffer. It
2768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * avoid the problems at the end of the buffer we had with the old
2778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * method which stored a possibly big buffer of size
2788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * lcm(in_rate,out_rate).
2798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *
2808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Limited to 16 bit samples and sampling frequency <= 65535 Hz. If
2818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * the input & output frequencies are equal, a delay of one sample is
2828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * introduced.  Limited to processing 32-bit count worth of samples.
2838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *
2848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 1 << FRAC_BITS evaluating to zero in several places.  Changed with
2858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * an (unsigned long) cast to make it safe.  MarkMLl 2/1/99
2868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
2878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Private data */
2898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstruct rate {
2908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    uint64_t opos;
2918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    uint64_t opos_inc;
2928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    uint32_t ipos;              /* position in the input stream (integer) */
2935d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    struct st_sample ilast;          /* last sample in the input stream */
2948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project};
2958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/*
2978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Prepare processing.
2988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
2998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid *st_rate_start (int inrate, int outrate)
3008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
3018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    struct rate *rate = audio_calloc (AUDIO_FUNC, 1, sizeof (*rate));
3028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (!rate) {
3048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        dolog ("Could not allocate resampler (%zu bytes)\n", sizeof (*rate));
3058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return NULL;
3068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
3078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    rate->opos = 0;
3098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    /* increment */
3118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    rate->opos_inc = ((uint64_t) inrate << 32) / outrate;
3128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    rate->ipos = 0;
3148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    rate->ilast.l = 0;
3158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    rate->ilast.r = 0;
3168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return rate;
3178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
3188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define NAME st_rate_flow_mix
3208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define OP(a, b) a += b
3218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "rate_template.h"
3228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define NAME st_rate_flow
3248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define OP(a, b) a = b
3258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "rate_template.h"
3268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid st_rate_stop (void *opaque)
3288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
3298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    qemu_free (opaque);
3308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
3318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3325d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid mixeng_clear (struct st_sample *buf, int len)
3338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
3345d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner    memset (buf, 0, len * sizeof (struct st_sample));
3358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
336