Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/dev Set sc_[trigger/rec]_started before the call to trig...



details:   https://anonhg.NetBSD.org/src/rev/bb4c8a84042c
branches:  trunk
changeset: 823968:bb4c8a84042c
user:      nat <nat%NetBSD.org@localhost>
date:      Tue May 16 23:55:53 2017 +0000

description:
Set sc_[trigger/rec]_started before the call to trigger_[input/output].
This prevents multiple calls to trigger_[input/output] for those drivers
that drop sc_intr_lock in there trigger_[input/output] functions.

diffstat:

 sys/dev/audio.c |  13 ++++++++-----
 1 files changed, 8 insertions(+), 5 deletions(-)

diffs (62 lines):

diff -r 99ce07c5cdf3 -r bb4c8a84042c sys/dev/audio.c
--- a/sys/dev/audio.c   Tue May 16 23:49:43 2017 +0000
+++ b/sys/dev/audio.c   Tue May 16 23:55:53 2017 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: audio.c,v 1.350 2017/05/16 21:43:18 nat Exp $  */
+/*     $NetBSD: audio.c,v 1.351 2017/05/16 23:55:53 nat Exp $  */
 
 /*-
  * Copyright (c) 2016 Nathanial Sloss <nathanialsloss%yahoo.com.au@localhost>
@@ -148,7 +148,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: audio.c,v 1.350 2017/05/16 21:43:18 nat Exp $");
+__KERNEL_RCSID(0, "$NetBSD: audio.c,v 1.351 2017/05/16 23:55:53 nat Exp $");
 
 #include "audio.h"
 #if NAUDIO > 0
@@ -5470,11 +5470,13 @@
 
        if (sc->hw_if->trigger_input && sc->sc_rec_started == false) {
                DPRINTF(("%s: call trigger_input\n", __func__));
+               sc->sc_rec_started = true;
                error = sc->hw_if->trigger_input(sc->hw_hdl, vc->sc_mrr.s.start,
                    vc->sc_mrr.s.end, blksize,
                    audio_rint, (void *)sc, &vc->sc_mrr.s.param);
        } else if (sc->hw_if->start_input) {
                DPRINTF(("%s: call start_input\n", __func__));
+               sc->sc_rec_started = true;
                error = sc->hw_if->start_input(sc->hw_hdl,
                    vc->sc_mrr.s.inp, blksize,
                    audio_rint, (void *)sc);
@@ -5483,8 +5485,8 @@
                /* XXX does this really help? */
                DPRINTF(("audio_upmix restart failed: %d\n", error));
                audio_clear(sc, SIMPLEQ_FIRST(&sc->sc_audiochan)->vc);
-       }
-       sc->sc_rec_started = true;
+               sc->sc_rec_started = false;
+       }
 
        inp = vc->sc_mrr.s.inp;
        vc->sc_mrr.s.inp = audio_stream_add_inp(&vc->sc_mrr.s, inp, cc);
@@ -5575,16 +5577,17 @@
 
        if (sc->hw_if->trigger_output && sc->sc_trigger_started == false) {
                DPRINTF(("%s: call trigger_output\n", __func__));
+               sc->sc_trigger_started = true;
                error = sc->hw_if->trigger_output(sc->hw_hdl,
                    vc->sc_mpr.s.start, vc->sc_mpr.s.end, blksize,
                    audio_pint, (void *)sc, &vc->sc_mpr.s.param);
        } else if (sc->hw_if->start_output) {
                DPRINTF(("%s: call start_output\n", __func__));
+               sc->sc_trigger_started = true;
                error = sc->hw_if->start_output(sc->hw_hdl,
                    __UNCONST(vc->sc_mpr.s.outp), blksize,
                    audio_pint, (void *)sc);
        }
-       sc->sc_trigger_started = true;
 
        if (error) {
                /* XXX does this really help? */



Home | Main Index | Thread Index | Old Index