mp3
Version:
An MP3 decoder for Aurora.js
1,110 lines (942 loc) • 26 kB
JavaScript
var utils = require('./utils');
function MP3Synth() {
this.filter = utils.makeArray([2, 2, 2, 16, 8]); // polyphase filterbank outputs
this.phase = 0;
this.pcm = {
samplerate: 0,
channels: 0,
length: 0,
samples: [new Float64Array(1152), new Float64Array(1152)]
};
}
/* costab[i] = cos(PI / (2 * 32) * i) */
const costab1 = 0.998795456;
const costab2 = 0.995184727;
const costab3 = 0.989176510;
const costab4 = 0.980785280;
const costab5 = 0.970031253;
const costab6 = 0.956940336;
const costab7 = 0.941544065;
const costab8 = 0.923879533;
const costab9 = 0.903989293;
const costab10 = 0.881921264;
const costab11 = 0.857728610;
const costab12 = 0.831469612;
const costab13 = 0.803207531;
const costab14 = 0.773010453;
const costab15 = 0.740951125;
const costab16 = 0.707106781;
const costab17 = 0.671558955;
const costab18 = 0.634393284;
const costab19 = 0.595699304;
const costab20 = 0.555570233;
const costab21 = 0.514102744;
const costab22 = 0.471396737;
const costab23 = 0.427555093;
const costab24 = 0.382683432;
const costab25 = 0.336889853;
const costab26 = 0.290284677;
const costab27 = 0.242980180;
const costab28 = 0.195090322;
const costab29 = 0.146730474;
const costab30 = 0.098017140;
const costab31 = 0.049067674;
/*
* NAME: dct32()
* DESCRIPTION: perform fast in[32].out[32] DCT
*/
MP3Synth.dct32 = function (_in, slot, lo, hi) {
var t0, t1, t2, t3, t4, t5, t6, t7;
var t8, t9, t10, t11, t12, t13, t14, t15;
var t16, t17, t18, t19, t20, t21, t22, t23;
var t24, t25, t26, t27, t28, t29, t30, t31;
var t32, t33, t34, t35, t36, t37, t38, t39;
var t40, t41, t42, t43, t44, t45, t46, t47;
var t48, t49, t50, t51, t52, t53, t54, t55;
var t56, t57, t58, t59, t60, t61, t62, t63;
var t64, t65, t66, t67, t68, t69, t70, t71;
var t72, t73, t74, t75, t76, t77, t78, t79;
var t80, t81, t82, t83, t84, t85, t86, t87;
var t88, t89, t90, t91, t92, t93, t94, t95;
var t96, t97, t98, t99, t100, t101, t102, t103;
var t104, t105, t106, t107, t108, t109, t110, t111;
var t112, t113, t114, t115, t116, t117, t118, t119;
var t120, t121, t122, t123, t124, t125, t126, t127;
var t128, t129, t130, t131, t132, t133, t134, t135;
var t136, t137, t138, t139, t140, t141, t142, t143;
var t144, t145, t146, t147, t148, t149, t150, t151;
var t152, t153, t154, t155, t156, t157, t158, t159;
var t160, t161, t162, t163, t164, t165, t166, t167;
var t168, t169, t170, t171, t172, t173, t174, t175;
var t176;
t0 = _in[0] + _in[31]; t16 = ((_in[0] - _in[31]) * (costab1));
t1 = _in[15] + _in[16]; t17 = ((_in[15] - _in[16]) * (costab31));
t41 = t16 + t17;
t59 = ((t16 - t17) * (costab2));
t33 = t0 + t1;
t50 = ((t0 - t1) * ( costab2));
t2 = _in[7] + _in[24]; t18 = ((_in[7] - _in[24]) * (costab15));
t3 = _in[8] + _in[23]; t19 = ((_in[8] - _in[23]) * (costab17));
t42 = t18 + t19;
t60 = ((t18 - t19) * (costab30));
t34 = t2 + t3;
t51 = ((t2 - t3) * ( costab30));
t4 = _in[3] + _in[28]; t20 = ((_in[3] - _in[28]) * (costab7));
t5 = _in[12] + _in[19]; t21 = ((_in[12] - _in[19]) * (costab25));
t43 = t20 + t21;
t61 = ((t20 - t21) * (costab14));
t35 = t4 + t5;
t52 = ((t4 - t5) * ( costab14));
t6 = _in[4] + _in[27]; t22 = ((_in[4] - _in[27]) * (costab9));
t7 = _in[11] + _in[20]; t23 = ((_in[11] - _in[20]) * (costab23));
t44 = t22 + t23;
t62 = ((t22 - t23) * (costab18));
t36 = t6 + t7;
t53 = ((t6 - t7) * ( costab18));
t8 = _in[1] + _in[30]; t24 = ((_in[1] - _in[30]) * (costab3));
t9 = _in[14] + _in[17]; t25 = ((_in[14] - _in[17]) * (costab29));
t45 = t24 + t25;
t63 = ((t24 - t25) * (costab6));
t37 = t8 + t9;
t54 = ((t8 - t9) * ( costab6));
t10 = _in[6] + _in[25]; t26 = ((_in[6] - _in[25]) * (costab13));
t11 = _in[9] + _in[22]; t27 = ((_in[9] - _in[22]) * (costab19));
t46 = t26 + t27;
t64 = ((t26 - t27) * (costab26));
t38 = t10 + t11;
t55 = ((t10 - t11) * (costab26));
t12 = _in[2] + _in[29]; t28 = ((_in[2] - _in[29]) * (costab5));
t13 = _in[13] + _in[18]; t29 = ((_in[13] - _in[18]) * (costab27));
t47 = t28 + t29;
t65 = ((t28 - t29) * (costab10));
t39 = t12 + t13;
t56 = ((t12 - t13) * (costab10));
t14 = _in[5] + _in[26]; t30 = ((_in[5] - _in[26]) * (costab11));
t15 = _in[10] + _in[21]; t31 = ((_in[10] - _in[21]) * (costab21));
t48 = t30 + t31;
t66 = ((t30 - t31) * (costab22));
t40 = t14 + t15;
t57 = ((t14 - t15) * (costab22));
t69 = t33 + t34; t89 = ((t33 - t34) * (costab4));
t70 = t35 + t36; t90 = ((t35 - t36) * (costab28));
t71 = t37 + t38; t91 = ((t37 - t38) * (costab12));
t72 = t39 + t40; t92 = ((t39 - t40) * (costab20));
t73 = t41 + t42; t94 = ((t41 - t42) * (costab4));
t74 = t43 + t44; t95 = ((t43 - t44) * (costab28));
t75 = t45 + t46; t96 = ((t45 - t46) * (costab12));
t76 = t47 + t48; t97 = ((t47 - t48) * (costab20));
t78 = t50 + t51; t100 = ((t50 - t51) * (costab4));
t79 = t52 + t53; t101 = ((t52 - t53) * (costab28));
t80 = t54 + t55; t102 = ((t54 - t55) * (costab12));
t81 = t56 + t57; t103 = ((t56 - t57) * (costab20));
t83 = t59 + t60; t106 = ((t59 - t60) * (costab4));
t84 = t61 + t62; t107 = ((t61 - t62) * (costab28));
t85 = t63 + t64; t108 = ((t63 - t64) * (costab12));
t86 = t65 + t66; t109 = ((t65 - t66) * (costab20));
t113 = t69 + t70;
t114 = t71 + t72;
/* 0 */ hi[15][slot] = t113 + t114;
/* 16 */ lo[ 0][slot] = ((t113 - t114) * (costab16));
t115 = t73 + t74;
t116 = t75 + t76;
t32 = t115 + t116;
/* 1 */ hi[14][slot] = t32;
t118 = t78 + t79;
t119 = t80 + t81;
t58 = t118 + t119;
/* 2 */ hi[13][slot] = t58;
t121 = t83 + t84;
t122 = t85 + t86;
t67 = t121 + t122;
t49 = (t67 * 2) - t32;
/* 3 */ hi[12][slot] = t49;
t125 = t89 + t90;
t126 = t91 + t92;
t93 = t125 + t126;
/* 4 */ hi[11][slot] = t93;
t128 = t94 + t95;
t129 = t96 + t97;
t98 = t128 + t129;
t68 = (t98 * 2) - t49;
/* 5 */ hi[10][slot] = t68;
t132 = t100 + t101;
t133 = t102 + t103;
t104 = t132 + t133;
t82 = (t104 * 2) - t58;
/* 6 */ hi[ 9][slot] = t82;
t136 = t106 + t107;
t137 = t108 + t109;
t110 = t136 + t137;
t87 = (t110 * 2) - t67;
t77 = (t87 * 2) - t68;
/* 7 */ hi[ 8][slot] = t77;
t141 = ((t69 - t70) * (costab8));
t142 = ((t71 - t72) * (costab24));
t143 = t141 + t142;
/* 8 */ hi[ 7][slot] = t143;
/* 24 */ lo[ 8][slot] =
(((t141 - t142) * (costab16) * 2)) - t143;
t144 = ((t73 - t74) * (costab8));
t145 = ((t75 - t76) * (costab24));
t146 = t144 + t145;
t88 = (t146 * 2) - t77;
/* 9 */ hi[ 6][slot] = t88;
t148 = ((t78 - t79) * (costab8));
t149 = ((t80 - t81) * (costab24));
t150 = t148 + t149;
t105 = (t150 * 2) - t82;
/* 10 */ hi[ 5][slot] = t105;
t152 = ((t83 - t84) * (costab8));
t153 = ((t85 - t86) * (costab24));
t154 = t152 + t153;
t111 = (t154 * 2) - t87;
t99 = (t111 * 2) - t88;
/* 11 */ hi[ 4][slot] = t99;
t157 = ((t89 - t90) * (costab8));
t158 = ((t91 - t92) * (costab24));
t159 = t157 + t158;
t127 = (t159 * 2) - t93;
/* 12 */ hi[ 3][slot] = t127;
t160 = (((t125 - t126) * (costab16) * 2)) - t127;
/* 20 */ lo[ 4][slot] = t160;
/* 28 */ lo[12][slot] =
(((((t157 - t158) * (costab16) * 2) - t159) * 2)) - t160;
t161 = ((t94 - t95) * (costab8));
t162 = ((t96 - t97) * (costab24));
t163 = t161 + t162;
t130 = (t163 * 2) - t98;
t112 = (t130 * 2) - t99;
/* 13 */ hi[ 2][slot] = t112;
t164 = (((t128 - t129) * (costab16) * 2)) - t130;
t166 = ((t100 - t101) * (costab8));
t167 = ((t102 - t103) * (costab24));
t168 = t166 + t167;
t134 = (t168 * 2) - t104;
t120 = (t134 * 2) - t105;
/* 14 */ hi[ 1][slot] = t120;
t135 = (((t118 - t119) * (costab16) * 2)) - t120;
/* 18 */ lo[ 2][slot] = t135;
t169 = (((t132 - t133) * (costab16) * 2)) - t134;
t151 = (t169 * 2) - t135;
/* 22 */ lo[ 6][slot] = t151;
t170 = (((((t148 - t149) * (costab16) * 2) - t150) * 2)) - t151;
/* 26 */ lo[10][slot] = t170;
/* 30 */ lo[14][slot] =
(((((((t166 - t167) * (costab16)) * 2 -
t168) * 2) - t169) * 2) - t170);
t171 = ((t106 - t107) * (costab8));
t172 = ((t108 - t109) * (costab24));
t173 = t171 + t172;
t138 = (t173 * 2) - t110;
t123 = (t138 * 2) - t111;
t139 = (((t121 - t122) * (costab16) * 2)) - t123;
t117 = (t123 * 2) - t112;
/* 15 */ hi[ 0][slot] = t117;
t124 = (((t115 - t116) * (costab16) * 2)) - t117;
/* 17 */ lo[ 1][slot] = t124;
t131 = (t139 * 2) - t124;
/* 19 */ lo[ 3][slot] = t131;
t140 = (t164 * 2) - t131;
/* 21 */ lo[ 5][slot] = t140;
t174 = (((t136 - t137) * (costab16) * 2)) - t138;
t155 = (t174 * 2) - t139;
t147 = (t155 * 2) - t140;
/* 23 */ lo[ 7][slot] = t147;
t156 = (((((t144 - t145) * (costab16) * 2) - t146) * 2)) - t147;
/* 25 */ lo[ 9][slot] = t156;
t175 = (((((t152 - t153) * (costab16) * 2) - t154) * 2)) - t155;
t165 = (t175 * 2) - t156;
/* 27 */ lo[11][slot] = t165;
t176 = (((((((t161 - t162) * (costab16) * 2)) -
t163) * 2) - t164) * 2) - t165;
/* 29 */ lo[13][slot] = t176;
/* 31 */ lo[15][slot] =
(((((((((t171 - t172) * (costab16)) * 2 -
t173) * 2) - t174) * 2) - t175) * 2) - t176);
/*
* Totals:
* 80 multiplies
* 80 additions
* 119 subtractions
* 49 shifts (not counting SSO)
*/
};
/*
* These are the coefficients for the subband synthesis window. This is a
* reordered version of Table B.3 from ISO/IEC 11172-3.
*/
const D = [
[ 0.000000000, /* 0 */
-0.000442505,
0.003250122,
-0.007003784,
0.031082153,
-0.078628540,
0.100311279,
-0.572036743,
1.144989014,
0.572036743,
0.100311279,
0.078628540,
0.031082153,
0.007003784,
0.003250122,
0.000442505,
0.000000000,
-0.000442505,
0.003250122,
-0.007003784,
0.031082153,
-0.078628540,
0.100311279,
-0.572036743,
1.144989014,
0.572036743,
0.100311279,
0.078628540,
0.031082153,
0.007003784,
0.003250122,
0.000442505 ],
[ -0.000015259, /* 1 */
-0.000473022,
0.003326416,
-0.007919312,
0.030517578,
-0.084182739,
0.090927124,
-0.600219727,
1.144287109,
0.543823242,
0.108856201,
0.073059082,
0.031478882,
0.006118774,
0.003173828,
0.000396729,
-0.000015259,
-0.000473022,
0.003326416,
-0.007919312,
0.030517578,
-0.084182739,
0.090927124,
-0.600219727,
1.144287109,
0.543823242,
0.108856201,
0.073059082,
0.031478882,
0.006118774,
0.003173828,
0.000396729 ],
[ -0.000015259, /* 2 */
-0.000534058,
0.003387451,
-0.008865356,
0.029785156,
-0.089706421,
0.080688477,
-0.628295898,
1.142211914,
0.515609741,
0.116577148,
0.067520142,
0.031738281,
0.005294800,
0.003082275,
0.000366211,
-0.000015259,
-0.000534058,
0.003387451,
-0.008865356,
0.029785156,
-0.089706421,
0.080688477,
-0.628295898,
1.142211914,
0.515609741,
0.116577148,
0.067520142,
0.031738281,
0.005294800,
0.003082275,
0.000366211 ],
[ -0.000015259, /* 3 */
-0.000579834,
0.003433228,
-0.009841919,
0.028884888,
-0.095169067,
0.069595337,
-0.656219482,
1.138763428,
0.487472534,
0.123474121,
0.061996460,
0.031845093,
0.004486084,
0.002990723,
0.000320435,
-0.000015259,
-0.000579834,
0.003433228,
-0.009841919,
0.028884888,
-0.095169067,
0.069595337,
-0.656219482,
1.138763428,
0.487472534,
0.123474121,
0.061996460,
0.031845093,
0.004486084,
0.002990723,
0.000320435 ],
[ -0.000015259, /* 4 */
-0.000625610,
0.003463745,
-0.010848999,
0.027801514,
-0.100540161,
0.057617187,
-0.683914185,
1.133926392,
0.459472656,
0.129577637,
0.056533813,
0.031814575,
0.003723145,
0.002899170,
0.000289917,
-0.000015259,
-0.000625610,
0.003463745,
-0.010848999,
0.027801514,
-0.100540161,
0.057617187,
-0.683914185,
1.133926392,
0.459472656,
0.129577637,
0.056533813,
0.031814575,
0.003723145,
0.002899170,
0.000289917 ],
[ -0.000015259, /* 5 */
-0.000686646,
0.003479004,
-0.011886597,
0.026535034,
-0.105819702,
0.044784546,
-0.711318970,
1.127746582,
0.431655884,
0.134887695,
0.051132202,
0.031661987,
0.003005981,
0.002792358,
0.000259399,
-0.000015259,
-0.000686646,
0.003479004,
-0.011886597,
0.026535034,
-0.105819702,
0.044784546,
-0.711318970,
1.127746582,
0.431655884,
0.134887695,
0.051132202,
0.031661987,
0.003005981,
0.002792358,
0.000259399 ],
[ -0.000015259, /* 6 */
-0.000747681,
0.003479004,
-0.012939453,
0.025085449,
-0.110946655,
0.031082153,
-0.738372803,
1.120223999,
0.404083252,
0.139450073,
0.045837402,
0.031387329,
0.002334595,
0.002685547,
0.000244141,
-0.000015259,
-0.000747681,
0.003479004,
-0.012939453,
0.025085449,
-0.110946655,
0.031082153,
-0.738372803,
1.120223999,
0.404083252,
0.139450073,
0.045837402,
0.031387329,
0.002334595,
0.002685547,
0.000244141 ],
[ -0.000030518, /* 7 */
-0.000808716,
0.003463745,
-0.014022827,
0.023422241,
-0.115921021,
0.016510010,
-0.765029907,
1.111373901,
0.376800537,
0.143264771,
0.040634155,
0.031005859,
0.001693726,
0.002578735,
0.000213623,
-0.000030518,
-0.000808716,
0.003463745,
-0.014022827,
0.023422241,
-0.115921021,
0.016510010,
-0.765029907,
1.111373901,
0.376800537,
0.143264771,
0.040634155,
0.031005859,
0.001693726,
0.002578735,
0.000213623 ],
[ -0.000030518, /* 8 */
-0.000885010,
0.003417969,
-0.015121460,
0.021575928,
-0.120697021,
0.001068115,
-0.791213989,
1.101211548,
0.349868774,
0.146362305,
0.035552979,
0.030532837,
0.001098633,
0.002456665,
0.000198364,
-0.000030518,
-0.000885010,
0.003417969,
-0.015121460,
0.021575928,
-0.120697021,
0.001068115,
-0.791213989,
1.101211548,
0.349868774,
0.146362305,
0.035552979,
0.030532837,
0.001098633,
0.002456665,
0.000198364 ],
[ -0.000030518, /* 9 */
-0.000961304,
0.003372192,
-0.016235352,
0.019531250,
-0.125259399,
-0.015228271,
-0.816864014,
1.089782715,
0.323318481,
0.148773193,
0.030609131,
0.029937744,
0.000549316,
0.002349854,
0.000167847,
-0.000030518,
-0.000961304,
0.003372192,
-0.016235352,
0.019531250,
-0.125259399,
-0.015228271,
-0.816864014,
1.089782715,
0.323318481,
0.148773193,
0.030609131,
0.029937744,
0.000549316,
0.002349854,
0.000167847 ],
[ -0.000030518, /* 10 */
-0.001037598,
0.003280640,
-0.017349243,
0.017257690,
-0.129562378,
-0.032379150,
-0.841949463,
1.077117920,
0.297210693,
0.150497437,
0.025817871,
0.029281616,
0.000030518,
0.002243042,
0.000152588,
-0.000030518,
-0.001037598,
0.003280640,
-0.017349243,
0.017257690,
-0.129562378,
-0.032379150,
-0.841949463,
1.077117920,
0.297210693,
0.150497437,
0.025817871,
0.029281616,
0.000030518,
0.002243042,
0.000152588 ],
[ -0.000045776, /* 11 */
-0.001113892,
0.003173828,
-0.018463135,
0.014801025,
-0.133590698,
-0.050354004,
-0.866363525,
1.063217163,
0.271591187,
0.151596069,
0.021179199,
0.028533936,
-0.000442505,
0.002120972,
0.000137329,
-0.000045776,
-0.001113892,
0.003173828,
-0.018463135,
0.014801025,
-0.133590698,
-0.050354004,
-0.866363525,
1.063217163,
0.271591187,
0.151596069,
0.021179199,
0.028533936,
-0.000442505,
0.002120972,
0.000137329 ],
[ -0.000045776, /* 12 */
-0.001205444,
0.003051758,
-0.019577026,
0.012115479,
-0.137298584,
-0.069168091,
-0.890090942,
1.048156738,
0.246505737,
0.152069092,
0.016708374,
0.027725220,
-0.000869751,
0.002014160,
0.000122070,
-0.000045776,
-0.001205444,
0.003051758,
-0.019577026,
0.012115479,
-0.137298584,
-0.069168091,
-0.890090942,
1.048156738,
0.246505737,
0.152069092,
0.016708374,
0.027725220,
-0.000869751,
0.002014160,
0.000122070 ],
[ -0.000061035, /* 13 */
-0.001296997,
0.002883911,
-0.020690918,
0.009231567,
-0.140670776,
-0.088775635,
-0.913055420,
1.031936646,
0.221984863,
0.151962280,
0.012420654,
0.026840210,
-0.001266479,
0.001907349,
0.000106812,
-0.000061035,
-0.001296997,
0.002883911,
-0.020690918,
0.009231567,
-0.140670776,
-0.088775635,
-0.913055420,
1.031936646,
0.221984863,
0.151962280,
0.012420654,
0.026840210,
-0.001266479,
0.001907349,
0.000106812 ],
[ -0.000061035, /* 14 */
-0.001388550,
0.002700806,
-0.021789551,
0.006134033,
-0.143676758,
-0.109161377,
-0.935195923,
1.014617920,
0.198059082,
0.151306152,
0.008316040,
0.025909424,
-0.001617432,
0.001785278,
0.000106812,
-0.000061035,
-0.001388550,
0.002700806,
-0.021789551,
0.006134033,
-0.143676758,
-0.109161377,
-0.935195923,
1.014617920,
0.198059082,
0.151306152,
0.008316040,
0.025909424,
-0.001617432,
0.001785278,
0.000106812 ],
[ -0.000076294, /* 15 */
-0.001480103,
0.002487183,
-0.022857666,
0.002822876,
-0.146255493,
-0.130310059,
-0.956481934,
0.996246338,
0.174789429,
0.150115967,
0.004394531,
0.024932861,
-0.001937866,
0.001693726,
0.000091553,
-0.000076294,
-0.001480103,
0.002487183,
-0.022857666,
0.002822876,
-0.146255493,
-0.130310059,
-0.956481934,
0.996246338,
0.174789429,
0.150115967,
0.004394531,
0.024932861,
-0.001937866,
0.001693726,
0.000091553 ],
[ -0.000076294, /* 16 */
-0.001586914,
0.002227783,
-0.023910522,
-0.000686646,
-0.148422241,
-0.152206421,
-0.976852417,
0.976852417,
0.152206421,
0.148422241,
0.000686646,
0.023910522,
-0.002227783,
0.001586914,
0.000076294,
-0.000076294,
-0.001586914,
0.002227783,
-0.023910522,
-0.000686646,
-0.148422241,
-0.152206421,
-0.976852417,
0.976852417,
0.152206421,
0.148422241,
0.000686646,
0.023910522,
-0.002227783,
0.001586914,
0.000076294 ]
];
/*
* perform full frequency PCM synthesis
*/
MP3Synth.prototype.full = function(frame, nch, ns) {
var Dptr, hi, lo, ptr;
for (var ch = 0; ch < nch; ++ch) {
var sbsample = frame.sbsample[ch];
var filter = this.filter[ch];
var phase = this.phase;
var pcm = this.pcm.samples[ch];
var pcm1Ptr = 0;
var pcm2Ptr = 0;
for (var s = 0; s < ns; ++s) {
MP3Synth.dct32(sbsample[s], phase >> 1, filter[0][phase & 1], filter[1][phase & 1]);
var pe = phase & ~1;
var po = ((phase - 1) & 0xf) | 1;
/* calculate 32 samples */
var fe = filter[0][ phase & 1];
var fx = filter[0][~phase & 1];
var fo = filter[1][~phase & 1];
var fePtr = 0;
var fxPtr = 0;
var foPtr = 0;
Dptr = 0;
ptr = D[Dptr];
_fx = fx[fxPtr];
_fe = fe[fePtr];
lo = _fx[0] * ptr[po + 0];
lo += _fx[1] * ptr[po + 14];
lo += _fx[2] * ptr[po + 12];
lo += _fx[3] * ptr[po + 10];
lo += _fx[4] * ptr[po + 8];
lo += _fx[5] * ptr[po + 6];
lo += _fx[6] * ptr[po + 4];
lo += _fx[7] * ptr[po + 2];
lo = -lo;
lo += _fe[0] * ptr[pe + 0];
lo += _fe[1] * ptr[pe + 14];
lo += _fe[2] * ptr[pe + 12];
lo += _fe[3] * ptr[pe + 10];
lo += _fe[4] * ptr[pe + 8];
lo += _fe[5] * ptr[pe + 6];
lo += _fe[6] * ptr[pe + 4];
lo += _fe[7] * ptr[pe + 2];
pcm[pcm1Ptr++] = lo;
pcm2Ptr = pcm1Ptr + 30;
for (var sb = 1; sb < 16; ++sb) {
++fePtr;
++Dptr;
/* D[32 - sb][i] === -D[sb][31 - i] */
ptr = D[Dptr];
_fo = fo[foPtr];
_fe = fe[fePtr];
lo = _fo[0] * ptr[po + 0];
lo += _fo[1] * ptr[po + 14];
lo += _fo[2] * ptr[po + 12];
lo += _fo[3] * ptr[po + 10];
lo += _fo[4] * ptr[po + 8];
lo += _fo[5] * ptr[po + 6];
lo += _fo[6] * ptr[po + 4];
lo += _fo[7] * ptr[po + 2];
lo = -lo;
lo += _fe[7] * ptr[pe + 2];
lo += _fe[6] * ptr[pe + 4];
lo += _fe[5] * ptr[pe + 6];
lo += _fe[4] * ptr[pe + 8];
lo += _fe[3] * ptr[pe + 10];
lo += _fe[2] * ptr[pe + 12];
lo += _fe[1] * ptr[pe + 14];
lo += _fe[0] * ptr[pe + 0];
pcm[pcm1Ptr++] = lo;
lo = _fe[0] * ptr[-pe + 31 - 16];
lo += _fe[1] * ptr[-pe + 31 - 14];
lo += _fe[2] * ptr[-pe + 31 - 12];
lo += _fe[3] * ptr[-pe + 31 - 10];
lo += _fe[4] * ptr[-pe + 31 - 8];
lo += _fe[5] * ptr[-pe + 31 - 6];
lo += _fe[6] * ptr[-pe + 31 - 4];
lo += _fe[7] * ptr[-pe + 31 - 2];
lo += _fo[7] * ptr[-po + 31 - 2];
lo += _fo[6] * ptr[-po + 31 - 4];
lo += _fo[5] * ptr[-po + 31 - 6];
lo += _fo[4] * ptr[-po + 31 - 8];
lo += _fo[3] * ptr[-po + 31 - 10];
lo += _fo[2] * ptr[-po + 31 - 12];
lo += _fo[1] * ptr[-po + 31 - 14];
lo += _fo[0] * ptr[-po + 31 - 16];
pcm[pcm2Ptr--] = lo;
++foPtr;
}
++Dptr;
ptr = D[Dptr];
_fo = fo[foPtr];
lo = _fo[0] * ptr[po + 0];
lo += _fo[1] * ptr[po + 14];
lo += _fo[2] * ptr[po + 12];
lo += _fo[3] * ptr[po + 10];
lo += _fo[4] * ptr[po + 8];
lo += _fo[5] * ptr[po + 6];
lo += _fo[6] * ptr[po + 4];
lo += _fo[7] * ptr[po + 2];
pcm[pcm1Ptr] = -lo;
pcm1Ptr += 16;
phase = (phase + 1) % 16;
}
}
};
// TODO: synth.half()
/*
* NAME: synth.frame()
* DESCRIPTION: perform PCM synthesis of frame subband samples
*/
MP3Synth.prototype.frame = function (frame) {
var nch = frame.header.nchannels();
var ns = frame.header.nbsamples();
this.pcm.samplerate = frame.header.samplerate;
this.pcm.channels = nch;
this.pcm.length = 32 * ns;
/*
if (frame.options & Mad.Option.HALFSAMPLERATE) {
this.pcm.samplerate /= 2;
this.pcm.length /= 2;
throw new Error("HALFSAMPLERATE is not supported. What do you think? As if I have the time for this");
}
*/
this.full(frame, nch, ns);
this.phase = (this.phase + ns) % 16;
};
module.exports = MP3Synth;