When calculating the block size to use for a particular sample rate,

round the result up to a multiple of 4 bytes so that it will always
be a multiple of the sample size. Also use the actual buffer size
from sc->bufsz instead of the default DS1_BUFFSIZE.

This fixes panics and bad distortion I have seen on Yamaha DS-1
hardware, mainly when playing certain Real Audio media.

Reviewed by:	orion (an earlier version of the patch)
This commit is contained in:
Ian Dowse 2003-08-23 13:00:48 +00:00
parent 72d173fa8f
commit 3944d0ff35
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=119362

View File

@ -526,12 +526,13 @@ static int
ds1pchan_setblocksize(kobj_t obj, void *data, u_int32_t blocksize)
{
struct sc_pchinfo *ch = data;
struct sc_info *sc = ch->parent;
int drate;
/* irq rate is fixed at 187.5hz */
drate = ch->spd * sndbuf_getbps(ch->buffer);
blocksize = (drate << 8) / DS1_IRQHZ;
sndbuf_resize(ch->buffer, DS1_BUFFSIZE / blocksize, blocksize);
blocksize = roundup2((drate << 8) / DS1_IRQHZ, 4);
sndbuf_resize(ch->buffer, sc->bufsz / blocksize, blocksize);
return blocksize;
}
@ -653,12 +654,13 @@ static int
ds1rchan_setblocksize(kobj_t obj, void *data, u_int32_t blocksize)
{
struct sc_rchinfo *ch = data;
struct sc_info *sc = ch->parent;
int drate;
/* irq rate is fixed at 187.5hz */
drate = ch->spd * sndbuf_getbps(ch->buffer);
blocksize = (drate << 8) / DS1_IRQHZ;
sndbuf_resize(ch->buffer, DS1_BUFFSIZE / blocksize, blocksize);
blocksize = roundup2((drate << 8) / DS1_IRQHZ, 4);
sndbuf_resize(ch->buffer, sc->bufsz / blocksize, blocksize);
return blocksize;
}