summaryrefslogtreecommitdiffstats
path: root/sys/dev
diff options
context:
space:
mode:
authorcg <cg@FreeBSD.org>2001-01-24 01:22:53 +0000
committercg <cg@FreeBSD.org>2001-01-24 01:22:53 +0000
commit456c0fc978869a36de39b3f37e7bd25b38545795 (patch)
tree6d725f979396994b36bfaa89adae06d63f0c0ff7 /sys/dev
parent9de50bdccefda0c20f9b20a3d2721791e51c3fbc (diff)
downloadFreeBSD-src-456c0fc978869a36de39b3f37e7bd25b38545795.zip
FreeBSD-src-456c0fc978869a36de39b3f37e7bd25b38545795.tar.gz
fix blocksizing for playback, implement blocksizing for record
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/sound/pci/ds1.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/sys/dev/sound/pci/ds1.c b/sys/dev/sound/pci/ds1.c
index f070dee..64db2b7 100644
--- a/sys/dev/sound/pci/ds1.c
+++ b/sys/dev/sound/pci/ds1.c
@@ -40,6 +40,7 @@
#define DS1_CHANS 4
#define DS1_RECPRIMARY 0
#define DS1_IRQHZ ((48000 << 8) / 256)
+#define DS1_BUFFSIZE 4096
struct pbank {
volatile u_int32_t Format;
@@ -487,7 +488,7 @@ ds1pchan_init(kobj_t obj, void *devinfo, snd_dbuf *b, pcm_channel *c, int dir)
ch->fmt = AFMT_U8;
ch->spd = 8000;
ch->run = 0;
- if (sndbuf_alloc(ch->buffer, sc->parent_dmat, 4096) == -1)
+ if (sndbuf_alloc(ch->buffer, sc->parent_dmat, DS1_BUFFSIZE) == -1)
return NULL;
else {
ch->lsnum = sc->pslotfree;
@@ -528,6 +529,8 @@ ds1pchan_setblocksize(kobj_t obj, void *data, u_int32_t blocksize)
/* 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);
+
return blocksize;
}
@@ -645,6 +648,14 @@ ds1rchan_setspeed(kobj_t obj, void *data, u_int32_t speed)
static int
ds1rchan_setblocksize(kobj_t obj, void *data, u_int32_t blocksize)
{
+ struct sc_rchinfo *ch = data;
+ 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);
+
return blocksize;
}
OpenPOWER on IntegriCloud