diff options
author | cg <cg@FreeBSD.org> | 2000-05-26 21:15:47 +0000 |
---|---|---|
committer | cg <cg@FreeBSD.org> | 2000-05-26 21:15:47 +0000 |
commit | e7de7487d9f2c8301120a8d7b0764cff65dead8c (patch) | |
tree | ef0510b1c060f4f7b7834089dfe7d1fc9ed32632 /sys/dev/sound/isa | |
parent | 8c66999e1dece9580671edf7cd994284f29eacee (diff) | |
download | FreeBSD-src-e7de7487d9f2c8301120a8d7b0764cff65dead8c.zip FreeBSD-src-e7de7487d9f2c8301120a8d7b0764cff65dead8c.tar.gz |
handle emulated dma reads
don't try to get sample size from snd_dbuf
Diffstat (limited to 'sys/dev/sound/isa')
-rw-r--r-- | sys/dev/sound/isa/ad1816.c | 4 | ||||
-rw-r--r-- | sys/dev/sound/isa/ess.c | 2 | ||||
-rw-r--r-- | sys/dev/sound/isa/mss.c | 16 | ||||
-rw-r--r-- | sys/dev/sound/isa/sb.c | 2 | ||||
-rw-r--r-- | sys/dev/sound/isa/sb16.c | 2 | ||||
-rw-r--r-- | sys/dev/sound/isa/sb8.c | 2 |
6 files changed, 19 insertions, 9 deletions
diff --git a/sys/dev/sound/isa/ad1816.c b/sys/dev/sound/isa/ad1816.c index 549ed51..bcf0715 100644 --- a/sys/dev/sound/isa/ad1816.c +++ b/sys/dev/sound/isa/ad1816.c @@ -403,7 +403,9 @@ ad1816chan_trigger(void *data, int go) struct ad1816_info *ad1816 = ch->parent; int wr, reg; - if (go == PCMTRIG_EMLDMAWR) return 0; + if (go == PCMTRIG_EMLDMAWR || go == PCMTRIG_EMLDMARD) + return 0; + buf_isadma(ch->buffer, go); wr = (ch->dir == PCMDIR_PLAY); reg = wr? AD1816_PLAY : AD1816_CAPT; diff --git a/sys/dev/sound/isa/ess.c b/sys/dev/sound/isa/ess.c index 879c029..ffdad21 100644 --- a/sys/dev/sound/isa/ess.c +++ b/sys/dev/sound/isa/ess.c @@ -678,7 +678,7 @@ esschan_trigger(void *data, int go) { struct ess_chinfo *ch = data; - if (go == PCMTRIG_EMLDMAWR) + if (go == PCMTRIG_EMLDMAWR || go == PCMTRIG_EMLDMARD) return 0; switch (go) { diff --git a/sys/dev/sound/isa/mss.c b/sys/dev/sound/isa/mss.c index 3094b9e..1db56c2 100644 --- a/sys/dev/sound/isa/mss.c +++ b/sys/dev/sound/isa/mss.c @@ -49,6 +49,7 @@ struct mss_chinfo { pcm_channel *channel; snd_dbuf *buffer; int dir; + u_int32_t fmt; }; struct mss_info { @@ -1293,6 +1294,7 @@ mss_format(struct mss_chinfo *ch, u_int32_t format) {AFMT_U8, AFMT_MU_LAW, AFMT_S16_LE, AFMT_A_LAW, -1, AFMT_IMA_ADPCM, AFMT_U16_BE, -1}; + ch->fmt = format; for (i = 0; i < 8; i++) if (arg == fmts[i]) break; arg = i << 1; if (format & AFMT_STEREO) arg |= 1; @@ -1309,13 +1311,17 @@ mss_trigger(struct mss_chinfo *ch, int go) { struct mss_info *mss = ch->parent; u_char m; - int retry, wr, cnt; + int retry, wr, cnt, ss; - wr = (ch->dir == PCMDIR_PLAY)? 1 : 0; + ss = 1; + ss <<= (ch->fmt & AFMT_STEREO)? 1 : 0; + ss <<= (ch->fmt & AFMT_16BIT)? 1 : 0; + + wr = (ch->dir == PCMDIR_PLAY)? 1 : 0; m = ad_read(mss, 9); switch (go) { case PCMTRIG_START: - cnt = (ch->buffer->dl / ch->buffer->sample_size) - 1; + cnt = (ch->buffer->dl / ss) - 1; DEB(if (m & 4) printf("OUCH! reg 9 0x%02x\n", m);); m |= wr? I9_PEN : I9_CEN; /* enable DMA */ @@ -1768,7 +1774,9 @@ msschan_trigger(void *data, int go) { struct mss_chinfo *ch = data; - if (go == PCMTRIG_EMLDMAWR) return 0; + if (go == PCMTRIG_EMLDMAWR || go == PCMTRIG_EMLDMARD) + return 0; + buf_isadma(ch->buffer, go); mss_trigger(ch, go); return 0; diff --git a/sys/dev/sound/isa/sb.c b/sys/dev/sound/isa/sb.c index 6b1aa4b..a784311 100644 --- a/sys/dev/sound/isa/sb.c +++ b/sys/dev/sound/isa/sb.c @@ -689,7 +689,7 @@ sbchan_trigger(void *data, int go) { struct sb_chinfo *ch = data; - if (go == PCMTRIG_EMLDMAWR) + if (go == PCMTRIG_EMLDMAWR || go == PCMTRIG_EMLDMARD) return 0; buf_isadma(ch->buffer, go); diff --git a/sys/dev/sound/isa/sb16.c b/sys/dev/sound/isa/sb16.c index 6b1aa4b..a784311 100644 --- a/sys/dev/sound/isa/sb16.c +++ b/sys/dev/sound/isa/sb16.c @@ -689,7 +689,7 @@ sbchan_trigger(void *data, int go) { struct sb_chinfo *ch = data; - if (go == PCMTRIG_EMLDMAWR) + if (go == PCMTRIG_EMLDMAWR || go == PCMTRIG_EMLDMARD) return 0; buf_isadma(ch->buffer, go); diff --git a/sys/dev/sound/isa/sb8.c b/sys/dev/sound/isa/sb8.c index 6b1aa4b..a784311 100644 --- a/sys/dev/sound/isa/sb8.c +++ b/sys/dev/sound/isa/sb8.c @@ -689,7 +689,7 @@ sbchan_trigger(void *data, int go) { struct sb_chinfo *ch = data; - if (go == PCMTRIG_EMLDMAWR) + if (go == PCMTRIG_EMLDMAWR || go == PCMTRIG_EMLDMARD) return 0; buf_isadma(ch->buffer, go); |