1 /* 2 * Copyright (C) 2007 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #define LOG_TAG "AudioResamplerSinc" 18 //#define LOG_NDEBUG 0 19 20 #define __STDC_CONSTANT_MACROS 21 #include <malloc.h> 22 #include <string.h> 23 #include <stdlib.h> 24 #include <dlfcn.h> 25 26 #include <cutils/compiler.h> 27 #include <cutils/properties.h> 28 29 #include <utils/Log.h> 30 #include <audio_utils/primitives.h> 31 32 #include "AudioResamplerSinc.h" 33 34 35 36 #if defined(__arm__) && !defined(__thumb__) 37 #define USE_INLINE_ASSEMBLY (true) 38 #else 39 #define USE_INLINE_ASSEMBLY (false) 40 #endif 41 42 #if defined(__aarch64__) || defined(__ARM_NEON__) 43 #include <arm_neon.h> 44 #define USE_NEON 45 #else 46 #undef USE_NEON 47 #endif 48 49 #define UNUSED(x) ((void)(x)) 50 51 namespace android { 52 // ---------------------------------------------------------------------------- 53 54 55 /* 56 * These coeficients are computed with the "fir" utility found in 57 * tools/resampler_tools 58 * cmd-line: fir -l 7 -s 48000 -c 20478 59 */ 60 const uint32_t AudioResamplerSinc::mFirCoefsUp[] __attribute__ ((aligned (32))) = { 61 0x6d374bc7, 0x111c6ba0, 0xf3240e61, 0x07d14a38, 0xfc509e64, 0x0139cee9, 0xffc8c866, 0xfffcc300, 62 0x6d35278a, 0x103e8192, 0xf36b9dfd, 0x07bdfaa5, 0xfc5102d0, 0x013d618d, 0xffc663b9, 0xfffd9592, 63 0x6d2ebafe, 0x0f62811a, 0xf3b3d8ac, 0x07a9f399, 0xfc51d9a6, 0x0140bea5, 0xffc41212, 0xfffe631e, 64 0x6d24069d, 0x0e8875ad, 0xf3fcb43e, 0x07953976, 0xfc53216f, 0x0143e67c, 0xffc1d373, 0xffff2b9f, 65 0x6d150b35, 0x0db06a89, 0xf4462690, 0x077fd0ac, 0xfc54d8ae, 0x0146d965, 0xffbfa7d9, 0xffffef10, 66 0x6d01c9e3, 0x0cda6ab5, 0xf4902587, 0x0769bdaf, 0xfc56fdda, 0x014997bb, 0xffbd8f40, 0x0000ad6e, 67 0x6cea4418, 0x0c0680fe, 0xf4daa718, 0x07530501, 0xfc598f60, 0x014c21db, 0xffbb89a1, 0x000166b6, 68 0x6cce7b97, 0x0b34b7f5, 0xf525a143, 0x073bab28, 0xfc5c8ba5, 0x014e782a, 0xffb996f3, 0x00021ae5, 69 0x6cae7272, 0x0a6519f4, 0xf5710a17, 0x0723b4b4, 0xfc5ff105, 0x01509b14, 0xffb7b728, 0x0002c9fd, 70 0x6c8a2b0f, 0x0997b116, 0xf5bcd7b1, 0x070b2639, 0xfc63bdd3, 0x01528b08, 0xffb5ea31, 0x000373fb, 71 0x6c61a823, 0x08cc873c, 0xf609003f, 0x06f20453, 0xfc67f05a, 0x0154487b, 0xffb42ffc, 0x000418e2, 72 0x6c34ecb5, 0x0803a60a, 0xf6557a00, 0x06d853a2, 0xfc6c86dd, 0x0155d3e8, 0xffb28876, 0x0004b8b3, 73 0x6c03fc1c, 0x073d16e7, 0xf6a23b44, 0x06be18cd, 0xfc717f97, 0x01572dcf, 0xffb0f388, 0x00055371, 74 0x6bced9ff, 0x0678e2fc, 0xf6ef3a6e, 0x06a3587e, 0xfc76d8bc, 0x015856b6, 0xffaf7118, 0x0005e921, 75 0x6b958a54, 0x05b71332, 0xf73c6df4, 0x06881761, 0xfc7c9079, 0x01594f25, 0xffae010b, 0x000679c5, 76 0x6b581163, 0x04f7b037, 0xf789cc61, 0x066c5a27, 0xfc82a4f4, 0x015a17ab, 0xffaca344, 0x00070564, 77 0x6b1673c1, 0x043ac276, 0xf7d74c53, 0x06502583, 0xfc89144d, 0x015ab0db, 0xffab57a1, 0x00078c04, 78 0x6ad0b652, 0x0380521c, 0xf824e480, 0x06337e2a, 0xfc8fdc9f, 0x015b1b4e, 0xffaa1e02, 0x00080dab, 79 0x6a86de48, 0x02c86715, 0xf8728bb3, 0x061668d2, 0xfc96fbfc, 0x015b579e, 0xffa8f641, 0x00088a62, 80 0x6a38f123, 0x0213090c, 0xf8c038d0, 0x05f8ea30, 0xfc9e7074, 0x015b666c, 0xffa7e039, 0x00090230, 81 0x69e6f4b1, 0x01603f6e, 0xf90de2d1, 0x05db06fc, 0xfca63810, 0x015b485b, 0xffa6dbc0, 0x0009751e, 82 0x6990ef0b, 0x00b01162, 0xf95b80cb, 0x05bcc3ed, 0xfcae50d6, 0x015afe14, 0xffa5e8ad, 0x0009e337, 83 0x6936e697, 0x000285d0, 0xf9a909ea, 0x059e25b5, 0xfcb6b8c4, 0x015a8843, 0xffa506d2, 0x000a4c85, 84 0x68d8e206, 0xff57a35e, 0xf9f67577, 0x057f310a, 0xfcbf6dd8, 0x0159e796, 0xffa43603, 0x000ab112, 85 0x6876e855, 0xfeaf706f, 0xfa43bad2, 0x055fea9d, 0xfcc86e09, 0x01591cc0, 0xffa3760e, 0x000b10ec, 86 0x681100c9, 0xfe09f323, 0xfa90d17b, 0x0540571a, 0xfcd1b74c, 0x01582878, 0xffa2c6c2, 0x000b6c1d, 87 0x67a732f4, 0xfd673159, 0xfaddb10c, 0x05207b2f, 0xfcdb4793, 0x01570b77, 0xffa227ec, 0x000bc2b3, 88 0x673986ac, 0xfcc730aa, 0xfb2a513b, 0x05005b82, 0xfce51ccb, 0x0155c678, 0xffa19957, 0x000c14bb, 89 0x66c80413, 0xfc29f670, 0xfb76a9dd, 0x04dffcb6, 0xfcef34e1, 0x01545a3c, 0xffa11acb, 0x000c6244, 90 0x6652b392, 0xfb8f87bd, 0xfbc2b2e4, 0x04bf6369, 0xfcf98dbe, 0x0152c783, 0xffa0ac11, 0x000cab5c, 91 0x65d99dd5, 0xfaf7e963, 0xfc0e6461, 0x049e9433, 0xfd04254a, 0x01510f13, 0xffa04cf0, 0x000cf012, 92 0x655ccbd3, 0xfa631fef, 0xfc59b685, 0x047d93a8, 0xfd0ef969, 0x014f31b2, 0xff9ffd2c, 0x000d3075, 93 0x64dc46c3, 0xf9d12fab, 0xfca4a19f, 0x045c6654, 0xfd1a0801, 0x014d3029, 0xff9fbc89, 0x000d6c97, 94 0x64581823, 0xf9421c9d, 0xfcef1e20, 0x043b10bd, 0xfd254ef4, 0x014b0b45, 0xff9f8ac9, 0x000da486, 95 0x63d049b4, 0xf8b5ea87, 0xfd392498, 0x04199760, 0xfd30cc24, 0x0148c3d2, 0xff9f67ae, 0x000dd854, 96 0x6344e578, 0xf82c9ce7, 0xfd82adba, 0x03f7feb4, 0xfd3c7d73, 0x01465a9f, 0xff9f52f7, 0x000e0812, 97 0x62b5f5b2, 0xf7a636fa, 0xfdcbb25a, 0x03d64b27, 0xfd4860c2, 0x0143d07f, 0xff9f4c65, 0x000e33d3, 98 0x622384e8, 0xf722bbb5, 0xfe142b6e, 0x03b4811d, 0xfd5473f3, 0x01412643, 0xff9f53b4, 0x000e5ba7, 99 0x618d9ddc, 0xf6a22dcf, 0xfe5c120f, 0x0392a4f4, 0xfd60b4e7, 0x013e5cc0, 0xff9f68a1, 0x000e7fa1, 100 0x60f44b91, 0xf6248fb6, 0xfea35f79, 0x0370bafc, 0xfd6d2180, 0x013b74ca, 0xff9f8ae9, 0x000e9fd5, 101 0x60579947, 0xf5a9e398, 0xfeea0d0c, 0x034ec77f, 0xfd79b7a1, 0x01386f3a, 0xff9fba47, 0x000ebc54, 102 0x5fb79278, 0xf5322b61, 0xff30144a, 0x032ccebb, 0xfd86752e, 0x01354ce7, 0xff9ff674, 0x000ed533, 103 0x5f1442dc, 0xf4bd68b6, 0xff756edc, 0x030ad4e1, 0xfd93580d, 0x01320ea9, 0xffa03f2b, 0x000eea84, 104 0x5e6db665, 0xf44b9cfe, 0xffba168d, 0x02e8de19, 0xfda05e23, 0x012eb55a, 0xffa09425, 0x000efc5c, 105 0x5dc3f93c, 0xf3dcc959, 0xfffe054e, 0x02c6ee7f, 0xfdad855b, 0x012b41d3, 0xffa0f519, 0x000f0ace, 106 0x5d1717c4, 0xf370eea9, 0x00413536, 0x02a50a22, 0xfdbacb9e, 0x0127b4f1, 0xffa161bf, 0x000f15ef, 107 0x5c671e96, 0xf3080d8c, 0x0083a081, 0x02833506, 0xfdc82edb, 0x01240f8e, 0xffa1d9cf, 0x000f1dd2, 108 0x5bb41a80, 0xf2a2265e, 0x00c54190, 0x02617321, 0xfdd5ad01, 0x01205285, 0xffa25cfe, 0x000f228d, 109 0x5afe1886, 0xf23f393b, 0x010612eb, 0x023fc85c, 0xfde34403, 0x011c7eb2, 0xffa2eb04, 0x000f2434, 110 0x5a4525df, 0xf1df45fd, 0x01460f41, 0x021e3891, 0xfdf0f1d6, 0x011894f0, 0xffa38395, 0x000f22dc, 111 0x59894ff3, 0xf1824c3e, 0x01853165, 0x01fcc78f, 0xfdfeb475, 0x0114961b, 0xffa42668, 0x000f1e99, 112 0x58caa45b, 0xf1284b58, 0x01c37452, 0x01db7914, 0xfe0c89db, 0x0110830f, 0xffa4d332, 0x000f1781, 113 0x580930e1, 0xf0d14267, 0x0200d32c, 0x01ba50d2, 0xfe1a7009, 0x010c5ca6, 0xffa589a6, 0x000f0da8, 114 0x5745037c, 0xf07d3043, 0x023d493c, 0x0199526b, 0xfe286505, 0x010823ba, 0xffa6497c, 0x000f0125, 115 0x567e2a51, 0xf02c138a, 0x0278d1f2, 0x01788170, 0xfe3666d5, 0x0103d927, 0xffa71266, 0x000ef20b, 116 0x55b4b3af, 0xefddea9a, 0x02b368e6, 0x0157e166, 0xfe447389, 0x00ff7dc4, 0xffa7e41a, 0x000ee070, 117 0x54e8ae13, 0xef92b393, 0x02ed09d7, 0x013775bf, 0xfe528931, 0x00fb126b, 0xffa8be4c, 0x000ecc69, 118 0x541a281e, 0xef4a6c58, 0x0325b0ad, 0x011741df, 0xfe60a5e5, 0x00f697f3, 0xffa9a0b1, 0x000eb60b, 119 0x5349309e, 0xef051290, 0x035d5977, 0x00f7491a, 0xfe6ec7c0, 0x00f20f32, 0xffaa8afe, 0x000e9d6b, 120 0x5275d684, 0xeec2a3a3, 0x0394006a, 0x00d78eb3, 0xfe7cece2, 0x00ed78ff, 0xffab7ce7, 0x000e829e, 121 0x51a028e8, 0xee831cc3, 0x03c9a1e5, 0x00b815da, 0xfe8b1373, 0x00e8d62d, 0xffac7621, 0x000e65ba, 122 0x50c83704, 0xee467ae1, 0x03fe3a6f, 0x0098e1b3, 0xfe99399f, 0x00e4278f, 0xffad7662, 0x000e46d3, 123 0x4fee1037, 0xee0cbab9, 0x0431c6b5, 0x0079f54c, 0xfea75d97, 0x00df6df7, 0xffae7d5f, 0x000e25fd, 124 0x4f11c3fe, 0xedd5d8ca, 0x0464438c, 0x005b53a4, 0xfeb57d92, 0x00daaa34, 0xffaf8acd, 0x000e034f, 125 0x4e3361f7, 0xeda1d15c, 0x0495adf2, 0x003cffa9, 0xfec397cf, 0x00d5dd16, 0xffb09e63, 0x000ddedb, 126 0x4d52f9df, 0xed70a07d, 0x04c6030d, 0x001efc35, 0xfed1aa92, 0x00d10769, 0xffb1b7d8, 0x000db8b7, 127 0x4c709b8e, 0xed424205, 0x04f54029, 0x00014c12, 0xfedfb425, 0x00cc29f7, 0xffb2d6e1, 0x000d90f6, 128 0x4b8c56f8, 0xed16b196, 0x052362ba, 0xffe3f1f7, 0xfeedb2da, 0x00c7458a, 0xffb3fb37, 0x000d67ae, 129 0x4aa63c2c, 0xecedea99, 0x0550685d, 0xffc6f08a, 0xfefba508, 0x00c25ae8, 0xffb52490, 0x000d3cf1, 130 0x49be5b50, 0xecc7e845, 0x057c4ed4, 0xffaa4a5d, 0xff09890f, 0x00bd6ad7, 0xffb652a7, 0x000d10d5, 131 0x48d4c4a2, 0xeca4a59b, 0x05a7140b, 0xff8e01f1, 0xff175d53, 0x00b87619, 0xffb78533, 0x000ce36b, 132 0x47e98874, 0xec841d68, 0x05d0b612, 0xff7219b3, 0xff252042, 0x00b37d70, 0xffb8bbed, 0x000cb4c8, 133 0x46fcb72d, 0xec664a48, 0x05f93324, 0xff5693fe, 0xff32d04f, 0x00ae8198, 0xffb9f691, 0x000c84ff, 134 0x460e6148, 0xec4b26a2, 0x0620899e, 0xff3b731b, 0xff406bf8, 0x00a9834e, 0xffbb34d8, 0x000c5422, 135 0x451e9750, 0xec32acb0, 0x0646b808, 0xff20b93e, 0xff4df1be, 0x00a4834c, 0xffbc767f, 0x000c2245, 136 0x442d69de, 0xec1cd677, 0x066bbd0d, 0xff066889, 0xff5b602c, 0x009f8249, 0xffbdbb42, 0x000bef79, 137 0x433ae99c, 0xec099dcf, 0x068f9781, 0xfeec830d, 0xff68b5d5, 0x009a80f8, 0xffbf02dd, 0x000bbbd2, 138 0x4247273f, 0xebf8fc64, 0x06b2465b, 0xfed30ac5, 0xff75f153, 0x0095800c, 0xffc04d0f, 0x000b8760, 139 0x41523389, 0xebeaebaf, 0x06d3c8bb, 0xfeba0199, 0xff831148, 0x00908034, 0xffc19996, 0x000b5235, 140 0x405c1f43, 0xebdf6500, 0x06f41de3, 0xfea16960, 0xff90145e, 0x008b821b, 0xffc2e832, 0x000b1c64, 141 0x3f64fb40, 0xebd6617b, 0x0713453d, 0xfe8943dc, 0xff9cf947, 0x0086866b, 0xffc438a3, 0x000ae5fc, 142 0x3e6cd85b, 0xebcfda19, 0x07313e56, 0xfe7192bd, 0xffa9bebe, 0x00818dcb, 0xffc58aaa, 0x000aaf0f, 143 0x3d73c772, 0xebcbc7a7, 0x074e08e0, 0xfe5a579d, 0xffb66386, 0x007c98de, 0xffc6de09, 0x000a77ac, 144 0x3c79d968, 0xebca22cc, 0x0769a4b2, 0xfe439407, 0xffc2e669, 0x0077a845, 0xffc83285, 0x000a3fe5, 145 0x3b7f1f23, 0xebcae405, 0x078411c7, 0xfe2d496f, 0xffcf463a, 0x0072bc9d, 0xffc987e0, 0x000a07c9, 146 0x3a83a989, 0xebce03aa, 0x079d503b, 0xfe177937, 0xffdb81d6, 0x006dd680, 0xffcadde1, 0x0009cf67, 147 0x3987897f, 0xebd379eb, 0x07b56051, 0xfe0224b0, 0xffe79820, 0x0068f687, 0xffcc344c, 0x000996ce, 148 0x388acfe9, 0xebdb3ed5, 0x07cc426c, 0xfded4d13, 0xfff38806, 0x00641d44, 0xffcd8aeb, 0x00095e0e, 149 0x378d8da8, 0xebe54a4f, 0x07e1f712, 0xfdd8f38b, 0xffff507b, 0x005f4b4a, 0xffcee183, 0x00092535, 150 0x368fd397, 0xebf1941f, 0x07f67eec, 0xfdc5192d, 0x000af07f, 0x005a8125, 0xffd037e0, 0x0008ec50, 151 0x3591b28b, 0xec0013e8, 0x0809dac3, 0xfdb1befc, 0x00166718, 0x0055bf60, 0xffd18dcc, 0x0008b36e, 152 0x34933b50, 0xec10c12c, 0x081c0b84, 0xfd9ee5e7, 0x0021b355, 0x00510682, 0xffd2e311, 0x00087a9c, 153 0x33947eab, 0xec23934f, 0x082d1239, 0xfd8c8ecc, 0x002cd44d, 0x004c570f, 0xffd4377d, 0x000841e8, 154 0x32958d55, 0xec388194, 0x083cf010, 0xfd7aba74, 0x0037c922, 0x0047b186, 0xffd58ade, 0x0008095d, 155 0x319677fa, 0xec4f8322, 0x084ba654, 0xfd696998, 0x004290fc, 0x00431666, 0xffd6dd02, 0x0007d108, 156 0x30974f3b, 0xec688f02, 0x08593671, 0xfd589cdc, 0x004d2b0e, 0x003e8628, 0xffd82dba, 0x000798f5, 157 0x2f9823a8, 0xec839c22, 0x0865a1f1, 0xfd4854d3, 0x00579691, 0x003a0141, 0xffd97cd6, 0x00076130, 158 0x2e9905c1, 0xeca0a156, 0x0870ea7e, 0xfd3891fd, 0x0061d2ca, 0x00358824, 0xffdaca2a, 0x000729c4, 159 0x2d9a05f4, 0xecbf9558, 0x087b11de, 0xfd2954c8, 0x006bdf05, 0x00311b41, 0xffdc1588, 0x0006f2bb, 160 0x2c9b349e, 0xece06ecb, 0x088419f6, 0xfd1a9d91, 0x0075ba95, 0x002cbb03, 0xffdd5ec6, 0x0006bc21, 161 0x2b9ca203, 0xed032439, 0x088c04c8, 0xfd0c6ca2, 0x007f64da, 0x002867d2, 0xffdea5bb, 0x000685ff, 162 0x2a9e5e57, 0xed27ac16, 0x0892d470, 0xfcfec233, 0x0088dd38, 0x00242213, 0xffdfea3c, 0x0006505f, 163 0x29a079b2, 0xed4dfcc2, 0x08988b2a, 0xfcf19e6b, 0x0092231e, 0x001fea27, 0xffe12c22, 0x00061b4b, 164 0x28a30416, 0xed760c88, 0x089d2b4a, 0xfce50161, 0x009b3605, 0x001bc06b, 0xffe26b48, 0x0005e6cb, 165 0x27a60d6a, 0xed9fd1a2, 0x08a0b740, 0xfcd8eb17, 0x00a4156b, 0x0017a53b, 0xffe3a788, 0x0005b2e8, 166 0x26a9a57b, 0xedcb4237, 0x08a33196, 0xfccd5b82, 0x00acc0da, 0x001398ec, 0xffe4e0bf, 0x00057faa, 167 0x25addbf9, 0xedf8545b, 0x08a49cf0, 0xfcc25285, 0x00b537e1, 0x000f9bd2, 0xffe616c8, 0x00054d1a, 168 0x24b2c075, 0xee26fe17, 0x08a4fc0d, 0xfcb7cff0, 0x00bd7a1c, 0x000bae3c, 0xffe74984, 0x00051b3e, 169 0x23b86263, 0xee573562, 0x08a451c0, 0xfcadd386, 0x00c5872a, 0x0007d075, 0xffe878d3, 0x0004ea1d, 170 0x22bed116, 0xee88f026, 0x08a2a0f8, 0xfca45cf7, 0x00cd5eb7, 0x000402c8, 0xffe9a494, 0x0004b9c0, 171 0x21c61bc0, 0xeebc2444, 0x089fecbb, 0xfc9b6be5, 0x00d50075, 0x00004579, 0xffeaccaa, 0x00048a2b, 172 0x20ce516f, 0xeef0c78d, 0x089c3824, 0xfc92ffe1, 0x00dc6c1e, 0xfffc98c9, 0xffebf0fa, 0x00045b65, 173 0x1fd7810f, 0xef26cfca, 0x08978666, 0xfc8b186d, 0x00e3a175, 0xfff8fcf7, 0xffed1166, 0x00042d74, 174 0x1ee1b965, 0xef5e32bd, 0x0891dac8, 0xfc83b4fc, 0x00eaa045, 0xfff5723d, 0xffee2dd7, 0x0004005e, 175 0x1ded0911, 0xef96e61c, 0x088b38a9, 0xfc7cd4f0, 0x00f16861, 0xfff1f8d2, 0xffef4632, 0x0003d426, 176 0x1cf97e8b, 0xefd0df9a, 0x0883a378, 0xfc76779e, 0x00f7f9a3, 0xffee90eb, 0xfff05a60, 0x0003a8d2, 177 0x1c072823, 0xf00c14e1, 0x087b1ebc, 0xfc709c4d, 0x00fe53ef, 0xffeb3ab8, 0xfff16a4a, 0x00037e65, 178 0x1b1613ff, 0xf0487b98, 0x0871ae0d, 0xfc6b4233, 0x0104772e, 0xffe7f666, 0xfff275db, 0x000354e5, 179 0x1a26501b, 0xf0860962, 0x08675516, 0xfc66687a, 0x010a6353, 0xffe4c41e, 0xfff37d00, 0x00032c54, 180 0x1937ea47, 0xf0c4b3e0, 0x085c1794, 0xfc620e3d, 0x01101858, 0xffe1a408, 0xfff47fa5, 0x000304b7, 181 0x184af025, 0xf10470b0, 0x084ff957, 0xfc5e328c, 0x0115963d, 0xffde9646, 0xfff57db8, 0x0002de0e, 182 0x175f6f2b, 0xf1453571, 0x0842fe3d, 0xfc5ad465, 0x011add0b, 0xffdb9af8, 0xfff67729, 0x0002b85f, 183 0x1675749e, 0xf186f7c0, 0x08352a35, 0xfc57f2be, 0x011fecd3, 0xffd8b23b, 0xfff76be9, 0x000293aa, 184 0x158d0d95, 0xf1c9ad40, 0x0826813e, 0xfc558c7c, 0x0124c5ab, 0xffd5dc28, 0xfff85be8, 0x00026ff2, 185 0x14a646f6, 0xf20d4b92, 0x08170767, 0xfc53a07b, 0x012967b1, 0xffd318d6, 0xfff9471b, 0x00024d39, 186 0x13c12d73, 0xf251c85d, 0x0806c0cb, 0xfc522d88, 0x012dd30a, 0xffd06858, 0xfffa2d74, 0x00022b7f, 187 0x12ddcd8f, 0xf297194d, 0x07f5b193, 0xfc513266, 0x013207e4, 0xffcdcabe, 0xfffb0ee9, 0x00020ac7, 188 0x11fc3395, 0xf2dd3411, 0x07e3ddf7, 0xfc50adcc, 0x01360670, 0xffcb4014, 0xfffbeb70, 0x0001eb10, 189 0x111c6ba0, 0xf3240e61, 0x07d14a38, 0xfc509e64, 0x0139cee9, 0xffc8c866, 0xfffcc300, 0x0001cc5c, 190 }; 191 192 /* 193 * These coefficients are optimized for 48KHz -> 44.1KHz 194 * cmd-line: fir -l 7 -s 48000 -c 17189 195 */ 196 const uint32_t AudioResamplerSinc::mFirCoefsDown[] __attribute__ ((aligned (32))) = { 197 0x5bacb6f4, 0x1ded1a1d, 0xf0398d56, 0x0394f674, 0x0193a5f9, 0xfe66dbeb, 0x00791043, 0xfffe6631, 198 0x5bab6c81, 0x1d3ddccd, 0xf0421d2c, 0x03af9995, 0x01818dc9, 0xfe6bb63e, 0x0079812a, 0xfffdc37d, 199 0x5ba78d37, 0x1c8f2cf9, 0xf04beb1d, 0x03c9a04a, 0x016f8aca, 0xfe70a511, 0x0079e34d, 0xfffd2545, 200 0x5ba1194f, 0x1be11231, 0xf056f2c7, 0x03e309fe, 0x015d9e64, 0xfe75a79f, 0x007a36e2, 0xfffc8b86, 201 0x5b981122, 0x1b3393f8, 0xf0632fb7, 0x03fbd625, 0x014bc9fa, 0xfe7abd23, 0x007a7c20, 0xfffbf639, 202 0x5b8c7530, 0x1a86b9bf, 0xf0709d74, 0x04140449, 0x013a0ee9, 0xfe7fe4db, 0x007ab33d, 0xfffb655b, 203 0x5b7e461a, 0x19da8ae5, 0xf07f3776, 0x042b93fd, 0x01286e86, 0xfe851e05, 0x007adc72, 0xfffad8e4, 204 0x5b6d84a8, 0x192f0eb7, 0xf08ef92d, 0x044284e6, 0x0116ea22, 0xfe8a67dd, 0x007af7f6, 0xfffa50ce, 205 0x5b5a31c6, 0x18844c70, 0xf09fddfe, 0x0458d6b7, 0x01058306, 0xfe8fc1a5, 0x007b0603, 0xfff9cd12, 206 0x5b444e81, 0x17da4b37, 0xf0b1e143, 0x046e8933, 0x00f43a74, 0xfe952a9b, 0x007b06d4, 0xfff94da9, 207 0x5b2bdc0e, 0x17311222, 0xf0c4fe50, 0x04839c29, 0x00e311a9, 0xfe9aa201, 0x007afaa1, 0xfff8d28c, 208 0x5b10dbc2, 0x1688a832, 0xf0d9306d, 0x04980f79, 0x00d209db, 0xfea02719, 0x007ae1a7, 0xfff85bb1, 209 0x5af34f18, 0x15e11453, 0xf0ee72db, 0x04abe310, 0x00c12439, 0xfea5b926, 0x007abc20, 0xfff7e910, 210 0x5ad337af, 0x153a5d5e, 0xf104c0d2, 0x04bf16e9, 0x00b061eb, 0xfeab576d, 0x007a8a49, 0xfff77a9f, 211 0x5ab09748, 0x14948a16, 0xf11c1583, 0x04d1ab0d, 0x009fc413, 0xfeb10134, 0x007a4c5d, 0xfff71057, 212 0x5a8b6fc7, 0x13efa12c, 0xf1346c17, 0x04e39f93, 0x008f4bcb, 0xfeb6b5c0, 0x007a029a, 0xfff6aa2b, 213 0x5a63c336, 0x134ba937, 0xf14dbfb1, 0x04f4f4a2, 0x007efa29, 0xfebc745c, 0x0079ad3d, 0xfff64812, 214 0x5a3993c0, 0x12a8a8bb, 0xf1680b6e, 0x0505aa6a, 0x006ed038, 0xfec23c50, 0x00794c82, 0xfff5ea02, 215 0x5a0ce3b2, 0x1206a625, 0xf1834a63, 0x0515c12d, 0x005ecf01, 0xfec80ce8, 0x0078e0a9, 0xfff58ff0, 216 0x59ddb57f, 0x1165a7cc, 0xf19f77a0, 0x05253938, 0x004ef782, 0xfecde571, 0x007869ee, 0xfff539cf, 217 0x59ac0bba, 0x10c5b3ef, 0xf1bc8e31, 0x053412e4, 0x003f4ab4, 0xfed3c538, 0x0077e891, 0xfff4e794, 218 0x5977e919, 0x1026d0b8, 0xf1da891b, 0x05424e9b, 0x002fc98a, 0xfed9ab8f, 0x00775ccf, 0xfff49934, 219 0x59415075, 0x0f890437, 0xf1f96360, 0x054feccf, 0x002074ed, 0xfedf97c6, 0x0076c6e8, 0xfff44ea3, 220 0x590844c9, 0x0eec5465, 0xf21917ff, 0x055cee03, 0x00114dc3, 0xfee58932, 0x00762719, 0xfff407d2, 221 0x58ccc930, 0x0e50c723, 0xf239a1ef, 0x056952c3, 0x000254e8, 0xfeeb7f27, 0x00757da3, 0xfff3c4b7, 222 0x588ee0ea, 0x0db6623b, 0xf25afc29, 0x05751baa, 0xfff38b32, 0xfef178fc, 0x0074cac4, 0xfff38542, 223 0x584e8f56, 0x0d1d2b5d, 0xf27d219f, 0x0580495c, 0xffe4f171, 0xfef7760c, 0x00740ebb, 0xfff34968, 224 0x580bd7f4, 0x0c85281f, 0xf2a00d43, 0x058adc8d, 0xffd6886d, 0xfefd75af, 0x007349c7, 0xfff3111b, 225 0x57c6be67, 0x0bee5dff, 0xf2c3ba04, 0x0594d5fa, 0xffc850e6, 0xff037744, 0x00727c27, 0xfff2dc4c, 226 0x577f4670, 0x0b58d262, 0xf2e822ce, 0x059e366c, 0xffba4b98, 0xff097a29, 0x0071a61b, 0xfff2aaef, 227 0x573573f2, 0x0ac48a92, 0xf30d428e, 0x05a6feb9, 0xffac7936, 0xff0f7dbf, 0x0070c7e1, 0xfff27cf3, 228 0x56e94af1, 0x0a318bc1, 0xf333142f, 0x05af2fbf, 0xff9eda6d, 0xff15816a, 0x006fe1b8, 0xfff2524c, 229 0x569acf90, 0x099fdb04, 0xf359929a, 0x05b6ca6b, 0xff916fe1, 0xff1b848e, 0x006ef3df, 0xfff22aea, 230 0x564a0610, 0x090f7d57, 0xf380b8ba, 0x05bdcfb2, 0xff843a32, 0xff218692, 0x006dfe94, 0xfff206bf, 231 0x55f6f2d3, 0x0880779d, 0xf3a88179, 0x05c44095, 0xff7739f7, 0xff2786e1, 0x006d0217, 0xfff1e5bb, 232 0x55a19a5c, 0x07f2ce9b, 0xf3d0e7c2, 0x05ca1e1f, 0xff6a6fc1, 0xff2d84e5, 0x006bfea4, 0xfff1c7d0, 233 0x554a0148, 0x076686fc, 0xf3f9e680, 0x05cf6965, 0xff5ddc1a, 0xff33800e, 0x006af47b, 0xfff1acef, 234 0x54f02c56, 0x06dba551, 0xf42378a0, 0x05d42387, 0xff517f86, 0xff3977cb, 0x0069e3d9, 0xfff19508, 235 0x54942061, 0x06522e0f, 0xf44d9912, 0x05d84daf, 0xff455a80, 0xff3f6b8f, 0x0068ccfa, 0xfff1800b, 236 0x5435e263, 0x05ca258f, 0xf47842c5, 0x05dbe90f, 0xff396d7f, 0xff455acf, 0x0067b01e, 0xfff16de9, 237 0x53d57774, 0x0543900d, 0xf4a370ad, 0x05def6e4, 0xff2db8f2, 0xff4b4503, 0x00668d80, 0xfff15e93, 238 0x5372e4c6, 0x04be71ab, 0xf4cf1dbf, 0x05e17873, 0xff223d40, 0xff5129a3, 0x0065655d, 0xfff151f9, 239 0x530e2fac, 0x043ace6e, 0xf4fb44f4, 0x05e36f0d, 0xff16faca, 0xff57082e, 0x006437f1, 0xfff1480b, 240 0x52a75d90, 0x03b8aa40, 0xf527e149, 0x05e4dc08, 0xff0bf1ed, 0xff5ce021, 0x00630577, 0xfff140b9, 241 0x523e73fd, 0x033808eb, 0xf554edbd, 0x05e5c0c6, 0xff0122fc, 0xff62b0fd, 0x0061ce2c, 0xfff13bf3, 242 0x51d37897, 0x02b8ee22, 0xf5826555, 0x05e61eae, 0xfef68e45, 0xff687a47, 0x00609249, 0xfff139aa, 243 0x5166711c, 0x023b5d76, 0xf5b0431a, 0x05e5f733, 0xfeec340f, 0xff6e3b84, 0x005f520a, 0xfff139cd, 244 0x50f76368, 0x01bf5a5e, 0xf5de8218, 0x05e54bcd, 0xfee2149b, 0xff73f43d, 0x005e0da8, 0xfff13c4c, 245 0x5086556f, 0x0144e834, 0xf60d1d63, 0x05e41dfe, 0xfed83023, 0xff79a3fe, 0x005cc55c, 0xfff14119, 246 0x50134d3e, 0x00cc0a36, 0xf63c1012, 0x05e26f4e, 0xfece86db, 0xff7f4a54, 0x005b7961, 0xfff14821, 247 0x4f9e50ff, 0x0054c382, 0xf66b5544, 0x05e0414d, 0xfec518f1, 0xff84e6d0, 0x005a29ed, 0xfff15156, 248 0x4f2766f2, 0xffdf171b, 0xf69ae81d, 0x05dd9593, 0xfebbe68c, 0xff8a7905, 0x0058d738, 0xfff15ca8, 249 0x4eae9571, 0xff6b07e7, 0xf6cac3c7, 0x05da6dbe, 0xfeb2efcd, 0xff900089, 0x0057817b, 0xfff16a07, 250 0x4e33e2ee, 0xfef898ae, 0xf6fae373, 0x05d6cb72, 0xfeaa34d0, 0xff957cf4, 0x005628ec, 0xfff17962, 251 0x4db755f3, 0xfe87cc1b, 0xf72b425b, 0x05d2b05c, 0xfea1b5a9, 0xff9aede0, 0x0054cdc0, 0xfff18aab, 252 0x4d38f520, 0xfe18a4bc, 0xf75bdbbd, 0x05ce1e2d, 0xfe997268, 0xffa052ec, 0x0053702d, 0xfff19dd1, 253 0x4cb8c72e, 0xfdab2501, 0xf78caae0, 0x05c9169d, 0xfe916b15, 0xffa5abb8, 0x00521068, 0xfff1b2c5, 254 0x4c36d2eb, 0xfd3f4f3d, 0xf7bdab16, 0x05c39b6a, 0xfe899fb2, 0xffaaf7e6, 0x0050aea5, 0xfff1c976, 255 0x4bb31f3c, 0xfcd525a5, 0xf7eed7b4, 0x05bdae57, 0xfe82103f, 0xffb0371c, 0x004f4b17, 0xfff1e1d6, 256 0x4b2db31a, 0xfc6caa53, 0xf8202c1c, 0x05b7512e, 0xfe7abcb1, 0xffb56902, 0x004de5f1, 0xfff1fbd5, 257 0x4aa69594, 0xfc05df40, 0xf851a3b6, 0x05b085bc, 0xfe73a4fb, 0xffba8d44, 0x004c7f66, 0xfff21764, 258 0x4a1dcdce, 0xfba0c64b, 0xf88339f5, 0x05a94dd5, 0xfe6cc909, 0xffbfa38d, 0x004b17a6, 0xfff23473, 259 0x499362ff, 0xfb3d6133, 0xf8b4ea55, 0x05a1ab52, 0xfe6628c1, 0xffc4ab8f, 0x0049aee3, 0xfff252f3, 260 0x49075c72, 0xfadbb19a, 0xf8e6b059, 0x0599a00e, 0xfe5fc405, 0xffc9a4fc, 0x0048454b, 0xfff272d6, 261 0x4879c185, 0xfa7bb908, 0xf9188793, 0x05912dea, 0xfe599aaf, 0xffce8f8a, 0x0046db0f, 0xfff2940b, 262 0x47ea99a9, 0xfa1d78e3, 0xf94a6b9b, 0x058856cd, 0xfe53ac97, 0xffd36af1, 0x0045705c, 0xfff2b686, 263 0x4759ec60, 0xf9c0f276, 0xf97c5815, 0x057f1c9e, 0xfe4df98e, 0xffd836eb, 0x00440561, 0xfff2da36, 264 0x46c7c140, 0xf96626f0, 0xf9ae48af, 0x0575814c, 0xfe48815e, 0xffdcf336, 0x00429a4a, 0xfff2ff0d, 265 0x46341fed, 0xf90d1761, 0xf9e03924, 0x056b86c6, 0xfe4343d0, 0xffe19f91, 0x00412f43, 0xfff324fd, 266 0x459f101d, 0xf8b5c4be, 0xfa122537, 0x05612f00, 0xfe3e40a6, 0xffe63bc0, 0x003fc478, 0xfff34bf9, 267 0x45089996, 0xf8602fdc, 0xfa4408ba, 0x05567bf1, 0xfe39779a, 0xffeac787, 0x003e5a12, 0xfff373f0, 268 0x4470c42d, 0xf80c5977, 0xfa75df87, 0x054b6f92, 0xfe34e867, 0xffef42af, 0x003cf03d, 0xfff39cd7, 269 0x43d797c7, 0xf7ba422b, 0xfaa7a586, 0x05400be1, 0xfe3092bf, 0xfff3ad01, 0x003b871f, 0xfff3c69f, 270 0x433d1c56, 0xf769ea78, 0xfad956ab, 0x053452dc, 0xfe2c7650, 0xfff8064b, 0x003a1ee3, 0xfff3f13a, 271 0x42a159dc, 0xf71b52c4, 0xfb0aeef6, 0x05284685, 0xfe2892c5, 0xfffc4e5c, 0x0038b7ae, 0xfff41c9c, 272 0x42045865, 0xf6ce7b57, 0xfb3c6a73, 0x051be8dd, 0xfe24e7c3, 0x00008507, 0x003751a7, 0xfff448b7, 273 0x4166200e, 0xf683645a, 0xfb6dc53c, 0x050f3bec, 0xfe2174ec, 0x0004aa1f, 0x0035ecf4, 0xfff4757e, 274 0x40c6b8fd, 0xf63a0ddf, 0xfb9efb77, 0x050241b6, 0xfe1e39da, 0x0008bd7c, 0x003489b9, 0xfff4a2e5, 275 0x40262b65, 0xf5f277d9, 0xfbd00956, 0x04f4fc46, 0xfe1b3628, 0x000cbef7, 0x0033281a, 0xfff4d0de, 276 0x3f847f83, 0xf5aca21f, 0xfc00eb1b, 0x04e76da3, 0xfe18696a, 0x0010ae6e, 0x0031c83a, 0xfff4ff5d, 277 0x3ee1bda2, 0xf5688c6d, 0xfc319d13, 0x04d997d8, 0xfe15d32f, 0x00148bbd, 0x00306a3b, 0xfff52e57, 278 0x3e3dee13, 0xf5263665, 0xfc621b9a, 0x04cb7cf2, 0xfe137304, 0x001856c7, 0x002f0e3f, 0xfff55dbf, 279 0x3d991932, 0xf4e59f8a, 0xfc926319, 0x04bd1efb, 0xfe114872, 0x001c0f6e, 0x002db466, 0xfff58d89, 280 0x3cf34766, 0xf4a6c748, 0xfcc27008, 0x04ae8000, 0xfe0f52fc, 0x001fb599, 0x002c5cd0, 0xfff5bdaa, 281 0x3c4c811c, 0xf469aced, 0xfcf23eec, 0x049fa20f, 0xfe0d9224, 0x0023492f, 0x002b079a, 0xfff5ee17, 282 0x3ba4cec9, 0xf42e4faf, 0xfd21cc59, 0x04908733, 0xfe0c0567, 0x0026ca1c, 0x0029b4e4, 0xfff61ec5, 283 0x3afc38eb, 0xf3f4aea6, 0xfd5114f0, 0x0481317a, 0xfe0aac3f, 0x002a384c, 0x002864c9, 0xfff64fa8, 284 0x3a52c805, 0xf3bcc8d3, 0xfd801564, 0x0471a2ef, 0xfe098622, 0x002d93ae, 0x00271766, 0xfff680b5, 285 0x39a884a1, 0xf3869d1a, 0xfdaeca73, 0x0461dda0, 0xfe089283, 0x0030dc34, 0x0025ccd7, 0xfff6b1e4, 286 0x38fd774e, 0xf3522a49, 0xfddd30eb, 0x0451e396, 0xfe07d0d3, 0x003411d2, 0x00248535, 0xfff6e329, 287 0x3851a8a2, 0xf31f6f0f, 0xfe0b45aa, 0x0441b6dd, 0xfe07407d, 0x0037347d, 0x0023409a, 0xfff7147a, 288 0x37a52135, 0xf2ee6a07, 0xfe39059b, 0x0431597d, 0xfe06e0eb, 0x003a442e, 0x0021ff1f, 0xfff745cd, 289 0x36f7e9a4, 0xf2bf19ae, 0xfe666dbc, 0x0420cd80, 0xfe06b184, 0x003d40e0, 0x0020c0dc, 0xfff7771a, 290 0x364a0a90, 0xf2917c6d, 0xfe937b15, 0x041014eb, 0xfe06b1ac, 0x00402a8e, 0x001f85e6, 0xfff7a857, 291 0x359b8c9d, 0xf265908f, 0xfec02ac2, 0x03ff31c3, 0xfe06e0c4, 0x00430137, 0x001e4e56, 0xfff7d97a, 292 0x34ec786f, 0xf23b544b, 0xfeec79ec, 0x03ee260d, 0xfe073e2a, 0x0045c4dd, 0x001d1a3f, 0xfff80a7c, 293 0x343cd6af, 0xf212c5be, 0xff1865cd, 0x03dcf3ca, 0xfe07c93a, 0x00487582, 0x001be9b7, 0xfff83b52, 294 0x338cb004, 0xf1ebe2ec, 0xff43ebac, 0x03cb9cf9, 0xfe08814e, 0x004b132b, 0x001abcd0, 0xfff86bf6, 295 0x32dc0d17, 0xf1c6a9c3, 0xff6f08e4, 0x03ba2398, 0xfe0965bc, 0x004d9dde, 0x0019939d, 0xfff89c60, 296 0x322af693, 0xf1a3181a, 0xff99badb, 0x03a889a1, 0xfe0a75da, 0x005015a5, 0x00186e31, 0xfff8cc86, 297 0x3179751f, 0xf1812bb0, 0xffc3ff0c, 0x0396d10c, 0xfe0bb0f9, 0x00527a8a, 0x00174c9c, 0xfff8fc62, 298 0x30c79163, 0xf160e22d, 0xffedd2fd, 0x0384fbd1, 0xfe0d166b, 0x0054cc9a, 0x00162eef, 0xfff92bec, 299 0x30155404, 0xf1423924, 0x00173447, 0x03730be0, 0xfe0ea57e, 0x00570be4, 0x00151538, 0xfff95b1e, 300 0x2f62c5a7, 0xf1252e0f, 0x00402092, 0x0361032a, 0xfe105d7e, 0x00593877, 0x0013ff88, 0xfff989ef, 301 0x2eafeeed, 0xf109be56, 0x00689598, 0x034ee39b, 0xfe123db6, 0x005b5267, 0x0012edea, 0xfff9b85b, 302 0x2dfcd873, 0xf0efe748, 0x0090911f, 0x033caf1d, 0xfe144570, 0x005d59c6, 0x0011e06d, 0xfff9e65a, 303 0x2d498ad3, 0xf0d7a622, 0x00b81102, 0x032a6796, 0xfe1673f2, 0x005f4eac, 0x0010d71d, 0xfffa13e5, 304 0x2c960ea3, 0xf0c0f808, 0x00df1328, 0x03180ee7, 0xfe18c884, 0x0061312e, 0x000fd205, 0xfffa40f8, 305 0x2be26c73, 0xf0abda0e, 0x0105958c, 0x0305a6f0, 0xfe1b4268, 0x00630167, 0x000ed130, 0xfffa6d8d, 306 0x2b2eaccf, 0xf0984931, 0x012b9635, 0x02f3318a, 0xfe1de0e2, 0x0064bf71, 0x000dd4a7, 0xfffa999d, 307 0x2a7ad83c, 0xf086425a, 0x0151133e, 0x02e0b08d, 0xfe20a335, 0x00666b68, 0x000cdc74, 0xfffac525, 308 0x29c6f738, 0xf075c260, 0x01760ad1, 0x02ce25ca, 0xfe2388a1, 0x0068056b, 0x000be89f, 0xfffaf01e, 309 0x2913123c, 0xf066c606, 0x019a7b27, 0x02bb9310, 0xfe269065, 0x00698d98, 0x000af931, 0xfffb1a84, 310 0x285f31b7, 0xf05949fb, 0x01be628c, 0x02a8fa2a, 0xfe29b9c1, 0x006b0411, 0x000a0e2f, 0xfffb4453, 311 0x27ab5e12, 0xf04d4ade, 0x01e1bf58, 0x02965cdb, 0xfe2d03f2, 0x006c68f8, 0x000927a0, 0xfffb6d86, 312 0x26f79fab, 0xf042c539, 0x02048ff8, 0x0283bce6, 0xfe306e35, 0x006dbc71, 0x00084589, 0xfffb961a, 313 0x2643feda, 0xf039b587, 0x0226d2e6, 0x02711c05, 0xfe33f7c7, 0x006efea0, 0x000767f0, 0xfffbbe09, 314 0x259083eb, 0xf032182f, 0x024886ad, 0x025e7bf0, 0xfe379fe3, 0x00702fae, 0x00068ed8, 0xfffbe552, 315 0x24dd3721, 0xf02be98a, 0x0269a9e9, 0x024bde5a, 0xfe3b65c4, 0x00714fc0, 0x0005ba46, 0xfffc0bef, 316 0x242a20b3, 0xf02725dc, 0x028a3b44, 0x023944ee, 0xfe3f48a5, 0x00725f02, 0x0004ea3a, 0xfffc31df, 317 0x237748cf, 0xf023c95d, 0x02aa397b, 0x0226b156, 0xfe4347c0, 0x00735d9c, 0x00041eb9, 0xfffc571e, 318 0x22c4b795, 0xf021d031, 0x02c9a359, 0x02142533, 0xfe476250, 0x00744bba, 0x000357c2, 0xfffc7ba9, 319 0x2212751a, 0xf0213671, 0x02e877b9, 0x0201a223, 0xfe4b978e, 0x0075298a, 0x00029558, 0xfffc9f7e, 320 0x21608968, 0xf021f823, 0x0306b586, 0x01ef29be, 0xfe4fe6b3, 0x0075f739, 0x0001d779, 0xfffcc29a, 321 0x20aefc79, 0xf0241140, 0x03245bbc, 0x01dcbd96, 0xfe544efb, 0x0076b4f5, 0x00011e26, 0xfffce4fc, 322 0x1ffdd63b, 0xf0277db1, 0x03416966, 0x01ca5f37, 0xfe58cf9d, 0x007762f0, 0x0000695e, 0xfffd06a1, 323 0x1f4d1e8e, 0xf02c3953, 0x035ddd9e, 0x01b81028, 0xfe5d67d4, 0x0078015a, 0xffffb91f, 0xfffd2787, 324 0x1e9cdd43, 0xf0323ff5, 0x0379b790, 0x01a5d1ea, 0xfe6216db, 0x00789065, 0xffff0d66, 0xfffd47ae, 325 0x1ded1a1d, 0xf0398d56, 0x0394f674, 0x0193a5f9, 0xfe66dbeb, 0x00791043, 0xfffe6631, 0xfffd6713, 326 }; 327 328 // we use 15 bits to interpolate between these samples 329 // this cannot change because the mul below rely on it. 330 static const int pLerpBits = 15; 331 332 static pthread_once_t once_control = PTHREAD_ONCE_INIT; 333 static readCoefficientsFn readResampleCoefficients = NULL; 334 335 /*static*/ AudioResamplerSinc::Constants AudioResamplerSinc::highQualityConstants; 336 /*static*/ AudioResamplerSinc::Constants AudioResamplerSinc::veryHighQualityConstants; 337 338 void AudioResamplerSinc::init_routine() 339 { 340 // for high quality resampler, the parameters for coefficients are compile-time constants 341 Constants *c = &highQualityConstants; 342 c->coefsBits = RESAMPLE_FIR_LERP_INT_BITS; 343 c->cShift = kNumPhaseBits - c->coefsBits; 344 c->cMask = ((1<< c->coefsBits)-1) << c->cShift; 345 c->pShift = kNumPhaseBits - c->coefsBits - pLerpBits; 346 c->pMask = ((1<< pLerpBits)-1) << c->pShift; 347 c->halfNumCoefs = RESAMPLE_FIR_NUM_COEF; 348 349 // for very high quality resampler, the parameters are load-time constants 350 veryHighQualityConstants = highQualityConstants; 351 352 // Open the dll to get the coefficients for VERY_HIGH_QUALITY 353 void *resampleCoeffLib = dlopen("libaudio-resampler.so", RTLD_NOW); 354 ALOGV("Open libaudio-resampler library = %p", resampleCoeffLib); 355 if (resampleCoeffLib == NULL) { 356 ALOGE("Could not open audio-resampler library: %s", dlerror()); 357 return; 358 } 359 360 readResampleFirNumCoeffFn readResampleFirNumCoeff; 361 readResampleFirLerpIntBitsFn readResampleFirLerpIntBits; 362 363 readResampleCoefficients = (readCoefficientsFn) 364 dlsym(resampleCoeffLib, "readResamplerCoefficients"); 365 readResampleFirNumCoeff = (readResampleFirNumCoeffFn) 366 dlsym(resampleCoeffLib, "readResampleFirNumCoeff"); 367 readResampleFirLerpIntBits = (readResampleFirLerpIntBitsFn) 368 dlsym(resampleCoeffLib, "readResampleFirLerpIntBits"); 369 370 if (!readResampleCoefficients || !readResampleFirNumCoeff || !readResampleFirLerpIntBits) { 371 readResampleCoefficients = NULL; 372 dlclose(resampleCoeffLib); 373 resampleCoeffLib = NULL; 374 ALOGE("Could not find symbol: %s", dlerror()); 375 return; 376 } 377 378 c = &veryHighQualityConstants; 379 c->coefsBits = readResampleFirLerpIntBits(); 380 c->cShift = kNumPhaseBits - c->coefsBits; 381 c->cMask = ((1<<c->coefsBits)-1) << c->cShift; 382 c->pShift = kNumPhaseBits - c->coefsBits - pLerpBits; 383 c->pMask = ((1<<pLerpBits)-1) << c->pShift; 384 // number of zero-crossing on each side 385 c->halfNumCoefs = readResampleFirNumCoeff(); 386 ALOGV("coefsBits = %d", c->coefsBits); 387 ALOGV("halfNumCoefs = %d", c->halfNumCoefs); 388 // note that we "leak" resampleCoeffLib until the process exits 389 } 390 391 // ---------------------------------------------------------------------------- 392 393 static inline 394 int32_t mulRL(int left, int32_t in, uint32_t vRL) 395 { 396 #if USE_INLINE_ASSEMBLY 397 int32_t out; 398 if (left) { 399 asm( "smultb %[out], %[in], %[vRL] \n" 400 : [out]"=r"(out) 401 : [in]"%r"(in), [vRL]"r"(vRL) 402 : ); 403 } else { 404 asm( "smultt %[out], %[in], %[vRL] \n" 405 : [out]"=r"(out) 406 : [in]"%r"(in), [vRL]"r"(vRL) 407 : ); 408 } 409 return out; 410 #else 411 int16_t v = left ? int16_t(vRL) : int16_t(vRL>>16); 412 return int32_t((int64_t(in) * v) >> 16); 413 #endif 414 } 415 416 static inline 417 int32_t mulAdd(int16_t in, int32_t v, int32_t a) 418 { 419 #if USE_INLINE_ASSEMBLY 420 int32_t out; 421 asm( "smlawb %[out], %[v], %[in], %[a] \n" 422 : [out]"=r"(out) 423 : [in]"%r"(in), [v]"r"(v), [a]"r"(a) 424 : ); 425 return out; 426 #else 427 return a + int32_t((int64_t(v) * in) >> 16); 428 #endif 429 } 430 431 static inline 432 int32_t mulAddRL(int left, uint32_t inRL, int32_t v, int32_t a) 433 { 434 #if USE_INLINE_ASSEMBLY 435 int32_t out; 436 if (left) { 437 asm( "smlawb %[out], %[v], %[inRL], %[a] \n" 438 : [out]"=r"(out) 439 : [inRL]"%r"(inRL), [v]"r"(v), [a]"r"(a) 440 : ); 441 } else { 442 asm( "smlawt %[out], %[v], %[inRL], %[a] \n" 443 : [out]"=r"(out) 444 : [inRL]"%r"(inRL), [v]"r"(v), [a]"r"(a) 445 : ); 446 } 447 return out; 448 #else 449 int16_t s = left ? int16_t(inRL) : int16_t(inRL>>16); 450 return a + int32_t((int64_t(v) * s) >> 16); 451 #endif 452 } 453 454 // ---------------------------------------------------------------------------- 455 456 AudioResamplerSinc::AudioResamplerSinc( 457 int inChannelCount, int32_t sampleRate, src_quality quality) 458 : AudioResampler(inChannelCount, sampleRate, quality), 459 mState(0), mImpulse(0), mRingFull(0), mFirCoefs(0) 460 { 461 /* 462 * Layout of the state buffer for 32 tap: 463 * 464 * "present" sample beginning of 2nd buffer 465 * v v 466 * 0 01 2 23 3 467 * 0 F0 0 F0 F 468 * [pppppppppppppppInnnnnnnnnnnnnnnnpppppppppppppppInnnnnnnnnnnnnnnn] 469 * ^ ^ head 470 * 471 * p = past samples, convoluted with the (p)ositive side of sinc() 472 * n = future samples, convoluted with the (n)egative side of sinc() 473 * r = extra space for implementing the ring buffer 474 * 475 */ 476 477 mVolumeSIMD[0] = 0; 478 mVolumeSIMD[1] = 0; 479 480 // Load the constants for coefficients 481 int ok = pthread_once(&once_control, init_routine); 482 if (ok != 0) { 483 ALOGE("%s pthread_once failed: %d", __func__, ok); 484 } 485 mConstants = (quality == VERY_HIGH_QUALITY) ? 486 &veryHighQualityConstants : &highQualityConstants; 487 } 488 489 490 AudioResamplerSinc::~AudioResamplerSinc() { 491 free(mState); 492 } 493 494 void AudioResamplerSinc::init() { 495 const Constants& c(*mConstants); 496 const size_t numCoefs = 2 * c.halfNumCoefs; 497 const size_t stateSize = numCoefs * mChannelCount * 2; 498 mState = (int16_t*)memalign(32, stateSize*sizeof(int16_t)); 499 memset(mState, 0, sizeof(int16_t)*stateSize); 500 mImpulse = mState + (c.halfNumCoefs-1)*mChannelCount; 501 mRingFull = mImpulse + (numCoefs+1)*mChannelCount; 502 } 503 504 void AudioResamplerSinc::setVolume(float left, float right) { 505 AudioResampler::setVolume(left, right); 506 // convert to U4_28 (rounding down). 507 // integer volume values are clamped to 0 to UNITY_GAIN. 508 mVolumeSIMD[0] = u4_28_from_float(clampFloatVol(left)); 509 mVolumeSIMD[1] = u4_28_from_float(clampFloatVol(right)); 510 } 511 512 void AudioResamplerSinc::resample(int32_t* out, size_t outFrameCount, 513 AudioBufferProvider* provider) 514 { 515 // FIXME store current state (up or down sample) and only load the coefs when the state 516 // changes. Or load two pointers one for up and one for down in the init function. 517 // Not critical now since the read functions are fast, but would be important if read was slow. 518 if (mConstants == &veryHighQualityConstants && readResampleCoefficients) { 519 mFirCoefs = readResampleCoefficients( mInSampleRate <= mSampleRate ); 520 } else { 521 mFirCoefs = (const int32_t *) ((mInSampleRate <= mSampleRate) ? mFirCoefsUp : mFirCoefsDown); 522 } 523 524 // select the appropriate resampler 525 switch (mChannelCount) { 526 case 1: 527 resample<1>(out, outFrameCount, provider); 528 break; 529 case 2: 530 resample<2>(out, outFrameCount, provider); 531 break; 532 } 533 } 534 535 536 template<int CHANNELS> 537 void AudioResamplerSinc::resample(int32_t* out, size_t outFrameCount, 538 AudioBufferProvider* provider) 539 { 540 const Constants& c(*mConstants); 541 const size_t headOffset = c.halfNumCoefs*CHANNELS; 542 int16_t* impulse = mImpulse; 543 uint32_t vRL = mVolumeRL; 544 size_t inputIndex = mInputIndex; 545 uint32_t phaseFraction = mPhaseFraction; 546 uint32_t phaseIncrement = mPhaseIncrement; 547 size_t outputIndex = 0; 548 size_t outputSampleCount = outFrameCount * 2; 549 size_t inFrameCount = getInFrameCountRequired(outFrameCount); 550 551 while (outputIndex < outputSampleCount) { 552 // buffer is empty, fetch a new one 553 while (mBuffer.frameCount == 0) { 554 mBuffer.frameCount = inFrameCount; 555 provider->getNextBuffer(&mBuffer, 556 calculateOutputPTS(outputIndex / 2)); 557 if (mBuffer.raw == NULL) { 558 goto resample_exit; 559 } 560 const uint32_t phaseIndex = phaseFraction >> kNumPhaseBits; 561 if (phaseIndex == 1) { 562 // read one frame 563 read<CHANNELS>(impulse, phaseFraction, mBuffer.i16, inputIndex); 564 } else if (phaseIndex == 2) { 565 // read 2 frames 566 read<CHANNELS>(impulse, phaseFraction, mBuffer.i16, inputIndex); 567 inputIndex++; 568 if (inputIndex >= mBuffer.frameCount) { 569 inputIndex -= mBuffer.frameCount; 570 provider->releaseBuffer(&mBuffer); 571 } else { 572 read<CHANNELS>(impulse, phaseFraction, mBuffer.i16, inputIndex); 573 } 574 } 575 } 576 int16_t const * const in = mBuffer.i16; 577 const size_t frameCount = mBuffer.frameCount; 578 579 // Always read-in the first samples from the input buffer 580 int16_t* head = impulse + headOffset; 581 for (size_t i=0 ; i<CHANNELS ; i++) { 582 head[i] = in[inputIndex*CHANNELS + i]; 583 } 584 585 // handle boundary case 586 while (CC_LIKELY(outputIndex < outputSampleCount)) { 587 filterCoefficient<CHANNELS>(&out[outputIndex], phaseFraction, impulse, vRL); 588 outputIndex += 2; 589 590 phaseFraction += phaseIncrement; 591 const size_t phaseIndex = phaseFraction >> kNumPhaseBits; 592 for (size_t i=0 ; i<phaseIndex ; i++) { 593 inputIndex++; 594 if (inputIndex >= frameCount) { 595 goto done; // need a new buffer 596 } 597 read<CHANNELS>(impulse, phaseFraction, in, inputIndex); 598 } 599 } 600 done: 601 // if done with buffer, save samples 602 if (inputIndex >= frameCount) { 603 inputIndex -= frameCount; 604 provider->releaseBuffer(&mBuffer); 605 } 606 } 607 608 resample_exit: 609 mImpulse = impulse; 610 mInputIndex = inputIndex; 611 mPhaseFraction = phaseFraction; 612 } 613 614 template<int CHANNELS> 615 /*** 616 * read() 617 * 618 * This function reads only one frame from input buffer and writes it in 619 * state buffer 620 * 621 **/ 622 void AudioResamplerSinc::read( 623 int16_t*& impulse, uint32_t& phaseFraction, 624 const int16_t* in, size_t inputIndex) 625 { 626 impulse += CHANNELS; 627 phaseFraction -= 1LU<<kNumPhaseBits; 628 629 const Constants& c(*mConstants); 630 if (CC_UNLIKELY(impulse >= mRingFull)) { 631 const size_t stateSize = (c.halfNumCoefs*2)*CHANNELS; 632 memcpy(mState, mState+stateSize, sizeof(int16_t)*stateSize); 633 impulse -= stateSize; 634 } 635 636 int16_t* head = impulse + c.halfNumCoefs*CHANNELS; 637 for (size_t i=0 ; i<CHANNELS ; i++) { 638 head[i] = in[inputIndex*CHANNELS + i]; 639 } 640 } 641 642 template<int CHANNELS> 643 void AudioResamplerSinc::filterCoefficient(int32_t* out, uint32_t phase, 644 const int16_t *samples, uint32_t vRL) 645 { 646 // NOTE: be very careful when modifying the code here. register 647 // pressure is very high and a small change might cause the compiler 648 // to generate far less efficient code. 649 // Always sanity check the result with objdump or test-resample. 650 651 // compute the index of the coefficient on the positive side and 652 // negative side 653 const Constants& c(*mConstants); 654 const int32_t ONE = c.cMask | c.pMask; 655 uint32_t indexP = ( phase & c.cMask) >> c.cShift; 656 uint32_t lerpP = ( phase & c.pMask) >> c.pShift; 657 uint32_t indexN = ((ONE-phase) & c.cMask) >> c.cShift; 658 uint32_t lerpN = ((ONE-phase) & c.pMask) >> c.pShift; 659 660 const size_t offset = c.halfNumCoefs; 661 indexP *= offset; 662 indexN *= offset; 663 664 int32_t const* coefsP = mFirCoefs + indexP; 665 int32_t const* coefsN = mFirCoefs + indexN; 666 int16_t const* sP = samples; 667 int16_t const* sN = samples + CHANNELS; 668 669 size_t count = offset; 670 671 #ifndef USE_NEON 672 int32_t l = 0; 673 int32_t r = 0; 674 for (size_t i=0 ; i<count ; i++) { 675 interpolate<CHANNELS>(l, r, coefsP++, offset, lerpP, sP); 676 sP -= CHANNELS; 677 interpolate<CHANNELS>(l, r, coefsN++, offset, lerpN, sN); 678 sN += CHANNELS; 679 } 680 out[0] += 2 * mulRL(1, l, vRL); 681 out[1] += 2 * mulRL(0, r, vRL); 682 #else 683 UNUSED(vRL); 684 if (CHANNELS == 1) { 685 int32_t const* coefsP1 = coefsP + offset; 686 int32_t const* coefsN1 = coefsN + offset; 687 sP -= CHANNELS*3; 688 689 int32x4_t sum; 690 int32x2_t lerpPN; 691 lerpPN = vdup_n_s32(0); 692 lerpPN = vld1_lane_s32((int32_t *)&lerpP, lerpPN, 0); 693 lerpPN = vld1_lane_s32((int32_t *)&lerpN, lerpPN, 1); 694 lerpPN = vshl_n_s32(lerpPN, 16); 695 sum = vdupq_n_s32(0); 696 697 int16x4_t sampleP, sampleN; 698 int32x4_t samplePExt, sampleNExt; 699 int32x4_t coefsPV0, coefsPV1, coefsNV0, coefsNV1; 700 701 coefsP = (const int32_t*)__builtin_assume_aligned(coefsP, 16); 702 coefsN = (const int32_t*)__builtin_assume_aligned(coefsN, 16); 703 coefsP1 = (const int32_t*)__builtin_assume_aligned(coefsP1, 16); 704 coefsN1 = (const int32_t*)__builtin_assume_aligned(coefsN1, 16); 705 for (; count > 0; count -= 4) { 706 sampleP = vld1_s16(sP); 707 sampleN = vld1_s16(sN); 708 coefsPV0 = vld1q_s32(coefsP); 709 coefsNV0 = vld1q_s32(coefsN); 710 coefsPV1 = vld1q_s32(coefsP1); 711 coefsNV1 = vld1q_s32(coefsN1); 712 sP -= 4; 713 sN += 4; 714 coefsP += 4; 715 coefsN += 4; 716 coefsP1 += 4; 717 coefsN1 += 4; 718 719 sampleP = vrev64_s16(sampleP); 720 721 // interpolate (step1) 722 coefsPV1 = vsubq_s32(coefsPV1, coefsPV0); 723 coefsNV1 = vsubq_s32(coefsNV1, coefsNV0); 724 samplePExt = vshll_n_s16(sampleP, 15); 725 // interpolate (step2) 726 coefsPV1 = vqrdmulhq_lane_s32(coefsPV1, lerpPN, 0); 727 coefsNV1 = vqrdmulhq_lane_s32(coefsNV1, lerpPN, 1); 728 sampleNExt = vshll_n_s16(sampleN, 15); 729 // interpolate (step3) 730 coefsPV0 = vaddq_s32(coefsPV0, coefsPV1); 731 coefsNV0 = vaddq_s32(coefsNV0, coefsNV1); 732 733 samplePExt = vqrdmulhq_s32(samplePExt, coefsPV0); 734 sampleNExt = vqrdmulhq_s32(sampleNExt, coefsNV0); 735 sum = vaddq_s32(sum, samplePExt); 736 sum = vaddq_s32(sum, sampleNExt); 737 } 738 int32x2_t volumesV, outV; 739 volumesV = vld1_s32(mVolumeSIMD); 740 outV = vld1_s32(out); 741 742 //add all 4 partial sums 743 int32x2_t sumLow, sumHigh; 744 sumLow = vget_low_s32(sum); 745 sumHigh = vget_high_s32(sum); 746 sumLow = vpadd_s32(sumLow, sumHigh); 747 sumLow = vpadd_s32(sumLow, sumLow); 748 749 sumLow = vqrdmulh_s32(sumLow, volumesV); 750 outV = vadd_s32(outV, sumLow); 751 vst1_s32(out, outV); 752 } else if (CHANNELS == 2) { 753 int32_t const* coefsP1 = coefsP + offset; 754 int32_t const* coefsN1 = coefsN + offset; 755 sP -= CHANNELS*3; 756 757 int32x4_t sum0, sum1; 758 int32x2_t lerpPN; 759 760 lerpPN = vdup_n_s32(0); 761 lerpPN = vld1_lane_s32((int32_t *)&lerpP, lerpPN, 0); 762 lerpPN = vld1_lane_s32((int32_t *)&lerpN, lerpPN, 1); 763 lerpPN = vshl_n_s32(lerpPN, 16); 764 sum0 = vdupq_n_s32(0); 765 sum1 = vdupq_n_s32(0); 766 767 int16x4x2_t sampleP, sampleN; 768 int32x4x2_t samplePExt, sampleNExt; 769 int32x4_t coefsPV0, coefsPV1, coefsNV0, coefsNV1; 770 771 coefsP = (const int32_t*)__builtin_assume_aligned(coefsP, 16); 772 coefsN = (const int32_t*)__builtin_assume_aligned(coefsN, 16); 773 coefsP1 = (const int32_t*)__builtin_assume_aligned(coefsP1, 16); 774 coefsN1 = (const int32_t*)__builtin_assume_aligned(coefsN1, 16); 775 for (; count > 0; count -= 4) { 776 sampleP = vld2_s16(sP); 777 sampleN = vld2_s16(sN); 778 coefsPV0 = vld1q_s32(coefsP); 779 coefsNV0 = vld1q_s32(coefsN); 780 coefsPV1 = vld1q_s32(coefsP1); 781 coefsNV1 = vld1q_s32(coefsN1); 782 sP -= 8; 783 sN += 8; 784 coefsP += 4; 785 coefsN += 4; 786 coefsP1 += 4; 787 coefsN1 += 4; 788 789 sampleP.val[0] = vrev64_s16(sampleP.val[0]); 790 sampleP.val[1] = vrev64_s16(sampleP.val[1]); 791 792 // interpolate (step1) 793 coefsPV1 = vsubq_s32(coefsPV1, coefsPV0); 794 coefsNV1 = vsubq_s32(coefsNV1, coefsNV0); 795 samplePExt.val[0] = vshll_n_s16(sampleP.val[0], 15); 796 samplePExt.val[1] = vshll_n_s16(sampleP.val[1], 15); 797 // interpolate (step2) 798 coefsPV1 = vqrdmulhq_lane_s32(coefsPV1, lerpPN, 0); 799 coefsNV1 = vqrdmulhq_lane_s32(coefsNV1, lerpPN, 1); 800 sampleNExt.val[0] = vshll_n_s16(sampleN.val[0], 15); 801 sampleNExt.val[1] = vshll_n_s16(sampleN.val[1], 15); 802 // interpolate (step3) 803 coefsPV0 = vaddq_s32(coefsPV0, coefsPV1); 804 coefsNV0 = vaddq_s32(coefsNV0, coefsNV1); 805 806 samplePExt.val[0] = vqrdmulhq_s32(samplePExt.val[0], coefsPV0); 807 samplePExt.val[1] = vqrdmulhq_s32(samplePExt.val[1], coefsPV0); 808 sampleNExt.val[0] = vqrdmulhq_s32(sampleNExt.val[0], coefsNV0); 809 sampleNExt.val[1] = vqrdmulhq_s32(sampleNExt.val[1], coefsNV0); 810 sum0 = vaddq_s32(sum0, samplePExt.val[0]); 811 sum1 = vaddq_s32(sum1, samplePExt.val[1]); 812 sum0 = vaddq_s32(sum0, sampleNExt.val[0]); 813 sum1 = vaddq_s32(sum1, sampleNExt.val[1]); 814 } 815 int32x2_t volumesV, outV; 816 volumesV = vld1_s32(mVolumeSIMD); 817 outV = vld1_s32(out); 818 819 //add all 4 partial sums 820 int32x2_t sumLow0, sumHigh0, sumLow1, sumHigh1; 821 sumLow0 = vget_low_s32(sum0); 822 sumHigh0 = vget_high_s32(sum0); 823 sumLow1 = vget_low_s32(sum1); 824 sumHigh1 = vget_high_s32(sum1); 825 sumLow0 = vpadd_s32(sumLow0, sumHigh0); 826 sumLow0 = vpadd_s32(sumLow0, sumLow0); 827 sumLow1 = vpadd_s32(sumLow1, sumHigh1); 828 sumLow1 = vpadd_s32(sumLow1, sumLow1); 829 830 sumLow0 = vtrn_s32(sumLow0, sumLow1).val[0]; 831 sumLow0 = vqrdmulh_s32(sumLow0, volumesV); 832 outV = vadd_s32(outV, sumLow0); 833 vst1_s32(out, outV); 834 } 835 #endif 836 } 837 838 template<int CHANNELS> 839 void AudioResamplerSinc::interpolate( 840 int32_t& l, int32_t& r, 841 const int32_t* coefs, size_t offset, 842 int32_t lerp, const int16_t* samples) 843 { 844 int32_t c0 = coefs[0]; 845 int32_t c1 = coefs[offset]; 846 int32_t sinc = mulAdd(lerp, (c1-c0)<<1, c0); 847 if (CHANNELS == 2) { 848 uint32_t rl = *reinterpret_cast<const uint32_t*>(samples); 849 l = mulAddRL(1, rl, sinc, l); 850 r = mulAddRL(0, rl, sinc, r); 851 } else { 852 r = l = mulAdd(samples[0], sinc, l); 853 } 854 } 855 // ---------------------------------------------------------------------------- 856 }; // namespace android 857