]> git.mxchange.org Git - simgear.git/blob - src/slEnvelope.cxx
Initial revision.
[simgear.git] / src / slEnvelope.cxx
1
2 #include "sl.h"
3
4 float slEnvelope::getValue ( float _time )
5 {
6   float delta ;
7   int   step = getStepDelta ( &_time, &delta ) ;
8
9   return delta * (_time - time[step]) + value[step] ;
10 }
11
12
13
14 int slEnvelope::getStepDelta ( float *_time, float *delta )
15 {
16   float tt ;
17
18   if ( replay_mode == SL_SAMPLE_LOOP )
19   {
20     tt = floor ( *_time / time [ nsteps-1 ] ) ; 
21     *_time -= tt * time [ nsteps-1 ] ;
22   }
23
24   tt = *_time ;
25
26   if ( tt <= time[    0   ] ) { *delta = 0.0f ; return 0 ; }
27   if ( tt >= time[nsteps-1] ) { *delta = 0.0f ; return nsteps-1 ; }
28
29   for ( int i = 1 ; i <= nsteps-1 ; i++ )
30     if ( tt <= time[i] )
31     {
32       float t1 = time[i-1] ; float v1 = value[i-1] ;
33       float t2 = time[ i ] ; float v2 = value[ i ] ;
34
35       if ( t1 == t2 )
36       {
37         *delta = 0.0f ;
38         return i ;
39       }
40
41       *delta = (v2-v1) / (t2-t1) ;
42       return i-1 ;
43     }
44
45   *delta = 0.0f ;
46   return nsteps - 1 ;
47 }
48
49 void slEnvelope::applyToVolume ( Uchar *dst, Uchar *src,
50                                  int nframes, int start )
51 {
52   float  delta ;
53   float  _time = slScheduler::getCurrent() -> getElapsedTime ( start ) ;
54   int     step = getStepDelta ( &_time, &delta ) ;
55   float _value = delta * (_time - time[step]) + value[step] ;
56
57   delta /= (float) slScheduler::getCurrent() -> getRate () ;
58
59   while ( nframes-- )
60   {
61     register int res = (int)( (float)((int)*(src++)-0x80) * _value ) + 0x80 ;
62
63     _value += delta ;
64
65     *(dst++) = ( res > 255 ) ? 255 : ( res < 0 ) ? 0 : res ;
66   }
67 }
68
69 void slEnvelope::applyToInvVolume ( Uchar *dst, Uchar *src,
70                                     int nframes, int start )
71 {
72   float  delta ;
73   float  _time = slScheduler::getCurrent() -> getElapsedTime ( start ) ;
74   int     step = getStepDelta ( &_time, &delta ) ;
75   float _value = delta * (_time - time[step]) + value[step] ;
76
77   delta /= (float) slScheduler::getCurrent() -> getRate () ;
78
79   delta = - delta ;
80   _value = 1.0 - _value ;
81
82   while ( nframes-- )
83   {
84     register int res = (int)( (float)((int)*(src++)-0x80) * _value ) + 0x80 ;
85
86     _value += delta ;
87
88     *(dst++) = ( res > 255 ) ? 255 : ( res < 0 ) ? 0 : res ;
89   }
90 }
91
92