AudioResamplerSinc.cpp revision d88a051aff15fdf5c57e1e5a4083bbd9635af3ad
165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian/*
265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * Copyright (C) 2007 The Android Open Source Project
365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *
465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * Licensed under the Apache License, Version 2.0 (the "License");
565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * you may not use this file except in compliance with the License.
665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * You may obtain a copy of the License at
765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *
865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *      http://www.apache.org/licenses/LICENSE-2.0
965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian *
1065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * Unless required by applicable law or agreed to in writing, software
1165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * distributed under the License is distributed on an "AS IS" BASIS,
1265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * See the License for the specific language governing permissions and
1465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * limitations under the License.
1565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian */
1665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
1776b111685010e1fea7c0a865c038aee35507fde4SathishKumar Mani#define LOG_TAG "AudioResamplerSinc"
1876b111685010e1fea7c0a865c038aee35507fde4SathishKumar Mani//#define LOG_NDEBUG 0
1976b111685010e1fea7c0a865c038aee35507fde4SathishKumar Mani
2065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include <string.h>
2165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#include "AudioResamplerSinc.h"
2276b111685010e1fea7c0a865c038aee35507fde4SathishKumar Mani#include <dlfcn.h>
2376b111685010e1fea7c0a865c038aee35507fde4SathishKumar Mani#include <cutils/properties.h>
2476b111685010e1fea7c0a865c038aee35507fde4SathishKumar Mani#include <stdlib.h>
2576b111685010e1fea7c0a865c038aee35507fde4SathishKumar Mani#include <utils/Log.h>
2665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
2765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopiannamespace android {
2865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian// ----------------------------------------------------------------------------
2965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
3065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
3165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian/*
3265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * These coeficients are computed with the "fir" utility found in
3365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian * tools/resampler_tools
34d88a051aff15fdf5c57e1e5a4083bbd9635af3adMathias Agopian * cmd-line: fir -l 7 -s 48000 -c 20478
3565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian */
3665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianconst int32_t AudioResamplerSinc::mFirCoefsUp[] = {
37d88a051aff15fdf5c57e1e5a4083bbd9635af3adMathias Agopian        0x6d374bc7, 0x6d35278a, 0x6d2ebafe, 0x6d24069d, 0x6d150b35, 0x6d01c9e3, 0x6cea4418, 0x6cce7b97, 0x6cae7272, 0x6c8a2b0f, 0x6c61a823, 0x6c34ecb5, 0x6c03fc1c, 0x6bced9ff, 0x6b958a54, 0x6b581163, 0x6b1673c1, 0x6ad0b652, 0x6a86de48, 0x6a38f123, 0x69e6f4b1, 0x6990ef0b, 0x6936e697, 0x68d8e206, 0x6876e855, 0x681100c9, 0x67a732f4, 0x673986ac, 0x66c80413, 0x6652b392, 0x65d99dd5, 0x655ccbd3, 0x64dc46c3, 0x64581823, 0x63d049b4, 0x6344e578, 0x62b5f5b2, 0x622384e8, 0x618d9ddc, 0x60f44b91, 0x60579947, 0x5fb79278, 0x5f1442dc, 0x5e6db665, 0x5dc3f93c, 0x5d1717c4, 0x5c671e96, 0x5bb41a80, 0x5afe1886, 0x5a4525df, 0x59894ff3, 0x58caa45b, 0x580930e1, 0x5745037c, 0x567e2a51, 0x55b4b3af, 0x54e8ae13, 0x541a281e, 0x5349309e, 0x5275d684, 0x51a028e8, 0x50c83704, 0x4fee1037, 0x4f11c3fe, 0x4e3361f7, 0x4d52f9df, 0x4c709b8e, 0x4b8c56f8, 0x4aa63c2c, 0x49be5b50, 0x48d4c4a2, 0x47e98874, 0x46fcb72d, 0x460e6148, 0x451e9750, 0x442d69de, 0x433ae99c, 0x4247273f, 0x41523389, 0x405c1f43, 0x3f64fb40, 0x3e6cd85b, 0x3d73c772, 0x3c79d968, 0x3b7f1f23, 0x3a83a989, 0x3987897f, 0x388acfe9, 0x378d8da8, 0x368fd397, 0x3591b28b, 0x34933b50, 0x33947eab, 0x32958d55, 0x319677fa, 0x30974f3b, 0x2f9823a8, 0x2e9905c1, 0x2d9a05f4, 0x2c9b349e, 0x2b9ca203, 0x2a9e5e57, 0x29a079b2, 0x28a30416, 0x27a60d6a, 0x26a9a57b, 0x25addbf9, 0x24b2c075, 0x23b86263, 0x22bed116, 0x21c61bc0, 0x20ce516f, 0x1fd7810f, 0x1ee1b965, 0x1ded0911, 0x1cf97e8b, 0x1c072823, 0x1b1613ff, 0x1a26501b, 0x1937ea47, 0x184af025, 0x175f6f2b, 0x1675749e, 0x158d0d95, 0x14a646f6, 0x13c12d73, 0x12ddcd8f, 0x11fc3395,
38d88a051aff15fdf5c57e1e5a4083bbd9635af3adMathias Agopian        0x111c6ba0, 0x103e8192, 0x0f62811a, 0x0e8875ad, 0x0db06a89, 0x0cda6ab5, 0x0c0680fe, 0x0b34b7f5, 0x0a6519f4, 0x0997b116, 0x08cc873c, 0x0803a60a, 0x073d16e7, 0x0678e2fc, 0x05b71332, 0x04f7b037, 0x043ac276, 0x0380521c, 0x02c86715, 0x0213090c, 0x01603f6e, 0x00b01162, 0x000285d0, 0xff57a35e, 0xfeaf706f, 0xfe09f323, 0xfd673159, 0xfcc730aa, 0xfc29f670, 0xfb8f87bd, 0xfaf7e963, 0xfa631fef, 0xf9d12fab, 0xf9421c9d, 0xf8b5ea87, 0xf82c9ce7, 0xf7a636fa, 0xf722bbb5, 0xf6a22dcf, 0xf6248fb6, 0xf5a9e398, 0xf5322b61, 0xf4bd68b6, 0xf44b9cfe, 0xf3dcc959, 0xf370eea9, 0xf3080d8c, 0xf2a2265e, 0xf23f393b, 0xf1df45fd, 0xf1824c3e, 0xf1284b58, 0xf0d14267, 0xf07d3043, 0xf02c138a, 0xefddea9a, 0xef92b393, 0xef4a6c58, 0xef051290, 0xeec2a3a3, 0xee831cc3, 0xee467ae1, 0xee0cbab9, 0xedd5d8ca, 0xeda1d15c, 0xed70a07d, 0xed424205, 0xed16b196, 0xecedea99, 0xecc7e845, 0xeca4a59b, 0xec841d68, 0xec664a48, 0xec4b26a2, 0xec32acb0, 0xec1cd677, 0xec099dcf, 0xebf8fc64, 0xebeaebaf, 0xebdf6500, 0xebd6617b, 0xebcfda19, 0xebcbc7a7, 0xebca22cc, 0xebcae405, 0xebce03aa, 0xebd379eb, 0xebdb3ed5, 0xebe54a4f, 0xebf1941f, 0xec0013e8, 0xec10c12c, 0xec23934f, 0xec388194, 0xec4f8322, 0xec688f02, 0xec839c22, 0xeca0a156, 0xecbf9558, 0xece06ecb, 0xed032439, 0xed27ac16, 0xed4dfcc2, 0xed760c88, 0xed9fd1a2, 0xedcb4237, 0xedf8545b, 0xee26fe17, 0xee573562, 0xee88f026, 0xeebc2444, 0xeef0c78d, 0xef26cfca, 0xef5e32bd, 0xef96e61c, 0xefd0df9a, 0xf00c14e1, 0xf0487b98, 0xf0860962, 0xf0c4b3e0, 0xf10470b0, 0xf1453571, 0xf186f7c0, 0xf1c9ad40, 0xf20d4b92, 0xf251c85d, 0xf297194d, 0xf2dd3411,
39d88a051aff15fdf5c57e1e5a4083bbd9635af3adMathias Agopian        0xf3240e61, 0xf36b9dfd, 0xf3b3d8ac, 0xf3fcb43e, 0xf4462690, 0xf4902587, 0xf4daa718, 0xf525a143, 0xf5710a17, 0xf5bcd7b1, 0xf609003f, 0xf6557a00, 0xf6a23b44, 0xf6ef3a6e, 0xf73c6df4, 0xf789cc61, 0xf7d74c53, 0xf824e480, 0xf8728bb3, 0xf8c038d0, 0xf90de2d1, 0xf95b80cb, 0xf9a909ea, 0xf9f67577, 0xfa43bad2, 0xfa90d17b, 0xfaddb10c, 0xfb2a513b, 0xfb76a9dd, 0xfbc2b2e4, 0xfc0e6461, 0xfc59b685, 0xfca4a19f, 0xfcef1e20, 0xfd392498, 0xfd82adba, 0xfdcbb25a, 0xfe142b6e, 0xfe5c120f, 0xfea35f79, 0xfeea0d0c, 0xff30144a, 0xff756edc, 0xffba168d, 0xfffe054e, 0x00413536, 0x0083a081, 0x00c54190, 0x010612eb, 0x01460f41, 0x01853165, 0x01c37452, 0x0200d32c, 0x023d493c, 0x0278d1f2, 0x02b368e6, 0x02ed09d7, 0x0325b0ad, 0x035d5977, 0x0394006a, 0x03c9a1e5, 0x03fe3a6f, 0x0431c6b5, 0x0464438c, 0x0495adf2, 0x04c6030d, 0x04f54029, 0x052362ba, 0x0550685d, 0x057c4ed4, 0x05a7140b, 0x05d0b612, 0x05f93324, 0x0620899e, 0x0646b808, 0x066bbd0d, 0x068f9781, 0x06b2465b, 0x06d3c8bb, 0x06f41de3, 0x0713453d, 0x07313e56, 0x074e08e0, 0x0769a4b2, 0x078411c7, 0x079d503b, 0x07b56051, 0x07cc426c, 0x07e1f712, 0x07f67eec, 0x0809dac3, 0x081c0b84, 0x082d1239, 0x083cf010, 0x084ba654, 0x08593671, 0x0865a1f1, 0x0870ea7e, 0x087b11de, 0x088419f6, 0x088c04c8, 0x0892d470, 0x08988b2a, 0x089d2b4a, 0x08a0b740, 0x08a33196, 0x08a49cf0, 0x08a4fc0d, 0x08a451c0, 0x08a2a0f8, 0x089fecbb, 0x089c3824, 0x08978666, 0x0891dac8, 0x088b38a9, 0x0883a378, 0x087b1ebc, 0x0871ae0d, 0x08675516, 0x085c1794, 0x084ff957, 0x0842fe3d, 0x08352a35, 0x0826813e, 0x08170767, 0x0806c0cb, 0x07f5b193, 0x07e3ddf7,
40d88a051aff15fdf5c57e1e5a4083bbd9635af3adMathias Agopian        0x07d14a38, 0x07bdfaa5, 0x07a9f399, 0x07953976, 0x077fd0ac, 0x0769bdaf, 0x07530501, 0x073bab28, 0x0723b4b4, 0x070b2639, 0x06f20453, 0x06d853a2, 0x06be18cd, 0x06a3587e, 0x06881761, 0x066c5a27, 0x06502583, 0x06337e2a, 0x061668d2, 0x05f8ea30, 0x05db06fc, 0x05bcc3ed, 0x059e25b5, 0x057f310a, 0x055fea9d, 0x0540571a, 0x05207b2f, 0x05005b82, 0x04dffcb6, 0x04bf6369, 0x049e9433, 0x047d93a8, 0x045c6654, 0x043b10bd, 0x04199760, 0x03f7feb4, 0x03d64b27, 0x03b4811d, 0x0392a4f4, 0x0370bafc, 0x034ec77f, 0x032ccebb, 0x030ad4e1, 0x02e8de19, 0x02c6ee7f, 0x02a50a22, 0x02833506, 0x02617321, 0x023fc85c, 0x021e3891, 0x01fcc78f, 0x01db7914, 0x01ba50d2, 0x0199526b, 0x01788170, 0x0157e166, 0x013775bf, 0x011741df, 0x00f7491a, 0x00d78eb3, 0x00b815da, 0x0098e1b3, 0x0079f54c, 0x005b53a4, 0x003cffa9, 0x001efc35, 0x00014c12, 0xffe3f1f7, 0xffc6f08a, 0xffaa4a5d, 0xff8e01f1, 0xff7219b3, 0xff5693fe, 0xff3b731b, 0xff20b93e, 0xff066889, 0xfeec830d, 0xfed30ac5, 0xfeba0199, 0xfea16960, 0xfe8943dc, 0xfe7192bd, 0xfe5a579d, 0xfe439407, 0xfe2d496f, 0xfe177937, 0xfe0224b0, 0xfded4d13, 0xfdd8f38b, 0xfdc5192d, 0xfdb1befc, 0xfd9ee5e7, 0xfd8c8ecc, 0xfd7aba74, 0xfd696998, 0xfd589cdc, 0xfd4854d3, 0xfd3891fd, 0xfd2954c8, 0xfd1a9d91, 0xfd0c6ca2, 0xfcfec233, 0xfcf19e6b, 0xfce50161, 0xfcd8eb17, 0xfccd5b82, 0xfcc25285, 0xfcb7cff0, 0xfcadd386, 0xfca45cf7, 0xfc9b6be5, 0xfc92ffe1, 0xfc8b186d, 0xfc83b4fc, 0xfc7cd4f0, 0xfc76779e, 0xfc709c4d, 0xfc6b4233, 0xfc66687a, 0xfc620e3d, 0xfc5e328c, 0xfc5ad465, 0xfc57f2be, 0xfc558c7c, 0xfc53a07b, 0xfc522d88, 0xfc513266, 0xfc50adcc,
41d88a051aff15fdf5c57e1e5a4083bbd9635af3adMathias Agopian        0xfc509e64, 0xfc5102d0, 0xfc51d9a6, 0xfc53216f, 0xfc54d8ae, 0xfc56fdda, 0xfc598f60, 0xfc5c8ba5, 0xfc5ff105, 0xfc63bdd3, 0xfc67f05a, 0xfc6c86dd, 0xfc717f97, 0xfc76d8bc, 0xfc7c9079, 0xfc82a4f4, 0xfc89144d, 0xfc8fdc9f, 0xfc96fbfc, 0xfc9e7074, 0xfca63810, 0xfcae50d6, 0xfcb6b8c4, 0xfcbf6dd8, 0xfcc86e09, 0xfcd1b74c, 0xfcdb4793, 0xfce51ccb, 0xfcef34e1, 0xfcf98dbe, 0xfd04254a, 0xfd0ef969, 0xfd1a0801, 0xfd254ef4, 0xfd30cc24, 0xfd3c7d73, 0xfd4860c2, 0xfd5473f3, 0xfd60b4e7, 0xfd6d2180, 0xfd79b7a1, 0xfd86752e, 0xfd93580d, 0xfda05e23, 0xfdad855b, 0xfdbacb9e, 0xfdc82edb, 0xfdd5ad01, 0xfde34403, 0xfdf0f1d6, 0xfdfeb475, 0xfe0c89db, 0xfe1a7009, 0xfe286505, 0xfe3666d5, 0xfe447389, 0xfe528931, 0xfe60a5e5, 0xfe6ec7c0, 0xfe7cece2, 0xfe8b1373, 0xfe99399f, 0xfea75d97, 0xfeb57d92, 0xfec397cf, 0xfed1aa92, 0xfedfb425, 0xfeedb2da, 0xfefba508, 0xff09890f, 0xff175d53, 0xff252042, 0xff32d04f, 0xff406bf8, 0xff4df1be, 0xff5b602c, 0xff68b5d5, 0xff75f153, 0xff831148, 0xff90145e, 0xff9cf947, 0xffa9bebe, 0xffb66386, 0xffc2e669, 0xffcf463a, 0xffdb81d6, 0xffe79820, 0xfff38806, 0xffff507b, 0x000af07f, 0x00166718, 0x0021b355, 0x002cd44d, 0x0037c922, 0x004290fc, 0x004d2b0e, 0x00579691, 0x0061d2ca, 0x006bdf05, 0x0075ba95, 0x007f64da, 0x0088dd38, 0x0092231e, 0x009b3605, 0x00a4156b, 0x00acc0da, 0x00b537e1, 0x00bd7a1c, 0x00c5872a, 0x00cd5eb7, 0x00d50075, 0x00dc6c1e, 0x00e3a175, 0x00eaa045, 0x00f16861, 0x00f7f9a3, 0x00fe53ef, 0x0104772e, 0x010a6353, 0x01101858, 0x0115963d, 0x011add0b, 0x011fecd3, 0x0124c5ab, 0x012967b1, 0x012dd30a, 0x013207e4, 0x01360670,
42d88a051aff15fdf5c57e1e5a4083bbd9635af3adMathias Agopian        0x0139cee9, 0x013d618d, 0x0140bea5, 0x0143e67c, 0x0146d965, 0x014997bb, 0x014c21db, 0x014e782a, 0x01509b14, 0x01528b08, 0x0154487b, 0x0155d3e8, 0x01572dcf, 0x015856b6, 0x01594f25, 0x015a17ab, 0x015ab0db, 0x015b1b4e, 0x015b579e, 0x015b666c, 0x015b485b, 0x015afe14, 0x015a8843, 0x0159e796, 0x01591cc0, 0x01582878, 0x01570b77, 0x0155c678, 0x01545a3c, 0x0152c783, 0x01510f13, 0x014f31b2, 0x014d3029, 0x014b0b45, 0x0148c3d2, 0x01465a9f, 0x0143d07f, 0x01412643, 0x013e5cc0, 0x013b74ca, 0x01386f3a, 0x01354ce7, 0x01320ea9, 0x012eb55a, 0x012b41d3, 0x0127b4f1, 0x01240f8e, 0x01205285, 0x011c7eb2, 0x011894f0, 0x0114961b, 0x0110830f, 0x010c5ca6, 0x010823ba, 0x0103d927, 0x00ff7dc4, 0x00fb126b, 0x00f697f3, 0x00f20f32, 0x00ed78ff, 0x00e8d62d, 0x00e4278f, 0x00df6df7, 0x00daaa34, 0x00d5dd16, 0x00d10769, 0x00cc29f7, 0x00c7458a, 0x00c25ae8, 0x00bd6ad7, 0x00b87619, 0x00b37d70, 0x00ae8198, 0x00a9834e, 0x00a4834c, 0x009f8249, 0x009a80f8, 0x0095800c, 0x00908034, 0x008b821b, 0x0086866b, 0x00818dcb, 0x007c98de, 0x0077a845, 0x0072bc9d, 0x006dd680, 0x0068f687, 0x00641d44, 0x005f4b4a, 0x005a8125, 0x0055bf60, 0x00510682, 0x004c570f, 0x0047b186, 0x00431666, 0x003e8628, 0x003a0141, 0x00358824, 0x00311b41, 0x002cbb03, 0x002867d2, 0x00242213, 0x001fea27, 0x001bc06b, 0x0017a53b, 0x001398ec, 0x000f9bd2, 0x000bae3c, 0x0007d075, 0x000402c8, 0x00004579, 0xfffc98c9, 0xfff8fcf7, 0xfff5723d, 0xfff1f8d2, 0xffee90eb, 0xffeb3ab8, 0xffe7f666, 0xffe4c41e, 0xffe1a408, 0xffde9646, 0xffdb9af8, 0xffd8b23b, 0xffd5dc28, 0xffd318d6, 0xffd06858, 0xffcdcabe, 0xffcb4014,
43d88a051aff15fdf5c57e1e5a4083bbd9635af3adMathias Agopian        0xffc8c866, 0xffc663b9, 0xffc41212, 0xffc1d373, 0xffbfa7d9, 0xffbd8f40, 0xffbb89a1, 0xffb996f3, 0xffb7b728, 0xffb5ea31, 0xffb42ffc, 0xffb28876, 0xffb0f388, 0xffaf7118, 0xffae010b, 0xffaca344, 0xffab57a1, 0xffaa1e02, 0xffa8f641, 0xffa7e039, 0xffa6dbc0, 0xffa5e8ad, 0xffa506d2, 0xffa43603, 0xffa3760e, 0xffa2c6c2, 0xffa227ec, 0xffa19957, 0xffa11acb, 0xffa0ac11, 0xffa04cf0, 0xff9ffd2c, 0xff9fbc89, 0xff9f8ac9, 0xff9f67ae, 0xff9f52f7, 0xff9f4c65, 0xff9f53b4, 0xff9f68a1, 0xff9f8ae9, 0xff9fba47, 0xff9ff674, 0xffa03f2b, 0xffa09425, 0xffa0f519, 0xffa161bf, 0xffa1d9cf, 0xffa25cfe, 0xffa2eb04, 0xffa38395, 0xffa42668, 0xffa4d332, 0xffa589a6, 0xffa6497c, 0xffa71266, 0xffa7e41a, 0xffa8be4c, 0xffa9a0b1, 0xffaa8afe, 0xffab7ce7, 0xffac7621, 0xffad7662, 0xffae7d5f, 0xffaf8acd, 0xffb09e63, 0xffb1b7d8, 0xffb2d6e1, 0xffb3fb37, 0xffb52490, 0xffb652a7, 0xffb78533, 0xffb8bbed, 0xffb9f691, 0xffbb34d8, 0xffbc767f, 0xffbdbb42, 0xffbf02dd, 0xffc04d0f, 0xffc19996, 0xffc2e832, 0xffc438a3, 0xffc58aaa, 0xffc6de09, 0xffc83285, 0xffc987e0, 0xffcadde1, 0xffcc344c, 0xffcd8aeb, 0xffcee183, 0xffd037e0, 0xffd18dcc, 0xffd2e311, 0xffd4377d, 0xffd58ade, 0xffd6dd02, 0xffd82dba, 0xffd97cd6, 0xffdaca2a, 0xffdc1588, 0xffdd5ec6, 0xffdea5bb, 0xffdfea3c, 0xffe12c22, 0xffe26b48, 0xffe3a788, 0xffe4e0bf, 0xffe616c8, 0xffe74984, 0xffe878d3, 0xffe9a494, 0xffeaccaa, 0xffebf0fa, 0xffed1166, 0xffee2dd7, 0xffef4632, 0xfff05a60, 0xfff16a4a, 0xfff275db, 0xfff37d00, 0xfff47fa5, 0xfff57db8, 0xfff67729, 0xfff76be9, 0xfff85be8, 0xfff9471b, 0xfffa2d74, 0xfffb0ee9, 0xfffbeb70,
44d88a051aff15fdf5c57e1e5a4083bbd9635af3adMathias Agopian        0xfffcc300, 0xfffd9592, 0xfffe631e, 0xffff2b9f, 0xffffef10, 0x0000ad6e, 0x000166b6, 0x00021ae5, 0x0002c9fd, 0x000373fb, 0x000418e2, 0x0004b8b3, 0x00055371, 0x0005e921, 0x000679c5, 0x00070564, 0x00078c04, 0x00080dab, 0x00088a62, 0x00090230, 0x0009751e, 0x0009e337, 0x000a4c85, 0x000ab112, 0x000b10ec, 0x000b6c1d, 0x000bc2b3, 0x000c14bb, 0x000c6244, 0x000cab5c, 0x000cf012, 0x000d3075, 0x000d6c97, 0x000da486, 0x000dd854, 0x000e0812, 0x000e33d3, 0x000e5ba7, 0x000e7fa1, 0x000e9fd5, 0x000ebc54, 0x000ed533, 0x000eea84, 0x000efc5c, 0x000f0ace, 0x000f15ef, 0x000f1dd2, 0x000f228d, 0x000f2434, 0x000f22dc, 0x000f1e99, 0x000f1781, 0x000f0da8, 0x000f0125, 0x000ef20b, 0x000ee070, 0x000ecc69, 0x000eb60b, 0x000e9d6b, 0x000e829e, 0x000e65ba, 0x000e46d3, 0x000e25fd, 0x000e034f, 0x000ddedb, 0x000db8b7, 0x000d90f6, 0x000d67ae, 0x000d3cf1, 0x000d10d5, 0x000ce36b, 0x000cb4c8, 0x000c84ff, 0x000c5422, 0x000c2245, 0x000bef79, 0x000bbbd2, 0x000b8760, 0x000b5235, 0x000b1c64, 0x000ae5fc, 0x000aaf0f, 0x000a77ac, 0x000a3fe5, 0x000a07c9, 0x0009cf67, 0x000996ce, 0x00095e0e, 0x00092535, 0x0008ec50, 0x0008b36e, 0x00087a9c, 0x000841e8, 0x0008095d, 0x0007d108, 0x000798f5, 0x00076130, 0x000729c4, 0x0006f2bb, 0x0006bc21, 0x000685ff, 0x0006505f, 0x00061b4b, 0x0005e6cb, 0x0005b2e8, 0x00057faa, 0x00054d1a, 0x00051b3e, 0x0004ea1d, 0x0004b9c0, 0x00048a2b, 0x00045b65, 0x00042d74, 0x0004005e, 0x0003d426, 0x0003a8d2, 0x00037e65, 0x000354e5, 0x00032c54, 0x000304b7, 0x0002de0e, 0x0002b85f, 0x000293aa, 0x00026ff2, 0x00024d39, 0x00022b7f, 0x00020ac7, 0x0001eb10,
4565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        0x00000000 // this one is needed for lerping the last coefficient
4665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian};
4765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
4865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian/*
49443e69625d598ea578e2c838960778ce498fd773Mathias Agopian * These coefficients are optimized for 48KHz -> 44.1KHz
50d88a051aff15fdf5c57e1e5a4083bbd9635af3adMathias Agopian * cmd-line: fir -l 7 -s 48000 -c 16600
5165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian */
5265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianconst int32_t AudioResamplerSinc::mFirCoefsDown[] = {
53d88a051aff15fdf5c57e1e5a4083bbd9635af3adMathias Agopian        0x58888889, 0x58875d88, 0x5883dc96, 0x587e05e0, 0x5875d9b3, 0x586b587d, 0x585e82c6, 0x584f593a, 0x583ddc9f, 0x582a0dde, 0x5813edfb, 0x57fb7e1a, 0x57e0bf7f, 0x57c3b389, 0x57a45bb8, 0x5782b9aa, 0x575ecf1a, 0x57389de0, 0x571027f6, 0x56e56f6f, 0x56b8767e, 0x56893f73, 0x5657ccbb, 0x562420e2, 0x55ee3e8d, 0x55b62882, 0x557be1a0, 0x553f6ce6, 0x5500cd6d, 0x54c0066a, 0x547d1b2e, 0x54380f26, 0x53f0e5da, 0x53a7a2ed, 0x535c4a1e, 0x530edf46, 0x52bf6657, 0x526de360, 0x521a5a86, 0x51c4d00c, 0x516d484a, 0x5113c7b6, 0x50b852d9, 0x505aee59, 0x4ffb9ef2, 0x4f9a6979, 0x4f3752d9, 0x4ed26016, 0x4e6b9649, 0x4e02faa3, 0x4d98926b, 0x4d2c62fd, 0x4cbe71cc, 0x4c4ec45e, 0x4bdd6050, 0x4b6a4b53, 0x4af58b2b, 0x4a7f25b0, 0x4a0720cd, 0x498d8283, 0x491250e1, 0x4895920c, 0x48174c37, 0x479785ab, 0x471644bd, 0x46938fd7, 0x460f6d70, 0x4589e411, 0x4502fa51, 0x447ab6d5, 0x43f12053, 0x43663d8d, 0x42da1554, 0x424cae85, 0x41be100a, 0x412e40db, 0x409d47f9, 0x400b2c72, 0x3f77f561, 0x3ee3a9e7, 0x3e4e5132, 0x3db7f27a, 0x3d2094ff, 0x3c88400b, 0x3beefaee, 0x3b54cd01, 0x3ab9bda6, 0x3a1dd444, 0x39811848, 0x38e39127, 0x3845465a, 0x37a63f5f, 0x370683ba, 0x36661af1, 0x35c50c90, 0x35236024, 0x34811d3f, 0x33de4b72, 0x333af253, 0x32971979, 0x31f2c87a, 0x314e06ed, 0x30a8dc6a, 0x30035089, 0x2f5d6ade, 0x2eb732fe, 0x2e10b07d, 0x2d69eaeb, 0x2cc2e9d4, 0x2c1bb4c4, 0x2b745340, 0x2acccccc, 0x2a2528e6, 0x297d6f06, 0x28d5a6a0, 0x282dd722, 0x278607f2, 0x26de4072, 0x263687fa, 0x258ee5dd, 0x24e76163, 0x244001cf, 0x2398ce58, 0x22f1ce2e, 0x224b0876, 0x21a4844b, 0x20fe48be, 0x20585cd5,
54d88a051aff15fdf5c57e1e5a4083bbd9635af3adMathias Agopian        0x1fb2c78a, 0x1f0d8fcb, 0x1e68bc7d, 0x1dc45475, 0x1d205e7d, 0x1c7ce150, 0x1bd9e39e, 0x1b376c06, 0x1a95811c, 0x19f42964, 0x19536b51, 0x18b34d4a, 0x1813d5a3, 0x17750aa3, 0x16d6f27f, 0x1639935b, 0x159cf34b, 0x15011851, 0x1466085d, 0x13cbc94f, 0x133260f3, 0x1299d502, 0x12022b24, 0x116b68ed, 0x10d593dd, 0x1040b162, 0x0facc6d4, 0x0f19d979, 0x0e87ee81, 0x0df70b09, 0x0d673417, 0x0cd86e9d, 0x0c4abf78, 0x0bbe2b70, 0x0b32b735, 0x0aa86763, 0x0a1f407f, 0x099746f9, 0x09107f29, 0x088aed4f, 0x08069598, 0x07837c17, 0x0701a4c8, 0x06811392, 0x0601cc40, 0x0583d28b, 0x05072a0f, 0x048bd653, 0x0411dac7, 0x03993abf, 0x0321f97b, 0x02ac1a20, 0x02379fbb, 0x01c48d42, 0x0152e590, 0x00e2ab69, 0x0073e179, 0x00068a52, 0xff9aa86c, 0xff303e29, 0xfec74dd1, 0xfe5fd993, 0xfdf9e383, 0xfd956da0, 0xfd3279cd, 0xfcd109d6, 0xfc711f6d, 0xfc12bc2a, 0xfbb5e18f, 0xfb5a9103, 0xfb00cbd4, 0xfaa89339, 0xfa51e84e, 0xf9fccc18, 0xf9a93f82, 0xf9574361, 0xf906d86d, 0xf8b7ff4b, 0xf86ab883, 0xf81f0487, 0xf7d4e3b0, 0xf78c5641, 0xf7455c62, 0xf6fff625, 0xf6bc2385, 0xf679e463, 0xf639388a, 0xf5fa1fae, 0xf5bc996b, 0xf580a547, 0xf54642b1, 0xf50d70ff, 0xf4d62f74, 0xf4a07d3b, 0xf46c5967, 0xf439c2f9, 0xf408b8d8, 0xf3d939d9, 0xf3ab44b9, 0xf37ed821, 0xf353f2a5, 0xf32a92c3, 0xf302b6e6, 0xf2dc5d64, 0xf2b7847f, 0xf2942a64, 0xf2724d2e, 0xf251eae4, 0xf2330179, 0xf2158ece, 0xf1f990b1, 0xf1df04de, 0xf1c5e8ff, 0xf1ae3aaa, 0xf197f765, 0xf1831ca6, 0xf16fa7d0, 0xf15d9634, 0xf14ce516, 0xf13d91a7, 0xf12f9909, 0xf122f84e, 0xf117ac79, 0xf10db27d, 0xf1050741, 0xf0fda799, 0xf0f7904e, 0xf0f2be1a,
55d88a051aff15fdf5c57e1e5a4083bbd9635af3adMathias Agopian        0xf0ef2dab, 0xf0ecdba0, 0xf0ebc48a, 0xf0ebe4f1, 0xf0ed394e, 0xf0efbe0d, 0xf0f36f92, 0xf0f84a32, 0xf0fe4a39, 0xf1056be8, 0xf10dab74, 0xf117050a, 0xf12174cd, 0xf12cf6d5, 0xf1398732, 0xf14721ec, 0xf155c300, 0xf1656666, 0xf176080d, 0xf187a3db, 0xf19a35b1, 0xf1adb969, 0xf1c22ad4, 0xf1d785c1, 0xf1edc5f5, 0xf204e733, 0xf21ce537, 0xf235bbb8, 0xf24f6669, 0xf269e0fa, 0xf2852715, 0xf2a13462, 0xf2be0485, 0xf2db9321, 0xf2f9dbd3, 0xf318da38, 0xf33889ec, 0xf358e688, 0xf379eba4, 0xf39b94d7, 0xf3bdddb7, 0xf3e0c1db, 0xf4043cd8, 0xf4284a45, 0xf44ce5ba, 0xf4720ace, 0xf497b51a, 0xf4bde03a, 0xf4e487c9, 0xf50ba766, 0xf5333ab3, 0xf55b3d52, 0xf583aaec, 0xf5ac7f29, 0xf5d5b5b7, 0xf5ff4a47, 0xf6293890, 0xf6537c4a, 0xf67e1134, 0xf6a8f311, 0xf6d41dab, 0xf6ff8cce, 0xf72b3c4f, 0xf7572808, 0xf7834bd7, 0xf7afa3a3, 0xf7dc2b58, 0xf808deec, 0xf835ba59, 0xf862b9a0, 0xf88fd8cc, 0xf8bd13f0, 0xf8ea6724, 0xf917ce8a, 0xf945464f, 0xf972caa4, 0xf9a057c6, 0xf9cde9fb, 0xf9fb7d90, 0xfa290edf, 0xfa569a49, 0xfa841c3a, 0xfab19127, 0xfadef591, 0xfb0c4601, 0xfb397f0d, 0xfb669d55, 0xfb939d83, 0xfbc07c4c, 0xfbed3671, 0xfc19c8bf, 0xfc46300d, 0xfc72693e, 0xfc9e7141, 0xfcca4511, 0xfcf5e1b4, 0xfd21443e, 0xfd4c69cd, 0xfd774f8e, 0xfda1f2b7, 0xfdcc508d, 0xfdf66662, 0xfe203193, 0xfe49af8a, 0xfe72ddbf, 0xfe9bb9b7, 0xfec44103, 0xfeec7141, 0xff14481d, 0xff3bc351, 0xff62e0a2, 0xff899de5, 0xffaff8f9, 0xffd5efce, 0xfffb8060, 0x0020a8b7, 0x004566eb, 0x0069b920, 0x008d9d89, 0x00b11264, 0x00d415ff, 0x00f6a6b5, 0x0118c2ef, 0x013a6922, 0x015b97d1, 0x017c4d8f, 0x019c88f9, 0x01bc48bd,
56d88a051aff15fdf5c57e1e5a4083bbd9635af3adMathias Agopian        0x01db8b94, 0x01fa5045, 0x021895a6, 0x02365a98, 0x02539e0b, 0x02705efd, 0x028c9c77, 0x02a85592, 0x02c38972, 0x02de3749, 0x02f85e57, 0x0311fde7, 0x032b1552, 0x0343a3ff, 0x035ba961, 0x037324f6, 0x038a164c, 0x03a07cfa, 0x03b658a7, 0x03cba904, 0x03e06dcf, 0x03f4a6d1, 0x040853e2, 0x041b74e4, 0x042e09c4, 0x0440127d, 0x04518f14, 0x04627f9b, 0x0472e42e, 0x0482bcf5, 0x04920a24, 0x04a0cbf7, 0x04af02ba, 0x04bcaebe, 0x04c9d064, 0x04d66814, 0x04e27642, 0x04edfb6c, 0x04f8f819, 0x05036cdc, 0x050d5a51, 0x0516c11c, 0x051fa1ee, 0x0527fd7e, 0x052fd48d, 0x053727e8, 0x053df861, 0x054446d5, 0x054a1429, 0x054f614a, 0x05542f2f, 0x05587ed5, 0x055c5141, 0x055fa783, 0x056282ae, 0x0564e3e1, 0x0566cc3e, 0x05683cf1, 0x0569372c, 0x0569bc29, 0x0569cd27, 0x05696b6b, 0x05689842, 0x056754fe, 0x0565a2f9, 0x0563838f, 0x0560f824, 0x055e0222, 0x055aa2f6, 0x0556dc14, 0x0552aef5, 0x054e1d14, 0x054927f4, 0x0543d11a, 0x053e1a11, 0x05380465, 0x053191aa, 0x052ac373, 0x05239b5b, 0x051c1afe, 0x051443fa, 0x050c17f3, 0x0503988d, 0x04fac770, 0x04f1a647, 0x04e836bd, 0x04de7a82, 0x04d47346, 0x04ca22bc, 0x04bf8a97, 0x04b4ac8c, 0x04a98a54, 0x049e25a4, 0x04928037, 0x04869bc6, 0x047a7a0b, 0x046e1cc1, 0x046185a3, 0x0454b66c, 0x0447b0d7, 0x043a76a1, 0x042d0983, 0x041f6b39, 0x04119d7b, 0x0403a204, 0x03f57a8c, 0x03e728c9, 0x03d8ae73, 0x03ca0d3e, 0x03bb46dd, 0x03ac5d03, 0x039d5160, 0x038e25a2, 0x037edb76, 0x036f7486, 0x035ff27a, 0x035056f9, 0x0340a3a5, 0x0330da20, 0x0320fc08, 0x03110af8, 0x03010889, 0x02f0f64f, 0x02e0d5df, 0x02d0a8c6, 0x02c07090, 0x02b02ec6, 0x029fe4ec,
57d88a051aff15fdf5c57e1e5a4083bbd9635af3adMathias Agopian        0x028f9484, 0x027f3f0b, 0x026ee5fa, 0x025e8ac8, 0x024e2ee5, 0x023dd3c0, 0x022d7ac1, 0x021d254d, 0x020cd4c6, 0x01fc8a88, 0x01ec47ea, 0x01dc0e40, 0x01cbded8, 0x01bbbafd, 0x01aba3f2, 0x019b9afa, 0x018ba14e, 0x017bb826, 0x016be0b3, 0x015c1c20, 0x014c6b97, 0x013cd038, 0x012d4b20, 0x011ddd67, 0x010e8820, 0x00ff4c57, 0x00f02b13, 0x00e12558, 0x00d23c22, 0x00c37068, 0x00b4c31c, 0x00a6352a, 0x0097c778, 0x00897ae9, 0x007b5057, 0x006d4899, 0x005f647f, 0x0051a4d3, 0x00440a5a, 0x003695d5, 0x002947fc, 0x001c2183, 0x000f231a, 0x00024d68, 0xfff5a111, 0xffe91eb2, 0xffdcc6e4, 0xffd09a37, 0xffc49939, 0xffb8c471, 0xffad1c5f, 0xffa1a180, 0xff965449, 0xff8b352a, 0xff804490, 0xff7582e0, 0xff6af079, 0xff608db6, 0xff565aec, 0xff4c586c, 0xff42867e, 0xff38e569, 0xff2f756c, 0xff2636c2, 0xff1d29a0, 0xff144e36, 0xff0ba4ae, 0xff032d30, 0xfefae7db, 0xfef2d4cc, 0xfeeaf419, 0xfee345d5, 0xfedbca0b, 0xfed480c6, 0xfecd6a07, 0xfec685cf, 0xfebfd416, 0xfeb954d4, 0xfeb307f8, 0xfeaced6f, 0xfea70522, 0xfea14ef4, 0xfe9bcac5, 0xfe96786f, 0xfe9157cb, 0xfe8c68ab, 0xfe87aadd, 0xfe831e2e, 0xfe7ec263, 0xfe7a9741, 0xfe769c85, 0xfe72d1ed, 0xfe6f3731, 0xfe6bcc04, 0xfe689017, 0xfe658319, 0xfe62a4b3, 0xfe5ff48d, 0xfe5d7249, 0xfe5b1d89, 0xfe58f5ea, 0xfe56fb06, 0xfe552c76, 0xfe5389cc, 0xfe52129d, 0xfe50c676, 0xfe4fa4e5, 0xfe4ead73, 0xfe4ddfa8, 0xfe4d3b09, 0xfe4cbf19, 0xfe4c6b59, 0xfe4c3f47, 0xfe4c3a5e, 0xfe4c5c1b, 0xfe4ca3f4, 0xfe4d1160, 0xfe4da3d4, 0xfe4e5ac3, 0xfe4f359e, 0xfe5033d5, 0xfe5154d6, 0xfe52980d, 0xfe53fce6, 0xfe5582cb, 0xfe572926, 0xfe58ef5d, 0xfe5ad4d7,
58d88a051aff15fdf5c57e1e5a4083bbd9635af3adMathias Agopian        0xfe5cd8fa, 0xfe5efb2b, 0xfe613ace, 0xfe639746, 0xfe660ff5, 0xfe68a43c, 0xfe6b537e, 0xfe6e1d1b, 0xfe710072, 0xfe73fce5, 0xfe7711d2, 0xfe7a3e98, 0xfe7d8297, 0xfe80dd2e, 0xfe844dbc, 0xfe87d39f, 0xfe8b6e37, 0xfe8f1ce3, 0xfe92df02, 0xfe96b3f4, 0xfe9a9b19, 0xfe9e93d1, 0xfea29d7d, 0xfea6b77d, 0xfeaae135, 0xfeaf1a05, 0xfeb36152, 0xfeb7b67e, 0xfebc18ef, 0xfec0880a, 0xfec50334, 0xfec989d5, 0xfece1b54, 0xfed2b71b, 0xfed75c94, 0xfedc0b2a, 0xfee0c249, 0xfee5815e, 0xfeea47d8, 0xfeef1528, 0xfef3e8be, 0xfef8c20c, 0xfefda088, 0xff0283a5, 0xff076adc, 0xff0c55a4, 0xff114377, 0xff1633d0, 0xff1b262d, 0xff201a0c, 0xff250eee, 0xff2a0453, 0xff2ef9c1, 0xff33eebc, 0xff38e2cb, 0xff3dd578, 0xff42c64c, 0xff47b4d6, 0xff4ca0a2, 0xff518941, 0xff566e47, 0xff5b4f45, 0xff602bd4, 0xff65038a, 0xff69d601, 0xff6ea2d6, 0xff7369a7, 0xff782a12, 0xff7ce3bb, 0xff819645, 0xff864157, 0xff8ae498, 0xff8f7fb2, 0xff941251, 0xff989c25, 0xff9d1cdc, 0xffa1942a, 0xffa601c3, 0xffaa655e, 0xffaebeb2, 0xffb30d7c, 0xffb75177, 0xffbb8a62, 0xffbfb7ff, 0xffc3da11, 0xffc7f05c, 0xffcbfaa8, 0xffcff8be, 0xffd3ea6a, 0xffd7cf79, 0xffdba7b9, 0xffdf72fe, 0xffe33119, 0xffe6e1e1, 0xffea852e, 0xffee1ad8, 0xfff1a2bb, 0xfff51cb5, 0xfff888a4, 0xfffbe66b, 0xffff35ed, 0x0002770f, 0x0005a9b8, 0x0008cdd0, 0x000be344, 0x000ee9ff, 0x0011e1f0, 0x0014cb08, 0x0017a538, 0x001a7075, 0x001d2cb3, 0x001fd9eb, 0x00227816, 0x0025072f, 0x00278731, 0x0029f81b, 0x002c59ed, 0x002eaca8, 0x0030f04f, 0x003324e6, 0x00354a74, 0x003760ff, 0x00396892, 0x003b6135, 0x003d4af6, 0x003f25e1, 0x0040f206, 0x0042af73,
59d88a051aff15fdf5c57e1e5a4083bbd9635af3adMathias Agopian        0x00445e3a, 0x0045fe6e, 0x00479023, 0x0049136d, 0x004a8864, 0x004bef1e, 0x004d47b5, 0x004e9242, 0x004fcedf, 0x0050fdaa, 0x00521ebe, 0x0053323b, 0x0054383e, 0x005530e9, 0x00561c5b, 0x0056fab7, 0x0057cc20, 0x005890b9, 0x005948a7, 0x0059f40e, 0x005a9315, 0x005b25e2, 0x005bac9d, 0x005c276d, 0x005c967d, 0x005cf9f4, 0x005d51fd, 0x005d9ec3, 0x005de071, 0x005e1731, 0x005e4331, 0x005e649d, 0x005e7ba1, 0x005e886c, 0x005e8b2b, 0x005e840c, 0x005e733e, 0x005e58ef, 0x005e354e, 0x005e088c, 0x005dd2d6, 0x005d945e, 0x005d4d53, 0x005cfde5, 0x005ca645, 0x005c46a2, 0x005bdf2d, 0x005b7017, 0x005af990, 0x005a7bc9, 0x0059f6f2, 0x00596b3b, 0x0058d8d6, 0x00583ff2, 0x0057a0c0, 0x0056fb70, 0x00565032, 0x00559f36, 0x0054e8ac, 0x00542cc2, 0x00536baa, 0x0052a591, 0x0051daa6, 0x00510b19, 0x00503717, 0x004f5ece, 0x004e826d, 0x004da220, 0x004cbe15, 0x004bd678, 0x004aeb75, 0x0049fd39, 0x00490bef, 0x004817c2, 0x004720dd, 0x0046276a, 0x00452b92, 0x00442d80, 0x00432d5b, 0x00422b4c, 0x0041277c, 0x00402210, 0x003f1b31, 0x003e1304, 0x003d09b0, 0x003bff58, 0x003af423, 0x0039e833, 0x0038dbad, 0x0037ceb3, 0x0036c168, 0x0035b3ed, 0x0034a664, 0x003398ed, 0x00328ba7, 0x00317eb3, 0x0030722e, 0x002f6638, 0x002e5aec, 0x002d5069, 0x002c46c9, 0x002b3e2a, 0x002a36a5, 0x00293054, 0x00282b52, 0x002727b7, 0x0026259c, 0x00252518, 0x00242641, 0x00232930, 0x00222df8, 0x002134b0, 0x00203d6b, 0x001f483d, 0x001e5539, 0x001d6473, 0x001c75fb, 0x001b89e3, 0x001aa03b, 0x0019b913, 0x0018d47b, 0x0017f281, 0x00171334, 0x001636a0, 0x00155cd2, 0x001485d7, 0x0013b1ba, 0x0012e086,
60d88a051aff15fdf5c57e1e5a4083bbd9635af3adMathias Agopian        0x00121246, 0x00114703, 0x00107ec6, 0x000fb999, 0x000ef783, 0x000e388c, 0x000d7cba, 0x000cc414, 0x000c0ea0, 0x000b5c64, 0x000aad63, 0x000a01a2, 0x00095925, 0x0008b3f0, 0x00081204, 0x00077364, 0x0006d811, 0x0006400e, 0x0005ab5a, 0x000519f6, 0x00048be2, 0x0004011d, 0x000379a7, 0x0002f57d, 0x0002749e, 0x0001f708, 0x00017cb7, 0x000105a9, 0x000091da, 0x00002147, 0xffffb3eb, 0xffff49c1, 0xfffee2c6, 0xfffe7ef2, 0xfffe1e41, 0xfffdc0ad, 0xfffd6630, 0xfffd0ec3, 0xfffcba5f, 0xfffc68fd, 0xfffc1a97, 0xfffbcf23, 0xfffb869a, 0xfffb40f4, 0xfffafe29, 0xfffabe30, 0xfffa8100, 0xfffa4690, 0xfffa0ed7, 0xfff9d9cc, 0xfff9a764, 0xfff97796, 0xfff94a58, 0xfff91fa0, 0xfff8f764, 0xfff8d199, 0xfff8ae34, 0xfff88d2b, 0xfff86e74, 0xfff85203, 0xfff837cd, 0xfff81fc7, 0xfff809e6, 0xfff7f61f, 0xfff7e467, 0xfff7d4b1, 0xfff7c6f4, 0xfff7bb22, 0xfff7b132, 0xfff7a917, 0xfff7a2c6, 0xfff79e33, 0xfff79b52, 0xfff79a19, 0xfff79a7b, 0xfff79c6e, 0xfff79fe5, 0xfff7a4d5, 0xfff7ab33, 0xfff7b2f3, 0xfff7bc0a, 0xfff7c66d, 0xfff7d210, 0xfff7dee8, 0xfff7eceb, 0xfff7fc0c, 0xfff80c41, 0xfff81d80, 0xfff82fbc, 0xfff842ed, 0xfff85707, 0xfff86bff, 0xfff881cb, 0xfff89861, 0xfff8afb7, 0xfff8c7c3, 0xfff8e07b, 0xfff8f9d4, 0xfff913c6, 0xfff92e46, 0xfff9494c, 0xfff964ce, 0xfff980c3, 0xfff99d23, 0xfff9b9e3, 0xfff9d6fc, 0xfff9f465, 0xfffa1216, 0xfffa3006, 0xfffa4e2d, 0xfffa6c84, 0xfffa8b03, 0xfffaa9a3, 0xfffac85b, 0xfffae725, 0xfffb05f9, 0xfffb24d2, 0xfffb43a7, 0xfffb6273, 0xfffb812f, 0xfffb9fd5, 0xfffbbe5f, 0xfffbdcc6, 0xfffbfb07, 0xfffc191a, 0xfffc36fa, 0xfffc54a4, 0xfffc7210,
6165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        0x00000000 // this one is needed for lerping the last coefficient
6265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian};
6365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
64ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten// we use 15 bits to interpolate between these samples
65ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten// this cannot change because the mul below rely on it.
66ac6020508acedd316391dee42329040bf45f8d90Glenn Kastenstatic const int pLerpBits = 15;
67ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten
68ac6020508acedd316391dee42329040bf45f8d90Glenn Kastenstatic pthread_once_t once_control = PTHREAD_ONCE_INIT;
69ac6020508acedd316391dee42329040bf45f8d90Glenn Kastenstatic readCoefficientsFn readResampleCoefficients = NULL;
70ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten
71ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten/*static*/ AudioResamplerSinc::Constants AudioResamplerSinc::highQualityConstants;
72ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten/*static*/ AudioResamplerSinc::Constants AudioResamplerSinc::veryHighQualityConstants;
73ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten
74ac6020508acedd316391dee42329040bf45f8d90Glenn Kastenvoid AudioResamplerSinc::init_routine()
75ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten{
76ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten    // for high quality resampler, the parameters for coefficients are compile-time constants
77ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten    Constants *c = &highQualityConstants;
78ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten    c->coefsBits = RESAMPLE_FIR_LERP_INT_BITS;
79ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten    c->cShift = kNumPhaseBits - c->coefsBits;
80ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten    c->cMask = ((1<< c->coefsBits)-1) << c->cShift;
81ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten    c->pShift = kNumPhaseBits - c->coefsBits - pLerpBits;
82ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten    c->pMask = ((1<< pLerpBits)-1) << c->pShift;
83ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten    c->halfNumCoefs = RESAMPLE_FIR_NUM_COEF;
84ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten
85ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten    // for very high quality resampler, the parameters are load-time constants
86ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten    veryHighQualityConstants = highQualityConstants;
87ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten
88ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten    // Open the dll to get the coefficients for VERY_HIGH_QUALITY
89ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten    void *resampleCoeffLib = dlopen("libaudio-resampler.so", RTLD_NOW);
90ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten    ALOGV("Open libaudio-resampler library = %p", resampleCoeffLib);
91ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten    if (resampleCoeffLib == NULL) {
92ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten        ALOGE("Could not open audio-resampler library: %s", dlerror());
93ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten        return;
94ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten    }
95ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten
96ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten    readResampleCoefficients = (readCoefficientsFn) dlsym(resampleCoeffLib,
97ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten            "readResamplerCoefficients");
98ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten    readResampleFirNumCoeffFn readResampleFirNumCoeff = (readResampleFirNumCoeffFn)
99ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten            dlsym(resampleCoeffLib, "readResampleFirNumCoeff");
100ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten    readResampleFirLerpIntBitsFn readResampleFirLerpIntBits = (readResampleFirLerpIntBitsFn)
101ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten            dlsym(resampleCoeffLib, "readResampleFirLerpIntBits");
102ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten    if (!readResampleCoefficients || !readResampleFirNumCoeff || !readResampleFirLerpIntBits) {
103ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten        readResampleCoefficients = NULL;
104ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten        dlclose(resampleCoeffLib);
105ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten        resampleCoeffLib = NULL;
106ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten        ALOGE("Could not find symbol: %s", dlerror());
107ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten        return;
108ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten    }
109ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten
110ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten    c = &veryHighQualityConstants;
111ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten    // we have 16 coefs samples per zero-crossing
112ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten    c->coefsBits = readResampleFirLerpIntBits();
113ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten    ALOGV("coefsBits = %d", c->coefsBits);
114ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten    c->cShift = kNumPhaseBits - c->coefsBits;
115ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten    c->cMask = ((1<<c->coefsBits)-1) << c->cShift;
116ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten    c->pShift = kNumPhaseBits - c->coefsBits - pLerpBits;
117ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten    c->pMask = ((1<<pLerpBits)-1) << c->pShift;
118ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten    // number of zero-crossing on each side
119ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten    c->halfNumCoefs = readResampleFirNumCoeff();
120ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten    ALOGV("halfNumCoefs = %d", c->halfNumCoefs);
121ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten    // note that we "leak" resampleCoeffLib until the process exits
122ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten}
12376b111685010e1fea7c0a865c038aee35507fde4SathishKumar Mani
12465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian// ----------------------------------------------------------------------------
12565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
12665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianstatic inline
12765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianint32_t mulRL(int left, int32_t in, uint32_t vRL)
12865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian{
12965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#if defined(__arm__) && !defined(__thumb__)
13065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    int32_t out;
13165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    if (left) {
13265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        asm( "smultb %[out], %[in], %[vRL] \n"
13365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian             : [out]"=r"(out)
13465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian             : [in]"%r"(in), [vRL]"r"(vRL)
13565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian             : );
13665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    } else {
13765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        asm( "smultt %[out], %[in], %[vRL] \n"
13865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian             : [out]"=r"(out)
13965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian             : [in]"%r"(in), [vRL]"r"(vRL)
14065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian             : );
14165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    }
14265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    return out;
14365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#else
14465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    if (left) {
14565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        return int16_t(in>>16) * int16_t(vRL&0xFFFF);
14665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    } else {
14765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        return int16_t(in>>16) * int16_t(vRL>>16);
14865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    }
14965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#endif
15065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
15165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
15265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianstatic inline
15365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianint32_t mulAdd(int16_t in, int32_t v, int32_t a)
15465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian{
15565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#if defined(__arm__) && !defined(__thumb__)
15665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    int32_t out;
15765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    asm( "smlawb %[out], %[v], %[in], %[a] \n"
15865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian         : [out]"=r"(out)
15965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian         : [in]"%r"(in), [v]"r"(v), [a]"r"(a)
16065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian         : );
16165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    return out;
16265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#else
16365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    return a + in * (v>>16);
16465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    // improved precision
16565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    // return a + in * (v>>16) + ((in * (v & 0xffff)) >> 16);
16665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#endif
16765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
16865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
16965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianstatic inline
17065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianint32_t mulAddRL(int left, uint32_t inRL, int32_t v, int32_t a)
17165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian{
17265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#if defined(__arm__) && !defined(__thumb__)
17365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    int32_t out;
17465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    if (left) {
17565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        asm( "smlawb %[out], %[v], %[inRL], %[a] \n"
17665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian             : [out]"=r"(out)
17765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian             : [inRL]"%r"(inRL), [v]"r"(v), [a]"r"(a)
17865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian             : );
17965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    } else {
18065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        asm( "smlawt %[out], %[v], %[inRL], %[a] \n"
18165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian             : [out]"=r"(out)
18265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian             : [inRL]"%r"(inRL), [v]"r"(v), [a]"r"(a)
18365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian             : );
18465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    }
18565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    return out;
18665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#else
18765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    if (left) {
18865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        return a + (int16_t(inRL&0xFFFF) * (v>>16));
18965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        //improved precision
19065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        // return a + (int16_t(inRL&0xFFFF) * (v>>16)) + ((int16_t(inRL&0xFFFF) * (v & 0xffff)) >> 16);
19165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    } else {
19265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        return a + (int16_t(inRL>>16) * (v>>16));
19365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    }
19465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian#endif
19565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
19665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
19765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian// ----------------------------------------------------------------------------
19865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
19965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias AgopianAudioResamplerSinc::AudioResamplerSinc(int bitDepth,
200ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten        int inChannelCount, int32_t sampleRate, src_quality quality)
201ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten    : AudioResampler(bitDepth, inChannelCount, sampleRate, quality),
20265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    mState(0)
20365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian{
20465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    /*
20565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian     * Layout of the state buffer for 32 tap:
20665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian     *
20765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian     * "present" sample            beginning of 2nd buffer
20865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian     *                 v                v
20965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian     *  0              01               2              23              3
21065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian     *  0              F0               0              F0              F
21165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian     * [pppppppppppppppInnnnnnnnnnnnnnnnpppppppppppppppInnnnnnnnnnnnnnnn]
21265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian     *                 ^               ^ head
21365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian     *
21465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian     * p = past samples, convoluted with the (p)ositive side of sinc()
21565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian     * n = future samples, convoluted with the (n)egative side of sinc()
21665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian     * r = extra space for implementing the ring buffer
21765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian     *
21865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian     */
21965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
220ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten    // Load the constants for coefficients
221ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten    int ok = pthread_once(&once_control, init_routine);
222ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten    if (ok != 0) {
223ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten        ALOGE("%s pthread_once failed: %d", __func__, ok);
22476b111685010e1fea7c0a865c038aee35507fde4SathishKumar Mani    }
225ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten    mConstants = (quality == VERY_HIGH_QUALITY) ? &veryHighQualityConstants : &highQualityConstants;
22665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
22765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
22876b111685010e1fea7c0a865c038aee35507fde4SathishKumar Mani
22965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias AgopianAudioResamplerSinc::~AudioResamplerSinc()
23065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian{
231ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten    delete[] mState;
23265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
23365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
23465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid AudioResamplerSinc::init() {
235ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten    const Constants *c = mConstants;
23676b111685010e1fea7c0a865c038aee35507fde4SathishKumar Mani
237ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten    const size_t numCoefs = 2*c->halfNumCoefs;
23876b111685010e1fea7c0a865c038aee35507fde4SathishKumar Mani    const size_t stateSize = numCoefs * mChannelCount * 2;
23976b111685010e1fea7c0a865c038aee35507fde4SathishKumar Mani    mState = new int16_t[stateSize];
24076b111685010e1fea7c0a865c038aee35507fde4SathishKumar Mani    memset(mState, 0, sizeof(int16_t)*stateSize);
241ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten    mImpulse = mState + (c->halfNumCoefs-1)*mChannelCount;
24276b111685010e1fea7c0a865c038aee35507fde4SathishKumar Mani    mRingFull = mImpulse + (numCoefs+1)*mChannelCount;
24365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
24465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
24565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid AudioResamplerSinc::resample(int32_t* out, size_t outFrameCount,
24665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            AudioBufferProvider* provider)
24765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian{
24876b111685010e1fea7c0a865c038aee35507fde4SathishKumar Mani
249ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten    // FIXME store current state (up or down sample) and only load the coefs when the state
250ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten    // changes. Or load two pointers one for up and one for down in the init function.
251ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten    // Not critical now since the read functions are fast, but would be important if read was slow.
25261ea117b03b53382b5ecbc33004c7d37ea70ea8bMathias Agopian    if (mConstants == &veryHighQualityConstants && readResampleCoefficients) {
25376b111685010e1fea7c0a865c038aee35507fde4SathishKumar Mani        ALOGV("get coefficient from libmm-audio resampler library");
254ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten        mFirCoefs = (mInSampleRate <= mSampleRate) ? readResampleCoefficients(true) :
255ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten                readResampleCoefficients(false);
256ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten    } else {
25776b111685010e1fea7c0a865c038aee35507fde4SathishKumar Mani        ALOGV("Use default coefficients");
25876b111685010e1fea7c0a865c038aee35507fde4SathishKumar Mani        mFirCoefs = (mInSampleRate <= mSampleRate) ? mFirCoefsUp : mFirCoefsDown;
25976b111685010e1fea7c0a865c038aee35507fde4SathishKumar Mani    }
26065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
26165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    // select the appropriate resampler
26265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    switch (mChannelCount) {
26365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    case 1:
26465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        resample<1>(out, outFrameCount, provider);
26565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        break;
26665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    case 2:
26765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        resample<2>(out, outFrameCount, provider);
26865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        break;
26965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    }
27076b111685010e1fea7c0a865c038aee35507fde4SathishKumar Mani
27165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
27265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
27365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
27465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopiantemplate<int CHANNELS>
27565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid AudioResamplerSinc::resample(int32_t* out, size_t outFrameCount,
27665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        AudioBufferProvider* provider)
27765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian{
278ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten    const Constants *c = mConstants;
27965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    int16_t* impulse = mImpulse;
28065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    uint32_t vRL = mVolumeRL;
28165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    size_t inputIndex = mInputIndex;
28265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    uint32_t phaseFraction = mPhaseFraction;
28365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    uint32_t phaseIncrement = mPhaseIncrement;
28465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    size_t outputIndex = 0;
28565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    size_t outputSampleCount = outFrameCount * 2;
28665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    size_t inFrameCount = (outFrameCount*mInSampleRate)/mSampleRate;
28765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
28865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    while (outputIndex < outputSampleCount) {
28965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        // buffer is empty, fetch a new one
290d198b61603d5fa9298edea4ddb5852ea45159906Glenn Kasten        while (mBuffer.frameCount == 0) {
291d198b61603d5fa9298edea4ddb5852ea45159906Glenn Kasten            mBuffer.frameCount = inFrameCount;
2924ff14bae91075eb274eb1c2975982358946e7e63John Grossman            provider->getNextBuffer(&mBuffer,
2934ff14bae91075eb274eb1c2975982358946e7e63John Grossman                                    calculateOutputPTS(outputIndex / 2));
294d198b61603d5fa9298edea4ddb5852ea45159906Glenn Kasten            if (mBuffer.raw == NULL) {
29565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                goto resample_exit;
29665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            }
29765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            const uint32_t phaseIndex = phaseFraction >> kNumPhaseBits;
29865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            if (phaseIndex == 1) {
29965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                // read one frame
300d198b61603d5fa9298edea4ddb5852ea45159906Glenn Kasten                read<CHANNELS>(impulse, phaseFraction, mBuffer.i16, inputIndex);
30165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            } else if (phaseIndex == 2) {
30265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                // read 2 frames
303d198b61603d5fa9298edea4ddb5852ea45159906Glenn Kasten                read<CHANNELS>(impulse, phaseFraction, mBuffer.i16, inputIndex);
30465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                inputIndex++;
30565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                if (inputIndex >= mBuffer.frameCount) {
30665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                    inputIndex -= mBuffer.frameCount;
307d198b61603d5fa9298edea4ddb5852ea45159906Glenn Kasten                    provider->releaseBuffer(&mBuffer);
30865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                } else {
309d198b61603d5fa9298edea4ddb5852ea45159906Glenn Kasten                    read<CHANNELS>(impulse, phaseFraction, mBuffer.i16, inputIndex);
31065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                }
311e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten            }
31265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        }
313d198b61603d5fa9298edea4ddb5852ea45159906Glenn Kasten        int16_t *in = mBuffer.i16;
314d198b61603d5fa9298edea4ddb5852ea45159906Glenn Kasten        const size_t frameCount = mBuffer.frameCount;
31565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
31665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        // Always read-in the first samples from the input buffer
317ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten        int16_t* head = impulse + c->halfNumCoefs*CHANNELS;
31865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        head[0] = in[inputIndex*CHANNELS + 0];
31965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        if (CHANNELS == 2)
32065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            head[1] = in[inputIndex*CHANNELS + 1];
32165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
32265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        // handle boundary case
32365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        int32_t l, r;
32465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        while (outputIndex < outputSampleCount) {
32565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            filterCoefficient<CHANNELS>(l, r, phaseFraction, impulse);
32665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            out[outputIndex++] += 2 * mulRL(1, l, vRL);
32765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            out[outputIndex++] += 2 * mulRL(0, r, vRL);
32865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
32965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            phaseFraction += phaseIncrement;
33065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            const uint32_t phaseIndex = phaseFraction >> kNumPhaseBits;
33165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            if (phaseIndex == 1) {
33265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                inputIndex++;
33365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                if (inputIndex >= frameCount)
33465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                    break;  // need a new buffer
33565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                read<CHANNELS>(impulse, phaseFraction, in, inputIndex);
336e53b9ead781c36e96d6b6f012ddffc93a3d80f0dGlenn Kasten            } else if (phaseIndex == 2) {    // maximum value
33765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                inputIndex++;
33865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                if (inputIndex >= frameCount)
33965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                    break;  // 0 frame available, 2 frames needed
34065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                // read first frame
34165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                read<CHANNELS>(impulse, phaseFraction, in, inputIndex);
34265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                inputIndex++;
34365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                if (inputIndex >= frameCount)
34465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                    break;  // 0 frame available, 1 frame needed
34565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                // read second frame
34665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian                read<CHANNELS>(impulse, phaseFraction, in, inputIndex);
34765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            }
34865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        }
34965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
35065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        // if done with buffer, save samples
35165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        if (inputIndex >= frameCount) {
35265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian            inputIndex -= frameCount;
353d198b61603d5fa9298edea4ddb5852ea45159906Glenn Kasten            provider->releaseBuffer(&mBuffer);
35465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        }
35565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    }
35665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
35765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianresample_exit:
35865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    mImpulse = impulse;
35965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    mInputIndex = inputIndex;
36065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    mPhaseFraction = phaseFraction;
36165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
36265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
36365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopiantemplate<int CHANNELS>
36465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian/***
36565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian* read()
36665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian*
36765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian* This function reads only one frame from input buffer and writes it in
36865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian* state buffer
36965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian*
37065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian**/
37165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid AudioResamplerSinc::read(
37265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        int16_t*& impulse, uint32_t& phaseFraction,
37354c3b66444ebfb9f2265ee70ac3b76ccefa0506aGlenn Kasten        const int16_t* in, size_t inputIndex)
37465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian{
375ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten    const Constants *c = mConstants;
37665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    const uint32_t phaseIndex = phaseFraction >> kNumPhaseBits;
37765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    impulse += CHANNELS;
37865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    phaseFraction -= 1LU<<kNumPhaseBits;
37965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    if (impulse >= mRingFull) {
380ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten        const size_t stateSize = (c->halfNumCoefs*2)*CHANNELS;
38165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        memcpy(mState, mState+stateSize, sizeof(int16_t)*stateSize);
38265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        impulse -= stateSize;
38365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    }
384ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten    int16_t* head = impulse + c->halfNumCoefs*CHANNELS;
38565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    head[0] = in[inputIndex*CHANNELS + 0];
38665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    if (CHANNELS == 2)
38765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        head[1] = in[inputIndex*CHANNELS + 1];
38865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
38965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
39065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopiantemplate<int CHANNELS>
39165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid AudioResamplerSinc::filterCoefficient(
39254c3b66444ebfb9f2265ee70ac3b76ccefa0506aGlenn Kasten        int32_t& l, int32_t& r, uint32_t phase, const int16_t *samples)
39365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian{
394ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten    const Constants *c = mConstants;
395ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten
39665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    // compute the index of the coefficient on the positive side and
39765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    // negative side
398ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten    uint32_t indexP = (phase & c->cMask) >> c->cShift;
399ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten    uint16_t lerpP = (phase & c->pMask) >> c->pShift;
400ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten    uint32_t indexN = (-phase & c->cMask) >> c->cShift;
401ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten    uint16_t lerpN = (-phase & c->pMask) >> c->pShift;
40265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    if ((indexP == 0) && (lerpP == 0)) {
403ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten        indexN = c->cMask >> c->cShift;
404ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten        lerpN = c->pMask >> c->pShift;
40565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    }
40665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
40765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    l = 0;
40865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    r = 0;
40954c3b66444ebfb9f2265ee70ac3b76ccefa0506aGlenn Kasten    const int32_t* coefs = mFirCoefs;
41054c3b66444ebfb9f2265ee70ac3b76ccefa0506aGlenn Kasten    const int16_t *sP = samples;
41154c3b66444ebfb9f2265ee70ac3b76ccefa0506aGlenn Kasten    const int16_t *sN = samples+CHANNELS;
412ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten    for (unsigned int i=0 ; i < c->halfNumCoefs/4 ; i++) {
41365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        interpolate<CHANNELS>(l, r, coefs+indexP, lerpP, sP);
41465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        interpolate<CHANNELS>(l, r, coefs+indexN, lerpN, sN);
415ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten        sP -= CHANNELS; sN += CHANNELS; coefs += 1 << c->coefsBits;
41665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        interpolate<CHANNELS>(l, r, coefs+indexP, lerpP, sP);
41765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        interpolate<CHANNELS>(l, r, coefs+indexN, lerpN, sN);
418ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten        sP -= CHANNELS; sN += CHANNELS; coefs += 1 << c->coefsBits;
41965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        interpolate<CHANNELS>(l, r, coefs+indexP, lerpP, sP);
42065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        interpolate<CHANNELS>(l, r, coefs+indexN, lerpN, sN);
421ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten        sP -= CHANNELS; sN += CHANNELS; coefs += 1 << c->coefsBits;
42265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        interpolate<CHANNELS>(l, r, coefs+indexP, lerpP, sP);
42365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        interpolate<CHANNELS>(l, r, coefs+indexN, lerpN, sN);
424ac6020508acedd316391dee42329040bf45f8d90Glenn Kasten        sP -= CHANNELS; sN += CHANNELS; coefs += 1 << c->coefsBits;
42565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    }
42665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
42765ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian
42865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopiantemplate<int CHANNELS>
42965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopianvoid AudioResamplerSinc::interpolate(
43065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        int32_t& l, int32_t& r,
43154c3b66444ebfb9f2265ee70ac3b76ccefa0506aGlenn Kasten        const int32_t* coefs, int16_t lerp, const int16_t* samples)
43265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian{
43365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    int32_t c0 = coefs[0];
43465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    int32_t c1 = coefs[1];
43565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    int32_t sinc = mulAdd(lerp, (c1-c0)<<1, c0);
43665ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    if (CHANNELS == 2) {
43754c3b66444ebfb9f2265ee70ac3b76ccefa0506aGlenn Kasten        uint32_t rl = *reinterpret_cast<const uint32_t*>(samples);
43865ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        l = mulAddRL(1, rl, sinc, l);
43965ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        r = mulAddRL(0, rl, sinc, r);
44065ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    } else {
44165ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian        r = l = mulAdd(samples[0], sinc, l);
44265ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian    }
44365ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}
44465ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian// ----------------------------------------------------------------------------
44565ab47156e1c7dfcd8cc4266253a5ff30219e7f0Mathias Agopian}; // namespace android
446