This is tap.c in view mode; [Download] [Up]
#include <stdio.h> #include "lprev.h" #include "tap.h" #include <math.h> /* indicies of taps */ int *tdmi; float Itdmt[] = TAPDLYS; float *tdmt = Itdmt; /* last element in tap delay */ int tdlast; /* gains of taps */ float Itdmg[] = TAPGAINS; float *tdmg = Itdmg; /* delay buffer */ float *tdm = NULL; int ndmtaps; float tapscale = 1.0; /* scales taps 1 -> n only, tap 0 is direct signal */ extern float srate; /* from lprev.c */ extern int debug; tapdly(ibuf, obuf, n) register float *ibuf, *obuf; { register int i, j; register float tdmo = 0; for (j = 0; j < n; j++) { /* use tdmi[0] as loc. of input */ *(tdm + *tdmi) = *(ibuf+j); /* input 1 sample into buffer */ for (i = 0; i < ndmtaps; i++) /* sum N samples from buffer */ tdmo += (*(tdm + *(tdmi + i))) * (*(tdmg + i)); /* decrement indicies to tdm array, with wraparound */ for (i = 0; i < ndmtaps; i++) { if ((--(*(tdmi + i))) < 0) *(tdmi + i) = tdlast; } *(obuf+j) = tdmo; /* write 1 output sample */ tdmo = 0; /* clear for next pass */ } } tapinit() { register int i; /* set tap indicies from tap delay times */ for (ndmtaps = 0; tdmt[ndmtaps] != -1.0; ndmtaps++ ) /* empty */ ; tdmi = (int *) malloc(sizeof(int) * ndmtaps); for (i = 0; i < ndmtaps; i++) tdmi[i] = floor((double) srate * tdmt[i]); tdlast = tdmi[ndmtaps-1]; tdm = (float *) calloc(sizeof(float) * (tdlast+1), 1); for (i = 0; i < ndmtaps; i++) tdmg[i] *= tapscale / ndmtaps; }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.