diff options
Diffstat (limited to 'sys/dev/sound/isa')
-rw-r--r-- | sys/dev/sound/isa/ad1816.c | 23 | ||||
-rw-r--r-- | sys/dev/sound/isa/ess.c | 22 | ||||
-rw-r--r-- | sys/dev/sound/isa/mss.c | 82 | ||||
-rw-r--r-- | sys/dev/sound/isa/sb16.c | 77 | ||||
-rw-r--r-- | sys/dev/sound/isa/sb8.c | 22 |
5 files changed, 118 insertions, 108 deletions
diff --git a/sys/dev/sound/isa/ad1816.c b/sys/dev/sound/isa/ad1816.c index d6e1dd7..f83aafb 100644 --- a/sys/dev/sound/isa/ad1816.c +++ b/sys/dev/sound/isa/ad1816.c @@ -39,7 +39,7 @@ struct ad1816_chinfo { struct ad1816_info *parent; pcm_channel *channel; snd_dbuf *buffer; - int dir; + int dir, blksz; }; struct ad1816_info { @@ -131,12 +131,12 @@ ad1816_intr(void *arg) c &= AD1816_INTRCI | AD1816_INTRPI; } /* check for capture interupt */ - if (ad1816->rch.buffer->dl && (c & AD1816_INTRCI)) { + if (sndbuf_runsz(ad1816->rch.buffer) && (c & AD1816_INTRCI)) { chn_intr(ad1816->rch.channel); served |= AD1816_INTRCI; /* cp served */ } /* check for playback interupt */ - if (ad1816->pch.buffer->dl && (c & AD1816_INTRPI)) { + if (sndbuf_runsz(ad1816->pch.buffer) && (c & AD1816_INTRPI)) { chn_intr(ad1816->pch.channel); served |= AD1816_INTRPI; /* pb served */ } @@ -311,8 +311,7 @@ ad1816chan_init(kobj_t obj, void *devinfo, snd_dbuf *b, pcm_channel *c, int dir) ch->parent = ad1816; ch->channel = c; ch->buffer = b; - ch->buffer->bufsize = DSP_BUFFSIZE; - if (chn_allocbuf(ch->buffer, ad1816->parent_dmat) == -1) return NULL; + if (sndbuf_alloc(ch->buffer, ad1816->parent_dmat, DSP_BUFFSIZE) == -1) return NULL; return ch; } @@ -322,8 +321,7 @@ ad1816chan_setdir(kobj_t obj, void *data, int dir) struct ad1816_chinfo *ch = data; struct ad1816_info *ad1816 = ch->parent; - ch->buffer->chan = rman_get_start((dir == PCMDIR_PLAY)? - ad1816->drq1 : ad1816->drq2); + sndbuf_isadmasetup(ch->buffer, (dir == PCMDIR_PLAY)? ad1816->drq1 : ad1816->drq2); ch->dir = dir; return 0; } @@ -384,7 +382,10 @@ ad1816chan_setspeed(kobj_t obj, void *data, u_int32_t speed) static int ad1816chan_setblocksize(kobj_t obj, void *data, u_int32_t blocksize) { - return blocksize; + struct ad1816_chinfo *ch = data; + + ch->blksz = blocksize; + return ch->blksz; } static int @@ -397,14 +398,14 @@ ad1816chan_trigger(kobj_t obj, void *data, int go) if (go == PCMTRIG_EMLDMAWR || go == PCMTRIG_EMLDMARD) return 0; - buf_isadma(ch->buffer, go); + sndbuf_isadma(ch->buffer, go); wr = (ch->dir == PCMDIR_PLAY); reg = wr? AD1816_PLAY : AD1816_CAPT; switch (go) { case PCMTRIG_START: /* start only if not already running */ if (!(io_rd(ad1816, reg) & AD1816_ENABLE)) { - int cnt = ((ch->buffer->dl) >> 2) - 1; + int cnt = ((ch->blksz) >> 2) - 1; ad1816_write(ad1816, wr? 8 : 10, cnt); /* count */ ad1816_write(ad1816, wr? 9 : 11, 0); /* reset cur cnt */ ad1816_write(ad1816, 1, ad1816_read(ad1816, 1) | @@ -441,7 +442,7 @@ static int ad1816chan_getptr(kobj_t obj, void *data) { struct ad1816_chinfo *ch = data; - return buf_isadmaptr(ch->buffer); + return sndbuf_isadmaptr(ch->buffer); } static pcmchan_caps * diff --git a/sys/dev/sound/isa/ess.c b/sys/dev/sound/isa/ess.c index f353289..b9c8362 100644 --- a/sys/dev/sound/isa/ess.c +++ b/sys/dev/sound/isa/ess.c @@ -82,7 +82,7 @@ struct ess_chinfo { pcm_channel *channel; snd_dbuf *buffer; int dir, hwch, stopping, run; - u_int32_t fmt, spd; + u_int32_t fmt, spd, blksz; }; struct ess_info { @@ -358,7 +358,7 @@ ess_intr(void *arg) printf("ess: play intr while not running\n"); if (sc->pch.stopping) { sc->pch.run = 0; - buf_isadma(sc->pch.buffer, PCMTRIG_STOP); + sndbuf_isadma(sc->pch.buffer, PCMTRIG_STOP); sc->pch.stopping = 0; if (sc->pch.hwch == 1) ess_write(sc, 0xb8, ess_read(sc, 0xb8) & ~0x01); @@ -373,7 +373,7 @@ ess_intr(void *arg) printf("ess: record intr while not running\n"); if (sc->rch.stopping) { sc->rch.run = 0; - buf_isadma(sc->rch.buffer, PCMTRIG_STOP); + sndbuf_isadma(sc->rch.buffer, PCMTRIG_STOP); sc->rch.stopping = 0; /* XXX: will this stop audio2? */ ess_write(sc, 0xb8, ess_read(sc, 0xb8) & ~0x01); @@ -509,7 +509,7 @@ ess_start(struct ess_chinfo *ch) struct ess_info *sc = ch->parent; int play = (ch->dir == PCMDIR_PLAY)? 1 : 0; - 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); @@ -547,14 +547,13 @@ 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; - if (chn_allocbuf(ch->buffer, sc->parent_dmat) == -1) + if (sndbuf_alloc(ch->buffer, sc->parent_dmat, ESS_BUFFSIZE) == -1) return NULL; ch->dir = dir; ch->hwch = 1; if ((dir == PCMDIR_PLAY) && (sc->duplex)) ch->hwch = 2; - ch->buffer->chan = rman_get_start((ch->hwch == 1)? sc->drq1 : sc->drq2); + sndbuf_isadmasetup(ch->buffer, (ch->hwch == 1)? sc->drq1 : sc->drq2); return ch; } @@ -584,7 +583,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 @@ -598,7 +600,7 @@ esschan_trigger(kobj_t obj, void *data, int go) switch (go) { case PCMTRIG_START: ch->run = 1; - buf_isadma(ch->buffer, go); + sndbuf_isadma(ch->buffer, go); ess_start(ch); break; @@ -616,7 +618,7 @@ esschan_getptr(kobj_t obj, void *data) { struct ess_chinfo *ch = data; - return buf_isadmaptr(ch->buffer); + return sndbuf_isadmaptr(ch->buffer); } static pcmchan_caps * diff --git a/sys/dev/sound/isa/mss.c b/sys/dev/sound/isa/mss.c index 3c6a126..a1802d4 100644 --- a/sys/dev/sound/isa/mss.c +++ b/sys/dev/sound/isa/mss.c @@ -48,7 +48,7 @@ struct mss_chinfo { pcm_channel *channel; snd_dbuf *buffer; int dir; - u_int32_t fmt; + u_int32_t fmt, blksz; }; struct mss_info { @@ -67,7 +67,6 @@ struct mss_info { char mss_indexed_regs[MSS_INDEXED_REGS]; char opl_indexed_regs[OPL_INDEXED_REGS]; - int pdma, rdma; int bd_id; /* used to hold board-id info, eg. sb version, * mss codec type, etc. etc. */ @@ -242,19 +241,17 @@ mss_release_resources(struct mss_info *mss, device_t dev) mss->irq); mss->irq = 0; } - if (mss->drq1) { - bus_release_resource(dev, SYS_RES_DRQ, mss->drq1_rid, - mss->drq1); - mss->drq1 = 0; - mss->pdma = -1; - } - if (mss->drq2) { + if (mss->drq2 && mss->drq2 != mss->drq1) { bus_release_resource(dev, SYS_RES_DRQ, mss->drq2_rid, mss->drq2); mss->drq2 = 0; - mss->rdma = -1; } - if (mss->io_base) { + if (mss->drq1) { + bus_release_resource(dev, SYS_RES_DRQ, mss->drq1_rid, + mss->drq1); + mss->drq1 = 0; + } + if (mss->io_base) { bus_release_resource(dev, SYS_RES_IOPORT, mss->io_rid, mss->io_base); mss->io_base = 0; @@ -274,7 +271,7 @@ mss_release_resources(struct mss_info *mss, device_t dev) static int mss_alloc_resources(struct mss_info *mss, device_t dev) { - int ok = 1; + int pdma, rdma, ok = 1; if (!mss->io_base) mss->io_base = bus_alloc_resource(dev, SYS_RES_IOPORT, &mss->io_rid, 0, ~0, 1, RF_ACTIVE); @@ -296,16 +293,16 @@ mss_alloc_resources(struct mss_info *mss, device_t dev) if (mss->drq2_rid >= 0 && !mss->drq2) ok = 0; if (ok) { - mss->pdma = rman_get_start(mss->drq1); - isa_dma_acquire(mss->pdma); - isa_dmainit(mss->pdma, MSS_BUFFSIZE); + pdma = rman_get_start(mss->drq1); + isa_dma_acquire(pdma); + isa_dmainit(pdma, MSS_BUFFSIZE); mss->bd_flags &= ~BD_F_DUPLEX; if (mss->drq2) { - mss->rdma = rman_get_start(mss->drq2); - isa_dma_acquire(mss->rdma); - isa_dmainit(mss->rdma, MSS_BUFFSIZE); + rdma = rman_get_start(mss->drq2); + isa_dma_acquire(rdma); + isa_dmainit(rdma, MSS_BUFFSIZE); mss->bd_flags |= BD_F_DUPLEX; - } else mss->rdma = mss->pdma; + } else mss->drq2 = mss->drq1; } return ok; } @@ -691,11 +688,11 @@ mss_intr(void *arg) /* get exact reason for full-duplex boards */ c = FULL_DUPLEX(mss)? ad_read(mss, 24) : 0x30; c &= ~served; - if (mss->pch.buffer->dl && (c & 0x10)) { + if (sndbuf_runsz(mss->pch.buffer) && (c & 0x10)) { served |= 0x10; chn_intr(mss->pch.channel); } - if (mss->rch.buffer->dl && (c & 0x20)) { + if (sndbuf_runsz(mss->rch.buffer) && (c & 0x20)) { served |= 0x20; chn_intr(mss->rch.channel); } @@ -935,7 +932,7 @@ mss_trigger(struct mss_chinfo *ch, int go) m = ad_read(mss, 9); switch (go) { case PCMTRIG_START: - cnt = (ch->buffer->dl / ss) - 1; + cnt = (ch->blksz / ss) - 1; DEB(if (m & 4) printf("OUCH! reg 9 0x%02x\n", m);); m |= wr? I9_PEN : I9_CEN; /* enable DMA */ @@ -1015,8 +1012,8 @@ opti931_intr(void *arg) return; } - if (mss->rch.buffer->dl && (mc11 & 8)) chn_intr(mss->rch.channel); - if (mss->pch.buffer->dl && (mc11 & 4)) chn_intr(mss->pch.channel); + if (sndbuf_runsz(mss->rch.buffer) && (mc11 & 8)) chn_intr(mss->rch.channel); + if (sndbuf_runsz(mss->pch.buffer) && (mc11 & 4)) chn_intr(mss->pch.channel); opti_wr(mss, 11, ~mc11); /* ack */ if (--loops) goto again; DEB(printf("xxx too many loops\n");) @@ -1033,10 +1030,9 @@ msschan_init(kobj_t obj, void *devinfo, snd_dbuf *b, pcm_channel *c, int dir) ch->parent = mss; ch->channel = c; ch->buffer = b; - ch->buffer->bufsize = MSS_BUFFSIZE; - ch->buffer->chan = (dir == PCMDIR_PLAY)? mss->pdma : mss->rdma; ch->dir = dir; - if (chn_allocbuf(ch->buffer, mss->parent_dmat) == -1) return NULL; + if (sndbuf_alloc(ch->buffer, mss->parent_dmat, MSS_BUFFSIZE) == -1) return NULL; + sndbuf_isadmasetup(ch->buffer, (dir == PCMDIR_PLAY)? mss->drq1 : mss->drq2); return ch; } @@ -1060,7 +1056,10 @@ msschan_setspeed(kobj_t obj, void *data, u_int32_t speed) static int msschan_setblocksize(kobj_t obj, void *data, u_int32_t blocksize) { - return blocksize; + struct mss_chinfo *ch = data; + + ch->blksz = blocksize; + return ch->blksz; } static int @@ -1071,7 +1070,7 @@ msschan_trigger(kobj_t obj, void *data, int go) if (go == PCMTRIG_EMLDMAWR || go == PCMTRIG_EMLDMARD) return 0; - buf_isadma(ch->buffer, go); + sndbuf_isadma(ch->buffer, go); mss_trigger(ch, go); return 0; } @@ -1080,7 +1079,7 @@ static int msschan_getptr(kobj_t obj, void *data) { struct mss_chinfo *ch = data; - return buf_isadmaptr(ch->buffer); + return sndbuf_isadmaptr(ch->buffer); } static pcmchan_caps * @@ -1496,11 +1495,13 @@ ymf_test(device_t dev, struct mss_info *mss) static int mss_doattach(device_t dev, struct mss_info *mss) { - int flags = device_get_flags(dev); + int pdma, rdma, flags = device_get_flags(dev); char status[SND_STATUSLEN]; if (!mss_alloc_resources(mss, dev)) goto no; mss_init(mss, dev); + pdma = rman_get_start(mss->drq1); + rdma = rman_get_start(mss->drq2); if (flags & DV_F_TRUE_MSS) { /* has IRQ/DMA registers, set IRQ and DMA addr */ #ifdef PC98 /* CS423[12] in PC98 can use IRQ3,5,10,12 */ @@ -1521,13 +1522,12 @@ mss_doattach(device_t dev, struct mss_info *mss) if ((io_rd(mss, 3) & 0x40) == 0) device_printf(dev, "IRQ Conflict?\n"); #endif /* Write IRQ+DMA setup */ - if (pdma_bits[mss->pdma] == -1) goto no; - bits |= pdma_bits[mss->pdma]; - if (mss->pdma != mss->rdma) { - if (mss->rdma == valid_rdma[mss->pdma]) bits |= 4; + if (pdma_bits[pdma] == -1) goto no; + bits |= pdma_bits[pdma]; + if (pdma != rdma) { + if (rdma == valid_rdma[pdma]) bits |= 4; else { - printf("invalid dual dma config %d:%d\n", - mss->pdma, mss->rdma); + printf("invalid dual dma config %d:%d\n", pdma, rdma); goto no; } } @@ -1542,7 +1542,7 @@ mss_doattach(device_t dev, struct mss_info *mss) default: bus_setup_intr(dev, mss->irq, INTR_TYPE_TTY, mss_intr, mss, &mss->ih); } - if (mss->pdma == mss->rdma) + if (pdma == rdma) pcm_setflags(dev, pcm_getflags(dev) | SD_F_SIMPLEX); if (bus_dma_tag_create(/*parent*/NULL, /*alignment*/2, /*boundary*/0, /*lowaddr*/BUS_SPACE_MAXADDR_24BIT, @@ -1555,9 +1555,9 @@ mss_doattach(device_t dev, struct mss_info *mss) goto no; } snprintf(status, SND_STATUSLEN, "at io 0x%lx irq %ld drq %d", - rman_get_start(mss->io_base), rman_get_start(mss->irq), mss->pdma); - if (mss->pdma != mss->rdma) snprintf(status + strlen(status), - SND_STATUSLEN - strlen(status), ":%d", mss->rdma); + rman_get_start(mss->io_base), rman_get_start(mss->irq), pdma); + if (pdma != rdma) snprintf(status + strlen(status), + SND_STATUSLEN - strlen(status), ":%d", rdma); if (pcm_register(dev, mss, 1, 1)) goto no; pcm_addchan(dev, PCMDIR_REC, &msschan_class, mss); diff --git a/sys/dev/sound/isa/sb16.c b/sys/dev/sound/isa/sb16.c index e1485fa..ce69b54 100644 --- a/sys/dev/sound/isa/sb16.c +++ b/sys/dev/sound/isa/sb16.c @@ -84,7 +84,7 @@ struct sb_info { int bd_id; u_long bd_flags; /* board-specific flags */ - int dl, dh, prio, prio16; + int prio, prio16; struct sb_chinfo pch, rch; }; @@ -370,15 +370,15 @@ sb16_release_resources(struct sb_info *sb, device_t dev) bus_release_resource(dev, SYS_RES_IRQ, 0, sb->irq); sb->irq = 0; } - if (sb->drq1) { - bus_release_resource(dev, SYS_RES_DRQ, 0, sb->drq1); - sb->drq1 = 0; - } - if (sb->drq2) { + if (sb->drq2 && (sb->drq2 != sb->drq2)) { bus_release_resource(dev, SYS_RES_DRQ, 1, sb->drq2); sb->drq2 = 0; } - if (sb->io_base) { + if (sb->drq1) { + bus_release_resource(dev, SYS_RES_DRQ, 0, sb->drq1); + sb->drq1 = 0; + } + if (sb->io_base) { bus_release_resource(dev, SYS_RES_IOPORT, 0, sb->io_base); sb->io_base = 0; } @@ -419,6 +419,9 @@ sb16_alloc_resources(struct sb_info *sb, device_t dev) if (sb->drq2) { isa_dma_acquire(rman_get_start(sb->drq2)); isa_dmainit(rman_get_start(sb->drq2), bs); + } else { + sb->drq2 = sb->drq1; + pcm_setflags(dev, pcm_getflags(dev) | SD_F_SIMPLEX); } return 0; } else return ENXIO; @@ -458,15 +461,15 @@ sb_intr(void *arg) } } else { if (c & 1) { /* 8-bit dma */ - if (sb->pch.dch == sb->dl) + if (sb->pch.dch == 1) reason |= 1; - if (sb->rch.dch == sb->dl) + if (sb->rch.dch == 1) reason |= 2; } if (c & 2) { /* 16-bit dma */ - if (sb->pch.dch == sb->dh) + if (sb->pch.dch == 2) reason |= 1; - if (sb->rch.dch == sb->dh) + if (sb->rch.dch == 2) reason |= 2; } } @@ -494,38 +497,43 @@ sb_setup(struct sb_info *sb) int l, pprio; if (sb->bd_flags & BD_F_DMARUN) - buf_isadma(sb->pch.buffer, PCMTRIG_STOP); + sndbuf_isadma(sb->pch.buffer, PCMTRIG_STOP); if (sb->bd_flags & BD_F_DMARUN2) - buf_isadma(sb->rch.buffer, PCMTRIG_STOP); + sndbuf_isadma(sb->rch.buffer, PCMTRIG_STOP); sb->bd_flags &= ~(BD_F_DMARUN | BD_F_DMARUN2); sb_reset_dsp(sb); if (sb->bd_flags & BD_F_SB16X) { pprio = sb->pch.run? 1 : 0; - sb->pch.buffer->chan = pprio? sb->dl : -1; - sb->rch.buffer->chan = pprio? sb->dh : sb->dl; + sndbuf_isadmasetup(sb->pch.buffer, pprio? sb->drq1 : NULL); + sb->pch.dch = pprio? 1 : 0; + sndbuf_isadmasetup(sb->rch.buffer, pprio? sb->drq2 : sb->drq1); + sb->rch.dch = pprio? 2 : 1; } else { if (sb->pch.run && sb->rch.run) { pprio = (sb->rch.fmt & AFMT_16BIT)? 0 : 1; - sb->pch.buffer->chan = pprio? sb->dh : sb->dl; - sb->rch.buffer->chan = pprio? sb->dl : sb->dh; + sndbuf_isadmasetup(sb->pch.buffer, pprio? sb->drq2 : sb->drq1); + sb->pch.dch = pprio? 2 : 1; + sndbuf_isadmasetup(sb->rch.buffer, pprio? sb->drq1 : sb->drq2); + sb->rch.dch = pprio? 1 : 2; } else { if (sb->pch.run) { - sb->pch.buffer->chan = (sb->pch.fmt & AFMT_16BIT)? sb->dh : sb->dl; - sb->rch.buffer->chan = (sb->pch.fmt & AFMT_16BIT)? sb->dl : sb->dh; + sndbuf_isadmasetup(sb->pch.buffer, (sb->pch.fmt & AFMT_16BIT)? sb->drq2 : sb->drq1); + sb->pch.dch = (sb->pch.fmt & AFMT_16BIT)? 2 : 1; + sndbuf_isadmasetup(sb->rch.buffer, (sb->pch.fmt & AFMT_16BIT)? sb->drq1 : sb->drq2); + sb->rch.dch = (sb->pch.fmt & AFMT_16BIT)? 1 : 2; } else if (sb->rch.run) { - sb->pch.buffer->chan = (sb->rch.fmt & AFMT_16BIT)? sb->dl : sb->dh; - sb->rch.buffer->chan = (sb->rch.fmt & AFMT_16BIT)? sb->dh : sb->dl; + sndbuf_isadmasetup(sb->pch.buffer, (sb->rch.fmt & AFMT_16BIT)? sb->drq1 : sb->drq2); + sb->pch.dch = (sb->rch.fmt & AFMT_16BIT)? 1 : 2; + sndbuf_isadmasetup(sb->rch.buffer, (sb->rch.fmt & AFMT_16BIT)? sb->drq2 : sb->drq1); + sb->rch.dch = (sb->rch.fmt & AFMT_16BIT)? 2 : 1; } } } - sb->pch.dch = sb->pch.buffer->chan; - sb->rch.dch = sb->rch.buffer->chan; - - sb->pch.buffer->dir = ISADMA_WRITE; - sb->rch.buffer->dir = ISADMA_READ; + sndbuf_isadmasetdir(sb->pch.buffer, PCMDIR_PLAY); + sndbuf_isadmasetdir(sb->rch.buffer, PCMDIR_REC); /* printf("setup: [pch = %d, pfmt = %d, pgo = %d] [rch = %d, rfmt = %d, rgo = %d]\n", @@ -553,7 +561,7 @@ sb_setup(struct sb_info *sb) v = (ch->fmt & AFMT_STEREO)? DSP_F16_STEREO : 0; v |= (ch->fmt & AFMT_SIGNED)? DSP_F16_SIGNED : 0; sb_cmd2(sb, v, l); - buf_isadma(ch->buffer, PCMTRIG_START); + sndbuf_isadma(ch->buffer, PCMTRIG_START); sb->bd_flags |= BD_F_DMARUN; } @@ -578,7 +586,7 @@ sb_setup(struct sb_info *sb) v = (ch->fmt & AFMT_STEREO)? DSP_F16_STEREO : 0; v |= (ch->fmt & AFMT_SIGNED)? DSP_F16_SIGNED : 0; sb_cmd2(sb, v, l); - buf_isadma(ch->buffer, PCMTRIG_START); + sndbuf_isadma(ch->buffer, PCMTRIG_START); sb->bd_flags |= BD_F_DMARUN2; } @@ -595,10 +603,9 @@ sb16chan_init(kobj_t obj, void *devinfo, snd_dbuf *b, pcm_channel *c, int dir) ch->parent = sb; ch->channel = c; ch->buffer = b; - ch->buffer->bufsize = SB16_BUFFSIZE; ch->dir = dir; - if (chn_allocbuf(ch->buffer, sb->parent_dmat) == -1) + if (sndbuf_alloc(ch->buffer, sb->parent_dmat, SB16_BUFFSIZE) == -1) return NULL; return ch; @@ -632,7 +639,7 @@ sb16chan_setblocksize(kobj_t obj, void *data, u_int32_t blocksize) struct sb_chinfo *ch = data; ch->blksz = blocksize; - return blocksize; + return ch->blksz; } static int @@ -659,7 +666,7 @@ sb16chan_getptr(kobj_t obj, void *data) { struct sb_chinfo *ch = data; - return buf_isadmaptr(ch->buffer); + return sndbuf_isadmaptr(ch->buffer); } static pcmchan_caps * @@ -749,11 +756,9 @@ sb16_attach(device_t dev) if (bus_setup_intr(dev, sb->irq, INTR_TYPE_TTY, sb_intr, sb, &sb->ih)) goto no; - if (!sb->drq2 || (sb->bd_flags & BD_F_SB16X)) + if (sb->bd_flags & BD_F_SB16X) pcm_setflags(dev, pcm_getflags(dev) | SD_F_SIMPLEX); - sb->dl = rman_get_start(sb->drq1); - sb->dh = sb->drq2? rman_get_start(sb->drq2) : sb->dl; sb->prio = 0; if (bus_dma_tag_create(/*parent*/NULL, /*alignment*/2, /*boundary*/0, @@ -770,7 +775,7 @@ sb16_attach(device_t dev) snprintf(status, SND_STATUSLEN, "at io 0x%lx irq %ld drq %ld", rman_get_start(sb->io_base), rman_get_start(sb->irq), rman_get_start(sb->drq1)); - if (sb->drq2) + if (!(pcm_getflags(dev) & SD_F_SIMPLEX)) snprintf(status + strlen(status), SND_STATUSLEN - strlen(status), ":%ld", rman_get_start(sb->drq2)); diff --git a/sys/dev/sound/isa/sb8.c b/sys/dev/sound/isa/sb8.c index b2e66b3..39a8f95 100644 --- a/sys/dev/sound/isa/sb8.c +++ b/sys/dev/sound/isa/sb8.c @@ -64,7 +64,7 @@ struct sb_chinfo { pcm_channel *channel; snd_dbuf *buffer; int dir; - u_int32_t fmt, spd; + u_int32_t fmt, spd, blksz; }; struct sb_info { @@ -463,10 +463,10 @@ sb_intr(void *arg) { struct sb_info *sb = (struct sb_info *)arg; - if (sb->pch.buffer->dl > 0) + if (sndbuf_runsz(sb->pch.buffer) > 0) chn_intr(sb->pch.channel); - if (sb->rch.buffer->dl > 0) + if (sndbuf_runsz(sb->rch.buffer) > 0) chn_intr(sb->rch.channel); sb_rd(sb, DSP_DATA_AVAIL); /* int ack */ @@ -517,7 +517,7 @@ sb_start(struct sb_chinfo *ch) struct sb_info *sb = ch->parent; int play = (ch->dir == PCMDIR_PLAY)? 1 : 0; int stereo = (ch->fmt & AFMT_STEREO)? 1 : 0; - int l = ch->buffer->dl; + int l = ch->blksz; u_char i; l--; @@ -566,10 +566,9 @@ sbchan_init(kobj_t obj, void *devinfo, snd_dbuf *b, pcm_channel *c, int dir) ch->channel = c; ch->dir = dir; ch->buffer = b; - ch->buffer->bufsize = SB_BUFFSIZE; - ch->buffer->chan = rman_get_start(sb->drq); - if (chn_allocbuf(ch->buffer, sb->parent_dmat) == -1) + if (sndbuf_alloc(ch->buffer, sb->parent_dmat, SB_BUFFSIZE) == -1) return NULL; + sndbuf_isadmasetup(ch->buffer, sb->drq); return ch; } @@ -594,7 +593,10 @@ sbchan_setspeed(kobj_t obj, void *data, u_int32_t speed) static int sbchan_setblocksize(kobj_t obj, void *data, u_int32_t blocksize) { - return blocksize; + struct sb_chinfo *ch = data; + + ch->blksz = blocksize; + return ch->blksz; } static int @@ -605,7 +607,7 @@ sbchan_trigger(kobj_t obj, void *data, int go) if (go == PCMTRIG_EMLDMAWR || go == PCMTRIG_EMLDMARD) return 0; - buf_isadma(ch->buffer, go); + sndbuf_isadma(ch->buffer, go); if (go == PCMTRIG_START) sb_start(ch); else @@ -618,7 +620,7 @@ sbchan_getptr(kobj_t obj, void *data) { struct sb_chinfo *ch = data; - return buf_isadmaptr(ch->buffer); + return sndbuf_isadmaptr(ch->buffer); } static pcmchan_caps * |