Mercurial > SDL_sound_CoreAudio
diff filter_templates.h @ 371:1b463ef9bcc2
More work from Frank.
author | Ryan C. Gordon <icculus@icculus.org> |
---|---|
date | Tue, 25 Jun 2002 17:15:03 +0000 |
parents | eda146d666d1 |
children | 24a610dfbbfd |
line wrap: on
line diff
--- a/filter_templates.h Mon Jun 24 23:13:04 2002 +0000 +++ b/filter_templates.h Tue Jun 25 17:15:03 2002 +0000 @@ -98,6 +98,7 @@ out+= 1800 * sum_h( inp, 9); out-= 2560 * sum_h( inp, 7); out+= 3863 * sum_h( inp, 5); + out-= 6764 * sum_h( inp, 3); out+= 20798 * sum_h( inp, 1); out+= 32770 * (int)inp[0]; @@ -111,59 +112,75 @@ /*-------------------------------------------------------------------------*/ static Sint16* Suffix(increaseRate)( Sint16 *outp, Sint16 *inp, int length, - VarFilter* filt, int* cpos ) + VarFilter* filter, int* cpos ) { const static int fsize = CH(2*_fsize); - Sint16 *filter; + Sint16 *f; int out; int i, pos; Sint16* to; inp -= fsize; to = inp - length; + pos = *cpos; while( inp > to ) { - pos = *cpos; out = 0; - filter = filt->c[pos]; - for( i = 0; i < 4*_fsize; i++ ) - out+= filter[i] * (int)inp[CH(i)]; + f = filter->c[pos]; + for( i = _fsize + 1; --i; inp+=CH(4), f+=4 ) + { + out+= f[0] * (int)inp[CH(0)]; + out+= f[1] * (int)inp[CH(1)]; + out+= f[2] * (int)inp[CH(2)]; + out+= f[3] * (int)inp[CH(3)]; + } outp[0] = out >> 16; - inp -= CH(filt->incr[pos]); + pos = ( pos + filter->denominator - 1 ) % filter->denominator; + inp -= CH( 4 * _fsize ); + inp -= CH( filter->incr[pos] ); outp -= CH(1); - *cpos = ( pos + 1 ) % filt->denominator; } + + *cpos = pos; return outp; } /*-------------------------------------------------------------------------*/ static Sint16* Suffix(decreaseRate)( Sint16 *outp, Sint16 *inp, int length, - VarFilter* filt, int* cpos ) + VarFilter* filter, int* cpos ) { const static int fsize = CH(2*_fsize); - Sint16 *filter; + Sint16 *f; int out; int i, pos; Sint16 *to; inp -= fsize; to = inp + length; + pos = *cpos; while( inp < to ) { - pos = *cpos; out = 0; - filter = filt->c[pos]; - for( i = 0; i < 4*_fsize; i++ ) - out+= filter[i] * inp[CH(i)]; + f = filter->c[pos]; + for( i = _fsize + 1; --i; inp+=CH(4), f+=4 ) + { + out+= f[0] * (int)inp[CH(0)]; + out+= f[1] * (int)inp[CH(1)]; + out+= f[2] * (int)inp[CH(2)]; + out+= f[3] * (int)inp[CH(3)]; + } outp[0] = out >> 16; - inp += CH(filt->incr[pos]); + inp -= CH( 4 * _fsize ); + inp += CH( filter->incr[pos] ); outp += CH(1); - *cpos = ( pos + 1 ) % filt->denominator; + pos = ( pos + 1 ) % filter->denominator; } + + *cpos = pos; return outp; }