⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 window.c

📁 fix point版本的Ogg Vorbis decoder
💻 C
字号:
/******************************************************************** *                                                                  * * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE.   * * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS     * * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE * * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING.       * *                                                                  * * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2002             * * by the XIPHOPHORUS Company http://www.xiph.org/                  * *                                                                  * ******************************************************************** function: window functions last mod: $Id: window.c,v 1.17 2002/03/23 03:17:34 xiphmont Exp $ ********************************************************************/#include <stdlib.h>#include <math.h>#include "os.h"#include "misc.h"#include "lookup.h"#ifdef FIXP_SPEED#define SCALE		12#define MULT(a,b)	(((a)>>SCALE) * (b))#else#define SCALE		14#define MULT(a,b)	MUL(SCALE,a,b)#endifFIXP *_vorbis_window(int type, int left){  FIXP *ret=_ogg_calloc(left,sizeof(*ret));  int i;  switch(type){  case 0:    /* The 'vorbis window' (window 0) is sin(sin(x)*sin(x)*2pi) */    {          for(i=0;i<left;i++){#if 1 && defined(FIXED_POINT)	long x=(2*i+1)*(65536/4)/left;	x=vorbis_sinlook_i(x);	x*=x;		/* .14 * .14 -> .28 */	x>>=(28-15);	/* back to PI/2 */	x=vorbis_sinlook_i(x);	ret[i]=x>>(14-SCALE);#else	float x=(i+.5f)/left*M_PI/2.;	x=sin(x);	x*=x;	x*=M_PI/2.f;	x=sin(x);	ret[i]=TO_FIXP_CHK(SCALE,x);#endif      }    }    break;  default:    _ogg_free(ret);    return(NULL);  }  return(ret);}void _vorbis_apply_window(FIXP *d,FIXP *window[2],long *blocksizes,			  int lW,int W,int nW){  lW=(W?lW:0);  nW=(W?nW:0);  {    long n=blocksizes[W];    long ln=blocksizes[lW];    long rn=blocksizes[nW];        long leftbegin=n/4-ln/4;    long leftend=leftbegin+ln/2;        long rightbegin=n/2+n/4-rn/4;    long rightend=rightbegin+rn/2;        int i,p;        for(i=0;i<leftbegin;i++)      d[i]=0;        for(p=0;i<leftend;i++,p++)      d[i]=MULT(d[i],window[lW][p]);        for(i=rightbegin,p=rn/2-1;i<rightend;i++,p--)      d[i]=MULT(d[i],window[nW][p]);        for(;i<n;i++)      d[i]=0;  }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -