diff options
author | cg <cg@FreeBSD.org> | 2002-01-23 04:44:03 +0000 |
---|---|---|
committer | cg <cg@FreeBSD.org> | 2002-01-23 04:44:03 +0000 |
commit | a9336f53544ccad50c9725c8f3c9e1113959a9cd (patch) | |
tree | 7da40118a6bd47bb278b48d53b117308706bdeb8 | |
parent | b75a033f7588a9c6ef9d7f21c864e9af9714de75 (diff) | |
download | FreeBSD-src-a9336f53544ccad50c9725c8f3c9e1113959a9cd.zip FreeBSD-src-a9336f53544ccad50c9725c8f3c9e1113959a9cd.tar.gz |
add more error checking to open of /dev/dsp* and /dev/audio* - if the
default format for the chosen subdevice cannot be obtained return an error
instead of returning success with an indeteterminate format selected.
note that this should never happen once the feederchain builder works for
recording.
-rw-r--r-- | sys/dev/sound/pcm/dsp.c | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/sys/dev/sound/pcm/dsp.c b/sys/dev/sound/pcm/dsp.c index 55147e3..2f1462c 100644 --- a/sys/dev/sound/pcm/dsp.c +++ b/sys/dev/sound/pcm/dsp.c @@ -285,7 +285,15 @@ dsp_open(dev_t i_dev, int flags, int mode, struct thread *td) /* bump refcounts, reset and unlock any channels that we just opened */ if (rdch) { if (flags & FREAD) { - chn_reset(rdch, fmt); + if (chn_reset(rdch, fmt)) { + pcm_lock(d); + pcm_chnrelease(rdch); + if (wrch && (flags & FWRITE)) + pcm_chnrelease(wrch); + pcm_unlock(d); + splx(s); + return ENODEV; + } if (flags & O_NONBLOCK) rdch->flags |= CHN_F_NBIO; } else @@ -296,7 +304,15 @@ dsp_open(dev_t i_dev, int flags, int mode, struct thread *td) } if (wrch) { if (flags & FWRITE) { - chn_reset(wrch, fmt); + if (chn_reset(wrch, fmt)) { + pcm_lock(d); + pcm_chnrelease(wrch); + if (rdch && (flags & FREAD)) + pcm_chnrelease(rdch); + pcm_unlock(d); + splx(s); + return ENODEV; + } if (flags & O_NONBLOCK) wrch->flags |= CHN_F_NBIO; } else |