annotate src/libmad-0.15.1b/synth.c @ 83:ae30d91d2ffe

Replace these with versions built using an older toolset (so as to avoid ABI compatibilities when linking on Ubuntu 14.04 for packaging purposes)
author Chris Cannam
date Fri, 07 Feb 2020 11:51:13 +0000
parents c7265573341e
children
rev   line source
Chris@0 1 /*
Chris@0 2 * libmad - MPEG audio decoder library
Chris@0 3 * Copyright (C) 2000-2004 Underbit Technologies, Inc.
Chris@0 4 *
Chris@0 5 * This program is free software; you can redistribute it and/or modify
Chris@0 6 * it under the terms of the GNU General Public License as published by
Chris@0 7 * the Free Software Foundation; either version 2 of the License, or
Chris@0 8 * (at your option) any later version.
Chris@0 9 *
Chris@0 10 * This program is distributed in the hope that it will be useful,
Chris@0 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Chris@0 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
Chris@0 13 * GNU General Public License for more details.
Chris@0 14 *
Chris@0 15 * You should have received a copy of the GNU General Public License
Chris@0 16 * along with this program; if not, write to the Free Software
Chris@0 17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Chris@0 18 *
Chris@0 19 * $Id: synth.c,v 1.25 2004/01/23 09:41:33 rob Exp $
Chris@0 20 */
Chris@0 21
Chris@0 22 # ifdef HAVE_CONFIG_H
Chris@0 23 # include "config.h"
Chris@0 24 # endif
Chris@0 25
Chris@0 26 # include "global.h"
Chris@0 27
Chris@0 28 # include "fixed.h"
Chris@0 29 # include "frame.h"
Chris@0 30 # include "synth.h"
Chris@0 31
Chris@0 32 /*
Chris@0 33 * NAME: synth->init()
Chris@0 34 * DESCRIPTION: initialize synth struct
Chris@0 35 */
Chris@0 36 void mad_synth_init(struct mad_synth *synth)
Chris@0 37 {
Chris@0 38 mad_synth_mute(synth);
Chris@0 39
Chris@0 40 synth->phase = 0;
Chris@0 41
Chris@0 42 synth->pcm.samplerate = 0;
Chris@0 43 synth->pcm.channels = 0;
Chris@0 44 synth->pcm.length = 0;
Chris@0 45 }
Chris@0 46
Chris@0 47 /*
Chris@0 48 * NAME: synth->mute()
Chris@0 49 * DESCRIPTION: zero all polyphase filterbank values, resetting synthesis
Chris@0 50 */
Chris@0 51 void mad_synth_mute(struct mad_synth *synth)
Chris@0 52 {
Chris@0 53 unsigned int ch, s, v;
Chris@0 54
Chris@0 55 for (ch = 0; ch < 2; ++ch) {
Chris@0 56 for (s = 0; s < 16; ++s) {
Chris@0 57 for (v = 0; v < 8; ++v) {
Chris@0 58 synth->filter[ch][0][0][s][v] = synth->filter[ch][0][1][s][v] =
Chris@0 59 synth->filter[ch][1][0][s][v] = synth->filter[ch][1][1][s][v] = 0;
Chris@0 60 }
Chris@0 61 }
Chris@0 62 }
Chris@0 63 }
Chris@0 64
Chris@0 65 /*
Chris@0 66 * An optional optimization called here the Subband Synthesis Optimization
Chris@0 67 * (SSO) improves the performance of subband synthesis at the expense of
Chris@0 68 * accuracy.
Chris@0 69 *
Chris@0 70 * The idea is to simplify 32x32->64-bit multiplication to 32x32->32 such
Chris@0 71 * that extra scaling and rounding are not necessary. This often allows the
Chris@0 72 * compiler to use faster 32-bit multiply-accumulate instructions instead of
Chris@0 73 * explicit 64-bit multiply, shift, and add instructions.
Chris@0 74 *
Chris@0 75 * SSO works like this: a full 32x32->64-bit multiply of two mad_fixed_t
Chris@0 76 * values requires the result to be right-shifted 28 bits to be properly
Chris@0 77 * scaled to the same fixed-point format. Right shifts can be applied at any
Chris@0 78 * time to either operand or to the result, so the optimization involves
Chris@0 79 * careful placement of these shifts to minimize the loss of accuracy.
Chris@0 80 *
Chris@0 81 * First, a 14-bit shift is applied with rounding at compile-time to the D[]
Chris@0 82 * table of coefficients for the subband synthesis window. This only loses 2
Chris@0 83 * bits of accuracy because the lower 12 bits are always zero. A second
Chris@0 84 * 12-bit shift occurs after the DCT calculation. This loses 12 bits of
Chris@0 85 * accuracy. Finally, a third 2-bit shift occurs just before the sample is
Chris@0 86 * saved in the PCM buffer. 14 + 12 + 2 == 28 bits.
Chris@0 87 */
Chris@0 88
Chris@0 89 /* FPM_DEFAULT without OPT_SSO will actually lose accuracy and performance */
Chris@0 90
Chris@0 91 # if defined(FPM_DEFAULT) && !defined(OPT_SSO)
Chris@0 92 # define OPT_SSO
Chris@0 93 # endif
Chris@0 94
Chris@0 95 /* second SSO shift, with rounding */
Chris@0 96
Chris@0 97 # if defined(OPT_SSO)
Chris@0 98 # define SHIFT(x) (((x) + (1L << 11)) >> 12)
Chris@0 99 # else
Chris@0 100 # define SHIFT(x) (x)
Chris@0 101 # endif
Chris@0 102
Chris@0 103 /* possible DCT speed optimization */
Chris@0 104
Chris@0 105 # if defined(OPT_SPEED) && defined(MAD_F_MLX)
Chris@0 106 # define OPT_DCTO
Chris@0 107 # define MUL(x, y) \
Chris@0 108 ({ mad_fixed64hi_t hi; \
Chris@0 109 mad_fixed64lo_t lo; \
Chris@0 110 MAD_F_MLX(hi, lo, (x), (y)); \
Chris@0 111 hi << (32 - MAD_F_SCALEBITS - 3); \
Chris@0 112 })
Chris@0 113 # else
Chris@0 114 # undef OPT_DCTO
Chris@0 115 # define MUL(x, y) mad_f_mul((x), (y))
Chris@0 116 # endif
Chris@0 117
Chris@0 118 /*
Chris@0 119 * NAME: dct32()
Chris@0 120 * DESCRIPTION: perform fast in[32]->out[32] DCT
Chris@0 121 */
Chris@0 122 static
Chris@0 123 void dct32(mad_fixed_t const in[32], unsigned int slot,
Chris@0 124 mad_fixed_t lo[16][8], mad_fixed_t hi[16][8])
Chris@0 125 {
Chris@0 126 mad_fixed_t t0, t1, t2, t3, t4, t5, t6, t7;
Chris@0 127 mad_fixed_t t8, t9, t10, t11, t12, t13, t14, t15;
Chris@0 128 mad_fixed_t t16, t17, t18, t19, t20, t21, t22, t23;
Chris@0 129 mad_fixed_t t24, t25, t26, t27, t28, t29, t30, t31;
Chris@0 130 mad_fixed_t t32, t33, t34, t35, t36, t37, t38, t39;
Chris@0 131 mad_fixed_t t40, t41, t42, t43, t44, t45, t46, t47;
Chris@0 132 mad_fixed_t t48, t49, t50, t51, t52, t53, t54, t55;
Chris@0 133 mad_fixed_t t56, t57, t58, t59, t60, t61, t62, t63;
Chris@0 134 mad_fixed_t t64, t65, t66, t67, t68, t69, t70, t71;
Chris@0 135 mad_fixed_t t72, t73, t74, t75, t76, t77, t78, t79;
Chris@0 136 mad_fixed_t t80, t81, t82, t83, t84, t85, t86, t87;
Chris@0 137 mad_fixed_t t88, t89, t90, t91, t92, t93, t94, t95;
Chris@0 138 mad_fixed_t t96, t97, t98, t99, t100, t101, t102, t103;
Chris@0 139 mad_fixed_t t104, t105, t106, t107, t108, t109, t110, t111;
Chris@0 140 mad_fixed_t t112, t113, t114, t115, t116, t117, t118, t119;
Chris@0 141 mad_fixed_t t120, t121, t122, t123, t124, t125, t126, t127;
Chris@0 142 mad_fixed_t t128, t129, t130, t131, t132, t133, t134, t135;
Chris@0 143 mad_fixed_t t136, t137, t138, t139, t140, t141, t142, t143;
Chris@0 144 mad_fixed_t t144, t145, t146, t147, t148, t149, t150, t151;
Chris@0 145 mad_fixed_t t152, t153, t154, t155, t156, t157, t158, t159;
Chris@0 146 mad_fixed_t t160, t161, t162, t163, t164, t165, t166, t167;
Chris@0 147 mad_fixed_t t168, t169, t170, t171, t172, t173, t174, t175;
Chris@0 148 mad_fixed_t t176;
Chris@0 149
Chris@0 150 /* costab[i] = cos(PI / (2 * 32) * i) */
Chris@0 151
Chris@0 152 # if defined(OPT_DCTO)
Chris@0 153 # define costab1 MAD_F(0x7fd8878e)
Chris@0 154 # define costab2 MAD_F(0x7f62368f)
Chris@0 155 # define costab3 MAD_F(0x7e9d55fc)
Chris@0 156 # define costab4 MAD_F(0x7d8a5f40)
Chris@0 157 # define costab5 MAD_F(0x7c29fbee)
Chris@0 158 # define costab6 MAD_F(0x7a7d055b)
Chris@0 159 # define costab7 MAD_F(0x78848414)
Chris@0 160 # define costab8 MAD_F(0x7641af3d)
Chris@0 161 # define costab9 MAD_F(0x73b5ebd1)
Chris@0 162 # define costab10 MAD_F(0x70e2cbc6)
Chris@0 163 # define costab11 MAD_F(0x6dca0d14)
Chris@0 164 # define costab12 MAD_F(0x6a6d98a4)
Chris@0 165 # define costab13 MAD_F(0x66cf8120)
Chris@0 166 # define costab14 MAD_F(0x62f201ac)
Chris@0 167 # define costab15 MAD_F(0x5ed77c8a)
Chris@0 168 # define costab16 MAD_F(0x5a82799a)
Chris@0 169 # define costab17 MAD_F(0x55f5a4d2)
Chris@0 170 # define costab18 MAD_F(0x5133cc94)
Chris@0 171 # define costab19 MAD_F(0x4c3fdff4)
Chris@0 172 # define costab20 MAD_F(0x471cece7)
Chris@0 173 # define costab21 MAD_F(0x41ce1e65)
Chris@0 174 # define costab22 MAD_F(0x3c56ba70)
Chris@0 175 # define costab23 MAD_F(0x36ba2014)
Chris@0 176 # define costab24 MAD_F(0x30fbc54d)
Chris@0 177 # define costab25 MAD_F(0x2b1f34eb)
Chris@0 178 # define costab26 MAD_F(0x25280c5e)
Chris@0 179 # define costab27 MAD_F(0x1f19f97b)
Chris@0 180 # define costab28 MAD_F(0x18f8b83c)
Chris@0 181 # define costab29 MAD_F(0x12c8106f)
Chris@0 182 # define costab30 MAD_F(0x0c8bd35e)
Chris@0 183 # define costab31 MAD_F(0x0647d97c)
Chris@0 184 # else
Chris@0 185 # define costab1 MAD_F(0x0ffb10f2) /* 0.998795456 */
Chris@0 186 # define costab2 MAD_F(0x0fec46d2) /* 0.995184727 */
Chris@0 187 # define costab3 MAD_F(0x0fd3aac0) /* 0.989176510 */
Chris@0 188 # define costab4 MAD_F(0x0fb14be8) /* 0.980785280 */
Chris@0 189 # define costab5 MAD_F(0x0f853f7e) /* 0.970031253 */
Chris@0 190 # define costab6 MAD_F(0x0f4fa0ab) /* 0.956940336 */
Chris@0 191 # define costab7 MAD_F(0x0f109082) /* 0.941544065 */
Chris@0 192 # define costab8 MAD_F(0x0ec835e8) /* 0.923879533 */
Chris@0 193 # define costab9 MAD_F(0x0e76bd7a) /* 0.903989293 */
Chris@0 194 # define costab10 MAD_F(0x0e1c5979) /* 0.881921264 */
Chris@0 195 # define costab11 MAD_F(0x0db941a3) /* 0.857728610 */
Chris@0 196 # define costab12 MAD_F(0x0d4db315) /* 0.831469612 */
Chris@0 197 # define costab13 MAD_F(0x0cd9f024) /* 0.803207531 */
Chris@0 198 # define costab14 MAD_F(0x0c5e4036) /* 0.773010453 */
Chris@0 199 # define costab15 MAD_F(0x0bdaef91) /* 0.740951125 */
Chris@0 200 # define costab16 MAD_F(0x0b504f33) /* 0.707106781 */
Chris@0 201 # define costab17 MAD_F(0x0abeb49a) /* 0.671558955 */
Chris@0 202 # define costab18 MAD_F(0x0a267993) /* 0.634393284 */
Chris@0 203 # define costab19 MAD_F(0x0987fbfe) /* 0.595699304 */
Chris@0 204 # define costab20 MAD_F(0x08e39d9d) /* 0.555570233 */
Chris@0 205 # define costab21 MAD_F(0x0839c3cd) /* 0.514102744 */
Chris@0 206 # define costab22 MAD_F(0x078ad74e) /* 0.471396737 */
Chris@0 207 # define costab23 MAD_F(0x06d74402) /* 0.427555093 */
Chris@0 208 # define costab24 MAD_F(0x061f78aa) /* 0.382683432 */
Chris@0 209 # define costab25 MAD_F(0x0563e69d) /* 0.336889853 */
Chris@0 210 # define costab26 MAD_F(0x04a5018c) /* 0.290284677 */
Chris@0 211 # define costab27 MAD_F(0x03e33f2f) /* 0.242980180 */
Chris@0 212 # define costab28 MAD_F(0x031f1708) /* 0.195090322 */
Chris@0 213 # define costab29 MAD_F(0x0259020e) /* 0.146730474 */
Chris@0 214 # define costab30 MAD_F(0x01917a6c) /* 0.098017140 */
Chris@0 215 # define costab31 MAD_F(0x00c8fb30) /* 0.049067674 */
Chris@0 216 # endif
Chris@0 217
Chris@0 218 t0 = in[0] + in[31]; t16 = MUL(in[0] - in[31], costab1);
Chris@0 219 t1 = in[15] + in[16]; t17 = MUL(in[15] - in[16], costab31);
Chris@0 220
Chris@0 221 t41 = t16 + t17;
Chris@0 222 t59 = MUL(t16 - t17, costab2);
Chris@0 223 t33 = t0 + t1;
Chris@0 224 t50 = MUL(t0 - t1, costab2);
Chris@0 225
Chris@0 226 t2 = in[7] + in[24]; t18 = MUL(in[7] - in[24], costab15);
Chris@0 227 t3 = in[8] + in[23]; t19 = MUL(in[8] - in[23], costab17);
Chris@0 228
Chris@0 229 t42 = t18 + t19;
Chris@0 230 t60 = MUL(t18 - t19, costab30);
Chris@0 231 t34 = t2 + t3;
Chris@0 232 t51 = MUL(t2 - t3, costab30);
Chris@0 233
Chris@0 234 t4 = in[3] + in[28]; t20 = MUL(in[3] - in[28], costab7);
Chris@0 235 t5 = in[12] + in[19]; t21 = MUL(in[12] - in[19], costab25);
Chris@0 236
Chris@0 237 t43 = t20 + t21;
Chris@0 238 t61 = MUL(t20 - t21, costab14);
Chris@0 239 t35 = t4 + t5;
Chris@0 240 t52 = MUL(t4 - t5, costab14);
Chris@0 241
Chris@0 242 t6 = in[4] + in[27]; t22 = MUL(in[4] - in[27], costab9);
Chris@0 243 t7 = in[11] + in[20]; t23 = MUL(in[11] - in[20], costab23);
Chris@0 244
Chris@0 245 t44 = t22 + t23;
Chris@0 246 t62 = MUL(t22 - t23, costab18);
Chris@0 247 t36 = t6 + t7;
Chris@0 248 t53 = MUL(t6 - t7, costab18);
Chris@0 249
Chris@0 250 t8 = in[1] + in[30]; t24 = MUL(in[1] - in[30], costab3);
Chris@0 251 t9 = in[14] + in[17]; t25 = MUL(in[14] - in[17], costab29);
Chris@0 252
Chris@0 253 t45 = t24 + t25;
Chris@0 254 t63 = MUL(t24 - t25, costab6);
Chris@0 255 t37 = t8 + t9;
Chris@0 256 t54 = MUL(t8 - t9, costab6);
Chris@0 257
Chris@0 258 t10 = in[6] + in[25]; t26 = MUL(in[6] - in[25], costab13);
Chris@0 259 t11 = in[9] + in[22]; t27 = MUL(in[9] - in[22], costab19);
Chris@0 260
Chris@0 261 t46 = t26 + t27;
Chris@0 262 t64 = MUL(t26 - t27, costab26);
Chris@0 263 t38 = t10 + t11;
Chris@0 264 t55 = MUL(t10 - t11, costab26);
Chris@0 265
Chris@0 266 t12 = in[2] + in[29]; t28 = MUL(in[2] - in[29], costab5);
Chris@0 267 t13 = in[13] + in[18]; t29 = MUL(in[13] - in[18], costab27);
Chris@0 268
Chris@0 269 t47 = t28 + t29;
Chris@0 270 t65 = MUL(t28 - t29, costab10);
Chris@0 271 t39 = t12 + t13;
Chris@0 272 t56 = MUL(t12 - t13, costab10);
Chris@0 273
Chris@0 274 t14 = in[5] + in[26]; t30 = MUL(in[5] - in[26], costab11);
Chris@0 275 t15 = in[10] + in[21]; t31 = MUL(in[10] - in[21], costab21);
Chris@0 276
Chris@0 277 t48 = t30 + t31;
Chris@0 278 t66 = MUL(t30 - t31, costab22);
Chris@0 279 t40 = t14 + t15;
Chris@0 280 t57 = MUL(t14 - t15, costab22);
Chris@0 281
Chris@0 282 t69 = t33 + t34; t89 = MUL(t33 - t34, costab4);
Chris@0 283 t70 = t35 + t36; t90 = MUL(t35 - t36, costab28);
Chris@0 284 t71 = t37 + t38; t91 = MUL(t37 - t38, costab12);
Chris@0 285 t72 = t39 + t40; t92 = MUL(t39 - t40, costab20);
Chris@0 286 t73 = t41 + t42; t94 = MUL(t41 - t42, costab4);
Chris@0 287 t74 = t43 + t44; t95 = MUL(t43 - t44, costab28);
Chris@0 288 t75 = t45 + t46; t96 = MUL(t45 - t46, costab12);
Chris@0 289 t76 = t47 + t48; t97 = MUL(t47 - t48, costab20);
Chris@0 290
Chris@0 291 t78 = t50 + t51; t100 = MUL(t50 - t51, costab4);
Chris@0 292 t79 = t52 + t53; t101 = MUL(t52 - t53, costab28);
Chris@0 293 t80 = t54 + t55; t102 = MUL(t54 - t55, costab12);
Chris@0 294 t81 = t56 + t57; t103 = MUL(t56 - t57, costab20);
Chris@0 295
Chris@0 296 t83 = t59 + t60; t106 = MUL(t59 - t60, costab4);
Chris@0 297 t84 = t61 + t62; t107 = MUL(t61 - t62, costab28);
Chris@0 298 t85 = t63 + t64; t108 = MUL(t63 - t64, costab12);
Chris@0 299 t86 = t65 + t66; t109 = MUL(t65 - t66, costab20);
Chris@0 300
Chris@0 301 t113 = t69 + t70;
Chris@0 302 t114 = t71 + t72;
Chris@0 303
Chris@0 304 /* 0 */ hi[15][slot] = SHIFT(t113 + t114);
Chris@0 305 /* 16 */ lo[ 0][slot] = SHIFT(MUL(t113 - t114, costab16));
Chris@0 306
Chris@0 307 t115 = t73 + t74;
Chris@0 308 t116 = t75 + t76;
Chris@0 309
Chris@0 310 t32 = t115 + t116;
Chris@0 311
Chris@0 312 /* 1 */ hi[14][slot] = SHIFT(t32);
Chris@0 313
Chris@0 314 t118 = t78 + t79;
Chris@0 315 t119 = t80 + t81;
Chris@0 316
Chris@0 317 t58 = t118 + t119;
Chris@0 318
Chris@0 319 /* 2 */ hi[13][slot] = SHIFT(t58);
Chris@0 320
Chris@0 321 t121 = t83 + t84;
Chris@0 322 t122 = t85 + t86;
Chris@0 323
Chris@0 324 t67 = t121 + t122;
Chris@0 325
Chris@0 326 t49 = (t67 * 2) - t32;
Chris@0 327
Chris@0 328 /* 3 */ hi[12][slot] = SHIFT(t49);
Chris@0 329
Chris@0 330 t125 = t89 + t90;
Chris@0 331 t126 = t91 + t92;
Chris@0 332
Chris@0 333 t93 = t125 + t126;
Chris@0 334
Chris@0 335 /* 4 */ hi[11][slot] = SHIFT(t93);
Chris@0 336
Chris@0 337 t128 = t94 + t95;
Chris@0 338 t129 = t96 + t97;
Chris@0 339
Chris@0 340 t98 = t128 + t129;
Chris@0 341
Chris@0 342 t68 = (t98 * 2) - t49;
Chris@0 343
Chris@0 344 /* 5 */ hi[10][slot] = SHIFT(t68);
Chris@0 345
Chris@0 346 t132 = t100 + t101;
Chris@0 347 t133 = t102 + t103;
Chris@0 348
Chris@0 349 t104 = t132 + t133;
Chris@0 350
Chris@0 351 t82 = (t104 * 2) - t58;
Chris@0 352
Chris@0 353 /* 6 */ hi[ 9][slot] = SHIFT(t82);
Chris@0 354
Chris@0 355 t136 = t106 + t107;
Chris@0 356 t137 = t108 + t109;
Chris@0 357
Chris@0 358 t110 = t136 + t137;
Chris@0 359
Chris@0 360 t87 = (t110 * 2) - t67;
Chris@0 361
Chris@0 362 t77 = (t87 * 2) - t68;
Chris@0 363
Chris@0 364 /* 7 */ hi[ 8][slot] = SHIFT(t77);
Chris@0 365
Chris@0 366 t141 = MUL(t69 - t70, costab8);
Chris@0 367 t142 = MUL(t71 - t72, costab24);
Chris@0 368 t143 = t141 + t142;
Chris@0 369
Chris@0 370 /* 8 */ hi[ 7][slot] = SHIFT(t143);
Chris@0 371 /* 24 */ lo[ 8][slot] =
Chris@0 372 SHIFT((MUL(t141 - t142, costab16) * 2) - t143);
Chris@0 373
Chris@0 374 t144 = MUL(t73 - t74, costab8);
Chris@0 375 t145 = MUL(t75 - t76, costab24);
Chris@0 376 t146 = t144 + t145;
Chris@0 377
Chris@0 378 t88 = (t146 * 2) - t77;
Chris@0 379
Chris@0 380 /* 9 */ hi[ 6][slot] = SHIFT(t88);
Chris@0 381
Chris@0 382 t148 = MUL(t78 - t79, costab8);
Chris@0 383 t149 = MUL(t80 - t81, costab24);
Chris@0 384 t150 = t148 + t149;
Chris@0 385
Chris@0 386 t105 = (t150 * 2) - t82;
Chris@0 387
Chris@0 388 /* 10 */ hi[ 5][slot] = SHIFT(t105);
Chris@0 389
Chris@0 390 t152 = MUL(t83 - t84, costab8);
Chris@0 391 t153 = MUL(t85 - t86, costab24);
Chris@0 392 t154 = t152 + t153;
Chris@0 393
Chris@0 394 t111 = (t154 * 2) - t87;
Chris@0 395
Chris@0 396 t99 = (t111 * 2) - t88;
Chris@0 397
Chris@0 398 /* 11 */ hi[ 4][slot] = SHIFT(t99);
Chris@0 399
Chris@0 400 t157 = MUL(t89 - t90, costab8);
Chris@0 401 t158 = MUL(t91 - t92, costab24);
Chris@0 402 t159 = t157 + t158;
Chris@0 403
Chris@0 404 t127 = (t159 * 2) - t93;
Chris@0 405
Chris@0 406 /* 12 */ hi[ 3][slot] = SHIFT(t127);
Chris@0 407
Chris@0 408 t160 = (MUL(t125 - t126, costab16) * 2) - t127;
Chris@0 409
Chris@0 410 /* 20 */ lo[ 4][slot] = SHIFT(t160);
Chris@0 411 /* 28 */ lo[12][slot] =
Chris@0 412 SHIFT((((MUL(t157 - t158, costab16) * 2) - t159) * 2) - t160);
Chris@0 413
Chris@0 414 t161 = MUL(t94 - t95, costab8);
Chris@0 415 t162 = MUL(t96 - t97, costab24);
Chris@0 416 t163 = t161 + t162;
Chris@0 417
Chris@0 418 t130 = (t163 * 2) - t98;
Chris@0 419
Chris@0 420 t112 = (t130 * 2) - t99;
Chris@0 421
Chris@0 422 /* 13 */ hi[ 2][slot] = SHIFT(t112);
Chris@0 423
Chris@0 424 t164 = (MUL(t128 - t129, costab16) * 2) - t130;
Chris@0 425
Chris@0 426 t166 = MUL(t100 - t101, costab8);
Chris@0 427 t167 = MUL(t102 - t103, costab24);
Chris@0 428 t168 = t166 + t167;
Chris@0 429
Chris@0 430 t134 = (t168 * 2) - t104;
Chris@0 431
Chris@0 432 t120 = (t134 * 2) - t105;
Chris@0 433
Chris@0 434 /* 14 */ hi[ 1][slot] = SHIFT(t120);
Chris@0 435
Chris@0 436 t135 = (MUL(t118 - t119, costab16) * 2) - t120;
Chris@0 437
Chris@0 438 /* 18 */ lo[ 2][slot] = SHIFT(t135);
Chris@0 439
Chris@0 440 t169 = (MUL(t132 - t133, costab16) * 2) - t134;
Chris@0 441
Chris@0 442 t151 = (t169 * 2) - t135;
Chris@0 443
Chris@0 444 /* 22 */ lo[ 6][slot] = SHIFT(t151);
Chris@0 445
Chris@0 446 t170 = (((MUL(t148 - t149, costab16) * 2) - t150) * 2) - t151;
Chris@0 447
Chris@0 448 /* 26 */ lo[10][slot] = SHIFT(t170);
Chris@0 449 /* 30 */ lo[14][slot] =
Chris@0 450 SHIFT((((((MUL(t166 - t167, costab16) * 2) -
Chris@0 451 t168) * 2) - t169) * 2) - t170);
Chris@0 452
Chris@0 453 t171 = MUL(t106 - t107, costab8);
Chris@0 454 t172 = MUL(t108 - t109, costab24);
Chris@0 455 t173 = t171 + t172;
Chris@0 456
Chris@0 457 t138 = (t173 * 2) - t110;
Chris@0 458
Chris@0 459 t123 = (t138 * 2) - t111;
Chris@0 460
Chris@0 461 t139 = (MUL(t121 - t122, costab16) * 2) - t123;
Chris@0 462
Chris@0 463 t117 = (t123 * 2) - t112;
Chris@0 464
Chris@0 465 /* 15 */ hi[ 0][slot] = SHIFT(t117);
Chris@0 466
Chris@0 467 t124 = (MUL(t115 - t116, costab16) * 2) - t117;
Chris@0 468
Chris@0 469 /* 17 */ lo[ 1][slot] = SHIFT(t124);
Chris@0 470
Chris@0 471 t131 = (t139 * 2) - t124;
Chris@0 472
Chris@0 473 /* 19 */ lo[ 3][slot] = SHIFT(t131);
Chris@0 474
Chris@0 475 t140 = (t164 * 2) - t131;
Chris@0 476
Chris@0 477 /* 21 */ lo[ 5][slot] = SHIFT(t140);
Chris@0 478
Chris@0 479 t174 = (MUL(t136 - t137, costab16) * 2) - t138;
Chris@0 480
Chris@0 481 t155 = (t174 * 2) - t139;
Chris@0 482
Chris@0 483 t147 = (t155 * 2) - t140;
Chris@0 484
Chris@0 485 /* 23 */ lo[ 7][slot] = SHIFT(t147);
Chris@0 486
Chris@0 487 t156 = (((MUL(t144 - t145, costab16) * 2) - t146) * 2) - t147;
Chris@0 488
Chris@0 489 /* 25 */ lo[ 9][slot] = SHIFT(t156);
Chris@0 490
Chris@0 491 t175 = (((MUL(t152 - t153, costab16) * 2) - t154) * 2) - t155;
Chris@0 492
Chris@0 493 t165 = (t175 * 2) - t156;
Chris@0 494
Chris@0 495 /* 27 */ lo[11][slot] = SHIFT(t165);
Chris@0 496
Chris@0 497 t176 = (((((MUL(t161 - t162, costab16) * 2) -
Chris@0 498 t163) * 2) - t164) * 2) - t165;
Chris@0 499
Chris@0 500 /* 29 */ lo[13][slot] = SHIFT(t176);
Chris@0 501 /* 31 */ lo[15][slot] =
Chris@0 502 SHIFT((((((((MUL(t171 - t172, costab16) * 2) -
Chris@0 503 t173) * 2) - t174) * 2) - t175) * 2) - t176);
Chris@0 504
Chris@0 505 /*
Chris@0 506 * Totals:
Chris@0 507 * 80 multiplies
Chris@0 508 * 80 additions
Chris@0 509 * 119 subtractions
Chris@0 510 * 49 shifts (not counting SSO)
Chris@0 511 */
Chris@0 512 }
Chris@0 513
Chris@0 514 # undef MUL
Chris@0 515 # undef SHIFT
Chris@0 516
Chris@0 517 /* third SSO shift and/or D[] optimization preshift */
Chris@0 518
Chris@0 519 # if defined(OPT_SSO)
Chris@0 520 # if MAD_F_FRACBITS != 28
Chris@0 521 # error "MAD_F_FRACBITS must be 28 to use OPT_SSO"
Chris@0 522 # endif
Chris@0 523 # define ML0(hi, lo, x, y) ((lo) = (x) * (y))
Chris@0 524 # define MLA(hi, lo, x, y) ((lo) += (x) * (y))
Chris@0 525 # define MLN(hi, lo) ((lo) = -(lo))
Chris@0 526 # define MLZ(hi, lo) ((void) (hi), (mad_fixed_t) (lo))
Chris@0 527 # define SHIFT(x) ((x) >> 2)
Chris@0 528 # define PRESHIFT(x) ((MAD_F(x) + (1L << 13)) >> 14)
Chris@0 529 # else
Chris@0 530 # define ML0(hi, lo, x, y) MAD_F_ML0((hi), (lo), (x), (y))
Chris@0 531 # define MLA(hi, lo, x, y) MAD_F_MLA((hi), (lo), (x), (y))
Chris@0 532 # define MLN(hi, lo) MAD_F_MLN((hi), (lo))
Chris@0 533 # define MLZ(hi, lo) MAD_F_MLZ((hi), (lo))
Chris@0 534 # define SHIFT(x) (x)
Chris@0 535 # if defined(MAD_F_SCALEBITS)
Chris@0 536 # undef MAD_F_SCALEBITS
Chris@0 537 # define MAD_F_SCALEBITS (MAD_F_FRACBITS - 12)
Chris@0 538 # define PRESHIFT(x) (MAD_F(x) >> 12)
Chris@0 539 # else
Chris@0 540 # define PRESHIFT(x) MAD_F(x)
Chris@0 541 # endif
Chris@0 542 # endif
Chris@0 543
Chris@0 544 static
Chris@0 545 mad_fixed_t const D[17][32] = {
Chris@0 546 # include "D.dat"
Chris@0 547 };
Chris@0 548
Chris@0 549 # if defined(ASO_SYNTH)
Chris@0 550 void synth_full(struct mad_synth *, struct mad_frame const *,
Chris@0 551 unsigned int, unsigned int);
Chris@0 552 # else
Chris@0 553 /*
Chris@0 554 * NAME: synth->full()
Chris@0 555 * DESCRIPTION: perform full frequency PCM synthesis
Chris@0 556 */
Chris@0 557 static
Chris@0 558 void synth_full(struct mad_synth *synth, struct mad_frame const *frame,
Chris@0 559 unsigned int nch, unsigned int ns)
Chris@0 560 {
Chris@0 561 unsigned int phase, ch, s, sb, pe, po;
Chris@0 562 mad_fixed_t *pcm1, *pcm2, (*filter)[2][2][16][8];
Chris@0 563 mad_fixed_t const (*sbsample)[36][32];
Chris@0 564 register mad_fixed_t (*fe)[8], (*fx)[8], (*fo)[8];
Chris@0 565 register mad_fixed_t const (*Dptr)[32], *ptr;
Chris@0 566 register mad_fixed64hi_t hi;
Chris@0 567 register mad_fixed64lo_t lo;
Chris@0 568
Chris@0 569 for (ch = 0; ch < nch; ++ch) {
Chris@0 570 sbsample = &frame->sbsample[ch];
Chris@0 571 filter = &synth->filter[ch];
Chris@0 572 phase = synth->phase;
Chris@0 573 pcm1 = synth->pcm.samples[ch];
Chris@0 574
Chris@0 575 for (s = 0; s < ns; ++s) {
Chris@0 576 dct32((*sbsample)[s], phase >> 1,
Chris@0 577 (*filter)[0][phase & 1], (*filter)[1][phase & 1]);
Chris@0 578
Chris@0 579 pe = phase & ~1;
Chris@0 580 po = ((phase - 1) & 0xf) | 1;
Chris@0 581
Chris@0 582 /* calculate 32 samples */
Chris@0 583
Chris@0 584 fe = &(*filter)[0][ phase & 1][0];
Chris@0 585 fx = &(*filter)[0][~phase & 1][0];
Chris@0 586 fo = &(*filter)[1][~phase & 1][0];
Chris@0 587
Chris@0 588 Dptr = &D[0];
Chris@0 589
Chris@0 590 ptr = *Dptr + po;
Chris@0 591 ML0(hi, lo, (*fx)[0], ptr[ 0]);
Chris@0 592 MLA(hi, lo, (*fx)[1], ptr[14]);
Chris@0 593 MLA(hi, lo, (*fx)[2], ptr[12]);
Chris@0 594 MLA(hi, lo, (*fx)[3], ptr[10]);
Chris@0 595 MLA(hi, lo, (*fx)[4], ptr[ 8]);
Chris@0 596 MLA(hi, lo, (*fx)[5], ptr[ 6]);
Chris@0 597 MLA(hi, lo, (*fx)[6], ptr[ 4]);
Chris@0 598 MLA(hi, lo, (*fx)[7], ptr[ 2]);
Chris@0 599 MLN(hi, lo);
Chris@0 600
Chris@0 601 ptr = *Dptr + pe;
Chris@0 602 MLA(hi, lo, (*fe)[0], ptr[ 0]);
Chris@0 603 MLA(hi, lo, (*fe)[1], ptr[14]);
Chris@0 604 MLA(hi, lo, (*fe)[2], ptr[12]);
Chris@0 605 MLA(hi, lo, (*fe)[3], ptr[10]);
Chris@0 606 MLA(hi, lo, (*fe)[4], ptr[ 8]);
Chris@0 607 MLA(hi, lo, (*fe)[5], ptr[ 6]);
Chris@0 608 MLA(hi, lo, (*fe)[6], ptr[ 4]);
Chris@0 609 MLA(hi, lo, (*fe)[7], ptr[ 2]);
Chris@0 610
Chris@0 611 *pcm1++ = SHIFT(MLZ(hi, lo));
Chris@0 612
Chris@0 613 pcm2 = pcm1 + 30;
Chris@0 614
Chris@0 615 for (sb = 1; sb < 16; ++sb) {
Chris@0 616 ++fe;
Chris@0 617 ++Dptr;
Chris@0 618
Chris@0 619 /* D[32 - sb][i] == -D[sb][31 - i] */
Chris@0 620
Chris@0 621 ptr = *Dptr + po;
Chris@0 622 ML0(hi, lo, (*fo)[0], ptr[ 0]);
Chris@0 623 MLA(hi, lo, (*fo)[1], ptr[14]);
Chris@0 624 MLA(hi, lo, (*fo)[2], ptr[12]);
Chris@0 625 MLA(hi, lo, (*fo)[3], ptr[10]);
Chris@0 626 MLA(hi, lo, (*fo)[4], ptr[ 8]);
Chris@0 627 MLA(hi, lo, (*fo)[5], ptr[ 6]);
Chris@0 628 MLA(hi, lo, (*fo)[6], ptr[ 4]);
Chris@0 629 MLA(hi, lo, (*fo)[7], ptr[ 2]);
Chris@0 630 MLN(hi, lo);
Chris@0 631
Chris@0 632 ptr = *Dptr + pe;
Chris@0 633 MLA(hi, lo, (*fe)[7], ptr[ 2]);
Chris@0 634 MLA(hi, lo, (*fe)[6], ptr[ 4]);
Chris@0 635 MLA(hi, lo, (*fe)[5], ptr[ 6]);
Chris@0 636 MLA(hi, lo, (*fe)[4], ptr[ 8]);
Chris@0 637 MLA(hi, lo, (*fe)[3], ptr[10]);
Chris@0 638 MLA(hi, lo, (*fe)[2], ptr[12]);
Chris@0 639 MLA(hi, lo, (*fe)[1], ptr[14]);
Chris@0 640 MLA(hi, lo, (*fe)[0], ptr[ 0]);
Chris@0 641
Chris@0 642 *pcm1++ = SHIFT(MLZ(hi, lo));
Chris@0 643
Chris@0 644 ptr = *Dptr - pe;
Chris@0 645 ML0(hi, lo, (*fe)[0], ptr[31 - 16]);
Chris@0 646 MLA(hi, lo, (*fe)[1], ptr[31 - 14]);
Chris@0 647 MLA(hi, lo, (*fe)[2], ptr[31 - 12]);
Chris@0 648 MLA(hi, lo, (*fe)[3], ptr[31 - 10]);
Chris@0 649 MLA(hi, lo, (*fe)[4], ptr[31 - 8]);
Chris@0 650 MLA(hi, lo, (*fe)[5], ptr[31 - 6]);
Chris@0 651 MLA(hi, lo, (*fe)[6], ptr[31 - 4]);
Chris@0 652 MLA(hi, lo, (*fe)[7], ptr[31 - 2]);
Chris@0 653
Chris@0 654 ptr = *Dptr - po;
Chris@0 655 MLA(hi, lo, (*fo)[7], ptr[31 - 2]);
Chris@0 656 MLA(hi, lo, (*fo)[6], ptr[31 - 4]);
Chris@0 657 MLA(hi, lo, (*fo)[5], ptr[31 - 6]);
Chris@0 658 MLA(hi, lo, (*fo)[4], ptr[31 - 8]);
Chris@0 659 MLA(hi, lo, (*fo)[3], ptr[31 - 10]);
Chris@0 660 MLA(hi, lo, (*fo)[2], ptr[31 - 12]);
Chris@0 661 MLA(hi, lo, (*fo)[1], ptr[31 - 14]);
Chris@0 662 MLA(hi, lo, (*fo)[0], ptr[31 - 16]);
Chris@0 663
Chris@0 664 *pcm2-- = SHIFT(MLZ(hi, lo));
Chris@0 665
Chris@0 666 ++fo;
Chris@0 667 }
Chris@0 668
Chris@0 669 ++Dptr;
Chris@0 670
Chris@0 671 ptr = *Dptr + po;
Chris@0 672 ML0(hi, lo, (*fo)[0], ptr[ 0]);
Chris@0 673 MLA(hi, lo, (*fo)[1], ptr[14]);
Chris@0 674 MLA(hi, lo, (*fo)[2], ptr[12]);
Chris@0 675 MLA(hi, lo, (*fo)[3], ptr[10]);
Chris@0 676 MLA(hi, lo, (*fo)[4], ptr[ 8]);
Chris@0 677 MLA(hi, lo, (*fo)[5], ptr[ 6]);
Chris@0 678 MLA(hi, lo, (*fo)[6], ptr[ 4]);
Chris@0 679 MLA(hi, lo, (*fo)[7], ptr[ 2]);
Chris@0 680
Chris@0 681 *pcm1 = SHIFT(-MLZ(hi, lo));
Chris@0 682 pcm1 += 16;
Chris@0 683
Chris@0 684 phase = (phase + 1) % 16;
Chris@0 685 }
Chris@0 686 }
Chris@0 687 }
Chris@0 688 # endif
Chris@0 689
Chris@0 690 /*
Chris@0 691 * NAME: synth->half()
Chris@0 692 * DESCRIPTION: perform half frequency PCM synthesis
Chris@0 693 */
Chris@0 694 static
Chris@0 695 void synth_half(struct mad_synth *synth, struct mad_frame const *frame,
Chris@0 696 unsigned int nch, unsigned int ns)
Chris@0 697 {
Chris@0 698 unsigned int phase, ch, s, sb, pe, po;
Chris@0 699 mad_fixed_t *pcm1, *pcm2, (*filter)[2][2][16][8];
Chris@0 700 mad_fixed_t const (*sbsample)[36][32];
Chris@0 701 register mad_fixed_t (*fe)[8], (*fx)[8], (*fo)[8];
Chris@0 702 register mad_fixed_t const (*Dptr)[32], *ptr;
Chris@0 703 register mad_fixed64hi_t hi;
Chris@0 704 register mad_fixed64lo_t lo;
Chris@0 705
Chris@0 706 for (ch = 0; ch < nch; ++ch) {
Chris@0 707 sbsample = &frame->sbsample[ch];
Chris@0 708 filter = &synth->filter[ch];
Chris@0 709 phase = synth->phase;
Chris@0 710 pcm1 = synth->pcm.samples[ch];
Chris@0 711
Chris@0 712 for (s = 0; s < ns; ++s) {
Chris@0 713 dct32((*sbsample)[s], phase >> 1,
Chris@0 714 (*filter)[0][phase & 1], (*filter)[1][phase & 1]);
Chris@0 715
Chris@0 716 pe = phase & ~1;
Chris@0 717 po = ((phase - 1) & 0xf) | 1;
Chris@0 718
Chris@0 719 /* calculate 16 samples */
Chris@0 720
Chris@0 721 fe = &(*filter)[0][ phase & 1][0];
Chris@0 722 fx = &(*filter)[0][~phase & 1][0];
Chris@0 723 fo = &(*filter)[1][~phase & 1][0];
Chris@0 724
Chris@0 725 Dptr = &D[0];
Chris@0 726
Chris@0 727 ptr = *Dptr + po;
Chris@0 728 ML0(hi, lo, (*fx)[0], ptr[ 0]);
Chris@0 729 MLA(hi, lo, (*fx)[1], ptr[14]);
Chris@0 730 MLA(hi, lo, (*fx)[2], ptr[12]);
Chris@0 731 MLA(hi, lo, (*fx)[3], ptr[10]);
Chris@0 732 MLA(hi, lo, (*fx)[4], ptr[ 8]);
Chris@0 733 MLA(hi, lo, (*fx)[5], ptr[ 6]);
Chris@0 734 MLA(hi, lo, (*fx)[6], ptr[ 4]);
Chris@0 735 MLA(hi, lo, (*fx)[7], ptr[ 2]);
Chris@0 736 MLN(hi, lo);
Chris@0 737
Chris@0 738 ptr = *Dptr + pe;
Chris@0 739 MLA(hi, lo, (*fe)[0], ptr[ 0]);
Chris@0 740 MLA(hi, lo, (*fe)[1], ptr[14]);
Chris@0 741 MLA(hi, lo, (*fe)[2], ptr[12]);
Chris@0 742 MLA(hi, lo, (*fe)[3], ptr[10]);
Chris@0 743 MLA(hi, lo, (*fe)[4], ptr[ 8]);
Chris@0 744 MLA(hi, lo, (*fe)[5], ptr[ 6]);
Chris@0 745 MLA(hi, lo, (*fe)[6], ptr[ 4]);
Chris@0 746 MLA(hi, lo, (*fe)[7], ptr[ 2]);
Chris@0 747
Chris@0 748 *pcm1++ = SHIFT(MLZ(hi, lo));
Chris@0 749
Chris@0 750 pcm2 = pcm1 + 14;
Chris@0 751
Chris@0 752 for (sb = 1; sb < 16; ++sb) {
Chris@0 753 ++fe;
Chris@0 754 ++Dptr;
Chris@0 755
Chris@0 756 /* D[32 - sb][i] == -D[sb][31 - i] */
Chris@0 757
Chris@0 758 if (!(sb & 1)) {
Chris@0 759 ptr = *Dptr + po;
Chris@0 760 ML0(hi, lo, (*fo)[0], ptr[ 0]);
Chris@0 761 MLA(hi, lo, (*fo)[1], ptr[14]);
Chris@0 762 MLA(hi, lo, (*fo)[2], ptr[12]);
Chris@0 763 MLA(hi, lo, (*fo)[3], ptr[10]);
Chris@0 764 MLA(hi, lo, (*fo)[4], ptr[ 8]);
Chris@0 765 MLA(hi, lo, (*fo)[5], ptr[ 6]);
Chris@0 766 MLA(hi, lo, (*fo)[6], ptr[ 4]);
Chris@0 767 MLA(hi, lo, (*fo)[7], ptr[ 2]);
Chris@0 768 MLN(hi, lo);
Chris@0 769
Chris@0 770 ptr = *Dptr + pe;
Chris@0 771 MLA(hi, lo, (*fe)[7], ptr[ 2]);
Chris@0 772 MLA(hi, lo, (*fe)[6], ptr[ 4]);
Chris@0 773 MLA(hi, lo, (*fe)[5], ptr[ 6]);
Chris@0 774 MLA(hi, lo, (*fe)[4], ptr[ 8]);
Chris@0 775 MLA(hi, lo, (*fe)[3], ptr[10]);
Chris@0 776 MLA(hi, lo, (*fe)[2], ptr[12]);
Chris@0 777 MLA(hi, lo, (*fe)[1], ptr[14]);
Chris@0 778 MLA(hi, lo, (*fe)[0], ptr[ 0]);
Chris@0 779
Chris@0 780 *pcm1++ = SHIFT(MLZ(hi, lo));
Chris@0 781
Chris@0 782 ptr = *Dptr - po;
Chris@0 783 ML0(hi, lo, (*fo)[7], ptr[31 - 2]);
Chris@0 784 MLA(hi, lo, (*fo)[6], ptr[31 - 4]);
Chris@0 785 MLA(hi, lo, (*fo)[5], ptr[31 - 6]);
Chris@0 786 MLA(hi, lo, (*fo)[4], ptr[31 - 8]);
Chris@0 787 MLA(hi, lo, (*fo)[3], ptr[31 - 10]);
Chris@0 788 MLA(hi, lo, (*fo)[2], ptr[31 - 12]);
Chris@0 789 MLA(hi, lo, (*fo)[1], ptr[31 - 14]);
Chris@0 790 MLA(hi, lo, (*fo)[0], ptr[31 - 16]);
Chris@0 791
Chris@0 792 ptr = *Dptr - pe;
Chris@0 793 MLA(hi, lo, (*fe)[0], ptr[31 - 16]);
Chris@0 794 MLA(hi, lo, (*fe)[1], ptr[31 - 14]);
Chris@0 795 MLA(hi, lo, (*fe)[2], ptr[31 - 12]);
Chris@0 796 MLA(hi, lo, (*fe)[3], ptr[31 - 10]);
Chris@0 797 MLA(hi, lo, (*fe)[4], ptr[31 - 8]);
Chris@0 798 MLA(hi, lo, (*fe)[5], ptr[31 - 6]);
Chris@0 799 MLA(hi, lo, (*fe)[6], ptr[31 - 4]);
Chris@0 800 MLA(hi, lo, (*fe)[7], ptr[31 - 2]);
Chris@0 801
Chris@0 802 *pcm2-- = SHIFT(MLZ(hi, lo));
Chris@0 803 }
Chris@0 804
Chris@0 805 ++fo;
Chris@0 806 }
Chris@0 807
Chris@0 808 ++Dptr;
Chris@0 809
Chris@0 810 ptr = *Dptr + po;
Chris@0 811 ML0(hi, lo, (*fo)[0], ptr[ 0]);
Chris@0 812 MLA(hi, lo, (*fo)[1], ptr[14]);
Chris@0 813 MLA(hi, lo, (*fo)[2], ptr[12]);
Chris@0 814 MLA(hi, lo, (*fo)[3], ptr[10]);
Chris@0 815 MLA(hi, lo, (*fo)[4], ptr[ 8]);
Chris@0 816 MLA(hi, lo, (*fo)[5], ptr[ 6]);
Chris@0 817 MLA(hi, lo, (*fo)[6], ptr[ 4]);
Chris@0 818 MLA(hi, lo, (*fo)[7], ptr[ 2]);
Chris@0 819
Chris@0 820 *pcm1 = SHIFT(-MLZ(hi, lo));
Chris@0 821 pcm1 += 8;
Chris@0 822
Chris@0 823 phase = (phase + 1) % 16;
Chris@0 824 }
Chris@0 825 }
Chris@0 826 }
Chris@0 827
Chris@0 828 /*
Chris@0 829 * NAME: synth->frame()
Chris@0 830 * DESCRIPTION: perform PCM synthesis of frame subband samples
Chris@0 831 */
Chris@0 832 void mad_synth_frame(struct mad_synth *synth, struct mad_frame const *frame)
Chris@0 833 {
Chris@0 834 unsigned int nch, ns;
Chris@0 835 void (*synth_frame)(struct mad_synth *, struct mad_frame const *,
Chris@0 836 unsigned int, unsigned int);
Chris@0 837
Chris@0 838 nch = MAD_NCHANNELS(&frame->header);
Chris@0 839 ns = MAD_NSBSAMPLES(&frame->header);
Chris@0 840
Chris@0 841 synth->pcm.samplerate = frame->header.samplerate;
Chris@0 842 synth->pcm.channels = nch;
Chris@0 843 synth->pcm.length = 32 * ns;
Chris@0 844
Chris@0 845 synth_frame = synth_full;
Chris@0 846
Chris@0 847 if (frame->options & MAD_OPTION_HALFSAMPLERATE) {
Chris@0 848 synth->pcm.samplerate /= 2;
Chris@0 849 synth->pcm.length /= 2;
Chris@0 850
Chris@0 851 synth_frame = synth_half;
Chris@0 852 }
Chris@0 853
Chris@0 854 synth_frame(synth, frame, nch, ns);
Chris@0 855
Chris@0 856 synth->phase = (synth->phase + ns) % 16;
Chris@0 857 }