diff --git a/sys/src/cmd/audio/pcmconv/pcmconv.c b/sys/src/cmd/audio/pcmconv/pcmconv.c index 972debb2a..37794277c 100644 --- a/sys/src/cmd/audio/pcmconv/pcmconv.c +++ b/sys/src/cmd/audio/pcmconv/pcmconv.c @@ -21,8 +21,11 @@ struct Chan ulong tΔ; /* output step */ ulong lΔ; /* filter step */ + ulong le; /* filter end */ - ulong u; /* unity scale */ + int *h; /* filter coefficients */ + int *hΔ; /* coefficient deltas for interpolation */ + int u; /* unity scale */ int wx; /* extra samples */ int ix; /* buffer index */ @@ -32,7 +35,7 @@ struct Chan enum { Nl = 8, - Nη = 8, /* for coefficient interpolation, not implenented */ + Nη = 8, Np = Nl+Nη, L = 1<ρ = ((uvlong)orate<ρ == One) + if(c->ρ == One) return; - c->u = 13128; /* unity scale factor for fir */ c->tΔ = ((uvlong)irate<lΔ = L; if(c->ρ < One){ @@ -56,6 +64,15 @@ chaninit(Chan *c, int irate, int orate, int count) c->lΔ *= c->ρ; c->lΔ >>= Np; } + c->le = nelem(h)<h = h; + if(!init){ + init = 1; + for(n=0; nhΔ = hΔ; + c->u = 13128; /* unity scale factor for fir */ c->wx = 2*Nz*irate / orate; c->ix = c->wx; c->t = c->ix<h; + hΔ = c->hΔ; + lΔ = c->lΔ; + le = c->le; + /* left side */ + x = &c->x[c->t>>Np]; p = c->t & ((1<ρ < One ? (c->ρ * p)>>Np : p; - for(n = c->t>>Np; l < nelem(h)<lΔ) - v += (vlong)c->x[--n] * h[l>>Nη]; + while(l < le){ + i = l >> Nη; + a = l & ((1<>= Nη; + a += h[i]; + v += (vlong)*(--x) * a; + } /* right side */ + x = &c->x[c->t>>Np]; p = (One - p) & ((1<ρ < One ? (c->ρ * p)>>Np : p; - n = c->t>>Np; - if(p == 0){ - /* skip h[0] as it was already been summed above if p == 0 */ + if(p == 0) /* skip h[0] as it was already been summed above if p == 0 */ l += c->lΔ; - n++; + while(l < le){ + i = l >> Nη; + a = l & ((1<>= Nη; + a += h[i]; + v += (vlong)*x++ * a; } - for(; l < nelem(h)<lΔ) - v += (vlong)c->x[n++] * h[l>>Nη]; /* scale */ v >>= 2; @@ -151,8 +182,11 @@ resample(Chan *c, int *x, int *y, ulong count) n = c->t >> Np; n -= c->wx; e -= c->wx; - while(e < i) - c->x[n++] = c->x[e++]; + i -= e; + if(i > 0){ + memmove(c->x + n, c->x + e, i*sizeof(int)); + n += i; + } c->ix = n; } } while(count > 0);