window.c
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:2k
源码类别:

Windows CE

开发平台:

C/C++

  1. /********************************************************************
  2.  *                                                                  *
  3.  * THIS FILE IS PART OF THE OggVorbis 'TREMOR' CODEC SOURCE CODE.   *
  4.  *                                                                  *
  5.  * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS     *
  6.  * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
  7.  * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING.       *
  8.  *                                                                  *
  9.  * THE OggVorbis 'TREMOR' SOURCE CODE IS (C) COPYRIGHT 1994-2002    *
  10.  * BY THE Xiph.Org FOUNDATION http://www.xiph.org/                  *
  11.  *                                                                  *
  12.  ********************************************************************
  13.  function: window functions
  14.  ********************************************************************/
  15. #include <stdlib.h>
  16. #include "os.h"
  17. #include "misc.h"
  18. #include "window.h"
  19. #include "window_lookup.h"
  20. const void *_vorbis_window(int type, int left){
  21.   switch(type){
  22.   case 0:
  23.     switch(left){
  24.     case 32:
  25.       return vwin64;
  26.     case 64:
  27.       return vwin128;
  28.     case 128:
  29.       return vwin256;
  30.     case 256:
  31.       return vwin512;
  32.     case 512:
  33.       return vwin1024;
  34.     case 1024:
  35.       return vwin2048;
  36.     case 2048:
  37.       return vwin4096;
  38.     case 4096:
  39.       return vwin8192;
  40.     default:
  41.       return(0);
  42.     }
  43.     break;
  44.   default:
  45.     return(0);
  46.   }
  47. }
  48. void _vorbis_apply_window(ogg_int32_t *d,const void *window_p[2],
  49.   long *blocksizes,
  50.   int lW,int W,int nW){
  51.   
  52.   LOOKUP_T *window[2]={window_p[0],window_p[1]};
  53.   long n=blocksizes[W];
  54.   long ln=blocksizes[lW];
  55.   long rn=blocksizes[nW];
  56.   long leftbegin=n/4-ln/4;
  57.   long leftend=leftbegin+ln/2;
  58.   long rightbegin=n/2+n/4-rn/4;
  59.   long rightend=rightbegin+rn/2;
  60.   
  61.   int i,p;
  62.   for(i=0;i<leftbegin;i++)
  63.     d[i]=0;
  64.   for(p=0;i<leftend;i++,p++)
  65.     d[i]=MULT31(d[i],window[lW][p]);
  66.   for(i=rightbegin,p=rn/2-1;i<rightend;i++,p--)
  67.     d[i]=MULT31(d[i],window[nW][p]);
  68.   for(;i<n;i++)
  69.     d[i]=0;
  70. }