diff --git a/sys/dev/sound/dummy.c b/sys/dev/sound/dummy.c --- a/sys/dev/sound/dummy.c +++ b/sys/dev/sound/dummy.c @@ -74,8 +74,6 @@ struct dummy_chan *ch; int i = 0; - snd_mtxlock(sc->lock); - for (i = 0; i < sc->chnum; i++) { ch = &sc->chans[i]; if (!ch->run) @@ -89,8 +87,6 @@ snd_mtxlock(sc->lock); } callout_schedule(&sc->callout, 1); - - snd_mtxunlock(sc->lock); } static int @@ -179,16 +175,14 @@ switch (go) { case PCMTRIG_START: - if (!callout_active(&sc->callout)) - callout_reset(&sc->callout, 1, dummy_chan_io, sc); + callout_reset(&sc->callout, 1, dummy_chan_io, sc); ch->ptr = 0; ch->run = 1; break; case PCMTRIG_STOP: case PCMTRIG_ABORT: ch->run = 0; - if (callout_active(&sc->callout)) - callout_stop(&sc->callout); + callout_stop(&sc->callout); default: break; } @@ -292,6 +286,7 @@ sc = device_get_softc(dev); sc->dev = dev; sc->lock = snd_mtxcreate(device_get_nameunit(dev), "snd_dummy softc"); + callout_init_mtx(&sc->callout, sc->lock, 0); sc->cap_fmts[0] = SND_FORMAT(AFMT_S32_LE, 2, 0); sc->cap_fmts[1] = SND_FORMAT(AFMT_S24_LE, 2, 0); @@ -316,7 +311,6 @@ if (pcm_register(dev, status)) return (ENXIO); mixer_init(dev, &dummy_mixer_class, sc); - callout_init(&sc->callout, 1); return (0); } @@ -327,8 +321,11 @@ struct dummy_softc *sc = device_get_softc(dev); int err; - callout_drain(&sc->callout); err = pcm_unregister(dev); + snd_mtxlock(sc->lock); + callout_stop(&sc->callout); + snd_mtxunlock(sc->lock); + callout_drain(&sc->callout); snd_mtxfree(sc->lock); return (err);