mirror of
https://github.com/ericonr/sndio.git
synced 2024-02-18 04:45:21 -06:00
simpler resampler
This commit is contained in:
parent
74cb9d0038
commit
16aeebd969
72
aucat/dsp.c
72
aucat/dsp.c
@ -268,40 +268,22 @@ aparams_native(struct aparams *par)
|
||||
}
|
||||
|
||||
/*
|
||||
* return the number of input and output frame that would
|
||||
* be consumed
|
||||
* Return the number of input and output frame that would be consumed
|
||||
* by resamp_do(p, *icnt, *ocnt).
|
||||
*/
|
||||
void
|
||||
resamp_getcnt(struct resamp *p, int *icnt, int *ocnt)
|
||||
{
|
||||
int diff, ifr, ofr;
|
||||
long long idiff, odiff;
|
||||
int cdiff;
|
||||
|
||||
diff = p->diff;
|
||||
ifr = *icnt;
|
||||
ofr = *ocnt;
|
||||
|
||||
for (;;) {
|
||||
if (diff < 0) {
|
||||
if (ifr == 0)
|
||||
break;
|
||||
diff += p->oblksz;
|
||||
ifr--;
|
||||
} else if (diff > 0) {
|
||||
if (ofr == 0)
|
||||
break;
|
||||
diff -= p->iblksz;
|
||||
ofr--;
|
||||
} else {
|
||||
if (ifr == 0 || ofr == 0)
|
||||
break;
|
||||
diff -= p->iblksz;
|
||||
diff += p->oblksz;
|
||||
ifr--;
|
||||
ofr--;
|
||||
}
|
||||
}
|
||||
*icnt -= ifr;
|
||||
*ocnt -= ofr;
|
||||
cdiff = p->oblksz - p->diff;
|
||||
idiff = (long long)*icnt * p->oblksz;
|
||||
odiff = (long long)*ocnt * p->iblksz;
|
||||
if (odiff - idiff >= cdiff)
|
||||
*ocnt = (idiff + cdiff + p->iblksz - 1) / p->iblksz;
|
||||
else
|
||||
*icnt = (odiff + p->diff) / p->oblksz;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -359,7 +341,7 @@ resamp_do(struct resamp *p, adata_t *in, adata_t *out, int icnt, int ocnt)
|
||||
}
|
||||
#endif
|
||||
for (;;) {
|
||||
if (diff < 0) {
|
||||
if (diff >= oblksz) {
|
||||
if (ifr == 0)
|
||||
break;
|
||||
ctx_start ^= 1;
|
||||
@ -368,37 +350,19 @@ resamp_do(struct resamp *p, adata_t *in, adata_t *out, int icnt, int ocnt)
|
||||
*ctx = *idata++;
|
||||
ctx += RESAMP_NCTX;
|
||||
}
|
||||
diff += oblksz;
|
||||
diff -= oblksz;
|
||||
ifr--;
|
||||
} else if (diff > 0) {
|
||||
} else {
|
||||
if (ofr == 0)
|
||||
break;
|
||||
ctx = ctxbuf;
|
||||
for (c = nch; c > 0; c--) {
|
||||
s = ctx[ctx_start];
|
||||
ds = ctx[ctx_start ^ 1] - s;
|
||||
s = ctx[ctx_start ^ 1];
|
||||
ds = ctx[ctx_start] - s;
|
||||
ctx += RESAMP_NCTX;
|
||||
*odata++ = s + ADATA_MULDIV(ds, diff, oblksz);
|
||||
}
|
||||
diff -= iblksz;
|
||||
ofr--;
|
||||
} else {
|
||||
if (ifr == 0 || ofr == 0)
|
||||
break;
|
||||
ctx = ctxbuf + ctx_start;
|
||||
for (c = nch; c > 0; c--) {
|
||||
*odata++ = *ctx;
|
||||
ctx += RESAMP_NCTX;
|
||||
}
|
||||
ctx_start ^= 1;
|
||||
ctx = ctxbuf + ctx_start;
|
||||
for (c = nch; c > 0; c--) {
|
||||
*ctx = *idata++;
|
||||
ctx += RESAMP_NCTX;
|
||||
}
|
||||
diff -= iblksz;
|
||||
diff += oblksz;
|
||||
ifr--;
|
||||
diff += iblksz;
|
||||
ofr--;
|
||||
}
|
||||
}
|
||||
@ -460,8 +424,6 @@ resamp_init(struct resamp *p, unsigned int iblksz,
|
||||
p->iblksz = iblksz;
|
||||
p->oblksz = oblksz;
|
||||
p->diff = 0;
|
||||
p->idelta = 0;
|
||||
p->odelta = 0;
|
||||
p->nch = nch;
|
||||
p->ctx_start = 0;
|
||||
for (i = 0; i < NCHAN_MAX * RESAMP_NCTX; i++)
|
||||
|
@ -116,7 +116,6 @@ struct resamp {
|
||||
adata_t ctx[NCHAN_MAX * RESAMP_NCTX];
|
||||
unsigned int iblksz, oblksz;
|
||||
int diff;
|
||||
int idelta, odelta; /* remainder of ipos/opos */
|
||||
int nch;
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user