DF-3996 / fix.diff
--- a/sys/dev/sound/pci/envy24.c +++ b/sys/dev/sound/pci/envy24.c @@ -1412,7 +1412,7 @@ envy24_p32sl(struct sc_chinfo *ch) length = sndbuf_getready(ch->buffer) / 8; dmabuf = ch->parent->pbuf; data = (u_int32_t *)ch->data; src = sndbuf_getreadyptr(ch->buffer) / 4; - dst = src / 2 + ch->offset; + dst = (src / 2 + ch->offset) % (ch->size / 8); ssize = ch->size / 4; dsize = ch->size / 8; slot = ch->num * 2; @@ -1444,7 +1444,7 @@ envy24_p16sl(struct sc_chinfo *ch) length = sndbuf_getready(ch->buffer) / 4; dmabuf = ch->parent->pbuf; data = (u_int16_t *)ch->data; src = sndbuf_getreadyptr(ch->buffer) / 2; - dst = src / 2 + ch->offset; + dst = (src / 2 + ch->offset) % (ch->size / 4); ssize = ch->size / 2; dsize = ch->size / 4; slot = ch->num * 2; @@ -1486,7 +1486,7 @@ envy24_p8u(struct sc_chinfo *ch) length = sndbuf_getready(ch->buffer) / 2; dmabuf = ch->parent->pbuf; data = (u_int8_t *)ch->data; src = sndbuf_getreadyptr(ch->buffer); - dst = src / 2 + ch->offset; + dst = (src / 2 + ch->offset) % (ch->size / 4); ssize = ch->size; dsize = ch->size / 4; slot = ch->num * 2; @@ -1516,7 +1516,7 @@ envy24_r32sl(struct sc_chinfo *ch) length = sndbuf_getfree(ch->buffer) / 8; dmabuf = ch->parent->rbuf; data = (u_int32_t *)ch->data; dst = sndbuf_getfreeptr(ch->buffer) / 4; - src = dst / 2 + ch->offset; + src = (dst / 2 + ch->offset) % (ch->size / 8); dsize = ch->size / 4; ssize = ch->size / 8; slot = (ch->num - ENVY24_CHAN_REC_ADC1) * 2; @@ -1547,7 +1547,7 @@ envy24_r16sl(struct sc_chinfo *ch) length = sndbuf_getfree(ch->buffer) / 4; dmabuf = ch->parent->rbuf; data = (u_int16_t *)ch->data; dst = sndbuf_getfreeptr(ch->buffer) / 2; - src = dst / 2 + ch->offset; + src = (dst / 2 + ch->offset) % (ch->size / 8); dsize = ch->size / 2; ssize = ch->size / 8; slot = (ch->num - ENVY24_CHAN_REC_ADC1) * 2; |