home *** CD-ROM | disk | FTP | other *** search
/ The Best of Windows 95.com 1996 September / WIN95_09964.iso / sound / mpw32-5s.zip / SYNFILT.CPP < prev    next >
C/C++ Source or Header  |  1996-07-18  |  37KB  |  1,055 lines

  1. /*
  2.  *  @(#) synthesis_filter.cc 1.14, last edit: 6/21/94 11:22:20
  3.  *  @(#) Copyright (C) 1993, 1994 Tobias Bading (bading@cs.tu-berlin.de)
  4.  *  @(#) Berlin University of Technology
  5.  *
  6.  *  This program is free software; you can redistribute it and/or modify
  7.  *  it under the terms of the GNU General Public License as published by
  8.  *  the Free Software Foundation; either version 2 of the License, or
  9.  *  (at your option) any later version.
  10.  *
  11.  *  This program is distributed in the hope that it will be useful,
  12.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.  *  GNU General Public License for more details.
  15.  *
  16.  *  You should have received a copy of the GNU General Public License
  17.  *  along with this program; if not, write to the Free Software
  18.  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  19.  */
  20.  
  21. /*
  22.  *  Changes from version 1.1 to 1.2:
  23.  *    - compute_new_v() uses a 32 point fast cosine transform as described by
  24.  *      Byeong Gi Lee in IEEE Transactions ASSP-32 Part 2, August 1984,
  25.  *      "A New Algorithm to Compute the Discrete Cosine Transform"
  26.  *      instead of the matrix-vector multiplication in V1.1
  27.  *    - loop unrolling done in compute_pcm_samples()
  28.  *    - if ULAW is defined, the synthesis filter does a downsampling
  29.  *      to 8 kHz by dropping samples and ignoring subbands above 4 kHz
  30.  */
  31.  
  32. #define STRICT
  33. #define WIN32_LEAN_AND_MEAN
  34. #define NOMCX
  35. #define NOIME
  36. #define NOGDI
  37. #define NOUSER
  38. #define NOSOUND
  39. #define NOCOMM
  40. #define NODRIVERS
  41. #define OEMRESOURCE
  42. #define NONLS
  43. #define NOSERVICE
  44. #define NOKANJI
  45. #define NOMINMAX
  46. #define NOLOGERROR
  47. #define NOPROFILER
  48. #define NOMEMMGR
  49. #define NOLFILEIO
  50. #define NOOPENFILE
  51. #define NORESOURCE
  52. #define NOATOM
  53. #define NOLANGUAGE
  54. #define NOLSTRING
  55. #define NODBCS
  56. #define NOKEYBOARDINFO
  57. #define NOGDICAPMASKS
  58. #define NOCOLOR
  59. #define NOGDIOBJ
  60. #define NODRAWTEXT
  61. #define NOTEXTMETRIC
  62. #define NOSCALABLEFONT
  63. #define NOBITMAP
  64. #define NORASTEROPS
  65. #define NOMETAFILE
  66. #define NOSYSMETRICS
  67. #define NOSYSTEMPARAMSINFO
  68. #define NOMSG
  69. #define NOWINSTYLES
  70. #define NOWINOFFSETS
  71. #define NOSHOWWINDOW
  72. #define NODEFERWINDOWPOS
  73. #define NOVIRTUALKEYCODES
  74. #define NOKEYSTATES
  75. #define NOWH
  76. #define NOMENUS
  77. #define NOSCROLL
  78. #define NOCLIPBOARD
  79. #define NOICONS
  80. #define NOMB
  81. #define NOSYSCOMMANDS
  82. #define NOMDI
  83. #define NOCTLMGR
  84. #define NOWINMESSAGES
  85. #define NOHELP
  86. #define _WINUSER_
  87. #define __oleidl_h__
  88. #define _OLE2_H_
  89. #include <windows.h>
  90.  
  91. #include <math.h>
  92. #include "all.h"
  93. #include "synfilt.h"
  94.  
  95. static const real MY_PI = 3.14159265358979323846;
  96.  
  97. static const real cos1_64  = 1.0 / (2.0 * cos(MY_PI        / 64.0));
  98. static const real cos3_64  = 1.0 / (2.0 * cos(MY_PI * 3.0  / 64.0));
  99. static const real cos5_64  = 1.0 / (2.0 * cos(MY_PI * 5.0  / 64.0));
  100. static const real cos7_64  = 1.0 / (2.0 * cos(MY_PI * 7.0  / 64.0));
  101. static const real cos9_64  = 1.0 / (2.0 * cos(MY_PI * 9.0  / 64.0));
  102. static const real cos11_64 = 1.0 / (2.0 * cos(MY_PI * 11.0 / 64.0));
  103. static const real cos13_64 = 1.0 / (2.0 * cos(MY_PI * 13.0 / 64.0));
  104. static const real cos15_64 = 1.0 / (2.0 * cos(MY_PI * 15.0 / 64.0));
  105. static const real cos17_64 = 1.0 / (2.0 * cos(MY_PI * 17.0 / 64.0));
  106. static const real cos19_64 = 1.0 / (2.0 * cos(MY_PI * 19.0 / 64.0));
  107. static const real cos21_64 = 1.0 / (2.0 * cos(MY_PI * 21.0 / 64.0));
  108. static const real cos23_64 = 1.0 / (2.0 * cos(MY_PI * 23.0 / 64.0));
  109. static const real cos25_64 = 1.0 / (2.0 * cos(MY_PI * 25.0 / 64.0));
  110. static const real cos27_64 = 1.0 / (2.0 * cos(MY_PI * 27.0 / 64.0));
  111. static const real cos29_64 = 1.0 / (2.0 * cos(MY_PI * 29.0 / 64.0));
  112. static const real cos31_64 = 1.0 / (2.0 * cos(MY_PI * 31.0 / 64.0));
  113. static const real cos1_32  = 1.0 / (2.0 * cos(MY_PI        / 32.0));
  114. static const real cos3_32  = 1.0 / (2.0 * cos(MY_PI * 3.0  / 32.0));
  115. static const real cos5_32  = 1.0 / (2.0 * cos(MY_PI * 5.0  / 32.0));
  116. static const real cos7_32  = 1.0 / (2.0 * cos(MY_PI * 7.0  / 32.0));
  117. static const real cos9_32  = 1.0 / (2.0 * cos(MY_PI * 9.0  / 32.0));
  118. static const real cos11_32 = 1.0 / (2.0 * cos(MY_PI * 11.0 / 32.0));
  119. static const real cos13_32 = 1.0 / (2.0 * cos(MY_PI * 13.0 / 32.0));
  120. static const real cos15_32 = 1.0 / (2.0 * cos(MY_PI * 15.0 / 32.0));
  121. static const real cos1_16  = 1.0 / (2.0 * cos(MY_PI        / 16.0));
  122. static const real cos3_16  = 1.0 / (2.0 * cos(MY_PI * 3.0  / 16.0));
  123. static const real cos5_16  = 1.0 / (2.0 * cos(MY_PI * 5.0  / 16.0));
  124. static const real cos7_16  = 1.0 / (2.0 * cos(MY_PI * 7.0  / 16.0));
  125. static const real cos1_8   = 1.0 / (2.0 * cos(MY_PI        / 8.0));
  126. static const real cos3_8   = 1.0 / (2.0 * cos(MY_PI * 3.0  / 8.0));
  127. static const real cos1_4   = 1.0 / (2.0 * cos(MY_PI / 4.0));
  128.  
  129.  
  130. const real SynthesisFilter::d[512] = {
  131.   // Note: These values are not in the same order
  132.   // as in Annex 3-B.3 of the ISO/IEC DIS 11172-3
  133.    0.000000000, -0.000442505,  0.003250122, -0.007003784,
  134.    0.031082153, -0.078628540,  0.100311279, -0.572036743,
  135.    1.144989014,  0.572036743,  0.100311279,  0.078628540,
  136.     0.031082153,  0.007003784,  0.003250122,  0.000442505,
  137.   -0.000015259, -0.000473022,  0.003326416, -0.007919312,
  138.    0.030517578, -0.084182739,  0.090927124, -0.600219727,
  139.    1.144287109,  0.543823242,  0.108856201,  0.073059082,
  140.    0.031478882,  0.006118774,  0.003173828,  0.000396729,
  141.   -0.000015259, -0.000534058,  0.003387451, -0.008865356,
  142.     0.029785156, -0.089706421,  0.080688477, -0.628295898,
  143.    1.142211914,  0.515609741,  0.116577148,  0.067520142,
  144.    0.031738281,  0.005294800,  0.003082275,  0.000366211,
  145.   -0.000015259, -0.000579834,  0.003433228, -0.009841919,
  146.    0.028884888, -0.095169067,  0.069595337, -0.656219482,
  147.     1.138763428,  0.487472534,  0.123474121,  0.061996460,
  148.    0.031845093,  0.004486084,  0.002990723,  0.000320435,
  149.   -0.000015259, -0.000625610,  0.003463745, -0.010848999,
  150.    0.027801514, -0.100540161,  0.057617188, -0.683914185,
  151.    1.133926392,  0.459472656,  0.129577637,  0.056533813,
  152.     0.031814575,  0.003723145,  0.002899170,  0.000289917,
  153.   -0.000015259, -0.000686646,  0.003479004, -0.011886597,
  154.     0.026535034, -0.105819702,  0.044784546, -0.711318970,
  155.    1.127746582,  0.431655884,  0.134887695,  0.051132202,
  156.    0.031661987,  0.003005981,  0.002792358,  0.000259399,
  157.   -0.000015259, -0.000747681,  0.003479004, -0.012939453,
  158.     0.025085449, -0.110946655,  0.031082153, -0.738372803,
  159.    1.120223999,  0.404083252,  0.139450073,  0.045837402,
  160.    0.031387329,  0.002334595,  0.002685547,  0.000244141,
  161.   -0.000030518, -0.000808716,  0.003463745, -0.014022827,
  162.    0.023422241, -0.115921021,  0.016510010, -0.765029907,
  163.     1.111373901,  0.376800537,  0.143264771,  0.040634155,
  164.    0.031005859,  0.001693726,  0.002578735,  0.000213623,
  165.   -0.000030518, -0.000885010,  0.003417969, -0.015121460,
  166.     0.021575928, -0.120697021,  0.001068115, -0.791213989,
  167.    1.101211548,  0.349868774,  0.146362305,  0.035552979,
  168.     0.030532837,  0.001098633,  0.002456665,  0.000198364,
  169.   -0.000030518, -0.000961304,  0.003372192, -0.016235352,
  170.    0.019531250, -0.125259399, -0.015228271, -0.816864014,
  171.    1.089782715,  0.323318481,  0.148773193,  0.030609131,
  172.    0.029937744,  0.000549316,  0.002349854,  0.000167847,
  173.   -0.000030518, -0.001037598,  0.003280640, -0.017349243,
  174.     0.017257690, -0.129562378, -0.032379150, -0.841949463,
  175.    1.077117920,  0.297210693,  0.150497437,  0.025817871,
  176.    0.029281616,  0.000030518,  0.002243042,  0.000152588,
  177.   -0.000045776, -0.001113892,  0.003173828, -0.018463135,
  178.     0.014801025, -0.133590698, -0.050354004, -0.866363525,
  179.     1.063217163,  0.271591187,  0.151596069,  0.021179199,
  180.    0.028533936, -0.000442505,  0.002120972,  0.000137329,
  181.   -0.000045776, -0.001205444,  0.003051758, -0.019577026,
  182.    0.012115479, -0.137298584, -0.069168091, -0.890090942,
  183.    1.048156738,  0.246505737,  0.152069092,  0.016708374,
  184.     0.027725220, -0.000869751,  0.002014160,  0.000122070,
  185.   -0.000061035, -0.001296997,  0.002883911, -0.020690918,
  186.    0.009231567, -0.140670776, -0.088775635, -0.913055420,
  187.    1.031936646,  0.221984863,  0.151962280,  0.012420654,
  188.    0.026840210, -0.001266479,  0.001907349,  0.000106812,
  189.   -0.000061035, -0.001388550,  0.002700806, -0.021789551,
  190.     0.006134033, -0.143676758, -0.109161377, -0.935195923,
  191.    1.014617920,  0.198059082,  0.151306152,  0.008316040,
  192.    0.025909424, -0.001617432,  0.001785278,  0.000106812,
  193.   -0.000076294, -0.001480103,  0.002487183, -0.022857666,
  194.    0.002822876, -0.146255493, -0.130310059, -0.956481934,
  195.     0.996246338,  0.174789429,  0.150115967,  0.004394531,
  196.    0.024932861, -0.001937866,  0.001693726,  0.000091553,
  197.   -0.000076294, -0.001586914,  0.002227783, -0.023910522,
  198.   -0.000686646, -0.148422241, -0.152206421, -0.976852417,
  199.    0.976852417,  0.152206421,  0.148422241,  0.000686646,
  200.     0.023910522, -0.002227783,  0.001586914,  0.000076294,
  201.   -0.000091553, -0.001693726,  0.001937866, -0.024932861,
  202.   -0.004394531, -0.150115967, -0.174789429, -0.996246338,
  203.    0.956481934,  0.130310059,  0.146255493, -0.002822876,
  204.    0.022857666, -0.002487183,  0.001480103,  0.000076294,
  205.   -0.000106812, -0.001785278,  0.001617432, -0.025909424,
  206.   -0.008316040, -0.151306152, -0.198059082, -1.014617920,
  207.    0.935195923,  0.109161377,  0.143676758, -0.006134033,
  208.    0.021789551, -0.002700806,  0.001388550,  0.000061035,
  209.   -0.000106812, -0.001907349,  0.001266479, -0.026840210,
  210.   -0.012420654, -0.151962280, -0.221984863, -1.031936646,
  211.     0.913055420,  0.088775635,  0.140670776, -0.009231567,
  212.    0.020690918, -0.002883911,  0.001296997,  0.000061035,
  213.   -0.000122070, -0.002014160,  0.000869751, -0.027725220,
  214.   -0.016708374, -0.152069092, -0.246505737, -1.048156738,
  215.    0.890090942,  0.069168091,  0.137298584, -0.012115479,
  216.     0.019577026, -0.003051758,  0.001205444,  0.000045776,
  217.   -0.000137329, -0.002120972,  0.000442505, -0.028533936,
  218.   -0.021179199, -0.151596069, -0.271591187, -1.063217163,
  219.    0.866363525,  0.050354004,  0.133590698, -0.014801025,
  220.    0.018463135, -0.003173828,  0.001113892,  0.000045776,
  221.   -0.000152588, -0.002243042, -0.000030518, -0.029281616,
  222.   -0.025817871, -0.150497437, -0.297210693, -1.077117920,
  223.    0.841949463,  0.032379150,  0.129562378, -0.017257690,
  224.    0.017349243, -0.003280640,  0.001037598,  0.000030518,
  225.   -0.000167847, -0.002349854, -0.000549316, -0.029937744,
  226.   -0.030609131, -0.148773193, -0.323318481, -1.089782715,
  227.     0.816864014,  0.015228271,  0.125259399, -0.019531250,
  228.    0.016235352, -0.003372192,  0.000961304,  0.000030518,
  229.   -0.000198364, -0.002456665, -0.001098633, -0.030532837,
  230.   -0.035552979, -0.146362305, -0.349868774, -1.101211548,
  231.    0.791213989, -0.001068115,  0.120697021, -0.021575928,
  232.     0.015121460, -0.003417969,  0.000885010,  0.000030518,
  233.   -0.000213623, -0.002578735, -0.001693726, -0.031005859,
  234.   -0.040634155, -0.143264771, -0.376800537, -1.111373901,
  235.    0.765029907, -0.016510010,  0.115921021, -0.023422241,
  236.    0.014022827, -0.003463745,  0.000808716,  0.000030518,
  237.   -0.000244141, -0.002685547, -0.002334595, -0.031387329,
  238.   -0.045837402, -0.139450073, -0.404083252, -1.120223999,
  239.    0.738372803, -0.031082153,  0.110946655, -0.025085449,
  240.    0.012939453, -0.003479004,  0.000747681,  0.000015259,
  241.   -0.000259399, -0.002792358, -0.003005981, -0.031661987,
  242.   -0.051132202, -0.134887695, -0.431655884, -1.127746582,
  243.     0.711318970, -0.044784546,  0.105819702, -0.026535034,
  244.    0.011886597, -0.003479004,  0.000686646,  0.000015259,
  245.   -0.000289917, -0.002899170, -0.003723145, -0.031814575,
  246.   -0.056533813, -0.129577637, -0.459472656, -1.133926392,
  247.    0.683914185, -0.057617188,  0.100540161, -0.027801514,
  248.     0.010848999, -0.003463745,  0.000625610,  0.000015259,
  249.   -0.000320435, -0.002990723, -0.004486084, -0.031845093,
  250.   -0.061996460, -0.123474121, -0.487472534, -1.138763428,
  251.     0.656219482, -0.069595337,  0.095169067, -0.028884888,
  252.     0.009841919, -0.003433228,  0.000579834,  0.000015259,
  253.   -0.000366211, -0.003082275, -0.005294800, -0.031738281,
  254.   -0.067520142, -0.116577148, -0.515609741, -1.142211914,
  255.     0.628295898, -0.080688477,  0.089706421, -0.029785156,
  256.     0.008865356, -0.003387451,  0.000534058,  0.000015259,
  257.   -0.000396729, -0.003173828, -0.006118774, -0.031478882,
  258.   -0.073059082, -0.108856201, -0.543823242, -1.144287109,
  259.     0.600219727, -0.090927124,  0.084182739, -0.030517578,
  260.     0.007919312, -0.003326416,  0.000473022,  0.000015259
  261. };
  262.  
  263. SynthesisFilter::SynthesisFilter (uint32 channelnumber, real factor)
  264. {
  265.   register real *floatp, *floatp2;
  266.  
  267.   // initialize v1[] and v2[]:
  268.   for (floatp = v1 + 512, floatp2 = v2 + 512; floatp > v1; )
  269.      *--floatp = *--floatp2 = 0.0;
  270.  
  271.   // initialize samples[]:
  272.   for (floatp = samples + 32; floatp > samples; )
  273.      *--floatp = 0.0;
  274.  
  275.   channel = channelnumber;
  276.   range_violations = written_samples = 0;
  277.   actual_v = v1;
  278.   actual_write_pos = 15;
  279.   scalefactor = factor;
  280. }
  281.  
  282.  
  283. void SynthesisFilter::compute_new_v (void)
  284. {
  285.   real new_v[32];        // new V[0-15] and V[33-48] of Figure 3-A.2 in ISO DIS 11172-3
  286.   register real *x1, *x2, tmp;
  287.   real p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15;
  288.   real pp0, pp1, pp2, pp3, pp4, pp5, pp6, pp7, pp8, pp9, pp10, pp11, pp12, pp13, pp14, pp15;
  289.  
  290.   // compute new values via a fast cosine transform:
  291.   x1 = samples;
  292.   x2 = samples + 31;
  293.   p0  = *x1++ + *x2;   p1  = *x1++ + *--x2; p2  = *x1++ + *--x2; p3  = *x1++ + *--x2;
  294.   p4  = *x1++ + *--x2; p5  = *x1++ + *--x2; p6  = *x1++ + *--x2; p7  = *x1++ + *--x2;
  295.   p8  = *x1++ + *--x2; p9  = *x1++ + *--x2; p10 = *x1++ + *--x2; p11 = *x1++ + *--x2;
  296.   p12 = *x1++ + *--x2; p13 = *x1++ + *--x2; p14 = *x1++ + *--x2; p15 = *x1   + *--x2;
  297.  
  298.   pp0  = p0 + p15; pp1 = p1 + p14; pp2 = p2 + p13; pp3 = p3 + p12;
  299.   pp4  = p4 + p11; pp5 = p5 + p10; pp6 = p6 + p9;  pp7 = p7 + p8;
  300.   pp8  = cos1_32  * (p0 - p15);
  301.   pp9  = cos3_32  * (p1 - p14);
  302.   pp10 = cos5_32  * (p2 - p13);
  303.   pp11 = cos7_32  * (p3 - p12);
  304.   pp12 = cos9_32  * (p4 - p11);
  305.   pp13 = cos11_32 * (p5 - p10);
  306.   pp14 = cos13_32 * (p6 - p9);
  307.   pp15 = cos15_32 * (p7 - p8);
  308.  
  309.   p0  = pp0 + pp7; p1 = pp1 + pp6; p2 = pp2 + pp5; p3 = pp3 + pp4;
  310.   p4  = cos1_16 * (pp0 - pp7);
  311.   p5  = cos3_16 * (pp1 - pp6);
  312.   p6  = cos5_16 * (pp2 - pp5);
  313.   p7  = cos7_16 * (pp3 - pp4);
  314.   p8  = pp8 + pp15; p9 = pp9 + pp14; p10 = pp10 + pp13; p11 = pp11 + pp12;
  315.   p12 = cos1_16 * (pp8  - pp15);
  316.   p13 = cos3_16 * (pp9  - pp14);
  317.   p14 = cos5_16 * (pp10 - pp13);
  318.   p15 = cos7_16 * (pp11 - pp12);
  319.  
  320.   pp0  = p0 + p3; pp1 = p1 + p2;
  321.   pp2  = cos1_8 * (p0 - p3);
  322.   pp3  = cos3_8 * (p1 - p2);
  323.   pp4  = p4 + p7; pp5 = p5 + p6;
  324.   pp6  = cos1_8 * (p4 - p7);
  325.   pp7  = cos3_8 * (p5 - p6);
  326.   pp8  = p8 + p11; pp9 = p9 + p10;
  327.   pp10 = cos1_8 * (p8 - p11);
  328.   pp11 = cos3_8 * (p9 - p10);
  329.   pp12 = p12 + p15; pp13 = p13 + p14;
  330.   pp14 = cos1_8 * (p12 - p15);
  331.   pp15 = cos3_8 * (p13 - p14);
  332.  
  333.   p0 = pp0 + pp1;
  334.   p1 = cos1_4 * (pp0 - pp1);
  335.   p2 = pp2 + pp3;
  336.   p3 = cos1_4 * (pp2 - pp3);
  337.   p4 = pp4 + pp5;
  338.   p5 = cos1_4 * (pp4 - pp5);
  339.   p6 = pp6 + pp7;
  340.   p7 = cos1_4 * (pp6 - pp7);
  341.   p8  = pp8 + pp9;
  342.   p9  = cos1_4 * (pp8 - pp9);
  343.   p10 = pp10 + pp11;
  344.   p11 = cos1_4 * (pp10 - pp11);
  345.   p12 = pp12 + pp13;
  346.   p13 = cos1_4 * (pp12 - pp13);
  347.   p14 = pp14 + pp15;
  348.   p15 = cos1_4 * (pp14 - pp15);
  349.  
  350.   tmp          = p6 + p7;
  351.   new_v[36-17] = -(p5 + tmp);
  352.   new_v[44-17] = -(p4 + tmp);
  353.   tmp          = p11 + p15;
  354.   new_v[10]    = tmp;
  355.   new_v[6]     = p13 + tmp;
  356.   tmp          = p14 + p15;
  357.   new_v[46-17] = -(p8  + p12 + tmp);
  358.   new_v[34-17] = -(p9  + p13 + tmp);
  359.   tmp         += p10 + p11;
  360.   new_v[38-17] = -(p13 + tmp);
  361.   new_v[42-17] = -(p12 + tmp);
  362.   new_v[2]     = p9 + p13 + p15;
  363.   new_v[4]     = p5 + p7;
  364.   new_v[48-17] = -p0;
  365.   new_v[0]     = p1;
  366.   new_v[8]     = p3;
  367.   new_v[12]    = p7;
  368.   new_v[14]    = p15;
  369.   new_v[40-17] = -(p2  + p3);
  370.  
  371.   x1 = samples;
  372.   x2 = samples + 31;
  373.   p0  = cos1_64  * (*x1++ - *x2);   p1  = cos3_64  * (*x1++ - *--x2);
  374.   p2  = cos5_64  * (*x1++ - *--x2); p3  = cos7_64  * (*x1++ - *--x2);
  375.   p4  = cos9_64  * (*x1++ - *--x2); p5  = cos11_64 * (*x1++ - *--x2);
  376.   p6  = cos13_64 * (*x1++ - *--x2); p7  = cos15_64 * (*x1++ - *--x2);
  377.   p8  = cos17_64 * (*x1++ - *--x2); p9  = cos19_64 * (*x1++ - *--x2);
  378.   p10 = cos21_64 * (*x1++ - *--x2); p11 = cos23_64 * (*x1++ - *--x2);
  379.   p12 = cos25_64 * (*x1++ - *--x2); p13 = cos27_64 * (*x1++ - *--x2);
  380.   p14 = cos29_64 * (*x1++ - *--x2); p15 = cos31_64 * (*x1   - *--x2);
  381.  
  382.   pp0  = p0 + p15; pp1 = p1 + p14; pp2 = p2 + p13; pp3 = p3 + p12;
  383.   pp4  = p4 + p11; pp5 = p5 + p10; pp6 = p6 + p9;  pp7 = p7 + p8;
  384.   pp8  = cos1_32  * (p0 - p15);
  385.   pp9  = cos3_32  * (p1 - p14);
  386.   pp10 = cos5_32  * (p2 - p13);
  387.   pp11 = cos7_32  * (p3 - p12);
  388.   pp12 = cos9_32  * (p4 - p11);
  389.   pp13 = cos11_32 * (p5 - p10);
  390.   pp14 = cos13_32 * (p6 - p9);
  391.   pp15 = cos15_32 * (p7 - p8);
  392.  
  393.   p0  = pp0 + pp7; p1 = pp1 + pp6; p2 = pp2 + pp5; p3 = pp3 + pp4;
  394.   p4  = cos1_16 * (pp0 - pp7);
  395.   p5  = cos3_16 * (pp1 - pp6);
  396.   p6  = cos5_16 * (pp2 - pp5);
  397.   p7  = cos7_16 * (pp3 - pp4);
  398.   p8  = pp8  + pp15; p9 = pp9  + pp14; p10 = pp10 + pp13; p11 = pp11 + pp12;
  399.   p12 = cos1_16 * (pp8  - pp15);
  400.   p13 = cos3_16 * (pp9  - pp14);
  401.   p14 = cos5_16 * (pp10 - pp13);
  402.   p15 = cos7_16 * (pp11 - pp12);
  403.  
  404.   pp0  = p0 + p3; pp1 = p1 + p2;
  405.   pp2  = cos1_8 * (p0 - p3);
  406.   pp3  = cos3_8 * (p1 - p2);
  407.   pp4  = p4 + p7; pp5 = p5 + p6;
  408.   pp6  = cos1_8 * (p4 - p7);
  409.   pp7  = cos3_8 * (p5 - p6);
  410.   pp8  = p8 + p11; pp9 = p9 + p10;
  411.   pp10 = cos1_8 * (p8 - p11);
  412.   pp11 = cos3_8 * (p9 - p10);
  413.   pp12 = p12 + p15; pp13 = p13 + p14;
  414.   pp14 = cos1_8 * (p12 - p15);
  415.   pp15 = cos3_8 * (p13 - p14);
  416.  
  417.   p0 = pp0 + pp1;
  418.   p1 = cos1_4 * (pp0 - pp1);
  419.   p2 = pp2 + pp3;
  420.   p3 = cos1_4 * (pp2 - pp3);
  421.   p4 = pp4 + pp5;
  422.   p5 = cos1_4 * (pp4 - pp5);
  423.   p6 = pp6 + pp7;
  424.   p7 = cos1_4 * (pp6 - pp7);
  425.   p8  = pp8 + pp9;
  426.   p9  = cos1_4 * (pp8 - pp9);
  427.   p10 = pp10 + pp11;
  428.   p11 = cos1_4 * (pp10 - pp11);
  429.   p12 = pp12 + pp13;
  430.   p13 = cos1_4 * (pp12 - pp13);
  431.   p14 = pp14 + pp15;
  432.   p15 = cos1_4 * (pp14 - pp15);
  433.  
  434.   tmp          = p13 + p15;
  435.   new_v[1]     = p1 + p9 + tmp;
  436.   new_v[5]     = p5 + p7 + p11 + tmp;
  437.   tmp         += p9;
  438.   new_v[33-17] = -(p1 + p14 + tmp);
  439.   tmp         += p5 + p7;
  440.   new_v[3]     = tmp;
  441.   new_v[35-17] = -(p6 + p14 + tmp);
  442.   tmp          = p10 + p11 + p12 + p13 + p14 + p15;
  443.   new_v[39-17] = -(p2 + p3 + tmp - p12);
  444.   new_v[43-17] = -(p4 + p6 + p7 + tmp - p13);
  445.   new_v[37-17] = -(p5 + p6 + p7 + tmp - p12);
  446.   new_v[41-17] = -(p2 + p3 + tmp - p13);
  447.   tmp          = p8 + p12 + p14 + p15;
  448.   new_v[47-17] = -(p0 + tmp);
  449.   new_v[45-17] = -(p4 + p6 + p7 + tmp);
  450.   tmp          = p11 + p15;
  451.   new_v[11]    = p7  + tmp;
  452.   tmp         += p3;
  453.   new_v[9]     = tmp;
  454.   new_v[7]     = p13 + tmp;
  455.   new_v[13]    = p7 + p15;
  456.   new_v[15]    = p15;
  457.  
  458.   // insert V[0-15] (== new_v[0-15]) into actual v:
  459.   x1 = new_v;
  460.   x2 = actual_v + actual_write_pos;
  461.   *x2 = *x1++; x2 += 16; *x2 = *x1++; x2 += 16; *x2 = *x1++; x2 += 16; *x2 = *x1++; x2 += 16;
  462.   *x2 = *x1++; x2 += 16; *x2 = *x1++; x2 += 16; *x2 = *x1++; x2 += 16; *x2 = *x1++; x2 += 16;
  463.   *x2 = *x1++; x2 += 16; *x2 = *x1++; x2 += 16; *x2 = *x1++; x2 += 16; *x2 = *x1++; x2 += 16;
  464.   *x2 = *x1++; x2 += 16; *x2 = *x1++; x2 += 16; *x2 = *x1++; x2 += 16; *x2 = *x1;   x2 += 16;
  465.   // V[16] is always 0.0:
  466.   *x2 = 0.0; x2 += 16;
  467.   // insert V[17-31] (== -new_v[15-1]) into actual v:
  468.   *x2 = -*x1;   x2 += 16; *x2 = -*--x1; x2 += 16; *x2 = -*--x1; x2 += 16; *x2 = -*--x1; x2 += 16;
  469.   *x2 = -*--x1; x2 += 16; *x2 = -*--x1; x2 += 16; *x2 = -*--x1; x2 += 16; *x2 = -*--x1; x2 += 16;
  470.   *x2 = -*--x1; x2 += 16; *x2 = -*--x1; x2 += 16; *x2 = -*--x1; x2 += 16; *x2 = -*--x1; x2 += 16;
  471.   *x2 = -*--x1; x2 += 16; *x2 = -*--x1; x2 += 16; *x2 = -*--x1;
  472.  
  473.   // insert V[32] (== -new_v[0]) into other v:
  474.   x2 = (actual_v == v1 ? v2 : v1) + actual_write_pos;
  475.   *x2 = -*--x1; x2 += 16;
  476.   // insert V[33-48] (== new_v[16-31]) into other v:
  477.   x1 = new_v + 16;
  478.   *x2 = *x1++; x2 += 16; *x2 = *x1++; x2 += 16; *x2 = *x1++; x2 += 16; *x2 = *x1++; x2 += 16;
  479.   *x2 = *x1++; x2 += 16; *x2 = *x1++; x2 += 16; *x2 = *x1++; x2 += 16; *x2 = *x1++; x2 += 16;
  480.   *x2 = *x1++; x2 += 16; *x2 = *x1++; x2 += 16; *x2 = *x1++; x2 += 16; *x2 = *x1++; x2 += 16;
  481.   *x2 = *x1++; x2 += 16; *x2 = *x1++; x2 += 16; *x2 = *x1++; x2 += 16; *x2 = *x1;   x2 += 16;
  482.   // insert V[49-63] (== new_v[30-16]) into other v:
  483.   *x2 = *--x1; x2 += 16; *x2 = *--x1; x2 += 16; *x2 = *--x1; x2 += 16; *x2 = *--x1; x2 += 16;
  484.   *x2 = *--x1; x2 += 16; *x2 = *--x1; x2 += 16; *x2 = *--x1; x2 += 16; *x2 = *--x1; x2 += 16;
  485.   *x2 = *--x1; x2 += 16; *x2 = *--x1; x2 += 16; *x2 = *--x1; x2 += 16; *x2 = *--x1; x2 += 16;
  486.   *x2 = *--x1; x2 += 16; *x2 = *--x1; x2 += 16; *x2 = *--x1;
  487. }
  488.  
  489.  
  490. void SynthesisFilter::compute_pcm_samples (Obuffer *buffer)
  491. {
  492.   uint32 i;
  493.   register real floatreg, *vp;
  494.   register const real *dp;
  495.   int32 pcm_sample;
  496.  
  497.   i = 0;
  498.   dp = d;
  499.  
  500.   switch (actual_write_pos)
  501.   {
  502.      case 0:
  503.         vp = actual_v;
  504.         for (; i < 32; ++i)
  505.         {
  506.     floatreg = *vp * *dp++;
  507.     vp += 15;
  508.     floatreg += *vp * *dp++;   floatreg += *--vp * *dp++;
  509.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  510.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  511.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  512.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  513.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  514.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  515.     floatreg += *--vp * *dp++;
  516.     pcm_sample = (int)(floatreg * scalefactor);
  517.     if (pcm_sample > 32767)
  518.     {
  519. /*      ++range_violations;
  520.       if (floatreg > max_violation)
  521.          max_violation = floatreg;    */
  522.       pcm_sample = 32767;
  523.     }
  524.     else if (pcm_sample < -32768)
  525.     {
  526. /*      ++range_violations;
  527.       if (-floatreg > max_violation)
  528.          max_violation = -floatreg; */
  529.       pcm_sample = -32768;
  530.     }
  531.     buffer->append (channel, (int32)pcm_sample);
  532.     vp += 15;
  533.         }
  534.         break;
  535.      case 1:
  536.         vp = actual_v + 1;
  537.         for (; i < 32; ++i)
  538.         {
  539.  
  540.     floatreg = *vp * *dp++;    floatreg += *--vp * *dp++;
  541.     vp += 15;
  542.     floatreg += *vp * *dp++;   floatreg += *--vp * *dp++;
  543.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  544.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  545.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  546.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  547.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  548.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  549.     pcm_sample = (int)(floatreg * scalefactor);
  550.     if (pcm_sample > 32767)
  551.     {
  552. /*      ++range_violations;
  553.       if (floatreg > max_violation)
  554.          max_violation = floatreg; */
  555.       pcm_sample = 32767;
  556.     }
  557.     else if (pcm_sample < -32768)
  558.     {
  559. /*      ++range_violations;
  560.       if (-floatreg > max_violation)
  561.          max_violation = -floatreg; */
  562.       pcm_sample = -32768;
  563.     }
  564.     buffer->append (channel, (int32)pcm_sample);
  565.     vp += 15;
  566.         }
  567.         break;
  568.      case 2:
  569.         vp = actual_v + 2;
  570.         for (; i < 32; ++i)
  571.         {
  572.     floatreg = *vp * *dp++;    floatreg += *--vp * *dp++;
  573.     floatreg += *--vp * *dp++;
  574.     vp += 15;
  575.     floatreg += *vp * *dp++;   floatreg += *--vp * *dp++;
  576.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  577.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  578.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  579.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  580.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  581.     floatreg += *--vp * *dp++;
  582.     pcm_sample = (int)(floatreg * scalefactor);
  583.     if (pcm_sample > 32767)
  584.     {
  585. /*      ++range_violations;
  586.       if (floatreg > max_violation)
  587.          max_violation = floatreg; */
  588.       pcm_sample = 32767;
  589.     }
  590.     else if (pcm_sample < -32768)
  591.     {
  592.       ++range_violations;
  593. /*      if (-floatreg > max_violation)
  594.          max_violation = -floatreg; */
  595.       pcm_sample = -32768;
  596.     }
  597.     buffer->append (channel, (int32)pcm_sample);
  598.     vp += 15;
  599.         }
  600.         break;
  601.      case 3:
  602.         vp = actual_v + 3;
  603.         for (; i < 32; ++i)
  604.         {
  605.  
  606.     floatreg = *vp * *dp++;    floatreg += *--vp * *dp++;
  607.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  608.     vp += 15;
  609.     floatreg += *vp * *dp++;   floatreg += *--vp * *dp++;
  610.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  611.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  612.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  613.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  614.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  615.     pcm_sample = (int)(floatreg * scalefactor);
  616.     if (pcm_sample > 32767)
  617.     {
  618. /*      ++range_violations;
  619.       if (floatreg > max_violation)
  620.          max_violation = floatreg; */
  621.       pcm_sample = 32767;
  622.     }
  623.     else if (pcm_sample < -32768)
  624.     {
  625. /*      ++range_violations;
  626.       if (-floatreg > max_violation)
  627.          max_violation = -floatreg; */
  628.       pcm_sample = -32768;
  629.     }
  630.     buffer->append (channel, (int32)pcm_sample);
  631.     vp += 15;
  632.         }
  633.         break;
  634.      case 4:
  635.         vp = actual_v + 4;
  636.         for (; i < 32; ++i)
  637.         {
  638.  
  639.     floatreg = *vp * *dp++;    floatreg += *--vp * *dp++;
  640.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  641.     floatreg += *--vp * *dp++;
  642.     vp += 15;
  643.     floatreg += *vp * *dp++;   floatreg += *--vp * *dp++;
  644.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  645.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  646.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  647.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  648.     floatreg += *--vp * *dp++;
  649.     pcm_sample = (int)(floatreg * scalefactor);
  650.     if (pcm_sample > 32767)
  651.     {
  652. /*      ++range_violations;
  653.       if (floatreg > max_violation)
  654.          max_violation = floatreg; */
  655.       pcm_sample = 32767;
  656.     }
  657.     else if (pcm_sample < -32768)
  658.     {
  659. /*      ++range_violations;
  660.       if (-floatreg > max_violation)
  661.          max_violation = -floatreg; */
  662.       pcm_sample = -32768;
  663.     }
  664.     buffer->append (channel, (int32)pcm_sample);
  665.     vp += 15;
  666.         }
  667.         break;
  668.      case 5:
  669.         vp = actual_v + 5;
  670.         for (; i < 32; ++i)
  671.         {
  672.  
  673.     floatreg = *vp * *dp++;    floatreg += *--vp * *dp++;
  674.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  675.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  676.     vp += 15;
  677.     floatreg += *vp * *dp++;   floatreg += *--vp * *dp++;
  678.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  679.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  680.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  681.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  682.     pcm_sample = (int)(floatreg * scalefactor);
  683.     if (pcm_sample > 32767)
  684.     {
  685. /*      ++range_violations;
  686.       if (floatreg > max_violation)
  687.          max_violation = floatreg;   */
  688.       pcm_sample = 32767;
  689.     }
  690.     else if (pcm_sample < -32768)
  691.     {
  692. /*      ++range_violations;
  693.       if (-floatreg > max_violation)
  694.          max_violation = -floatreg;   */
  695.       pcm_sample = -32768;
  696.     }
  697.     buffer->append (channel, (int32)pcm_sample);
  698.     vp += 15;
  699.         }
  700.         break;
  701.      case 6:
  702.         vp = actual_v + 6;
  703.         for (; i < 32; ++i)
  704.         {
  705.  
  706.     floatreg = *vp * *dp++;    floatreg += *--vp * *dp++;
  707.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  708.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  709.     floatreg += *--vp * *dp++;
  710.     vp += 15;
  711.     floatreg += *vp * *dp++;   floatreg += *--vp * *dp++;
  712.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  713.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  714.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  715.     floatreg += *--vp * *dp++;
  716.     pcm_sample = (int)(floatreg * scalefactor);
  717.     if (pcm_sample > 32767)
  718.     {
  719. /*      ++range_violations;
  720.       if (floatreg > max_violation)
  721.          max_violation = floatreg; */
  722.       pcm_sample = 32767;
  723.     }
  724.     else if (pcm_sample < -32768)
  725.     {
  726. /*      ++range_violations;
  727.       if (-floatreg > max_violation)
  728.          max_violation = -floatreg; */
  729.       pcm_sample = -32768;
  730.     }
  731.     buffer->append (channel, (int32)pcm_sample);
  732.     vp += 15;
  733.         }
  734.         break;
  735.      case 7:
  736.         vp = actual_v + 7;
  737.         for (; i < 32; ++i)
  738.         {
  739.  
  740.     floatreg = *vp * *dp++;    floatreg += *--vp * *dp++;
  741.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  742.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  743.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  744.     vp += 15;
  745.     floatreg += *vp * *dp++;   floatreg += *--vp * *dp++;
  746.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  747.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  748.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  749.     pcm_sample = (int)(floatreg * scalefactor);
  750.     if (pcm_sample > 32767)
  751.     {
  752. /*      ++range_violations;
  753.       if (floatreg > max_violation)
  754.          max_violation = floatreg;   */
  755.       pcm_sample = 32767;
  756.     }
  757.     else if (pcm_sample < -32768)
  758.     {
  759. /*      ++range_violations;
  760.       if (-floatreg > max_violation)
  761.          max_violation = -floatreg;   */
  762.       pcm_sample = -32768;
  763.     }
  764.     buffer->append (channel, (int32)pcm_sample);
  765.     vp += 15;
  766.         }
  767.         break;
  768.      case 8:
  769.         vp = actual_v + 8;
  770.         for (; i < 32; ++i)
  771.         {
  772.  
  773.     floatreg = *vp * *dp++;    floatreg += *--vp * *dp++;
  774.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  775.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  776.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  777.     floatreg += *--vp * *dp++;
  778.     vp += 15;
  779.     floatreg += *vp * *dp++;   floatreg += *--vp * *dp++;
  780.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  781.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  782.     floatreg += *--vp * *dp++;
  783.     pcm_sample = (int)(floatreg * scalefactor);
  784.     if (pcm_sample > 32767)
  785.     {
  786. /*      ++range_violations;
  787.       if (floatreg > max_violation)
  788.          max_violation = floatreg; */
  789.       pcm_sample = 32767;
  790.     }
  791.     else if (pcm_sample < -32768)
  792.     {
  793. /*      ++range_violations;
  794.       if (-floatreg > max_violation)
  795.          max_violation = -floatreg; */
  796.       pcm_sample = -32768;
  797.     }
  798.     buffer->append (channel, (int32)pcm_sample);
  799.     vp += 15;
  800.         }
  801.         break;
  802.      case 9:
  803.         vp = actual_v + 9;
  804.         for (; i < 32; ++i)
  805.         {
  806.  
  807.     floatreg = *vp * *dp++;    floatreg += *--vp * *dp++;
  808.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  809.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  810.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  811.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  812.     vp += 15;
  813.     floatreg += *vp * *dp++;   floatreg += *--vp * *dp++;
  814.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  815.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  816.     pcm_sample = (int)(floatreg * scalefactor);
  817.     if (pcm_sample > 32767)
  818.     {
  819.       ++range_violations;
  820. /*      if (floatreg > max_violation)
  821.          max_violation = floatreg; */
  822.       pcm_sample = 32767;
  823.     }
  824.     else if (pcm_sample < -32768)
  825.     {
  826. /*      ++range_violations;
  827.       if (-floatreg > max_violation)
  828.          max_violation = -floatreg; */
  829.       pcm_sample = -32768;
  830.     }
  831.     buffer->append (channel, (int32)pcm_sample);
  832.     vp += 15;
  833.         }
  834.         break;
  835.      case 10:
  836.         vp = actual_v + 10;
  837.         for (; i < 32; ++i)
  838.         {
  839.  
  840.     floatreg = *vp * *dp++;    floatreg += *--vp * *dp++;
  841.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  842.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  843.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  844.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  845.     floatreg += *--vp * *dp++;
  846.     vp += 15;
  847.     floatreg += *vp * *dp++;   floatreg += *--vp * *dp++;
  848.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  849.     floatreg += *--vp * *dp++;
  850.     pcm_sample = (int)(floatreg * scalefactor);
  851.     if (pcm_sample > 32767)
  852.     {
  853. /*      ++range_violations;
  854.       if (floatreg > max_violation)
  855.          max_violation = floatreg; */
  856.       pcm_sample = 32767;
  857.     }
  858.     else if (pcm_sample < -32768)
  859.     {
  860. /*      ++range_violations;
  861.       if (-floatreg > max_violation)
  862.          max_violation = -floatreg; */
  863.       pcm_sample = -32768;
  864.     }
  865.     buffer->append (channel, (int32)pcm_sample);
  866.     vp += 15;
  867.         }
  868.         break;
  869.      case 11:
  870.         vp = actual_v + 11;
  871.         for (; i < 32; ++i)
  872.         {
  873.  
  874.     floatreg = *vp * *dp++;    floatreg += *--vp * *dp++;
  875.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  876.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  877.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  878.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  879.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  880.     vp += 15;
  881.     floatreg += *vp * *dp++;   floatreg += *--vp * *dp++;
  882.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  883.     pcm_sample = (int)(floatreg * scalefactor);
  884.     if (pcm_sample > 32767)
  885.     {
  886. /*      ++range_violations;
  887.       if (floatreg > max_violation)
  888.          max_violation = floatreg; */
  889.       pcm_sample = 32767;
  890.     }
  891.     else if (pcm_sample < -32768)
  892.     {
  893. /*      ++range_violations;
  894.       if (-floatreg > max_violation)
  895.          max_violation = -floatreg; */
  896.       pcm_sample = -32768;
  897.     }
  898.     buffer->append (channel, (int32)pcm_sample);
  899.     vp += 15;
  900.         }
  901.         break;
  902.      case 12:
  903.         vp = actual_v + 12;
  904.         for (; i < 32; ++i)
  905.         {
  906.  
  907.     floatreg = *vp * *dp++;    floatreg += *--vp * *dp++;
  908.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  909.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  910.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  911.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  912.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  913.     floatreg += *--vp * *dp++;
  914.     vp += 15;
  915.     floatreg += *vp * *dp++;   floatreg += *--vp * *dp++;
  916.     floatreg += *--vp * *dp++;
  917.     pcm_sample = (int)(floatreg * scalefactor);
  918.     if (pcm_sample > 32767)
  919.     {
  920. /*      ++range_violations;
  921.       if (floatreg > max_violation)
  922.          max_violation = floatreg; */
  923.       pcm_sample = 32767;
  924.     }
  925.     else if (pcm_sample < -32768)
  926.     {
  927. /*      ++range_violations;
  928.       if (-floatreg > max_violation)
  929.          max_violation = -floatreg; */
  930.       pcm_sample = -32768;
  931.     }
  932.     buffer->append (channel, (int32)pcm_sample);
  933.     vp += 15;
  934.         }
  935.         break;
  936.      case 13:
  937.         vp = actual_v + 13;
  938.         for (; i < 32; ++i)
  939.         {
  940.  
  941.     floatreg = *vp * *dp++;    floatreg += *--vp * *dp++;
  942.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  943.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  944.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  945.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  946.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  947.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  948.     vp += 15;
  949.     floatreg += *vp * *dp++;   floatreg += *--vp * *dp++;
  950.     pcm_sample = (int)(floatreg * scalefactor);
  951.     if (pcm_sample > 32767)
  952.     {
  953. /*      ++range_violations;
  954.       if (floatreg > max_violation)
  955.          max_violation = floatreg; */
  956.       pcm_sample = 32767;
  957.     }
  958.     else if (pcm_sample < -32768)
  959.     {
  960. /*      ++range_violations;
  961.       if (-floatreg > max_violation)
  962.          max_violation = -floatreg; */
  963.       pcm_sample = -32768;
  964.     }
  965.     buffer->append (channel, (int32)pcm_sample);
  966.     vp += 15;
  967.         }
  968.         break;
  969.      case 14:
  970.         vp = actual_v + 14;
  971.         for (; i < 32; ++i)
  972.         {
  973.  
  974.     floatreg = *vp * *dp++;    floatreg += *--vp * *dp++;
  975.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  976.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  977.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  978.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  979.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  980.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  981.     floatreg += *--vp * *dp++;
  982.     vp += 15;
  983.     floatreg += *vp * *dp++;
  984.     pcm_sample = (int)(floatreg * scalefactor);
  985.     if (pcm_sample > 32767)
  986.     {
  987. /*      ++range_violations;
  988.       if (floatreg > max_violation)
  989.          max_violation = floatreg; */
  990.       pcm_sample = 32767;
  991.     }
  992.     else if (pcm_sample < -32768)
  993.     {
  994. /*      ++range_violations;
  995.       if (-floatreg > max_violation)
  996.          max_violation = -floatreg; */
  997.       pcm_sample = -32768;
  998.     }
  999.     buffer->append (channel, (int32)pcm_sample);
  1000.     vp += 15;
  1001.         }
  1002.         break;
  1003.      case 15:
  1004.         vp = actual_v + 15;
  1005.         for (; i < 32; ++i)
  1006.         {
  1007.  
  1008.     floatreg = *vp * *dp++;    floatreg += *--vp * *dp++;
  1009.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  1010.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  1011.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  1012.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  1013.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  1014.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  1015.     floatreg += *--vp * *dp++; floatreg += *--vp * *dp++;
  1016.     pcm_sample = (int)(floatreg * scalefactor);
  1017.     if (pcm_sample > 32767)
  1018.     {
  1019. /*      ++range_violations;
  1020.       if (floatreg > max_violation)
  1021.          max_violation = floatreg; */
  1022.       pcm_sample = 32767;
  1023.     }
  1024.     else if (pcm_sample < -32768)
  1025.     {
  1026. /*      ++range_violations;
  1027.       if (-floatreg > max_violation)
  1028.          max_violation = -floatreg; */
  1029.       pcm_sample = -32768;
  1030.     }
  1031.  
  1032.     buffer->append(channel, (int32)pcm_sample);
  1033.     vp += 31;
  1034.         }
  1035.   }
  1036.  
  1037. }
  1038.  
  1039. void SynthesisFilter::calculate_pcm_samples (Obuffer *buffer)
  1040. {
  1041.   compute_new_v ();
  1042.   compute_pcm_samples (buffer);
  1043.  
  1044.   written_samples += 32;
  1045.   if (actual_write_pos < 15)
  1046.      ++actual_write_pos;
  1047.   else
  1048.      actual_write_pos = 0;
  1049.   actual_v = (actual_v == v1 ? v2 : v1);
  1050.  
  1051.   // initialize samples[]:
  1052.   for (register real *floatp = samples + 32; floatp > samples; )
  1053.      *--floatp = 0.0;
  1054. }
  1055.