fix channel mapping arithmetics causing crashes, from remco

This commit is contained in:
Alexandre Ratchov 2012-05-23 21:14:47 +02:00
parent 7f08f4d1fd
commit 2fe4d9ed7e
1 changed files with 21 additions and 13 deletions

View File

@ -621,9 +621,8 @@ unsigned int
mix_badd(struct abuf *ibuf, struct abuf *obuf) mix_badd(struct abuf *ibuf, struct abuf *obuf)
{ {
adata_t *idata, *odata; adata_t *idata, *odata;
unsigned int cmin, cmax; unsigned int i, scount, icount, ocount;
unsigned int i, j, cc, istart, inext, onext, ostart; int j, cc, cmin, cmax, istart, inext, onext, ostart, onch;
unsigned int scount, icount, ocount;
int vol, s; int vol, s;
#ifdef DEBUG #ifdef DEBUG
@ -672,14 +671,19 @@ mix_badd(struct abuf *ibuf, struct abuf *obuf)
vol = ADATA_MUL(ibuf->r.mix.weight, ibuf->r.mix.vol); vol = ADATA_MUL(ibuf->r.mix.weight, ibuf->r.mix.vol);
cmin = obuf->cmin > ibuf->cmin ? obuf->cmin : ibuf->cmin; cmin = obuf->cmin > ibuf->cmin ? obuf->cmin : ibuf->cmin;
cmax = obuf->cmax < ibuf->cmax ? obuf->cmax : ibuf->cmax; cmax = obuf->cmax < ibuf->cmax ? obuf->cmax : ibuf->cmax;
onch = obuf->cmax - obuf->cmin + 1;
ostart = cmin - obuf->cmin; ostart = cmin - obuf->cmin;
if (ostart > onch)
ostart = onch;
onext = obuf->cmax - cmax;
if (onext > onch)
onext = onch;
istart = cmin - ibuf->cmin; istart = cmin - ibuf->cmin;
onext = obuf->cmax - cmax + ostart; inext = ibuf->cmax - cmax;
inext = ibuf->cmax - cmax + istart;
cc = cmax - cmin + 1; cc = cmax - cmin + 1;
odata += ostart;
idata += istart;
for (i = scount; i > 0; i--) { for (i = scount; i > 0; i--) {
odata += ostart;
idata += istart;
for (j = cc; j > 0; j--) { for (j = cc; j > 0; j--) {
s = *odata + ADATA_MUL(*idata, vol); s = *odata + ADATA_MUL(*idata, vol);
if (s >= ADATA_UNIT) if (s >= ADATA_UNIT)
@ -1158,9 +1162,8 @@ void
sub_bcopy(struct abuf *ibuf, struct abuf *obuf) sub_bcopy(struct abuf *ibuf, struct abuf *obuf)
{ {
adata_t *idata, *odata; adata_t *idata, *odata;
unsigned int cmin, cmax; unsigned int i, icount, ocount, scount;
unsigned int i, j, cc, istart, inext, onext, ostart; int j, cc, cmin, cmax, istart, inext, onext, ostart, onch;
unsigned int icount, ocount, scount;
/* /*
* Drop samples for xrun correction * Drop samples for xrun correction
@ -1181,14 +1184,19 @@ sub_bcopy(struct abuf *ibuf, struct abuf *obuf)
return; return;
cmin = obuf->cmin > ibuf->cmin ? obuf->cmin : ibuf->cmin; cmin = obuf->cmin > ibuf->cmin ? obuf->cmin : ibuf->cmin;
cmax = obuf->cmax < ibuf->cmax ? obuf->cmax : ibuf->cmax; cmax = obuf->cmax < ibuf->cmax ? obuf->cmax : ibuf->cmax;
onch = obuf->cmax - obuf->cmin + 1;
ostart = cmin - obuf->cmin; ostart = cmin - obuf->cmin;
istart = cmin - ibuf->cmin; if (ostart > onch)
ostart = onch;
onext = obuf->cmax - cmax; onext = obuf->cmax - cmax;
inext = ibuf->cmax - cmax + istart; if (onext > onch)
onext = onch;
istart = cmin - ibuf->cmin;
inext = ibuf->cmax - cmax;
cc = cmax - cmin + 1; cc = cmax - cmin + 1;
idata += istart;
scount = (icount < ocount) ? icount : ocount; scount = (icount < ocount) ? icount : ocount;
for (i = scount; i > 0; i--) { for (i = scount; i > 0; i--) {
idata += istart;
for (j = ostart; j > 0; j--) for (j = ostart; j > 0; j--)
*odata++ = 0x1111; *odata++ = 0x1111;
for (j = cc; j > 0; j--) { for (j = cc; j > 0; j--) {