[Plib-cvs] plib/src/sl sl.h,1.25,1.26 slEnvelope.cxx,1.5,1.6 slPlayer.cxx,1.4,1.5
Brought to you by:
sjbaker
From: Steve B. <sj...@us...> - 2004-04-06 13:45:15
|
Update of /cvsroot/plib/plib/src/sl In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv18289/plib/src/sl Modified Files: sl.h slEnvelope.cxx slPlayer.cxx Log Message: Added Christos Dimitrakakis' fixes to SL to prevent crackling in certain envelope conditions. Fixed some double-->float warnings in KeyFlier. Index: sl.h =================================================================== RCS file: /cvsroot/plib/plib/src/sl/sl.h,v retrieving revision 1.25 retrieving revision 1.26 diff -u -d -r1.25 -r1.26 --- sl.h 6 Apr 2004 12:53:17 -0000 1.25 +++ sl.h 6 Apr 2004 13:32:26 -0000 1.26 @@ -363,12 +363,13 @@ { protected: - float *time ; - float *value ; - int nsteps ; - int ref_count ; - - slReplayMode replay_mode ; + float *time ; + float *value ; + int nsteps ; + int ref_count ; + float previous_value ; + unsigned char prev_pitchenv ; + slReplayMode replay_mode ; int getStepDelta ( float *_time, float *delta ) const ; @@ -382,7 +383,8 @@ value = new float [ nsteps ] ; memcpy ( time , _times , sizeof(float) * nsteps ) ; memcpy ( value, _values, sizeof(float) * nsteps ) ; - + prev_pitchenv = 0x80 ; + previous_value = 0.0f ; replay_mode = _rm ; } @@ -393,6 +395,8 @@ nsteps = _nsteps ; time = new float [ nsteps ] ; value = new float [ nsteps ] ; + prev_pitchenv = 0x80 ; + previous_value = 0.0f ; for ( int i = 0 ; i < nsteps ; i++ ) time [ i ] = value [ i ] = 0.0 ; @@ -415,6 +419,10 @@ int getPlayCount () const { return ref_count ; } + void applyToLPFilter ( unsigned char *dst, + unsigned char *src, + int nframes, int start ) ; + void setStep ( int n, float _time, float _value ) { if ( n >= 0 && n < nsteps ) @@ -438,10 +446,10 @@ } ; #define SL_MAX_PRIORITY 16 -#define SL_MAX_SAMPLES 16 +#define SL_MAX_SAMPLES 32 #define SL_MAX_CALLBACKS (SL_MAX_SAMPLES * 2) -#define SL_MAX_ENVELOPES 4 -#define SL_MAX_MIXERINPUTS 10 +#define SL_MAX_ENVELOPES 32 +#define SL_MAX_MIXERINPUTS 16 enum slEnvelopeType { Index: slEnvelope.cxx =================================================================== RCS file: /cvsroot/plib/plib/src/sl/slEnvelope.cxx,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- slEnvelope.cxx 2 Sep 2002 06:05:47 -0000 1.5 +++ slEnvelope.cxx 6 Apr 2004 13:32:26 -0000 1.6 @@ -83,7 +83,7 @@ unsigned char tmp [ 512 ] ; float pos = 0 ; float npos = 0 ; - unsigned char last = 0x80 ; + unsigned char last = prev_pitchenv; while ( nframes-- ) { @@ -104,6 +104,7 @@ src -> read ( offset, tmp, next_env ) ; *(dst++) = last = tmp [ offset-1 ] ; + prev_pitchenv = last; } } } @@ -167,6 +168,31 @@ } } +void slEnvelope::applyToLPFilter ( Uchar *dst, Uchar *src, + int nframes, int start ) +{ + float delta ; + float _time = slScheduler::getCurrent() -> getElapsedTime ( start ) ; + int step = getStepDelta ( &_time, &delta ) ; + float _value = delta * (_time - time[step]) + value[step] ; + register float p_v = previous_value; + delta /= (float) slScheduler::getCurrent() -> getRate () ; + + while ( nframes-- ) + { + + register float c_v = (float) ((int)*(src++) - 0x80); + register float f=_value; + p_v = p_v*(1.0-f)+ f*c_v; + register int res = (int)(p_v) + 0x80 ; + _value += delta ; + + *(dst++) = ( res > 255 ) ? 255 : ( res < 0 ) ? 0 : res ; + } + previous_value = p_v; +} + + void slEnvelope::applyToInvVolume ( Uchar *dst, Uchar *src, int nframes, int start ) { Index: slPlayer.cxx =================================================================== RCS file: /cvsroot/plib/plib/src/sl/slPlayer.cxx,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- slPlayer.cxx 2 Sep 2002 06:05:47 -0000 1.4 +++ slPlayer.cxx 6 Apr 2004 13:32:26 -0000 1.5 @@ -118,6 +118,8 @@ case SL_INVERSE_FILTER_ENVELOPE: case SL_FILTER_ENVELOPE : read ( nframes, dst, next_env+1 ) ; + env [ next_env ] -> applyToLPFilter ( dst, dst, nframes, + env_start_time [ next_env ] ) ; break ; case SL_INVERSE_PAN_ENVELOPE : |