1
0
mirror of https://github.com/ericonr/sndio.git synced 2024-02-18 04:45:21 -06:00

simpler resampler

This commit is contained in:
Alexandre Ratchov 2016-06-09 16:51:02 +02:00
parent 74cb9d0038
commit 16aeebd969
2 changed files with 17 additions and 56 deletions

View File

@ -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++)

View File

@ -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;
};