Module Name: src Committed By: isaki Date: Tue Aug 8 05:54:14 UTC 2017
Modified Files: src/sys/dev: audio.c Log Message: Introduce audio_destroy_pfilters()/audio_destroy_rfilters() and use it. To generate a diff of this commit: cvs rdiff -u -r1.389 -r1.390 src/sys/dev/audio.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/audio.c diff -u src/sys/dev/audio.c:1.389 src/sys/dev/audio.c:1.390 --- src/sys/dev/audio.c:1.389 Tue Aug 8 05:46:23 2017 +++ src/sys/dev/audio.c Tue Aug 8 05:54:14 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: audio.c,v 1.389 2017/08/08 05:46:23 isaki Exp $ */ +/* $NetBSD: audio.c,v 1.390 2017/08/08 05:54:14 isaki Exp $ */ /*- * Copyright (c) 2016 Nathanial Sloss <nathanialsl...@yahoo.com.au> @@ -148,7 +148,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: audio.c,v 1.389 2017/08/08 05:46:23 isaki Exp $"); +__KERNEL_RCSID(0, "$NetBSD: audio.c,v 1.390 2017/08/08 05:54:14 isaki Exp $"); #ifdef _KERNEL_OPT #include "audio.h" @@ -298,6 +298,8 @@ static int audio_setup_pfilters(struct a stream_filter_list_t *, struct virtual_channel *); static int audio_setup_rfilters(struct audio_softc *, const audio_params_t *, stream_filter_list_t *, struct virtual_channel *); +static void audio_destroy_pfilters(struct virtual_channel *); +static void audio_destroy_rfilters(struct virtual_channel *); static void audio_stream_dtor(audio_stream_t *); static int audio_stream_ctor(audio_stream_t *, const audio_params_t *, int); static void stream_filter_list_append(stream_filter_list_t *, @@ -864,7 +866,7 @@ audiodetach(device_t self, int flags) { struct audio_softc *sc; struct audio_chan *chan; - int maj, mn, i, rc; + int maj, mn, rc; sc = device_private(self); DPRINTF(("audio_detach: sc=%p flags=%d\n", sc, flags)); @@ -941,21 +943,8 @@ audiodetach(device_t self, int flags) if (chan->chan == MIXER_INUSE) continue; - for (i = 0; i < chan->vc->sc_npfilters; i++) { - chan->vc->sc_pfilters[i]->dtor - (chan->vc->sc_pfilters[i]); - chan->vc->sc_pfilters[i] = NULL; - audio_stream_dtor(&chan->vc->sc_pstreams[i]); - } - chan->vc->sc_npfilters = 0; - - for (i = 0; i < chan->vc->sc_nrfilters; i++) { - chan->vc->sc_rfilters[i]->dtor - (chan->vc->sc_rfilters[i]); - chan->vc->sc_rfilters[i] = NULL; - audio_stream_dtor(&chan->vc->sc_rstreams[i]); - } - chan->vc->sc_nrfilters = 0; + audio_destroy_pfilters(chan->vc); + audio_destroy_rfilters(chan->vc); } auconv_delete_encodings(sc->sc_encodings); @@ -1451,6 +1440,32 @@ audio_setup_rfilters(struct audio_softc } static void +audio_destroy_pfilters(struct virtual_channel *vc) +{ + int i; + + for (i = 0; i < vc->sc_npfilters; i++) { + vc->sc_pfilters[i]->dtor(vc->sc_pfilters[i]); + vc->sc_pfilters[i] = NULL; + audio_stream_dtor(&vc->sc_pstreams[i]); + } + vc->sc_npfilters = 0; +} + +static void +audio_destroy_rfilters(struct virtual_channel *vc) +{ + int i; + + for (i = 0; i < vc->sc_nrfilters; i++) { + vc->sc_rfilters[i]->dtor(vc->sc_rfilters[i]); + vc->sc_rfilters[i] = NULL; + audio_stream_dtor(&vc->sc_pstreams[i]); + } + vc->sc_nrfilters = 0; +} + +static void audio_stream_dtor(audio_stream_t *stream) { @@ -2113,7 +2128,7 @@ audio_open(dev_t dev, struct audio_softc struct lwp *l, struct file **nfp) { struct file *fp; - int error, fd, i, n; + int error, fd, n; u_int mode; const struct audio_hw_if *hw; struct virtual_channel *vc; @@ -2273,18 +2288,8 @@ audio_open(dev_t dev, struct audio_softc return error; bad: - for (i = 0; i < vc->sc_npfilters; i++) { - vc->sc_pfilters[i]->dtor(vc->sc_pfilters[i]); - vc->sc_pfilters[i] = NULL; - audio_stream_dtor(&vc->sc_pstreams[i]); - } - vc->sc_npfilters = 0; - for (i = 0; i < vc->sc_nrfilters; i++) { - vc->sc_rfilters[i]->dtor(vc->sc_rfilters[i]); - vc->sc_rfilters[i] = NULL; - audio_stream_dtor(&vc->sc_rstreams[i]); - } - vc->sc_nrfilters = 0; + audio_destroy_pfilters(vc); + audio_destroy_rfilters(vc); if (hw->close != NULL && sc->sc_opens == 0) hw->close(sc->hw_hdl); mutex_exit(sc->sc_lock); @@ -2432,7 +2437,6 @@ audio_close(struct audio_softc *sc, int { struct virtual_channel *vc; const struct audio_hw_if *hw; - int o; KASSERT(mutex_owned(sc->sc_lock)); @@ -2493,19 +2497,9 @@ audio_close(struct audio_softc *sc, int vc->sc_open = 0; vc->sc_mode = 0; vc->sc_full_duplex = 0; - - for (o = 0; o < vc->sc_npfilters; o++) { - vc->sc_pfilters[o]->dtor(vc->sc_pfilters[o]); - vc->sc_pfilters[o] = NULL; - audio_stream_dtor(&vc->sc_pstreams[o]); - } - vc->sc_npfilters = 0; - for (o = 0; o < vc->sc_nrfilters; o++) { - vc->sc_rfilters[o]->dtor(vc->sc_rfilters[o]); - vc->sc_rfilters[o] = NULL; - audio_stream_dtor(&vc->sc_rstreams[o]); - } - vc->sc_nrfilters = 0; + + audio_destroy_pfilters(vc); + audio_destroy_rfilters(vc); if (flags & FREAD) sc->sc_recopens--;