diff options
author | cg <cg@FreeBSD.org> | 2000-12-23 03:16:13 +0000 |
---|---|---|
committer | cg <cg@FreeBSD.org> | 2000-12-23 03:16:13 +0000 |
commit | d0b795f25b705ff883368ba3e49f31c3541d3b11 (patch) | |
tree | 076eb63fe5bbf4764062f83df117a0ee11cfc3ed /sys/dev/sound/pci | |
parent | 818087b543b4be6d1211cb39cb7b7204e9ae9f6c (diff) | |
download | FreeBSD-src-d0b795f25b705ff883368ba3e49f31c3541d3b11.zip FreeBSD-src-d0b795f25b705ff883368ba3e49f31c3541d3b11.tar.gz |
update code dealing with snd_dbuf objects to do so using a functional interface
modify chn_setblocksize() to pick a default soft-blocksize appropriate to the
sample rate and format in use. it will aim for a power of two size small
enough to generate block sizes of at most 20ms. it will also set the
hard-blocksize taking into account rate/format conversions in use.
update drivers to implement setblocksize correctly:
updated, tested: sb16, emu10k1, maestro, solo
updated, untested: ad1816, ess, mss, sb8, csa
not updated: ds1, es137x, fm801, neomagic, t4dwave, via82c686
i lack hardware to test: ad1816, csa, fm801, neomagic
others will be updated/tested in the next few days.
Diffstat (limited to 'sys/dev/sound/pci')
-rw-r--r-- | sys/dev/sound/pci/aureal.c | 5 | ||||
-rw-r--r-- | sys/dev/sound/pci/csapcm.c | 18 | ||||
-rw-r--r-- | sys/dev/sound/pci/ds1.c | 14 | ||||
-rw-r--r-- | sys/dev/sound/pci/emu10k1.c | 69 | ||||
-rw-r--r-- | sys/dev/sound/pci/es137x.c | 20 | ||||
-rw-r--r-- | sys/dev/sound/pci/fm801.c | 5 | ||||
-rw-r--r-- | sys/dev/sound/pci/maestro.c | 21 | ||||
-rw-r--r-- | sys/dev/sound/pci/neomagic.c | 3 | ||||
-rw-r--r-- | sys/dev/sound/pci/solo.c | 16 | ||||
-rw-r--r-- | sys/dev/sound/pci/t4dwave.c | 24 | ||||
-rw-r--r-- | sys/dev/sound/pci/via82c686.c | 13 |
11 files changed, 120 insertions, 88 deletions
diff --git a/sys/dev/sound/pci/aureal.c b/sys/dev/sound/pci/aureal.c index e957b07..09ead9f 100644 --- a/sys/dev/sound/pci/aureal.c +++ b/sys/dev/sound/pci/aureal.c @@ -242,7 +242,7 @@ au_prepareoutput(struct au_chinfo *ch, u_int32_t format) { struct au_info *au = ch->parent; int i, stereo = (format & AFMT_STEREO)? 1 : 0; - u_int32_t baseaddr = vtophys(ch->buffer->buf); + u_int32_t baseaddr = vtophys(sndbuf_getbuf(ch->buffer)); au_wr(au, 0, 0x1061c, 0, 4); au_wr(au, 0, 0x10620, 0, 4); @@ -301,9 +301,8 @@ auchan_init(kobj_t obj, void *devinfo, snd_dbuf *b, pcm_channel *c, int dir) ch->parent = au; ch->channel = c; ch->buffer = b; - ch->buffer->bufsize = AU_BUFFSIZE; ch->dir = dir; - if (chn_allocbuf(ch->buffer, au->parent_dmat) == -1) return NULL; + if (sndbuf_alloc(ch->buffer, au->parent_dmat, AU_BUFFSIZE) == -1) return NULL; return ch; } diff --git a/sys/dev/sound/pci/csapcm.c b/sys/dev/sound/pci/csapcm.c index c3ae93e..8bad7b5 100644 --- a/sys/dev/sound/pci/csapcm.c +++ b/sys/dev/sound/pci/csapcm.c @@ -523,8 +523,7 @@ csachan_init(kobj_t obj, void *devinfo, snd_dbuf *b, pcm_channel *c, int dir) ch->parent = csa; ch->channel = c; ch->buffer = b; - ch->buffer->bufsize = CS461x_BUFFSIZE; - if (chn_allocbuf(ch->buffer, csa->parent_dmat) == -1) return NULL; + if (sndbuf_alloc(ch->buffer, csa->parent_dmat, CS461x_BUFFSIZE) == -1) return NULL; return ch; } @@ -538,9 +537,9 @@ csachan_setdir(kobj_t obj, void *data, int dir) resp = &csa->res; if (dir == PCMDIR_PLAY) - csa_writemem(resp, BA1_PBA, vtophys(ch->buffer->buf)); + csa_writemem(resp, BA1_PBA, vtophys(sndbuf_getbuf(ch->buffer))); else - csa_writemem(resp, BA1_CBA, vtophys(ch->buffer->buf)); + csa_writemem(resp, BA1_CBA, vtophys(sndbuf_getbuf(ch->buffer))); ch->dir = dir; return 0; } @@ -606,12 +605,7 @@ csachan_setspeed(kobj_t obj, void *data, u_int32_t speed) static int csachan_setblocksize(kobj_t obj, void *data, u_int32_t blocksize) { -#if notdef - return blocksize; -#else - struct csa_chinfo *ch = data; - return ch->buffer->bufsize / 2; -#endif /* notdef */ + return CS461x_BUFFSIZE / 2; } static int @@ -648,11 +642,11 @@ csachan_getptr(kobj_t obj, void *data) resp = &csa->res; if (ch->dir == PCMDIR_PLAY) { - ptr = csa_readmem(resp, BA1_PBA) - vtophys(ch->buffer->buf); + ptr = csa_readmem(resp, BA1_PBA) - vtophys(sndbuf_getbuf(ch->buffer)); if ((ch->fmt & AFMT_U8) != 0 || (ch->fmt & AFMT_S8) != 0) ptr >>= 1; } else { - ptr = csa_readmem(resp, BA1_CBA) - vtophys(ch->buffer->buf); + ptr = csa_readmem(resp, BA1_CBA) - vtophys(sndbuf_getbuf(ch->buffer)); if ((ch->fmt & AFMT_U8) != 0 || (ch->fmt & AFMT_S8) != 0) ptr >>= 1; } diff --git a/sys/dev/sound/pci/ds1.c b/sys/dev/sound/pci/ds1.c index c215b5a..5d76502 100644 --- a/sys/dev/sound/pci/ds1.c +++ b/sys/dev/sound/pci/ds1.c @@ -431,8 +431,8 @@ ds_setuppch(struct sc_pchinfo *ch) stereo = (ch->fmt & AFMT_STEREO)? 1 : 0; b16 = (ch->fmt & AFMT_16BIT)? 1 : 0; c = stereo? 1 : 0; - buf = ch->buffer->buf; - sz = ch->buffer->bufsize; + buf = sndbuf_getbuf(ch->buffer); + sz = sndbuf_getsize(ch->buffer); ds_initpbank(ch->lslot, c, stereo, b16, ch->spd, buf, sz); ds_initpbank(ch->lslot + 1, c, stereo, b16, ch->spd, buf, sz); @@ -450,8 +450,8 @@ ds_setuprch(struct sc_rchinfo *ch) stereo = (ch->fmt & AFMT_STEREO)? 1 : 0; b16 = (ch->fmt & AFMT_16BIT)? 1 : 0; - buf = ch->buffer->buf; - sz = ch->buffer->bufsize; + buf = sndbuf_getbuf(ch->buffer); + sz = sndbuf_getsize(ch->buffer); pri = (ch->num == DS1_RECPRIMARY)? 1 : 0; for (i = 0; i < 2; i++) { @@ -480,14 +480,13 @@ ds1pchan_init(kobj_t obj, void *devinfo, snd_dbuf *b, pcm_channel *c, int dir) ch = &sc->pch[sc->pchn++]; ch->buffer = b; - ch->buffer->bufsize = 4096; ch->parent = sc; ch->channel = c; ch->dir = dir; ch->fmt = AFMT_U8; ch->spd = 8000; ch->run = 0; - if (chn_allocbuf(ch->buffer, sc->parent_dmat) == -1) + if (sndbuf_alloc(ch->buffer, sc->parent_dmat, 4096) == -1) return NULL; else { ch->lsnum = sc->pslotfree; @@ -602,13 +601,12 @@ ds1rchan_init(kobj_t obj, void *devinfo, snd_dbuf *b, pcm_channel *c, int dir) ch = &sc->rch[sc->rchn]; ch->num = sc->rchn++; ch->buffer = b; - ch->buffer->bufsize = 4096; ch->parent = sc; ch->channel = c; ch->dir = dir; ch->fmt = AFMT_U8; ch->spd = 8000; - if (chn_allocbuf(ch->buffer, sc->parent_dmat) == -1) + if (sndbuf_alloc(ch->buffer, sc->parent_dmat, 4096) == -1) return NULL; else { ch->slot = (ch->num == DS1_RECPRIMARY)? sc->rbank + 2: sc->rbank; diff --git a/sys/dev/sound/pci/emu10k1.c b/sys/dev/sound/pci/emu10k1.c index e199446..e816572 100644 --- a/sys/dev/sound/pci/emu10k1.c +++ b/sys/dev/sound/pci/emu10k1.c @@ -68,7 +68,7 @@ struct sc_info; /* channel registers */ struct sc_pchinfo { - int spd, fmt, run; + int spd, fmt, blksz, run; struct emu_voice *master, *slave; snd_dbuf *buffer; pcm_channel *channel; @@ -76,7 +76,7 @@ struct sc_pchinfo { }; struct sc_rchinfo { - int spd, fmt, run, num; + int spd, fmt, run, blksz, num; u_int32_t idxreg, basereg, sizereg, setupreg, irqmask; snd_dbuf *buffer; pcm_channel *channel; @@ -97,7 +97,7 @@ struct sc_info { int regtype, regid, irqid; void *ih; - int timer; + int timer, timerinterval; int pnum, rnum; struct emu_mem mem; struct emu_voice voice[64]; @@ -303,12 +303,39 @@ emu_enaint(struct sc_info *sc, char channel, int enable) /* stuff */ static int +emu_settimer(struct sc_info *sc) +{ + struct sc_pchinfo *pch; + struct sc_rchinfo *rch; + int i, tmp, rate; + + rate = 0; + for (i = 0; i < EMU_CHANS; i++) { + pch = &sc->pch[i]; + tmp = (pch->spd * sndbuf_getbps(pch->buffer)) / pch->blksz; + if (tmp > rate) + rate = tmp; + } + + for (i = 0; i < 3; i++) { + rch = &sc->rch[i]; + tmp = (rch->spd * sndbuf_getbps(rch->buffer)) / rch->blksz; + if (tmp > rate) + rate = tmp; + } + RANGE(rate, 48, 9600); + sc->timerinterval = 48000 / rate; + emu_wr(sc, TIMER, sc->timerinterval & 0x03ff, 2); + + return sc->timerinterval; +} + +static int emu_enatimer(struct sc_info *sc, int go) { u_int32_t x; if (go) { if (sc->timer++ == 0) { - emu_wr(sc, TIMER, 256, 2); x = emu_rd(sc, INTE, 4); x |= INTE_INTERVALTIMERENB; emu_wr(sc, INTE, x, 4); @@ -430,10 +457,8 @@ emu_vinit(struct sc_info *sc, struct emu_voice *m, struct emu_voice *s, buf = emu_memalloc(sc, sz); if (buf == NULL) return -1; - if (c != NULL) { - c->buffer.buf = buf; - c->buffer.bufsize = sz; - } + if (c != NULL) + sndbuf_setup(&c->buffer, buf, sz); m->start = emu_memstart(sc, buf) * EMUPAGESIZE; m->end = m->start + sz; m->channel = NULL; @@ -631,6 +656,9 @@ emupchan_init(kobj_t obj, void *devinfo, snd_dbuf *b, pcm_channel *c, int dir) ch->buffer = b; ch->parent = sc; ch->channel = c; + ch->blksz = EMU_BUFFSIZE / 2; + ch->fmt = AFMT_U8; + ch->spd = 8000; ch->master = emu_valloc(sc); ch->slave = emu_valloc(sc); if (emu_vinit(sc, ch->master, ch->slave, EMU_BUFFSIZE, ch->channel)) @@ -645,7 +673,7 @@ emupchan_free(kobj_t obj, void *data) struct sc_pchinfo *ch = data; struct sc_info *sc = ch->parent; - return emu_memfree(sc, ch->buffer->buf); + return emu_memfree(sc, sndbuf_getbuf(ch->buffer)); } static int @@ -669,6 +697,14 @@ emupchan_setspeed(kobj_t obj, void *data, u_int32_t speed) static int emupchan_setblocksize(kobj_t obj, void *data, u_int32_t blocksize) { + struct sc_pchinfo *ch = data; + struct sc_info *sc = ch->parent; + int irqrate, blksz; + + ch->blksz = blocksize; + emu_settimer(sc); + irqrate = 48000 / sc->timerinterval; + blksz = (ch->spd * sndbuf_getbps(ch->buffer)) / irqrate; return blocksize; } @@ -684,6 +720,7 @@ emupchan_trigger(kobj_t obj, void *data, int go) if (go == PCMTRIG_START) { emu_vsetup(ch); emu_vwrite(sc, ch->master); + emu_settimer(sc); emu_enatimer(sc, 1); #ifdef EMUDEBUG printf("start [%d bit, %s, %d hz]\n", @@ -737,9 +774,9 @@ emurchan_init(kobj_t obj, void *devinfo, snd_dbuf *b, pcm_channel *c, int dir) KASSERT(dir == PCMDIR_REC, ("emurchan_init: bad direction")); ch = &sc->rch[sc->rnum]; ch->buffer = b; - ch->buffer->bufsize = EMU_BUFFSIZE; ch->parent = sc; ch->channel = c; + ch->blksz = EMU_BUFFSIZE / 2; ch->fmt = AFMT_U8; ch->spd = 8000; ch->num = sc->rnum; @@ -769,10 +806,10 @@ emurchan_init(kobj_t obj, void *devinfo, snd_dbuf *b, pcm_channel *c, int dir) break; } sc->rnum++; - if (chn_allocbuf(ch->buffer, sc->parent_dmat) == -1) + if (sndbuf_alloc(ch->buffer, sc->parent_dmat, EMU_BUFFSIZE) == -1) return NULL; else { - emu_wrptr(sc, 0, ch->basereg, vtophys(ch->buffer->buf)); + emu_wrptr(sc, 0, ch->basereg, vtophys(sndbuf_getbuf(ch->buffer))); emu_wrptr(sc, 0, ch->sizereg, 0); /* off */ return ch; } @@ -805,6 +842,14 @@ emurchan_setspeed(kobj_t obj, void *data, u_int32_t speed) static int emurchan_setblocksize(kobj_t obj, void *data, u_int32_t blocksize) { + struct sc_rchinfo *ch = data; + struct sc_info *sc = ch->parent; + int irqrate, blksz; + + ch->blksz = blocksize; + emu_settimer(sc); + irqrate = 48000 / sc->timerinterval; + blksz = (ch->spd * sndbuf_getbps(ch->buffer)) / irqrate; return blocksize; } diff --git a/sys/dev/sound/pci/es137x.c b/sys/dev/sound/pci/es137x.c index 15779e8..0206dce 100644 --- a/sys/dev/sound/pci/es137x.c +++ b/sys/dev/sound/pci/es137x.c @@ -253,9 +253,8 @@ eschan_init(kobj_t obj, void *devinfo, snd_dbuf *b, pcm_channel *c, int dir) ch->parent = es; ch->channel = c; ch->buffer = b; - ch->buffer->bufsize = ES_BUFFSIZE; ch->num = ch->parent->num++; - if (chn_allocbuf(ch->buffer, es->parent_dmat) == -1) return NULL; + if (sndbuf_alloc(ch->buffer, es->parent_dmat, ES_BUFFSIZE) == -1) return NULL; return ch; } @@ -269,16 +268,16 @@ eschan_setdir(kobj_t obj, void *data, int dir) bus_space_write_1(es->st, es->sh, ES1370_REG_MEMPAGE, ES1370_REG_DAC2_FRAMEADR >> 8); bus_space_write_4(es->st, es->sh, ES1370_REG_DAC2_FRAMEADR & 0xff, - vtophys(ch->buffer->buf)); + vtophys(sndbuf_getbuf(ch->buffer))); bus_space_write_4(es->st, es->sh, ES1370_REG_DAC2_FRAMECNT & 0xff, - (ch->buffer->bufsize >> 2) - 1); + (sndbuf_getsize(ch->buffer) >> 2) - 1); } else { bus_space_write_1(es->st, es->sh, ES1370_REG_MEMPAGE, ES1370_REG_ADC_FRAMEADR >> 8); bus_space_write_4(es->st, es->sh, ES1370_REG_ADC_FRAMEADR & 0xff, - vtophys(ch->buffer->buf)); + vtophys(sndbuf_getbuf(ch->buffer))); bus_space_write_4(es->st, es->sh, ES1370_REG_ADC_FRAMECNT & 0xff, - (ch->buffer->bufsize >> 2) - 1); + (sndbuf_getsize(ch->buffer) >> 2) - 1); } ch->dir = dir; return 0; @@ -346,10 +345,7 @@ eschan_trigger(kobj_t obj, void *data, int go) if (go == PCMTRIG_EMLDMAWR || go == PCMTRIG_EMLDMARD) return 0; - ss = 1; - ss <<= (ch->fmt & AFMT_STEREO)? 1 : 0; - ss <<= (ch->fmt & AFMT_16BIT)? 1 : 0; - cnt = ch->buffer->dl / ss - 1; + cnt = (sndbuf_runsz(ch->buffer) / sndbuf_getbps(ch->buffer)) - 1; if (ch->dir == PCMDIR_PLAY) { if (go == PCMTRIG_START) { @@ -366,7 +362,7 @@ eschan_trigger(kobj_t obj, void *data, int go) ES1370_REG_DAC2_FRAMECNT >> 8); bus_space_write_4(es->st, es->sh, ES1370_REG_DAC2_FRAMECNT & 0xff, - (ch->buffer->bufsize >> 2) - 1); + (sndbuf_getsize(ch->buffer) >> 2) - 1); } else es->ctrl &= ~CTRL_DAC2_EN; } else { if (go == PCMTRIG_START) { @@ -380,7 +376,7 @@ eschan_trigger(kobj_t obj, void *data, int go) ES1370_REG_ADC_FRAMECNT >> 8); bus_space_write_4(es->st, es->sh, ES1370_REG_ADC_FRAMECNT & 0xff, - (ch->buffer->bufsize >> 2) - 1); + (sndbuf_getsize(ch->buffer) >> 2) - 1); } else es->ctrl &= ~CTRL_ADC_EN; } bus_space_write_4(es->st, es->sh, ES1370_REG_SERIAL_CONTROL, es->sctrl); diff --git a/sys/dev/sound/pci/fm801.c b/sys/dev/sound/pci/fm801.c index a01ea8e..33b9915 100644 --- a/sys/dev/sound/pci/fm801.c +++ b/sys/dev/sound/pci/fm801.c @@ -331,9 +331,8 @@ fm801ch_init(kobj_t obj, void *devinfo, snd_dbuf *b, pcm_channel *c, int dir) ch->parent = fm801; ch->channel = c; ch->buffer = b; - ch->buffer->bufsize = FM801_BUFFSIZE; ch->dir = dir; - if( chn_allocbuf(ch->buffer, fm801->parent_dmat) == -1) return NULL; + if (sndbuf_alloc(ch->buffer, fm801->parent_dmat, FM801_BUFFSIZE) == -1) return NULL; return (void *)ch; } @@ -435,7 +434,7 @@ fm801ch_trigger(kobj_t obj, void *data, int go) { struct fm801_chinfo *ch = data; struct fm801_info *fm801 = ch->parent; - u_int32_t baseaddr = vtophys(ch->buffer->buf); + u_int32_t baseaddr = vtophys(sndbuf_getbuf(ch->buffer)); snd_dbuf *b = ch->buffer; u_int32_t k1; diff --git a/sys/dev/sound/pci/maestro.c b/sys/dev/sound/pci/maestro.c index 5955f77..82e84bf 100644 --- a/sys/dev/sound/pci/maestro.c +++ b/sys/dev/sound/pci/maestro.c @@ -85,6 +85,7 @@ struct agg_chinfo { snd_dbuf *buffer; bus_addr_t offset; u_int32_t blocksize; + u_int32_t speed; int dir; u_int num; u_int16_t aputype; @@ -518,9 +519,9 @@ aggch_start_dac(struct agg_chinfo *ch) { u_int wpwa = APU_USE_SYSMEM | (ch->offset >> 9); u_int size = AGG_BUFSIZ >> 1; - u_int speed = ch->channel->speed; + u_int speed = ch->speed; u_int offset = ch->offset >> 1; - u_int cp = ch->buffer->rp >> 1; + u_int cp = 0; u_int16_t apuch = ch->num << 1; u_int dv; int pan = 0; @@ -613,7 +614,7 @@ calc_timer_freq(struct agg_chinfo *ch) if (ch->aputype == APUTYPE_8BITLINEAR) ss >>= 1; - return (ch->channel->speed * ss + ch->blocksize - 1) / ch->blocksize; + return (ch->speed * ss) / ch->blocksize; } static void @@ -641,6 +642,7 @@ aggch_init(kobj_t obj, void *devinfo, snd_dbuf *b, pcm_channel *c, int dir) struct agg_info *ess = devinfo; struct agg_chinfo *ch; bus_addr_t physaddr; + void *p; ch = (dir == PCMDIR_PLAY)? ess->pch + ess->playchns : &ess->rch; @@ -650,9 +652,10 @@ aggch_init(kobj_t obj, void *devinfo, snd_dbuf *b, pcm_channel *c, int dir) ch->num = ess->playchns; ch->dir = dir; - b->buf = dma_malloc(ess, AGG_BUFSIZ, &physaddr); - if (b->buf == NULL) + p = dma_malloc(ess, AGG_BUFSIZ, &physaddr); + if (p == NULL) return NULL; + sndbuf_setup(b, p, AGG_BUFSIZ); ch->offset = physaddr - ess->baseaddr; if (physaddr < ess->baseaddr || ch->offset > WPWA_MAXADDR) { @@ -663,7 +666,6 @@ aggch_init(kobj_t obj, void *devinfo, snd_dbuf *b, pcm_channel *c, int dir) return NULL; } - b->bufsize = AGG_BUFSIZ; ch->wcreg_tpl = (physaddr - 16) & WAVCACHE_CHCTL_ADDRTAG_MASK; if (dir == PCMDIR_PLAY) { @@ -683,7 +685,7 @@ aggch_free(kobj_t obj, void *data) struct agg_info *ess = ch->parent; /* free up buffer - called after channel stopped */ - dma_free(ess, ch->buffer->buf); + dma_free(ess, sndbuf_getbuf(ch->buffer)); /* return 0 if ok */ return 0; @@ -719,7 +721,10 @@ aggch_setplayformat(kobj_t obj, void *data, u_int32_t format) static int aggch_setspeed(kobj_t obj, void *data, u_int32_t speed) { - return speed; + struct agg_chinfo *ch = data; + + ch->speed = speed; + return ch->speed; } static int diff --git a/sys/dev/sound/pci/neomagic.c b/sys/dev/sound/pci/neomagic.c index 1e2760c..5a6ca8c 100644 --- a/sys/dev/sound/pci/neomagic.c +++ b/sys/dev/sound/pci/neomagic.c @@ -338,8 +338,7 @@ nmchan_init(kobj_t obj, void *devinfo, snd_dbuf *b, pcm_channel *c, int dir) chnbuf = (dir == PCMDIR_PLAY)? sc->pbuf : sc->rbuf; ch = (dir == PCMDIR_PLAY)? &sc->pch : &sc->rch; ch->buffer = b; - ch->buffer->bufsize = NM_BUFFSIZE; - ch->buffer->buf = (u_int8_t *)rman_get_virtual(sc->buf) + chnbuf; + sndbuf_setup(ch->buffer, (u_int8_t *)rman_get_virtual(sc->buf) + chnbuf, NM_BUFFSIZE); if (bootverbose) device_printf(sc->dev, "%s buf %p\n", (dir == PCMDIR_PLAY)? "play" : "rec", ch->buffer->buf); diff --git a/sys/dev/sound/pci/solo.c b/sys/dev/sound/pci/solo.c index 7cb10f3..71a00f1 100644 --- a/sys/dev/sound/pci/solo.c +++ b/sys/dev/sound/pci/solo.c @@ -80,7 +80,7 @@ struct ess_chinfo { pcm_channel *channel; snd_dbuf *buffer; int dir, hwch, stopping; - u_int32_t fmt, spd; + u_int32_t fmt, spd, blksz; }; struct ess_info { @@ -477,7 +477,7 @@ ess_start(struct ess_chinfo *ch) struct ess_info *sc = ch->parent; DEB(printf("ess_start\n");); - ess_setupch(sc, ch->hwch, ch->dir, ch->spd, ch->fmt, ch->buffer->dl); + ess_setupch(sc, ch->hwch, ch->dir, ch->spd, ch->fmt, ch->blksz); ch->stopping = 0; if (ch->hwch == 1) { ess_write(sc, 0xb8, ess_read(sc, 0xb8) | 0x01); @@ -519,9 +519,8 @@ esschan_init(kobj_t obj, void *devinfo, snd_dbuf *b, pcm_channel *c, int dir) ch->parent = sc; ch->channel = c; ch->buffer = b; - ch->buffer->bufsize = ESS_BUFFSIZE; ch->dir = dir; - if (chn_allocbuf(ch->buffer, sc->parent_dmat) == -1) + if (sndbuf_alloc(ch->buffer, sc->parent_dmat, ESS_BUFFSIZE) == -1) return NULL; ch->hwch = 1; if ((dir == PCMDIR_PLAY) && (sc->duplex)) @@ -555,7 +554,10 @@ esschan_setspeed(kobj_t obj, void *data, u_int32_t speed) static int esschan_setblocksize(kobj_t obj, void *data, u_int32_t blocksize) { - return blocksize; + struct ess_chinfo *ch = data; + + ch->blksz = blocksize; + return ch->blksz; } static int @@ -570,7 +572,7 @@ esschan_trigger(kobj_t obj, void *data, int go) switch (go) { case PCMTRIG_START: - ess_dmasetup(sc, ch->hwch, vtophys(ch->buffer->buf), ch->buffer->bufsize, ch->dir); + ess_dmasetup(sc, ch->hwch, vtophys(sndbuf_getbuf(ch->buffer)), sndbuf_getsize(ch->buffer), ch->dir); ess_dmatrigger(sc, ch->hwch, 1); ess_start(ch); break; @@ -780,7 +782,7 @@ ess_dmapos(struct ess_info *sc, int ch) i, p); i = port_rd(sc->vc, 0x4, 2) + 1; p = port_rd(sc->vc, 0x4, 2) + 1; - } while ((p > sc->dmasz[ch -1 ] || i < p || (p - i) > 0x8) && j++ < 1000); + } while ((p > sc->dmasz[ch - 1] || i < p || (p - i) > 0x8) && j++ < 1000); ess_dmatrigger(sc, ch, 1); } else if (ch == 2) diff --git a/sys/dev/sound/pci/t4dwave.c b/sys/dev/sound/pci/t4dwave.c index dee0f9f..1dace66 100644 --- a/sys/dev/sound/pci/t4dwave.c +++ b/sys/dev/sound/pci/t4dwave.c @@ -52,7 +52,7 @@ struct tr_chinfo { u_int32_t eso, delta; u_int32_t rvol, cvol; u_int32_t gvsel, pan, vol, ctrl; - int index, ss; + int index; snd_dbuf *buffer; pcm_channel *channel; struct tr_info *parent; @@ -391,10 +391,9 @@ trchan_init(kobj_t obj, void *devinfo, snd_dbuf *b, pcm_channel *c, int dir) ch->index = -1; } ch->buffer = b; - ch->buffer->bufsize = TR_BUFFSIZE; ch->parent = tr; ch->channel = c; - if (chn_allocbuf(ch->buffer, tr->parent_dmat) == -1) return NULL; + if (sndbuf_alloc(ch->buffer, tr->parent_dmat, TR_BUFFSIZE) == -1) return NULL; else return ch; } @@ -405,9 +404,9 @@ trchan_setdir(kobj_t obj, void *data, int dir) struct tr_info *tr = ch->parent; if (dir == PCMDIR_PLAY && ch->index >= 0) { ch->fmc = ch->fms = ch->ec = ch->alpha = 0; - ch->lba = vtophys(ch->buffer->buf); + ch->lba = vtophys(sndbuf_getbuf(ch->buffer)); ch->cso = 0; - ch->eso = ch->buffer->bufsize - 1; + ch->eso = sndbuf_getsize(ch->buffer) - 1; ch->rvol = ch->cvol = 0; ch->gvsel = 0; ch->pan = 0; @@ -423,10 +422,10 @@ trchan_setdir(kobj_t obj, void *data, int dir) i = tr_rd(tr, TR_REG_DMAR11, 1) & 0x03; tr_wr(tr, TR_REG_DMAR11, i | 0x54, 1); /* set up base address */ - tr_wr(tr, TR_REG_DMAR0, vtophys(ch->buffer->buf), 4); + tr_wr(tr, TR_REG_DMAR0, vtophys(sndbuf_getbuf(ch->buffer)), 4); /* set up buffer size */ i = tr_rd(tr, TR_REG_DMAR4, 4) & ~0x00ffffff; - tr_wr(tr, TR_REG_DMAR4, i | (ch->buffer->bufsize - 1), 4); + tr_wr(tr, TR_REG_DMAR4, i | (sndbuf_getsize(ch->buffer) - 1), 4); } else return -1; return 0; } @@ -438,12 +437,9 @@ trchan_setformat(kobj_t obj, void *data, u_int32_t format) struct tr_info *tr = ch->parent; u_int32_t bits = tr_fmttobits(format); - ch->ss = 1; - ch->ss <<= (format & AFMT_STEREO)? 1 : 0; - ch->ss <<= (format & AFMT_16BIT)? 1 : 0; if (ch->index >= 0) { tr_rdch(tr, ch->index, ch); - ch->eso = (ch->buffer->bufsize / ch->ss) - 1; + ch->eso = (sndbuf_getsize(ch->buffer) / sndbuf_getbps(ch->buffer)) - 1; ch->ctrl = bits | 0x01; tr_wrch(tr, ch->index, ch); } else { @@ -482,7 +478,7 @@ static int trchan_setblocksize(kobj_t obj, void *data, u_int32_t blocksize) { struct tr_chinfo *ch = data; - return ch->buffer->bufsize / 2; + return sndbuf_getsize(ch->buffer) / 2; } static int @@ -516,8 +512,8 @@ trchan_getptr(kobj_t obj, void *data) if (ch->index >= 0) { tr_rdch(tr, ch->index, ch); - return ch->cso * ch->ss; - } else return tr_rd(tr, TR_REG_DMAR0, 4) - vtophys(ch->buffer->buf); + return ch->cso * sndbuf_getbps(ch->buffer); + } else return tr_rd(tr, TR_REG_DMAR0, 4) - vtophys(sndbuf_getbuf(ch->buffer)); } static pcmchan_caps * diff --git a/sys/dev/sound/pci/via82c686.c b/sys/dev/sound/pci/via82c686.c index 27d7aef..70dd9db 100644 --- a/sys/dev/sound/pci/via82c686.c +++ b/sys/dev/sound/pci/via82c686.c @@ -217,9 +217,8 @@ viachan_init(kobj_t obj, void *devinfo, snd_dbuf *b, pcm_channel *c, int dir) ch->parent = via; ch->channel = c; ch->buffer = b; - b->bufsize = VIA_BUFFSIZE; - if (chn_allocbuf(ch->buffer, via->parent_dmat) == -1) return NULL; + if (sndbuf_alloc(ch->buffer, via->parent_dmat, VIA_BUFFSIZE) == -1) return NULL; return ch; } @@ -240,14 +239,14 @@ viachan_setdir(kobj_t obj, void *data, int dir) * is feeding. */ ado = via->sgd_table; - chunk_size = ch->buffer->bufsize / SEGS_PER_CHAN; + chunk_size = sndbuf_getsize(ch->buffer) / SEGS_PER_CHAN; if (dir == PCMDIR_REC) { ado += SEGS_PER_CHAN; } DEB(printf("SGD table located at va %p\n", ado)); - phys_addr = vtophys(ch->buffer->buf); + phys_addr = vtophys(sndbuf_getbuf(ch->buffer)); for (i = 0; i < SEGS_PER_CHAN; i++) { ado->ptr = phys_addr; flag = (i == SEGS_PER_CHAN-1) ? @@ -339,7 +338,7 @@ viachan_setblocksize(kobj_t obj, void *data, u_int32_t blocksize) { struct via_chinfo *ch = data; - return ch->buffer->bufsize / 2; + return sndbuf_getsize(ch->buffer) / 2; } static int @@ -409,7 +408,7 @@ DEB(printf("viachan_getptr: len / base = %x / %x\n", len, base)); if (seg == 0) seg = SEGS_PER_CHAN; /* Now work out offset: seg less count */ - ptr = seg * ch->buffer->bufsize / SEGS_PER_CHAN - len; + ptr = seg * sndbuf_getsize(ch->buffer) / SEGS_PER_CHAN - len; DEB(printf("return ptr=%d\n", ptr)); return ptr; } @@ -430,7 +429,7 @@ DEB(printf("viachan_getptr: len / base = %x / %x\n", len, base)); if (seg == 0) seg = SEGS_PER_CHAN; /* Now work out offset: seg less count */ - ptr = seg * ch->buffer->bufsize / SEGS_PER_CHAN - len; + ptr = seg * sndbuf_getsize(ch->buffer) / SEGS_PER_CHAN - len; /* DMA appears to operate on memory 'lines' of 32 bytes */ /* so don't return any part line - it isn't in RAM yet */ |