OPtimized case of seeking within a single link; reset decode state
[platform/upstream/libvorbis.git] / lib / window.c
1 /********************************************************************
2  *                                                                  *
3  * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE.   *
4  * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS     *
5  * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
6  * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING.       *
7  *                                                                  *
8  * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2002             *
9  * by the XIPHOPHORUS Company http://www.xiph.org/                  *
10  *                                                                  *
11  ********************************************************************
12
13  function: window functions
14  last mod: $Id: window.c,v 1.20 2003/03/04 21:22:11 xiphmont Exp $
15
16  ********************************************************************/
17
18 #include <stdlib.h>
19 #include <math.h>
20 #include "os.h"
21 #include "misc.h"
22
23 float *_vorbis_window_create(int type, int left){
24   float *ret=_ogg_calloc(left,sizeof(*ret));
25   int i;
26
27   switch(type){
28   case 0:
29     /* The 'vorbis window' (window 0) is sin(sin(x)*sin(x)*pi*.5) */
30     {
31     
32       for(i=0;i<left;i++){
33         float x=(i+.5f)/left*M_PI/2.;
34         x=sin(x);
35         x*=x;
36         x*=M_PI/2.f;
37         x=sin(x);
38         ret[i]=x;
39       }
40     }
41     break;
42   default:
43     _ogg_free(ret);
44     return(NULL);
45   }
46   return(ret);
47 }
48
49 void _vorbis_apply_window(float *d,float *window[2],long *blocksizes,
50                           int lW,int W,int nW){
51   lW=(W?lW:0);
52   nW=(W?nW:0);
53
54   {
55     long n=blocksizes[W];
56     long ln=blocksizes[lW];
57     long rn=blocksizes[nW];
58     
59     long leftbegin=n/4-ln/4;
60     long leftend=leftbegin+ln/2;
61     
62     long rightbegin=n/2+n/4-rn/4;
63     long rightend=rightbegin+rn/2;
64     
65     int i,p;
66     
67     for(i=0;i<leftbegin;i++)
68       d[i]=0.f;
69     
70     for(p=0;i<leftend;i++,p++)
71       d[i]*=window[lW][p];
72     
73     for(i=rightbegin,p=rn/2-1;i<rightend;i++,p--)
74       d[i]*=window[nW][p];
75     
76     for(;i<n;i++)
77       d[i]=0.f;
78   }
79 }
80