From a8b02eb198d2c35ea385aaaa962487fbff2bf89b Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Wed, 12 Dec 2012 19:04:57 +0100 Subject: audio/pcmconv: cleanup --- sys/src/cmd/audio/pcmconv/pcmconv.c | 55 +++++++++++++++++++------------------ 1 file changed, 29 insertions(+), 26 deletions(-) diff --git a/sys/src/cmd/audio/pcmconv/pcmconv.c b/sys/src/cmd/audio/pcmconv/pcmconv.c index 37794277c..af004e7a0 100644 --- a/sys/src/cmd/audio/pcmconv/pcmconv.c +++ b/sys/src/cmd/audio/pcmconv/pcmconv.c @@ -23,9 +23,9 @@ struct Chan ulong lΔ; /* filter step */ ulong le; /* filter end */ + int 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 */ @@ -34,17 +34,13 @@ struct Chan }; enum { - Nl = 8, - Nη = 8, - Np = Nl+Nη, - - L = 1<ρ = ((uvlong)orate<ρ == One) - return; + goto Done; + c->tΔ = ((uvlong)irate<lΔ = L; + c->lΔ = 1<<(Nl+Nη); + c->le = nelem(h)<wx = 1 + (c->le / c->lΔ); + c->u = 13128; /* unity scale factor for fir */ if(c->ρ < One){ c->u *= c->ρ; c->u >>= Np; c->lΔ *= c->ρ; c->lΔ >>= Np; + c->wx *= c->tΔ; + c->wx >>= Np; } - c->le = nelem(h)<h = h; if(!init){ init = 1; for(n=0; nh = h; c->hΔ = hΔ; - c->u = 13128; /* unity scale factor for fir */ - c->wx = 2*Nz*irate / orate; c->ix = c->wx; c->t = c->ix<nx = c->wx*2 + count; c->x = sbrk(sizeof(c->x[0]) * c->nx); + count += c->nx; /* account for buffer accumulation */ +Done: + return ((uvlong)count * c->ρ) >> Np; } int @@ -418,7 +420,7 @@ main(int argc, char *argv[]) int *out, *in; Chan ch[8]; Desc i, o; - int k, r, n, m; + int k, n, m, nin, nout; vlong l; void (*oconv)(int *, uchar *, int, int, int) = nil; @@ -473,21 +475,22 @@ main(int argc, char *argv[]) if(i.fmt == 'f' || o.fmt == 'f') setfcr(getfcr() & ~(FPINVAL|FPOVFL)); - n = (sizeof(ibuf)-i.framesz)/i.framesz; - r = n*i.framesz; - m = 3+(n*o.rate)/i.rate; - in = sbrk(sizeof(int) * n); - out = sbrk(sizeof(int) * m); - obuf = sbrk(o.framesz * m); + nin = (sizeof(ibuf)-i.framesz)/i.framesz; + in = sbrk(sizeof(int) * nin); + nout = 0; memset(ch, 0, sizeof(ch)); for(k=0; k < i.channels; k++) - chaninit(&ch[k], i.rate, o.rate, n); + nout = chaninit(&ch[k], i.rate, o.rate, nin); + + out = sbrk(sizeof(int) * nout); + obuf = sbrk(o.framesz * nout); for(;;){ - if(l >= 0 && l < r) - r = l; - n = cread(0, ibuf, r, i.framesz); + n = nin * i.framesz; + if(l >= 0 && l < n) + n = l; + n = cread(0, ibuf, n, i.framesz); if(n < 0) sysfatal("read: %r"); if(l > 0) -- cgit v1.2.3