4 float slEnvelope::getValue ( float _time )
7 int step = getStepDelta ( &_time, &delta ) ;
9 return delta * (_time - time[step]) + value[step] ;
14 int slEnvelope::getStepDelta ( float *_time, float *delta )
18 if ( replay_mode == SL_SAMPLE_LOOP )
20 tt = floor ( *_time / time [ nsteps-1 ] ) ;
21 *_time -= tt * time [ nsteps-1 ] ;
26 if ( tt <= time[ 0 ] ) { *delta = 0.0f ; return 0 ; }
27 if ( tt >= time[nsteps-1] ) { *delta = 0.0f ; return nsteps-1 ; }
29 for ( int i = 1 ; i <= nsteps-1 ; i++ )
32 float t1 = time[i-1] ; float v1 = value[i-1] ;
33 float t2 = time[ i ] ; float v2 = value[ i ] ;
41 *delta = (v2-v1) / (t2-t1) ;
49 void slEnvelope::applyToVolume ( Uchar *dst, Uchar *src,
50 int nframes, int start )
53 float _time = slScheduler::getCurrent() -> getElapsedTime ( start ) ;
54 int step = getStepDelta ( &_time, &delta ) ;
55 float _value = delta * (_time - time[step]) + value[step] ;
57 delta /= (float) slScheduler::getCurrent() -> getRate () ;
61 register int res = (int)( (float)((int)*(src++)-0x80) * _value ) + 0x80 ;
65 *(dst++) = ( res > 255 ) ? 255 : ( res < 0 ) ? 0 : res ;
69 void slEnvelope::applyToInvVolume ( Uchar *dst, Uchar *src,
70 int nframes, int start )
73 float _time = slScheduler::getCurrent() -> getElapsedTime ( start ) ;
74 int step = getStepDelta ( &_time, &delta ) ;
75 float _value = delta * (_time - time[step]) + value[step] ;
77 delta /= (float) slScheduler::getCurrent() -> getRate () ;
80 _value = 1.0 - _value ;
84 register int res = (int)( (float)((int)*(src++)-0x80) * _value ) + 0x80 ;
88 *(dst++) = ( res > 255 ) ? 255 : ( res < 0 ) ? 0 : res ;