Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. extern float wincoef[264];
  2.  
  3. void windowB(float *vbuf, int vb_ptr, unsigned char *pcm)
  4. {
  5.    int i, j;
  6.    int si, bx;
  7.    float *coef;
  8.    float sum;
  9.    long tmp;
  10.  
  11.    si = vb_ptr + 16;
  12.    bx = (si + 32) & 511;
  13.    coef = wincoef;
  14.  
  15. /*-- first 16 --*/
  16.    for (i = 0; i < 16; i++)
  17.    {
  18.       sum = 0.0F;
  19.       for (j = 0; j < 8; j++)
  20.       {
  21.          sum += (*coef++) * vbuf[si];
  22.          si = (si + 64) & 511;
  23.          sum -= (*coef++) * vbuf[bx];
  24.          bx = (bx + 64) & 511;
  25.       }
  26.       si++;
  27.       bx--;
  28.       tmp = (long) sum;
  29.       if (tmp > 32767)
  30.          tmp = 32767;
  31.       else if (tmp < -32768)
  32.          tmp = -32768;
  33.       *pcm++ = ((unsigned char) (tmp >> 8)) ^ 0x80;
  34.    }
  35. /*--  special case --*/
  36.    sum = 0.0F;
  37.    for (j = 0; j < 8; j++)
  38.    {
  39.       sum += (*coef++) * vbuf[bx];
  40.       bx = (bx + 64) & 511;
  41.    }
  42.    tmp = (long) sum;
  43.    if (tmp > 32767)
  44.       tmp = 32767;
  45.    else if (tmp < -32768)
  46.       tmp = -32768;
  47.    *pcm++ = ((unsigned char) (tmp >> 8)) ^ 0x80;
  48. /*-- last 15 --*/
  49.    coef = wincoef + 255;        /* back pass through coefs */
  50.    for (i = 0; i < 15; i++)
  51.    {
  52.       si--;
  53.       bx++;
  54.       sum = 0.0F;
  55.       for (j = 0; j < 8; j++)
  56.       {
  57.          sum += (*coef--) * vbuf[si];
  58.          si = (si + 64) & 511;
  59.          sum += (*coef--) * vbuf[bx];
  60.          bx = (bx + 64) & 511;
  61.       }
  62.       tmp = (long) sum;
  63.       if (tmp > 32767)
  64.          tmp = 32767;
  65.       else if (tmp < -32768)
  66.          tmp = -32768;
  67.       *pcm++ = ((unsigned char) (tmp >> 8)) ^ 0x80;
  68.    }
  69. }
  70. /*------------------------------------------------------------*/
  71. void windowB_dual(float *vbuf, int vb_ptr, unsigned char *pcm)
  72. {
  73.    int i, j;                    /* dual window interleaves output */
  74.    int si, bx;
  75.    float *coef;
  76.    float sum;
  77.    long tmp;
  78.  
  79.    si = vb_ptr + 16;
  80.    bx = (si + 32) & 511;
  81.    coef = wincoef;
  82.  
  83. /*-- first 16 --*/
  84.    for (i = 0; i < 16; i++)
  85.    {
  86.       sum = 0.0F;
  87.       for (j = 0; j < 8; j++)
  88.       {
  89.          sum += (*coef++) * vbuf[si];
  90.          si = (si + 64) & 511;
  91.          sum -= (*coef++) * vbuf[bx];
  92.          bx = (bx + 64) & 511;
  93.       }
  94.       si++;
  95.       bx--;
  96.       tmp = (long) sum;
  97.       if (tmp > 32767)
  98.          tmp = 32767;
  99.       else if (tmp < -32768)
  100.          tmp = -32768;
  101.       *pcm = ((unsigned char) (tmp >> 8)) ^ 0x80;
  102.       pcm += 2;
  103.    }
  104. /*--  special case --*/
  105.    sum = 0.0F;
  106.    for (j = 0; j < 8; j++)
  107.    {
  108.       sum += (*coef++) * vbuf[bx];
  109.       bx = (bx + 64) & 511;
  110.    }
  111.    tmp = (long) sum;
  112.    if (tmp > 32767)
  113.       tmp = 32767;
  114.    else if (tmp < -32768)
  115.       tmp = -32768;
  116.    *pcm = ((unsigned char) (tmp >> 8)) ^ 0x80;
  117.    pcm += 2;
  118. /*-- last 15 --*/
  119.    coef = wincoef + 255;        /* back pass through coefs */
  120.    for (i = 0; i < 15; i++)
  121.    {
  122.       si--;
  123.       bx++;
  124.       sum = 0.0F;
  125.       for (j = 0; j < 8; j++)
  126.       {
  127.          sum += (*coef--) * vbuf[si];
  128.          si = (si + 64) & 511;
  129.          sum += (*coef--) * vbuf[bx];
  130.          bx = (bx + 64) & 511;
  131.       }
  132.       tmp = (long) sum;
  133.       if (tmp > 32767)
  134.          tmp = 32767;
  135.       else if (tmp < -32768)
  136.          tmp = -32768;
  137.       *pcm = ((unsigned char) (tmp >> 8)) ^ 0x80;
  138.       pcm += 2;
  139.    }
  140. }
  141. /*------------------------------------------------------------*/
  142. /*------------------- 16 pt window ------------------------------*/
  143. void windowB16(float *vbuf, int vb_ptr, unsigned char *pcm)
  144. {
  145.    int i, j;
  146.    unsigned char si, bx;
  147.    float *coef;
  148.    float sum;
  149.    long tmp;
  150.  
  151.    si = vb_ptr + 8;
  152.    bx = si + 16;
  153.    coef = wincoef;
  154.  
  155. /*-- first 8 --*/
  156.    for (i = 0; i < 8; i++)
  157.    {
  158.       sum = 0.0F;
  159.       for (j = 0; j < 8; j++)
  160.       {
  161.          sum += (*coef++) * vbuf[si];
  162.          si += 32;
  163.          sum -= (*coef++) * vbuf[bx];
  164.          bx += 32;
  165.       }
  166.       si++;
  167.       bx--;
  168.       coef += 16;
  169.       tmp = (long) sum;
  170.       if (tmp > 32767)
  171.          tmp = 32767;
  172.       else if (tmp < -32768)
  173.          tmp = -32768;
  174.       *pcm++ = ((unsigned char) (tmp >> 8)) ^ 0x80;
  175.    }
  176. /*--  special case --*/
  177.    sum = 0.0F;
  178.    for (j = 0; j < 8; j++)
  179.    {
  180.       sum += (*coef++) * vbuf[bx];
  181.       bx += 32;
  182.    }
  183.    tmp = (long) sum;
  184.    if (tmp > 32767)
  185.       tmp = 32767;
  186.    else if (tmp < -32768)
  187.       tmp = -32768;
  188.    *pcm++ = ((unsigned char) (tmp >> 8)) ^ 0x80;
  189. /*-- last 7 --*/
  190.    coef = wincoef + 255;        /* back pass through coefs */
  191.    for (i = 0; i < 7; i++)
  192.    {
  193.       coef -= 16;
  194.       si--;
  195.       bx++;
  196.       sum = 0.0F;
  197.       for (j = 0; j < 8; j++)
  198.       {
  199.          sum += (*coef--) * vbuf[si];
  200.          si += 32;
  201.          sum += (*coef--) * vbuf[bx];
  202.          bx += 32;
  203.       }
  204.       tmp = (long) sum;
  205.       if (tmp > 32767)
  206.          tmp = 32767;
  207.       else if (tmp < -32768)
  208.          tmp = -32768;
  209.       *pcm++ = ((unsigned char) (tmp >> 8)) ^ 0x80;
  210.    }
  211. }
  212. /*--------------- 16 pt dual window (interleaved output) -----------------*/
  213. void windowB16_dual(float *vbuf, int vb_ptr, unsigned char *pcm)
  214. {
  215.    int i, j;
  216.    unsigned char si, bx;
  217.    float *coef;
  218.    float sum;
  219.    long tmp;
  220.  
  221.    si = vb_ptr + 8;
  222.    bx = si + 16;
  223.    coef = wincoef;
  224.  
  225. /*-- first 8 --*/
  226.    for (i = 0; i < 8; i++)
  227.    {
  228.       sum = 0.0F;
  229.       for (j = 0; j < 8; j++)
  230.       {
  231.          sum += (*coef++) * vbuf[si];
  232.          si += 32;
  233.          sum -= (*coef++) * vbuf[bx];
  234.          bx += 32;
  235.       }
  236.       si++;
  237.       bx--;
  238.       coef += 16;
  239.       tmp = (long) sum;
  240.       if (tmp > 32767)
  241.          tmp = 32767;
  242.       else if (tmp < -32768)
  243.          tmp = -32768;
  244.       *pcm = ((unsigned char) (tmp >> 8)) ^ 0x80;
  245.       pcm += 2;
  246.    }
  247. /*--  special case --*/
  248.    sum = 0.0F;
  249.    for (j = 0; j < 8; j++)
  250.    {
  251.       sum += (*coef++) * vbuf[bx];
  252.       bx += 32;
  253.    }
  254.    tmp = (long) sum;
  255.    if (tmp > 32767)
  256.       tmp = 32767;
  257.    else if (tmp < -32768)
  258.       tmp = -32768;
  259.    *pcm = ((unsigned char) (tmp >> 8)) ^ 0x80;
  260.    pcm += 2;
  261. /*-- last 7 --*/
  262.    coef = wincoef + 255;        /* back pass through coefs */
  263.    for (i = 0; i < 7; i++)
  264.    {
  265.       coef -= 16;
  266.       si--;
  267.       bx++;
  268.       sum = 0.0F;
  269.       for (j = 0; j < 8; j++)
  270.       {
  271.          sum += (*coef--) * vbuf[si];
  272.          si += 32;
  273.          sum += (*coef--) * vbuf[bx];
  274.          bx += 32;
  275.       }
  276.       tmp = (long) sum;
  277.       if (tmp > 32767)
  278.          tmp = 32767;
  279.       else if (tmp < -32768)
  280.          tmp = -32768;
  281.       *pcm = ((unsigned char) (tmp >> 8)) ^ 0x80;
  282.       pcm += 2;
  283.    }
  284. }
  285. /*------------------- 8 pt window ------------------------------*/
  286. void windowB8(float *vbuf, int vb_ptr, unsigned char *pcm)
  287. {
  288.    int i, j;
  289.    int si, bx;
  290.    float *coef;
  291.    float sum;
  292.    long tmp;
  293.  
  294.    si = vb_ptr + 4;
  295.    bx = (si + 8) & 127;
  296.    coef = wincoef;
  297.  
  298. /*-- first 4 --*/
  299.    for (i = 0; i < 4; i++)
  300.    {
  301.       sum = 0.0F;
  302.       for (j = 0; j < 8; j++)
  303.       {
  304.          sum += (*coef++) * vbuf[si];
  305.          si = (si + 16) & 127;
  306.          sum -= (*coef++) * vbuf[bx];
  307.          bx = (bx + 16) & 127;
  308.       }
  309.       si++;
  310.       bx--;
  311.       coef += 48;
  312.       tmp = (long) sum;
  313.       if (tmp > 32767)
  314.          tmp = 32767;
  315.       else if (tmp < -32768)
  316.          tmp = -32768;
  317.       *pcm++ = ((unsigned char) (tmp >> 8)) ^ 0x80;
  318.    }
  319. /*--  special case --*/
  320.    sum = 0.0F;
  321.    for (j = 0; j < 8; j++)
  322.    {
  323.       sum += (*coef++) * vbuf[bx];
  324.       bx = (bx + 16) & 127;
  325.    }
  326.    tmp = (long) sum;
  327.    if (tmp > 32767)
  328.       tmp = 32767;
  329.    else if (tmp < -32768)
  330.       tmp = -32768;
  331.    *pcm++ = ((unsigned char) (tmp >> 8)) ^ 0x80;
  332. /*-- last 3 --*/
  333.    coef = wincoef + 255;        /* back pass through coefs */
  334.    for (i = 0; i < 3; i++)
  335.    {
  336.       coef -= 48;
  337.       si--;
  338.       bx++;
  339.       sum = 0.0F;
  340.       for (j = 0; j < 8; j++)
  341.       {
  342.          sum += (*coef--) * vbuf[si];
  343.          si = (si + 16) & 127;
  344.          sum += (*coef--) * vbuf[bx];
  345.          bx = (bx + 16) & 127;
  346.       }
  347.       tmp = (long) sum;
  348.       if (tmp > 32767)
  349.          tmp = 32767;
  350.       else if (tmp < -32768)
  351.          tmp = -32768;
  352.       *pcm++ = ((unsigned char) (tmp >> 8)) ^ 0x80;
  353.    }
  354. }
  355. /*--------------- 8 pt dual window (interleaved output) -----------------*/
  356. void windowB8_dual(float *vbuf, int vb_ptr, unsigned char *pcm)
  357. {
  358.    int i, j;
  359.    int si, bx;
  360.    float *coef;
  361.    float sum;
  362.    long tmp;
  363.  
  364.    si = vb_ptr + 4;
  365.    bx = (si + 8) & 127;
  366.    coef = wincoef;
  367.  
  368. /*-- first 4 --*/
  369.    for (i = 0; i < 4; i++)
  370.    {
  371.       sum = 0.0F;
  372.       for (j = 0; j < 8; j++)
  373.       {
  374.          sum += (*coef++) * vbuf[si];
  375.          si = (si + 16) & 127;
  376.          sum -= (*coef++) * vbuf[bx];
  377.          bx = (bx + 16) & 127;
  378.       }
  379.       si++;
  380.       bx--;
  381.       coef += 48;
  382.       tmp = (long) sum;
  383.       if (tmp > 32767)
  384.          tmp = 32767;
  385.       else if (tmp < -32768)
  386.          tmp = -32768;
  387.       *pcm = ((unsigned char) (tmp >> 8)) ^ 0x80;
  388.       pcm += 2;
  389.    }
  390. /*--  special case --*/
  391.    sum = 0.0F;
  392.    for (j = 0; j < 8; j++)
  393.    {
  394.       sum += (*coef++) * vbuf[bx];
  395.       bx = (bx + 16) & 127;
  396.    }
  397.    tmp = (long) sum;
  398.    if (tmp > 32767)
  399.       tmp = 32767;
  400.    else if (tmp < -32768)
  401.       tmp = -32768;
  402.    *pcm = ((unsigned char) (tmp >> 8)) ^ 0x80;
  403.    pcm += 2;
  404. /*-- last 3 --*/
  405.    coef = wincoef + 255;        /* back pass through coefs */
  406.    for (i = 0; i < 3; i++)
  407.    {
  408.       coef -= 48;
  409.       si--;
  410.       bx++;
  411.       sum = 0.0F;
  412.       for (j = 0; j < 8; j++)
  413.       {
  414.          sum += (*coef--) * vbuf[si];
  415.          si = (si + 16) & 127;
  416.          sum += (*coef--) * vbuf[bx];
  417.          bx = (bx + 16) & 127;
  418.       }
  419.       tmp = (long) sum;
  420.       if (tmp > 32767)
  421.          tmp = 32767;
  422.       else if (tmp < -32768)
  423.          tmp = -32768;
  424.       *pcm = ((unsigned char) (tmp >> 8)) ^ 0x80;
  425.       pcm += 2;
  426.    }
  427. }
  428.