diff options
author | Jacob Meuser <jakemsr@cvs.openbsd.org> | 2007-08-02 07:15:50 +0000 |
---|---|---|
committer | Jacob Meuser <jakemsr@cvs.openbsd.org> | 2007-08-02 07:15:50 +0000 |
commit | 7f5531714a749969a0f6f621efabd38c4e7ab90b (patch) | |
tree | f95bc46a52523ad1f71b21b67bb9c8ee49bd450e /sys/dev/audio.c | |
parent | cab14cd66574a4c81fc8aed6915cd90860ccc34a (diff) |
the MI audio layer never really knows what encoding the hardware uses;
the hardware drivers just set a conversion function.
when the MI audio layer needs to add silence, it adds silence in the
userland format, but the amount added is for the hardware sample size.
this diff fixes both record mode by sending the right amount, and
play mode by converting the silence to the right format.
Diffstat (limited to 'sys/dev/audio.c')
-rw-r--r-- | sys/dev/audio.c | 41 |
1 files changed, 33 insertions, 8 deletions
diff --git a/sys/dev/audio.c b/sys/dev/audio.c index 3a603e8b34b..5566128b42c 100644 --- a/sys/dev/audio.c +++ b/sys/dev/audio.c @@ -1,4 +1,4 @@ -/* $OpenBSD: audio.c,v 1.69 2007/07/31 03:11:14 jakemsr Exp $ */ +/* $OpenBSD: audio.c,v 1.70 2007/08/02 07:15:49 jakemsr Exp $ */ /* $NetBSD: audio.c,v 1.119 1999/11/09 16:50:47 augustss Exp $ */ /* @@ -1053,7 +1053,12 @@ audio_drain(struct audio_softc *sc) u_char *inp = cb->inp; cc = cb->blksize - (inp - cb->start) % cb->blksize; - audio_fill_silence(&sc->sc_pparams, inp, cc); + if (sc->sc_pparams.sw_code) { + int ncc = cc / sc->sc_pparams.factor; + audio_fill_silence(&sc->sc_pparams, inp, ncc); + sc->sc_pparams.sw_code(sc->hw_hdl, inp, ncc); + } else + audio_fill_silence(&sc->sc_pparams, inp, cc); inp += cc; if (inp >= cb->end) inp = cb->start; @@ -1203,10 +1208,11 @@ audio_read(dev_t dev, struct uio *uio, int ioflag) } splx(s); - if (uio->uio_resid < cc) - cc = uio->uio_resid; + if (uio->uio_resid < cc / sc->sc_rparams.factor) + cc = uio->uio_resid * sc->sc_rparams.factor; DPRINTFN(1, ("audio_read: reading in write mode, cc=%d\n", cc)); - error = audio_silence_copyout(sc, cc, uio); + error = audio_silence_copyout(sc, + cc / sc->sc_rparams.factor, uio); sc->sc_wstamp += cc; } return (error); @@ -1538,7 +1544,12 @@ audio_write(dev_t dev, struct uio *uio, int ioflag) splx(s); if (cc) { DPRINTFN(1, ("audio_write: fill %d\n", cc)); - audio_fill_silence(&sc->sc_pparams, einp, cc); + if (sc->sc_pparams.sw_code) { + int ncc = cc / sc->sc_pparams.factor; + audio_fill_silence(&sc->sc_pparams, einp, ncc); + sc->sc_pparams.sw_code(sc->hw_hdl, einp, ncc); + } else + audio_fill_silence(&sc->sc_pparams, einp, cc); } } return (error); @@ -1900,7 +1911,14 @@ audio_pint_silence(struct audio_softc *sc, struct audio_ringbuffer *cb, sc->sc_sil_count = max(sc->sc_sil_count, q-s); DPRINTFN(5, ("audio_pint_silence: fill cc=%d inp=%p, count=%d size=%d\n", cc, inp, sc->sc_sil_count, (int)(cb->end - cb->start))); - audio_fill_silence(&sc->sc_pparams, inp, cc); + + if (sc->sc_pparams.sw_code) { + int ncc = cc / sc->sc_pparams.factor; + audio_fill_silence(&sc->sc_pparams, inp, ncc); + sc->sc_pparams.sw_code(sc->hw_hdl, inp, ncc); + } else + audio_fill_silence(&sc->sc_pparams, inp, cc); + } else { DPRINTFN(5, ("audio_pint_silence: already silent cc=%d inp=%p\n", cc, inp)); @@ -1910,7 +1928,14 @@ audio_pint_silence(struct audio_softc *sc, struct audio_ringbuffer *cb, sc->sc_sil_count = cc; DPRINTFN(5, ("audio_pint_silence: start fill %p %d\n", inp, cc)); - audio_fill_silence(&sc->sc_pparams, inp, cc); + + if (sc->sc_pparams.sw_code) { + int ncc = cc / sc->sc_pparams.factor; + audio_fill_silence(&sc->sc_pparams, inp, ncc); + sc->sc_pparams.sw_code(sc->hw_hdl, inp, ncc); + } else + audio_fill_silence(&sc->sc_pparams, inp, cc); + } } |