mirror of https://github.com/ericonr/sndio.git
fix channel mapping arithmetics causing crashes, from remco
This commit is contained in:
parent
7f08f4d1fd
commit
2fe4d9ed7e
|
@ -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--) {
|
||||||
|
|
Loading…
Reference in New Issue