DF-3998 / fix.diff
--- a/sys/dev/sound/pci/envy24ht.c +++ b/sys/dev/sound/pci/envy24ht.c @@ -1321,7 +1321,9 @@ envy24ht_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; + src -= src % 2; + dst = (src / 2 + ch->offset) % (ch->size / 8); ssize = ch->size / 4; dsize = ch->size / 8; slot = ch->num * 2; @@ -1354,7 +1356,9 @@ envy24ht_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; + src -= src % 2; + dst = (src / 2 + ch->offset) % (ch->size / 4); ssize = ch->size / 2; dsize = ch->size / 4; slot = ch->num * 2; @@ -1396,7 +1400,9 @@ envy24ht_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; + src -= src % 2; + dst = (src / 2 + ch->offset) % (ch->size / 4); ssize = ch->size; dsize = ch->size / 4; slot = ch->num * 2; @@ -1426,7 +1432,9 @@ envy24ht_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; + dst -= dst % 2; + src = (dst / 2 + ch->offset) % (ch->size / 8); dsize = ch->size / 4; ssize = ch->size / 8; slot = (ch->num - ENVY24HT_CHAN_REC_ADC1) * 2; @@ -1456,7 +1464,9 @@ envy24ht_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; + dst -= dst % 2; + src = (dst / 2 + ch->offset) % (ch->size / 8); dsize = ch->size / 2; ssize = ch->size / 8; slot = (ch->num - ENVY24HT_CHAN_REC_ADC1) * 2; |