synthesis_filter.cc
上传用户:aoeyumen
上传日期:2007-01-06
资源大小:3329k
文件大小:28k
源码类别:

DVD

开发平台:

Unix_Linux

  1. /*
  2.    File: synthesis_filter.cc
  3. */
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <fstream.h>
  7. #ifdef IRIX
  8. #include <dmedia/audio.h>
  9. #endif
  10. #ifdef SOLARIS
  11. #include <sys/audioio.h>
  12. #endif
  13. #include "athread.hh"
  14. #include "error.hh"
  15. #include "debug.hh"
  16. #include "util.hh"
  17. #include "sync.hh"
  18. #include "mpeg2const.hh"
  19. #include "mpeg2buff.hh"
  20. #include "astream.hh"
  21. #include "crc.hh"
  22. #include "header.hh"
  23. #include "obuffer.hh"
  24. #include "synthesis_filter.hh"
  25. const real SynthesisFilter::n[32][31] = {
  26.   {  0.707106781,  0.671558955,  0.634393284,  0.595699304,
  27.      0.555570233,  0.514102744,  0.471396737,  0.427555093,
  28.      0.382683432,  0.336889853,  0.290284677,  0.242980180,
  29.      0.195090322,  0.146730474,  0.098017140,  0.049067674,
  30.     -0.740951126, -0.773010454, -0.803207532, -0.831469612,
  31.     -0.857728610, -0.881921265, -0.903989293, -0.923879533,
  32.     -0.941544065, -0.956940336, -0.970031253, -0.980785280,
  33.     -0.989176510, -0.995184727, -0.998795456 },
  34.   { -0.707106781, -0.803207532, -0.881921265, -0.941544065,
  35.     -0.980785280, -0.998795456, -0.995184727, -0.970031253,
  36.     -0.923879532, -0.857728610, -0.773010453, -0.671558954,
  37.     -0.555570233, -0.427555093, -0.290284677, -0.146730474,
  38.      0.595699304,  0.471396737,  0.336889853,  0.195090322,
  39.      0.049067674, -0.098017141, -0.242980180, -0.382683433,
  40.     -0.514102744, -0.634393284, -0.740951126, -0.831469612,
  41.     -0.903989293, -0.956940336, -0.989176510 },
  42.   { -0.707106781, -0.514102744, -0.290284677, -0.049067674,
  43.      0.195090323,  0.427555094,  0.634393285,  0.803207532,
  44.      0.923879533,  0.989176510,  0.995184727,  0.941544065,
  45.      0.831469612,  0.671558955,  0.471396737,  0.242980180,
  46.      0.857728610,  0.956940336,  0.998795456,  0.980785280,
  47.      0.903989293,  0.773010453,  0.595699304,  0.382683432,
  48.      0.146730474, -0.098017141, -0.336889854, -0.555570233,
  49.     -0.740951126, -0.881921265, -0.970031253 },
  50.   {  0.707106782,  0.903989293,  0.995184727,  0.970031253,
  51.      0.831469612,  0.595699304,  0.290284677, -0.049067675,
  52.     -0.382683433, -0.671558955, -0.881921265, -0.989176510,
  53.     -0.980785280, -0.857728610, -0.634393284, -0.336889853,
  54.     -0.427555093, -0.098017140,  0.242980181,  0.555570234,
  55.      0.803207532,  0.956940336,  0.998795456,  0.923879532,
  56.      0.740951125,  0.471396737,  0.146730474, -0.195090322,
  57.     -0.514102744, -0.773010454, -0.941544065 },
  58.   {  0.707106781,  0.336889853, -0.098017141, -0.514102744,
  59.     -0.831469612, -0.989176510, -0.956940336, -0.740951125,
  60.     -0.382683432,  0.049067675,  0.471396737,  0.803207532,
  61.      0.980785281,  0.970031253,  0.773010453,  0.427555093,
  62.     -0.941544065, -0.995184727, -0.857728610, -0.555570233,
  63.     -0.146730474,  0.290284678,  0.671558955,  0.923879533,
  64.      0.998795456,  0.881921264,  0.595699304,  0.195090322,
  65.     -0.242980180, -0.634393284, -0.903989293 },
  66.   { -0.707106781, -0.970031253, -0.956940336, -0.671558954,
  67.     -0.195090321,  0.336889854,  0.773010454,  0.989176510,
  68.      0.923879532,  0.595699304,  0.098017140, -0.427555094,
  69.     -0.831469612, -0.998795456, -0.881921264, -0.514102744,
  70.      0.242980180, -0.290284677, -0.740951126, -0.980785280,
  71.     -0.941544065, -0.634393284, -0.146730474,  0.382683433,
  72.      0.803207532,  0.995184727,  0.903989293,  0.555570233,
  73.      0.049067674, -0.471396737, -0.857728610 },
  74.   { -0.707106781, -0.146730474,  0.471396737,  0.903989293,
  75.      0.980785280,  0.671558955,  0.098017140, -0.514102744,
  76.     -0.923879533, -0.970031253, -0.634393284, -0.049067674,
  77.      0.555570234,  0.941544065,  0.956940336,  0.595699304,
  78.      0.989176510,  0.881921264,  0.427555093, -0.195090322,
  79.     -0.740951126, -0.995184727, -0.857728610, -0.382683432,
  80.      0.242980181,  0.773010454,  0.998795456,  0.831469612,
  81.      0.336889853, -0.290284677, -0.803207532 },
  82.   {  0.707106782,  0.998795456,  0.773010453,  0.146730474,
  83.     -0.555570233, -0.970031253, -0.881921264, -0.336889853,
  84.      0.382683433,  0.903989293,  0.956940336,  0.514102744,
  85.     -0.195090322, -0.803207532, -0.995184727, -0.671558954,
  86.     -0.049067674,  0.634393285,  0.989176510,  0.831469612,
  87.      0.242980180, -0.471396737, -0.941544065, -0.923879532,
  88.     -0.427555093,  0.290284678,  0.857728610,  0.980785280,
  89.      0.595699304, -0.098017141, -0.740951126 },
  90.   {  0.707106781, -0.049067675, -0.773010454, -0.989176510,
  91.     -0.555570233,  0.242980181,  0.881921265,  0.941544065,
  92.      0.382683432, -0.427555094, -0.956940336, -0.857728610,
  93.     -0.195090321,  0.595699305,  0.995184727,  0.740951125,
  94.     -0.998795456, -0.634393284,  0.146730475,  0.831469613,
  95.      0.970031253,  0.471396737, -0.336889854, -0.923879533,
  96.     -0.903989293, -0.290284677,  0.514102745,  0.980785281,
  97.      0.803207531,  0.098017140, -0.671558955 },
  98.   { -0.707106781, -0.989176510, -0.471396736,  0.427555094,
  99.      0.980785281,  0.740951125, -0.098017141, -0.857728610,
  100.     -0.923879532, -0.242980179,  0.634393285,  0.998795456,
  101.      0.555570233, -0.336889854, -0.956940336, -0.803207531,
  102.     -0.146730475, -0.881921265, -0.903989293, -0.195090321,
  103.      0.671558955,  0.995184727,  0.514102744, -0.382683433,
  104.     -0.970031253, -0.773010453,  0.049067675,  0.831469613,
  105.      0.941544065,  0.290284677, -0.595699305 },
  106.   { -0.707106781,  0.242980181,  0.956940336,  0.740951125,
  107.     -0.195090322, -0.941544065, -0.773010453,  0.146730475,
  108.      0.923879533,  0.803207531, -0.098017141, -0.903989293,
  109.     -0.831469612,  0.049067675,  0.881921265,  0.857728610,
  110.      0.970031253,  0.290284677, -0.671558955, -0.980785280,
  111.     -0.336889853,  0.634393285,  0.989176510,  0.382683432,
  112.     -0.595699305, -0.995184727, -0.427555093,  0.555570234,
  113.      0.998795456,  0.471396737, -0.514102744 },
  114.   {  0.707106782,  0.941544065,  0.098017140, -0.857728610,
  115.     -0.831469612,  0.146730475,  0.956940336,  0.671558955,
  116.     -0.382683433, -0.998795456, -0.471396736,  0.595699305,
  117.      0.980785280,  0.242980180, -0.773010454, -0.903989293,
  118.      0.336889854,  0.995184727,  0.514102744, -0.555570233,
  119.     -0.989176510, -0.290284677,  0.740951126,  0.923879532,
  120.      0.049067674, -0.881921265, -0.803207531,  0.195090323,
  121.      0.970031253,  0.634393284, -0.427555094 },
  122.   {  0.707106781, -0.427555094, -0.995184727, -0.242980179,
  123.      0.831469613,  0.803207531, -0.290284677, -0.998795456,
  124.     -0.382683432,  0.740951126,  0.881921264, -0.146730475,
  125.     -0.980785280, -0.514102744,  0.634393285,  0.941544065,
  126.     -0.903989293,  0.098017141,  0.970031253,  0.555570233,
  127.     -0.595699305, -0.956940336, -0.049067674,  0.923879533,
  128.      0.671558955, -0.471396737, -0.989176510, -0.195090321,
  129.      0.857728610,  0.773010453, -0.336889854 },
  130.   { -0.707106781, -0.857728610,  0.290284678,  0.998795456,
  131.      0.195090322, -0.903989293, -0.634393284,  0.595699305,
  132.      0.923879532, -0.146730475, -0.995184727, -0.336889853,
  133.      0.831469613,  0.740951125, -0.471396737, -0.970031253,
  134.     -0.514102744, -0.956940336,  0.049067675,  0.980785281,
  135.      0.427555093, -0.773010454, -0.803207531,  0.382683433,
  136.      0.989176510,  0.098017140, -0.941544065, -0.555570233,
  137.      0.671558955,  0.881921264, -0.242980180 },
  138.   { -0.707106781,  0.595699305,  0.881921264, -0.336889854,
  139.     -0.980785280,  0.049067675,  0.995184727,  0.242980180,
  140.     -0.923879533, -0.514102744,  0.773010454,  0.740951125,
  141.     -0.555570233, -0.903989293,  0.290284678,  0.989176510,
  142.      0.803207531, -0.471396737, -0.941544065,  0.195090323,
  143.      0.998795456,  0.098017140, -0.970031253, -0.382683432,
  144.      0.857728610,  0.634393284, -0.671558955, -0.831469612,
  145.      0.427555094,  0.956940336, -0.146730475 },
  146.   {  0.707106782,  0.740951125, -0.634393284, -0.803207531,
  147.      0.555570234,  0.857728610, -0.471396737, -0.903989293,
  148.      0.382683433,  0.941544065, -0.290284677, -0.970031253,
  149.      0.195090323,  0.989176510, -0.098017141, -0.998795456,
  150.      0.671558955,  0.773010453, -0.595699305, -0.831469612,
  151.      0.514102745,  0.881921264, -0.427555094, -0.923879532,
  152.      0.336889854,  0.956940336, -0.242980180, -0.980785280,
  153.      0.146730475,  0.995184727, -0.049067675 },
  154.   {  0.707106781, -0.740951126, -0.634393284,  0.803207532,
  155.      0.555570233, -0.857728610, -0.471396736,  0.903989293,
  156.      0.382683432, -0.941544065, -0.290284677,  0.970031253,
  157.      0.195090322, -0.989176510, -0.098017140,  0.998795456,
  158.     -0.671558954,  0.773010454,  0.595699304, -0.831469612,
  159.     -0.514102744,  0.881921265,  0.427555093, -0.923879533,
  160.     -0.336889853,  0.956940336,  0.242980180, -0.980785280,
  161.     -0.146730474,  0.995184727,  0.049067674 },
  162.   { -0.707106781, -0.595699304,  0.881921265,  0.336889853,
  163.     -0.980785280, -0.049067674,  0.995184727, -0.242980180,
  164.     -0.923879532,  0.514102745,  0.773010453, -0.740951126,
  165.     -0.555570233,  0.903989293,  0.290284677, -0.989176510,
  166.     -0.803207532, -0.471396736,  0.941544065,  0.195090322,
  167.     -0.998795456,  0.098017141,  0.970031253, -0.382683433,
  168.     -0.857728610,  0.634393285,  0.671558955, -0.831469612,
  169.     -0.427555093,  0.956940336,  0.146730474 },
  170.   { -0.707106781,  0.857728610,  0.290284677, -0.998795456,
  171.      0.195090323,  0.903989293, -0.634393284, -0.595699304,
  172.      0.923879533,  0.146730474, -0.995184727,  0.336889854,
  173.      0.831469612, -0.740951126, -0.471396736,  0.970031253,
  174.      0.514102744, -0.956940336, -0.049067674,  0.980785280,
  175.     -0.427555094, -0.773010453,  0.803207532,  0.382683432,
  176.     -0.989176510,  0.098017141,  0.941544065, -0.555570233,
  177.     -0.671558954,  0.881921265,  0.242980180 },
  178.   {  0.707106782,  0.427555093, -0.995184727,  0.242980181,
  179.      0.831469612, -0.803207532, -0.290284677,  0.998795456,
  180.     -0.382683433, -0.740951125,  0.881921265,  0.146730474,
  181.     -0.980785280,  0.514102745,  0.634393284, -0.941544065,
  182.      0.903989293,  0.098017140, -0.970031253,  0.555570234,
  183.      0.595699304, -0.956940336,  0.049067675,  0.923879532,
  184.     -0.671558955, -0.471396736,  0.989176510, -0.195090322,
  185.     -0.857728610,  0.773010454,  0.336889853 },
  186.   {  0.707106781, -0.941544065,  0.098017141,  0.857728610,
  187.     -0.831469612, -0.146730474,  0.956940336, -0.671558955,
  188.     -0.382683432,  0.998795456, -0.471396737, -0.595699304,
  189.      0.980785281, -0.242980180, -0.773010453,  0.903989293,
  190.     -0.336889853,  0.995184727, -0.514102744, -0.555570233,
  191.      0.989176510, -0.290284677, -0.740951125,  0.923879533,
  192.     -0.049067675, -0.881921264,  0.803207532,  0.195090322,
  193.     -0.970031253,  0.634393285,  0.427555093 },
  194.   { -0.707106781, -0.242980179,  0.956940336, -0.740951126,
  195.     -0.195090321,  0.941544065, -0.773010454, -0.146730474,
  196.      0.923879532, -0.803207532, -0.098017140,  0.903989293,
  197.     -0.831469612, -0.049067674,  0.881921264, -0.857728610,
  198.     -0.970031253,  0.290284678,  0.671558955, -0.980785280,
  199.      0.336889854,  0.634393284, -0.989176510,  0.382683433,
  200.      0.595699304, -0.995184727,  0.427555094,  0.555570233,
  201.     -0.998795456,  0.471396737,  0.514102744 },
  202.   { -0.707106781,  0.989176510, -0.471396737, -0.427555093,
  203.      0.980785280, -0.740951126, -0.098017140,  0.857728610,
  204.     -0.923879533,  0.242980181,  0.634393284, -0.998795456,
  205.      0.555570234,  0.336889853, -0.956940336,  0.803207532,
  206.      0.146730474, -0.881921264,  0.903989293, -0.195090322,
  207.     -0.671558954,  0.995184727, -0.514102744, -0.382683432,
  208.      0.970031253, -0.773010454, -0.049067674,  0.831469612,
  209.     -0.941544065,  0.290284678,  0.595699304 },
  210.   {  0.707106782,  0.049067674, -0.773010453,  0.989176510,
  211.     -0.555570233, -0.242980179,  0.881921264, -0.941544065,
  212.      0.382683433,  0.427555093, -0.956940336,  0.857728610,
  213.     -0.195090322, -0.595699304,  0.995184727, -0.740951126,
  214.      0.998795456, -0.634393284, -0.146730474,  0.831469612,
  215.     -0.970031253,  0.471396737,  0.336889853, -0.923879532,
  216.      0.903989293, -0.290284677, -0.514102744,  0.980785280,
  217.     -0.803207532,  0.098017141,  0.671558955 },
  218.   {  0.707106781, -0.998795456,  0.773010454, -0.146730475,
  219.     -0.555570233,  0.970031253, -0.881921265,  0.336889854,
  220.      0.382683432, -0.903989293,  0.956940336, -0.514102744,
  221.     -0.195090321,  0.803207531, -0.995184727,  0.671558955,
  222.      0.049067675,  0.634393284, -0.989176510,  0.831469613,
  223.     -0.242980180, -0.471396736,  0.941544065, -0.923879533,
  224.      0.427555094,  0.290284677, -0.857728610,  0.980785281,
  225.     -0.595699305, -0.098017140,  0.740951125 },
  226.   { -0.707106781,  0.146730475,  0.471396737, -0.903989293,
  227.      0.980785281, -0.671558955,  0.098017141,  0.514102744,
  228.     -0.923879532,  0.970031253, -0.634393284,  0.049067675,
  229.      0.555570233, -0.941544065,  0.956940336, -0.595699305,
  230.     -0.989176510,  0.881921265, -0.427555094, -0.195090321,
  231.      0.740951125, -0.995184727,  0.857728610, -0.382683433,
  232.     -0.242980179,  0.773010453, -0.998795456,  0.831469613,
  233.     -0.336889854, -0.290284677,  0.803207531 },
  234.   { -0.707106781,  0.970031253, -0.956940336,  0.671558955,
  235.     -0.195090322, -0.336889853,  0.773010453, -0.989176510,
  236.      0.923879533, -0.595699305,  0.098017141,  0.427555093,
  237.     -0.831469612,  0.998795456, -0.881921265,  0.514102745,
  238.     -0.242980180, -0.290284677,  0.740951125, -0.980785280,
  239.      0.941544065, -0.634393284,  0.146730475,  0.382683432,
  240.     -0.803207531,  0.995184727, -0.903989293,  0.555570234,
  241.     -0.049067675, -0.471396736,  0.857728610 },
  242.   {  0.707106782, -0.336889854, -0.098017140,  0.514102744,
  243.     -0.831469612,  0.989176510, -0.956940336,  0.740951126,
  244.     -0.382683433, -0.049067674,  0.471396737, -0.803207531,
  245.      0.980785280, -0.970031253,  0.773010454, -0.427555094,
  246.      0.941544065, -0.995184727,  0.857728610, -0.555570233,
  247.      0.146730475,  0.290284677, -0.671558954,  0.923879532,
  248.     -0.998795456,  0.881921265, -0.595699305,  0.195090323,
  249.      0.242980180, -0.634393284,  0.903989293 },
  250.   {  0.707106781, -0.903989293,  0.995184727, -0.970031253,
  251.      0.831469613, -0.595699305,  0.290284678,  0.049067674,
  252.     -0.382683432,  0.671558955, -0.881921264,  0.989176510,
  253.     -0.980785280,  0.857728610, -0.634393284,  0.336889854,
  254.      0.427555094, -0.098017141, -0.242980179,  0.555570233,
  255.     -0.803207531,  0.956940336, -0.998795456,  0.923879533,
  256.     -0.740951126,  0.471396737, -0.146730475, -0.195090321,
  257.      0.514102744, -0.773010453,  0.941544065 },
  258.   { -0.707106781,  0.514102745, -0.290284677,  0.049067675,
  259.      0.195090322, -0.427555093,  0.634393284, -0.803207531,
  260.      0.923879532, -0.989176510,  0.995184727, -0.941544065,
  261.      0.831469613, -0.671558955,  0.471396737, -0.242980180,
  262.     -0.857728610,  0.956940336, -0.998795456,  0.980785281,
  263.     -0.903989293,  0.773010454, -0.595699305,  0.382683433,
  264.     -0.146730475, -0.098017140,  0.336889853, -0.555570233,
  265.      0.740951125, -0.881921264,  0.970031253 },
  266.   { -0.707106781,  0.803207531, -0.881921264,  0.941544065,
  267.     -0.980785280,  0.998795456, -0.995184727,  0.970031253,
  268.     -0.923879533,  0.857728610, -0.773010454,  0.671558955,
  269.     -0.555570233,  0.427555094, -0.290284677,  0.146730475,
  270.     -0.595699305,  0.471396737, -0.336889854,  0.195090323,
  271.     -0.049067675, -0.098017140,  0.242980180, -0.382683432,
  272.      0.514102744, -0.634393284,  0.740951125, -0.831469612,
  273.      0.903989293, -0.956940336,  0.989176510 },
  274.   {  0.707106782, -0.671558955,  0.634393285, -0.595699305,
  275.      0.555570234, -0.514102744,  0.471396737, -0.427555094,
  276.      0.382683433, -0.336889854,  0.290284678, -0.242980180,
  277.      0.195090323, -0.146730475,  0.098017141, -0.049067675,
  278.      0.740951125, -0.773010453,  0.803207531, -0.831469612,
  279.      0.857728610, -0.881921264,  0.903989293, -0.923879532,
  280.      0.941544065, -0.956940336,  0.970031253, -0.980785280,
  281.      0.989176510, -0.995184727,  0.998795456 }
  282. };
  283. const real SynthesisFilter::d[512] = {
  284.   // Warning: These values are not in the same order
  285.   // as in Annex 3-B.3 of the ISO/IEC DIS 11172-3
  286.    0.000000000, -0.000442505,  0.003250122, -0.007003784,
  287.    0.031082153, -0.078628540,  0.100311279, -0.572036743,
  288.    1.144989014,  0.572036743,  0.100311279,  0.078628540,
  289.    0.031082153,  0.007003784,  0.003250122,  0.000442505,
  290.   -0.000015259, -0.000473022,  0.003326416, -0.007919312,
  291.    0.030517578, -0.084182739,  0.090927124, -0.600219727,
  292.    1.144287109,  0.543823242,  0.108856201,  0.073059082,
  293.    0.031478882,  0.006118774,  0.003173828,  0.000396729,
  294.   -0.000015259, -0.000534058,  0.003387451, -0.008865356,
  295.    0.029785156, -0.089706421,  0.080688477, -0.628295898,
  296.    1.142211914,  0.515609741,  0.116577148,  0.067520142,
  297.    0.031738281,  0.005294800,  0.003082275,  0.000366211,
  298.   -0.000015259, -0.000579834,  0.003433228, -0.009841919,
  299.    0.028884888, -0.095169067,  0.069595337, -0.656219482,
  300.    1.138763428,  0.487472534,  0.123474121,  0.061996460,
  301.    0.031845093,  0.004486084,  0.002990723,  0.000320435,
  302.   -0.000015259, -0.000625610,  0.003463745, -0.010848999,
  303.    0.027801514, -0.100540161,  0.057617188, -0.683914185,
  304.    1.133926392,  0.459472656,  0.129577637,  0.056533813,
  305.    0.031814575,  0.003723145,  0.002899170,  0.000289917,
  306.   -0.000015259, -0.000686646,  0.003479004, -0.011886597,
  307.    0.026535034, -0.105819702,  0.044784546, -0.711318970,
  308.    1.127746582,  0.431655884,  0.134887695,  0.051132202,
  309.    0.031661987,  0.003005981,  0.002792358,  0.000259399,
  310.   -0.000015259, -0.000747681,  0.003479004, -0.012939453,
  311.    0.025085449, -0.110946655,  0.031082153, -0.738372803,
  312.    1.120223999,  0.404083252,  0.139450073,  0.045837402,
  313.    0.031387329,  0.002334595,  0.002685547,  0.000244141,
  314.   -0.000030518, -0.000808716,  0.003463745, -0.014022827,
  315.    0.023422241, -0.115921021,  0.016510010, -0.765029907,
  316.    1.111373901,  0.376800537,  0.143264771,  0.040634155,
  317.    0.031005859,  0.001693726,  0.002578735,  0.000213623,
  318.   -0.000030518, -0.000885010,  0.003417969, -0.015121460,
  319.    0.021575928, -0.120697021,  0.001068115, -0.791213989,
  320.    1.101211548,  0.349868774,  0.146362305,  0.035552979,
  321.    0.030532837,  0.001098633,  0.002456665,  0.000198364,
  322.   -0.000030518, -0.000961304,  0.003372192, -0.016235352,
  323.    0.019531250, -0.125259399, -0.015228271, -0.816864014,
  324.    1.089782715,  0.323318481,  0.148773193,  0.030609131,
  325.    0.029937744,  0.000549316,  0.002349854,  0.000167847,
  326.   -0.000030518, -0.001037598,  0.003280640, -0.017349243,
  327.    0.017257690, -0.129562378, -0.032379150, -0.841949463,
  328.    1.077117920,  0.297210693,  0.150497437,  0.025817871,
  329.    0.029281616,  0.000030518,  0.002243042,  0.000152588,
  330.   -0.000045776, -0.001113892,  0.003173828, -0.018463135,
  331.    0.014801025, -0.133590698, -0.050354004, -0.866363525,
  332.    1.063217163,  0.271591187,  0.151596069,  0.021179199,
  333.    0.028533936, -0.000442505,  0.002120972,  0.000137329,
  334.   -0.000045776, -0.001205444,  0.003051758, -0.019577026,
  335.    0.012115479, -0.137298584, -0.069168091, -0.890090942,
  336.    1.048156738,  0.246505737,  0.152069092,  0.016708374,
  337.    0.027725220, -0.000869751,  0.002014160,  0.000122070,
  338.   -0.000061035, -0.001296997,  0.002883911, -0.020690918,
  339.    0.009231567, -0.140670776, -0.088775635, -0.913055420,
  340.    1.031936646,  0.221984863,  0.151962280,  0.012420654,
  341.    0.026840210, -0.001266479,  0.001907349,  0.000106812,
  342.   -0.000061035, -0.001388550,  0.002700806, -0.021789551,
  343.    0.006134033, -0.143676758, -0.109161377, -0.935195923,
  344.    1.014617920,  0.198059082,  0.151306152,  0.008316040,
  345.    0.025909424, -0.001617432,  0.001785278,  0.000106812,
  346.   -0.000076294, -0.001480103,  0.002487183, -0.022857666,
  347.    0.002822876, -0.146255493, -0.130310059, -0.956481934,
  348.    0.996246338,  0.174789429,  0.150115967,  0.004394531,
  349.    0.024932861, -0.001937866,  0.001693726,  0.000091553,
  350.   -0.000076294, -0.001586914,  0.002227783, -0.023910522,
  351.   -0.000686646, -0.148422241, -0.152206421, -0.976852417,
  352.    0.976852417,  0.152206421,  0.148422241,  0.000686646,
  353.    0.023910522, -0.002227783,  0.001586914,  0.000076294,
  354.   -0.000091553, -0.001693726,  0.001937866, -0.024932861,
  355.   -0.004394531, -0.150115967, -0.174789429, -0.996246338,
  356.    0.956481934,  0.130310059,  0.146255493, -0.002822876,
  357.    0.022857666, -0.002487183,  0.001480103,  0.000076294,
  358.   -0.000106812, -0.001785278,  0.001617432, -0.025909424,
  359.   -0.008316040, -0.151306152, -0.198059082, -1.014617920,
  360.    0.935195923,  0.109161377,  0.143676758, -0.006134033,
  361.    0.021789551, -0.002700806,  0.001388550,  0.000061035,
  362.   -0.000106812, -0.001907349,  0.001266479, -0.026840210,
  363.   -0.012420654, -0.151962280, -0.221984863, -1.031936646,
  364.    0.913055420,  0.088775635,  0.140670776, -0.009231567,
  365.    0.020690918, -0.002883911,  0.001296997,  0.000061035,
  366.   -0.000122070, -0.002014160,  0.000869751, -0.027725220,
  367.   -0.016708374, -0.152069092, -0.246505737, -1.048156738,
  368.    0.890090942,  0.069168091,  0.137298584, -0.012115479,
  369.    0.019577026, -0.003051758,  0.001205444,  0.000045776,
  370.   -0.000137329, -0.002120972,  0.000442505, -0.028533936,
  371.   -0.021179199, -0.151596069, -0.271591187, -1.063217163,
  372.    0.866363525,  0.050354004,  0.133590698, -0.014801025,
  373.    0.018463135, -0.003173828,  0.001113892,  0.000045776,
  374.   -0.000152588, -0.002243042, -0.000030518, -0.029281616,
  375.   -0.025817871, -0.150497437, -0.297210693, -1.077117920,
  376.    0.841949463,  0.032379150,  0.129562378, -0.017257690,
  377.    0.017349243, -0.003280640,  0.001037598,  0.000030518,
  378.   -0.000167847, -0.002349854, -0.000549316, -0.029937744,
  379.   -0.030609131, -0.148773193, -0.323318481, -1.089782715,
  380.    0.816864014,  0.015228271,  0.125259399, -0.019531250,
  381.    0.016235352, -0.003372192,  0.000961304,  0.000030518,
  382.   -0.000198364, -0.002456665, -0.001098633, -0.030532837,
  383.   -0.035552979, -0.146362305, -0.349868774, -1.101211548,
  384.    0.791213989, -0.001068115,  0.120697021, -0.021575928,
  385.    0.015121460, -0.003417969,  0.000885010,  0.000030518,
  386.   -0.000213623, -0.002578735, -0.001693726, -0.031005859,
  387.   -0.040634155, -0.143264771, -0.376800537, -1.111373901,
  388.    0.765029907, -0.016510010,  0.115921021, -0.023422241,
  389.    0.014022827, -0.003463745,  0.000808716,  0.000030518,
  390.   -0.000244141, -0.002685547, -0.002334595, -0.031387329,
  391.   -0.045837402, -0.139450073, -0.404083252, -1.120223999,
  392.    0.738372803, -0.031082153,  0.110946655, -0.025085449,
  393.    0.012939453, -0.003479004,  0.000747681,  0.000015259,
  394.   -0.000259399, -0.002792358, -0.003005981, -0.031661987,
  395.   -0.051132202, -0.134887695, -0.431655884, -1.127746582,
  396.    0.711318970, -0.044784546,  0.105819702, -0.026535034,
  397.    0.011886597, -0.003479004,  0.000686646,  0.000015259,
  398.   -0.000289917, -0.002899170, -0.003723145, -0.031814575,
  399.   -0.056533813, -0.129577637, -0.459472656, -1.133926392,
  400.    0.683914185, -0.057617188,  0.100540161, -0.027801514,
  401.    0.010848999, -0.003463745,  0.000625610,  0.000015259,
  402.   -0.000320435, -0.002990723, -0.004486084, -0.031845093,
  403.   -0.061996460, -0.123474121, -0.487472534, -1.138763428,
  404.    0.656219482, -0.069595337,  0.095169067, -0.028884888,
  405.    0.009841919, -0.003433228,  0.000579834,  0.000015259,
  406.   -0.000366211, -0.003082275, -0.005294800, -0.031738281,
  407.   -0.067520142, -0.116577148, -0.515609741, -1.142211914,
  408.    0.628295898, -0.080688477,  0.089706421, -0.029785156,
  409.    0.008865356, -0.003387451,  0.000534058,  0.000015259,
  410.   -0.000396729, -0.003173828, -0.006118774, -0.031478882,
  411.   -0.073059082, -0.108856201, -0.543823242, -1.144287109,
  412.    0.600219727, -0.090927124,  0.084182739, -0.030517578,
  413.    0.007919312, -0.003326416,  0.000473022,  0.000015259
  414. };
  415. SynthesisFilter::SynthesisFilter (uint32 channelnumber, real factor){
  416.   register real *floatp, *floatp2;
  417.   // initialize v1[] and v2[]:
  418.   for (floatp = v1 + 512, floatp2 = v2 + 512; floatp > v1; )
  419.     *--floatp = *--floatp2 = 0.0;
  420.   channel = channelnumber;
  421.   number_of_samples = range_violations = written_samples = 0;
  422.   actual_v = v1;
  423.   actual_write_pos = 15;
  424.   scalefactor = factor;
  425. }
  426. void SynthesisFilter::compute_new_v(real *new_v){
  427.   {
  428.     unsigned int i;
  429.     register real sample = 0.0, *v = new_v;
  430.     register const real *cooefs;
  431.     // initialize new_v[]:
  432.     *v++ = sample; *v++ = sample; *v++ = sample; *v++ = sample;
  433.     *v++ = sample; *v++ = sample; *v++ = sample; *v++ = sample;
  434.     *v++ = sample; *v++ = sample; *v++ = sample; *v++ = sample;
  435.     *v++ = sample; *v++ = sample; *v++ = sample; *v++ = sample;
  436.     v = new_v + 33;
  437.     *v++ = sample; *v++ = sample; *v++ = sample; *v++ = sample;
  438.     *v++ = sample; *v++ = sample; *v++ = sample; *v++ = sample;
  439.     *v++ = sample; *v++ = sample; *v++ = sample; *v++ = sample;
  440.     *v++ = sample; *v++ = sample; *v++ = sample; *v++ = sample;
  441.     // compute new values:
  442.     for (i = 0; i < number_of_samples; ++i){
  443.       sample = samples[i];
  444.       cooefs = n[subbandnumbers[i]];
  445.       v = new_v;
  446.       // add to new_v[0]-new_v[15]: (new_v[16] remains always 0.0)
  447.       *v++ += sample * *cooefs++; *v++ += sample * *cooefs++;
  448.       *v++ += sample * *cooefs++; *v++ += sample * *cooefs++;
  449.       *v++ += sample * *cooefs++; *v++ += sample * *cooefs++;
  450.       *v++ += sample * *cooefs++; *v++ += sample * *cooefs++;
  451.       *v++ += sample * *cooefs++; *v++ += sample * *cooefs++;
  452.       *v++ += sample * *cooefs++; *v++ += sample * *cooefs++;
  453.       *v++ += sample * *cooefs++; *v++ += sample * *cooefs++;
  454.       *v++ += sample * *cooefs++; *v++ += sample * *cooefs++;
  455.       v = new_v + 33;
  456.       // add to new_v[33]-new_v[47]:
  457.       *v++ += sample * *cooefs++; *v++ += sample * *cooefs++;
  458.       *v++ += sample * *cooefs++; *v++ += sample * *cooefs++;
  459.       *v++ += sample * *cooefs++; *v++ += sample * *cooefs++;
  460.       *v++ += sample * *cooefs++; *v++ += sample * *cooefs++;
  461.       *v++ += sample * *cooefs++; *v++ += sample * *cooefs++;
  462.       *v++ += sample * *cooefs++; *v++ += sample * *cooefs++;
  463.       *v++ += sample * *cooefs++; *v++ += sample * *cooefs++;
  464.       *v++ += sample * *cooefs++;
  465.       *v   -= sample; // new_v[48]
  466.     }
  467.   }
  468.   // fold new values to there boundaries: (a few streams need this)
  469.   {
  470.     register real *v;
  471.     for (v = new_v + 15; v >= new_v; --v)
  472.       if (*v < -1.0)
  473. *v = -1.0;
  474.       else if (*v > 1.0)
  475. *v = 1.0;
  476.     for (v = new_v + 48; v >= new_v + 33; --v)
  477.       if (*v < -1.0)
  478. *v = -1.0;
  479.       else if (*v > 1.0)
  480. *v = 1.0;
  481.   }
  482.   {
  483.     // copy values -new_v[0-15] to new_v[32-17]:
  484.     register real *v1 = new_v, *v2 = new_v + 33;
  485.     *--v2 = -*v1++; *--v2 = -*v1++; *--v2 = -*v1++; *--v2 = -*v1++;
  486.     *--v2 = -*v1++; *--v2 = -*v1++; *--v2 = -*v1++; *--v2 = -*v1++;
  487.     *--v2 = -*v1++; *--v2 = -*v1++; *--v2 = -*v1++; *--v2 = -*v1++;
  488.     *--v2 = -*v1++; *--v2 = -*v1++; *--v2 = -*v1++; *--v2 = -*v1++;
  489.     // copy values new_v[33-47] to new_v[63-49]:
  490.     v1 = new_v + 33;
  491.     v2 = new_v + 64;
  492.     *--v2 = *v1++; *--v2 = *v1++; *--v2 = *v1++; *--v2 = *v1++;
  493.     *--v2 = *v1++; *--v2 = *v1++; *--v2 = *v1++; *--v2 = *v1++;
  494.     *--v2 = *v1++; *--v2 = *v1++; *--v2 = *v1++; *--v2 = *v1++;
  495.     *--v2 = *v1++; *--v2 = *v1++; *--v2 = *v1++;
  496.   }
  497.   // insert new values into v1[] and v2[]:
  498.   {
  499.     register int i;
  500.     register real *nnv, *nv;
  501.     // insert new_v[0-31] into actual v:
  502.     nnv = new_v;
  503.     nv = actual_v + actual_write_pos;
  504.     for (i = 0; i < 32; ++i, nv += 16)
  505.       *nv = *nnv++;
  506.     // insert new_v[32-63] into other v:
  507.     nv = (actual_v == v1 ? v2 : v1) + actual_write_pos;
  508.     for (; i < 64; ++i, nv += 16)
  509.       *nv = *nnv++;
  510.   }
  511. }
  512. void SynthesisFilter::compute_pcm_samples (Obuffer *buffer){
  513.   int i;
  514.   register real floatreg, *lower_bound, *vp;
  515.   register const real *dp;
  516.   int pcm_sample;
  517.   dp = d;
  518.   lower_bound = actual_v;
  519.   if (actual_write_pos != 15)
  520.     for (i = 0; i < 32; ++i)
  521.     {
  522.       floatreg = 0;
  523.       for (vp = lower_bound + actual_write_pos + 1; vp > lower_bound; )
  524.         floatreg += *--vp * *dp++;
  525.       for (vp += 16; vp > lower_bound + actual_write_pos + 1; )
  526.         floatreg += *--vp * *dp++;
  527.       pcm_sample = (int)(floatreg * scalefactor);
  528.       if (pcm_sample > 32767)
  529.         {
  530.           ++range_violations;
  531.           if (floatreg > max_violation)
  532.             max_violation = floatreg;
  533.           pcm_sample = 32767;
  534.         }
  535.       else if (pcm_sample < -32768)
  536.         {
  537.           ++range_violations;
  538.           if (-floatreg > max_violation)
  539.             max_violation = -floatreg;
  540.           pcm_sample = -32768;
  541.         }
  542.       buffer->append (channel, (int16)pcm_sample);
  543.       lower_bound += 16;
  544.     }
  545.   else
  546.     for (i = 0; i < 32; ++i)
  547.       {
  548.         floatreg = 0;
  549.         for (vp = lower_bound + 16; vp > lower_bound; )
  550.           floatreg += *--vp * *dp++;
  551.         
  552.         pcm_sample = (int)(floatreg * scalefactor);
  553.         if (pcm_sample > 32767)
  554.           {
  555.             ++range_violations;
  556.             if (floatreg > max_violation)
  557.               max_violation = floatreg;
  558.             pcm_sample = 32767;
  559.           }
  560.         else if (pcm_sample < -32768)
  561.           {
  562.             ++range_violations;
  563.             if (-floatreg > max_violation)
  564.               max_violation = -floatreg;
  565.             pcm_sample = -32768;
  566.           }
  567.         buffer->append (channel, (int16)pcm_sample);
  568.         lower_bound += 16;
  569.       }
  570. }
  571. void SynthesisFilter::calculate_pcm_samples (Obuffer *buffer){
  572.   static real new_v[64];
  573.   compute_new_v (new_v);
  574.   compute_pcm_samples (buffer);
  575.   written_samples += 32;
  576.   if (actual_write_pos < 15)
  577.     ++actual_write_pos;
  578.   else
  579.     actual_write_pos = 0;
  580.   actual_v = (actual_v == v1 ? v2 : v1);
  581.   number_of_samples = 0;
  582. }