Module Name:    src
Committed By:   nat
Date:           Sun Sep 24 23:40:41 UTC 2017

Modified Files:
        src/sys/dev: audio.c audiovar.h

Log Message:
Move play/rec mix ring buffers into a virtual channel sc_mixring.  NFCI.


To generate a diff of this commit:
cvs rdiff -u -r1.406 -r1.407 src/sys/dev/audio.c
cvs rdiff -u -r1.64 -r1.65 src/sys/dev/audiovar.h

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.406 src/sys/dev/audio.c:1.407
--- src/sys/dev/audio.c:1.406	Sat Sep  2 15:26:43 2017
+++ src/sys/dev/audio.c	Sun Sep 24 23:40:41 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: audio.c,v 1.406 2017/09/02 15:26:43 isaki Exp $	*/
+/*	$NetBSD: audio.c,v 1.407 2017/09/24 23:40:41 nat 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.406 2017/09/02 15:26:43 isaki Exp $");
+__KERNEL_RCSID(0, "$NetBSD: audio.c,v 1.407 2017/09/24 23:40:41 nat Exp $");
 
 #ifdef _KERNEL_OPT
 #include "audio.h"
@@ -930,8 +930,8 @@ audiodetach(device_t self, int flags)
 	}
 	audio_free_ring(sc, &sc->sc_hwvc->sc_mpr);
 	audio_free_ring(sc, &sc->sc_hwvc->sc_mrr);
-	audio_free_ring(sc, &sc->sc_pr);
-	audio_free_ring(sc, &sc->sc_rr);
+	audio_free_ring(sc, &sc->sc_mixring.sc_mpr);
+	audio_free_ring(sc, &sc->sc_mixring.sc_mrr);
 	SIMPLEQ_FOREACH(chan, &sc->sc_audiochan, entries) {
 		audio_destroy_pfilters(chan->vc);
 		audio_destroy_rfilters(chan->vc);
@@ -1114,13 +1114,13 @@ audio_allocbufs(struct audio_softc *sc)
 
 	vc = sc->sc_hwvc;
 
-	sc->sc_pr.s.start = NULL;
+	sc->sc_mixring.sc_mpr.s.start = NULL;
 	vc->sc_mpr.s.start = NULL;
-	sc->sc_rr.s.start = NULL;
+	sc->sc_mixring.sc_mrr.s.start = NULL;
 	vc->sc_mrr.s.start = NULL;
 
 	if (audio_can_playback(sc)) {
-		error = audio_alloc_ring(sc, &sc->sc_pr,
+		error = audio_alloc_ring(sc, &sc->sc_mixring.sc_mpr,
 		    AUMODE_PLAY, AU_RING_SIZE);
 		if (error)
 			goto bad_play1;
@@ -1131,7 +1131,7 @@ audio_allocbufs(struct audio_softc *sc)
 			goto bad_play2;
 	}
 	if (audio_can_capture(sc)) {
-		error = audio_alloc_ring(sc, &sc->sc_rr,
+		error = audio_alloc_ring(sc, &sc->sc_mixring.sc_mrr,
 		    AUMODE_RECORD, AU_RING_SIZE);
 		if (error)
 			goto bad_rec1;
@@ -1144,14 +1144,14 @@ audio_allocbufs(struct audio_softc *sc)
 	return 0;
 
 bad_rec2:
-	if (sc->sc_rr.s.start != NULL)
-		audio_free_ring(sc, &sc->sc_rr);
+	if (sc->sc_mixring.sc_mrr.s.start != NULL)
+		audio_free_ring(sc, &sc->sc_mixring.sc_mrr);
 bad_rec1:
 	if (vc->sc_mpr.s.start != NULL)
 		audio_free_ring(sc, &vc->sc_mpr);
 bad_play2:
-	if (sc->sc_pr.s.start != NULL)
-		audio_free_ring(sc, &sc->sc_pr);
+	if (sc->sc_mixring.sc_mpr.s.start != NULL)
+		audio_free_ring(sc, &sc->sc_mixring.sc_mpr);
 bad_play1:
 	return error;
 }
@@ -2166,9 +2166,11 @@ audio_open(dev_t dev, struct audio_softc
 		}
 		audio_initbufs(sc, NULL);
 		if (audio_can_playback(sc))
-			audio_init_ringbuffer(sc, &sc->sc_pr, AUMODE_PLAY);
+			audio_init_ringbuffer(sc, &sc->sc_mixring.sc_mpr,
+			    AUMODE_PLAY);
 		if (audio_can_capture(sc))
-			audio_init_ringbuffer(sc, &sc->sc_rr, AUMODE_RECORD);
+			audio_init_ringbuffer(sc, &sc->sc_mixring.sc_mrr,
+			    AUMODE_RECORD);
 		sc->schedule_wih = false;
 		sc->schedule_rih = false;
 		sc->sc_last_drops = 0;
@@ -2202,8 +2204,8 @@ audio_open(dev_t dev, struct audio_softc
 		mode |= AUMODE_PLAY | AUMODE_PLAY_ALL;
 	}
 
-	vc->sc_mpr.blksize = sc->sc_pr.blksize;
-	vc->sc_mrr.blksize = sc->sc_rr.blksize;
+	vc->sc_mpr.blksize = sc->sc_mixring.sc_mpr.blksize;
+	vc->sc_mrr.blksize = sc->sc_mixring.sc_mrr.blksize;
 
 	/*
 	 * Multiplex device: /dev/audio (MU-Law) and /dev/sound (linear)
@@ -2328,7 +2330,7 @@ audio_drain(struct audio_softc *sc, stru
 	used = audio_stream_get_used(&cb->s);
 	if (vc == sc->sc_hwvc) {
 		hw = true;
-		used += audio_stream_get_used(&sc->sc_pr.s);
+		used += audio_stream_get_used(&sc->sc_mixring.sc_mpr.s);
 	}
 	for (i = 0; i < vc->sc_npfilters; i++)
 		used += audio_stream_get_used(&vc->sc_pstreams[i]);
@@ -2350,15 +2352,18 @@ audio_drain(struct audio_softc *sc, stru
 		if (error)
 			return error;
 	} else if (hw == true) {
-		used = cb->blksize - (sc->sc_pr.s.inp - sc->sc_pr.s.start)
-		    % cb->blksize;
+		used = cb->blksize - (sc->sc_mixring.sc_mpr.s.inp -
+		    sc->sc_mixring.sc_mpr.s.start) % cb->blksize;
 		while (used > 0) {
-			cc = sc->sc_pr.s.end - sc->sc_pr.s.inp;
+			cc = sc->sc_mixring.sc_mpr.s.end -
+			    sc->sc_mixring.sc_mpr.s.inp;
 			if (cc > used)
 				cc = used;
-			audio_fill_silence(&cb->s.param, sc->sc_pr.s.inp, cc);
-			sc->sc_pr.s.inp = audio_stream_add_inp(&sc->sc_pr.s,
-			    sc->sc_pr.s.inp, cc);
+			audio_fill_silence(&cb->s.param,
+			    sc->sc_mixring.sc_mpr.s.inp, cc);
+			sc->sc_mixring.sc_mpr.s.inp =
+			    audio_stream_add_inp(&sc->sc_mixring.sc_mpr.s,
+				sc->sc_mixring.sc_mpr.s.inp, cc);
 			used -= cc;
 		}
 		mix_write(sc);
@@ -3389,7 +3394,7 @@ audio_mmap(struct audio_softc *sc, off_t
 				(void)audiostartp(sc, vc);
 		} else if (cb == &vc->sc_mrr) {
 			vc->sc_rustream = &cb->s;
-			if (!vc->sc_rbus && !sc->sc_rr.pause)
+			if (!vc->sc_rbus && !sc->sc_mixring.sc_mrr.pause)
 				(void)audiostartr(sc, vc);
 		}
 	}
@@ -3592,26 +3597,29 @@ audio_pint(void *v)
 	if (sc->sc_dying == true || sc->sc_trigger_started == false)
 		return;
 
-	if (vc->sc_draining == true && sc->sc_pr.drops !=
+	if (vc->sc_draining == true && sc->sc_mixring.sc_mpr.drops !=
 						sc->sc_last_drops) {
 		vc->sc_mpr.drops += blksize;
 		cv_broadcast(&sc->sc_wchan);
 	}
-	sc->sc_last_drops = sc->sc_pr.drops;
+	sc->sc_last_drops = sc->sc_mixring.sc_mpr.drops;
 
 	vc->sc_mpr.s.outp = audio_stream_add_outp(&vc->sc_mpr.s,
 	    vc->sc_mpr.s.outp, blksize);
 
-	if (audio_stream_get_used(&sc->sc_pr.s) < blksize) {
+	if (audio_stream_get_used(&sc->sc_mixring.sc_mpr.s) < blksize) {
 		DPRINTFN(3, ("HW RING - INSERT SILENCE\n"));
 		used = blksize;
 		while (used > 0) {
-			cc = sc->sc_pr.s.end - sc->sc_pr.s.inp;
+			cc = sc->sc_mixring.sc_mpr.s.end -
+			    sc->sc_mixring.sc_mpr.s.inp;
 			if (cc > used)
 				cc = used;
-			audio_fill_silence(&vc->sc_pustream->param, sc->sc_pr.s.inp, cc);
-			sc->sc_pr.s.inp = audio_stream_add_inp(&sc->sc_pr.s,
-			    sc->sc_pr.s.inp, cc);
+			audio_fill_silence(&vc->sc_pustream->param,
+			    sc->sc_mixring.sc_mpr.s.inp, cc);
+			sc->sc_mixring.sc_mpr.s.inp =
+			    audio_stream_add_inp(&sc->sc_mixring.sc_mpr.s,
+			        sc->sc_mixring.sc_mpr.s.inp, cc);
 			used -= cc;
 		}
 	}
@@ -3643,7 +3651,7 @@ audio_mix(void *v)
 	if (sc->sc_dying == true)
 		return;
 
-	blksize = sc->sc_pr.blksize;
+	blksize = sc->sc_mixring.sc_mpr.blksize;
 	SIMPLEQ_FOREACH(chan, &sc->sc_audiochan, entries) {
 		vc = chan->vc;
 
@@ -3780,24 +3788,27 @@ audio_mix(void *v)
 	mutex_enter(sc->sc_intr_lock);
 
 	vc = sc->sc_hwvc;
-	cb = &sc->sc_pr;
+	cb = &sc->sc_mixring.sc_mpr;
 	inp = cb->s.inp;
 	cc = blksize - (inp - cb->s.start) % blksize;
 	if (sc->sc_writeme == false) {
 		DPRINTFN(3, ("MIX RING EMPTY - INSERT SILENCE\n"));
 		audio_fill_silence(&vc->sc_pustream->param, inp, cc);
-		sc->sc_pr.drops += cc;
+		sc->sc_mixring.sc_mpr.drops += cc;
 	} else
 		cc = blksize;
 	cb->s.inp = audio_stream_add_inp(&cb->s, cb->s.inp, cc);
 	cc = blksize;
-	cc1 = sc->sc_pr.s.end - sc->sc_pr.s.inp;
+	cc1 = sc->sc_mixring.sc_mpr.s.end - sc->sc_mixring.sc_mpr.s.inp;
 	if (cc1 < cc) {
-		audio_fill_silence(&vc->sc_pustream->param, sc->sc_pr.s.inp, cc1);
+		audio_fill_silence(&vc->sc_pustream->param,
+		    sc->sc_mixring.sc_mpr.s.inp, cc1);
 		cc -= cc1;
-		audio_fill_silence(&vc->sc_pustream->param, sc->sc_pr.s.start, cc);
+		audio_fill_silence(&vc->sc_pustream->param,
+		    sc->sc_mixring.sc_mpr.s.start, cc);
 	} else
-		audio_fill_silence(&vc->sc_pustream->param, sc->sc_pr.s.inp, cc);
+		audio_fill_silence(&vc->sc_pustream->param,
+		    sc->sc_mixring.sc_mpr.s.inp, cc);
 	mutex_exit(sc->sc_intr_lock);
 
 	kpreempt_disable();
@@ -3827,9 +3838,10 @@ audio_rint(void *v)
 	if (sc->sc_dying == true || sc->sc_rec_started == false)
 		return;
 
-	blksize = audio_stream_get_used(&sc->sc_rr.s);
-	sc->sc_rr.s.outp = audio_stream_add_outp(&sc->sc_rr.s,
-	    sc->sc_rr.s.outp, blksize);
+	blksize = audio_stream_get_used(&sc->sc_mixring.sc_mrr.s);
+	sc->sc_mixring.sc_mrr.s.outp =
+	    audio_stream_add_outp(&sc->sc_mixring.sc_mrr.s,
+		sc->sc_mixring.sc_mrr.s.outp, blksize);
 	mix_read(sc);
 
 	cv_broadcast(&sc->sc_rcondvar);
@@ -3847,7 +3859,7 @@ audio_upmix(void *v)
 	int cc, used, blksize, cc1;
 
 	sc = v;
-	blksize = sc->sc_rr.blksize;
+	blksize = sc->sc_mixring.sc_mrr.blksize;
 
 	SIMPLEQ_FOREACH(chan, &sc->sc_audiochan, entries) {
 		vc = chan->vc;
@@ -3859,11 +3871,11 @@ audio_upmix(void *v)
 
 		cb = &vc->sc_mrr;
 
-		blksize = audio_stream_get_used(&sc->sc_rr.s);
+		blksize = audio_stream_get_used(&sc->sc_mixring.sc_mrr.s);
 		if (audio_stream_get_space(&cb->s) < blksize) {
 			cb->drops += blksize;
 			cb->s.outp = audio_stream_add_outp(&cb->s, cb->s.outp,
-			    sc->sc_rr.blksize);
+			    sc->sc_mixring.sc_mrr.blksize);
 			continue;
 		}
 
@@ -3871,11 +3883,12 @@ audio_upmix(void *v)
 		if (cb->s.inp + blksize > cb->s.end)
 			cc = cb->s.end - cb->s.inp;
 		mutex_enter(sc->sc_intr_lock);
-		memcpy(cb->s.inp, sc->sc_rr.s.start, cc);
+		memcpy(cb->s.inp, sc->sc_mixring.sc_mrr.s.start, cc);
 		if (cc < blksize && cc != 0) {
 			cc1 = cc;
 			cc = blksize - cc;
-			memcpy(cb->s.start, sc->sc_rr.s.start + cc1, cc);
+			memcpy(cb->s.start,
+			    sc->sc_mixring.sc_mrr.s.start + cc1, cc);
 		}
 		mutex_exit(sc->sc_intr_lock);
 
@@ -4679,13 +4692,13 @@ audiosetinfo(struct audio_softc *sc, str
 			cleared = true;
 		}
 		if (nr > 0) {
-			sc->sc_rr.blksize = audio_calc_blksize(sc,
-			    &vc->sc_rparams);
+			sc->sc_mixring.sc_mrr.blksize =
+			    audio_calc_blksize(sc, &vc->sc_rparams);
 			vc->sc_mrr.blksize = audio_calc_blksize(sc,
 			    &vc->sc_mrr.s.param);
 		}
 		if (np > 0) {
-			sc->sc_pr.blksize = audio_calc_blksize(sc,
+			sc->sc_mixring.sc_mpr.blksize = audio_calc_blksize(sc,
 			    &vc->sc_pparams);
 			vc->sc_mpr.blksize = audio_calc_blksize(sc,
 			    &vc->sc_mpr.s.param);
@@ -5379,13 +5392,14 @@ mix_read(void *arg)
 	cc1 = blksize;
 	if (vc->sc_rustream->outp + blksize > vc->sc_rustream->end)
 		cc1 = vc->sc_rustream->end - vc->sc_rustream->outp;
-	memcpy(sc->sc_rr.s.start, vc->sc_rustream->outp, cc1);
+	memcpy(sc->sc_mixring.sc_mrr.s.start, vc->sc_rustream->outp, cc1);
 	if (cc1 < blksize) {
-		memcpy(sc->sc_rr.s.start + cc1, vc->sc_rustream->start,
-		    blksize - cc1);
+		memcpy(sc->sc_mixring.sc_mrr.s.start + cc1,
+		    vc->sc_rustream->start, blksize - cc1);
 	}
-	sc->sc_rr.s.inp = audio_stream_add_inp(&sc->sc_rr.s, sc->sc_rr.s.inp,
-	    blksize);
+	sc->sc_mixring.sc_mrr.s.inp =
+	    audio_stream_add_inp(&sc->sc_mixring.sc_mrr.s,
+		sc->sc_mixring.sc_mrr.s.inp, blksize);
 	vc->sc_rustream->outp = audio_stream_add_outp(vc->sc_rustream,
 	    vc->sc_rustream->outp, blksize);
 	
@@ -5407,14 +5421,15 @@ mix_write(void *arg)
 	vc = sc->sc_hwvc;
 	error = 0;
 
-	if (audio_stream_get_used(vc->sc_pustream) <= sc->sc_pr.blksize) {
+	if (audio_stream_get_used(vc->sc_pustream) <=
+				sc->sc_mixring.sc_mpr.blksize) {
 		tocopy = vc->sc_pustream->inp;
-		orig = sc->sc_pr.s.outp;
-		used = sc->sc_pr.blksize;
+		orig = sc->sc_mixring.sc_mpr.s.outp;
+		used = sc->sc_mixring.sc_mpr.blksize;
 		while (used > 0) {
 			cc = used;
 			cc1 = vc->sc_pustream->end - tocopy;
-			cc2 = sc->sc_pr.s.end - orig;
+			cc2 = sc->sc_mixring.sc_mpr.s.end - orig;
 			if (cc > cc1)
 				cc = cc1;
 			if (cc > cc2)
@@ -5425,17 +5440,19 @@ mix_write(void *arg)
 
 			if (tocopy >= vc->sc_pustream->end)
 				tocopy = vc->sc_pustream->start;
-			if (orig >= sc->sc_pr.s.end)
-				orig = sc->sc_pr.s.start;
+			if (orig >= sc->sc_mixring.sc_mpr.s.end)
+				orig = sc->sc_mixring.sc_mpr.s.start;
 
 			used -= cc;
 		}
 
 		vc->sc_pustream->inp = audio_stream_add_inp(vc->sc_pustream,
-		    vc->sc_pustream->inp, sc->sc_pr.blksize);
+		    vc->sc_pustream->inp, sc->sc_mixring.sc_mpr.blksize);
 
-		sc->sc_pr.s.outp = audio_stream_add_outp(&sc->sc_pr.s,
-		    sc->sc_pr.s.outp, sc->sc_pr.blksize);
+		sc->sc_mixring.sc_mpr.s.outp =
+		    audio_stream_add_outp(&sc->sc_mixring.sc_mpr.s,
+		    	sc->sc_mixring.sc_mpr.s.outp,
+			sc->sc_mixring.sc_mpr.blksize);
 	}
 
 	if (vc->sc_npfilters > 0) {
@@ -5480,15 +5497,16 @@ mix_write(void *arg)
 		bigger_type result;					\
 		type *orig, *tomix;					\
 									\
-		blksize = sc->sc_pr.blksize;				\
+		blksize = sc->sc_mixring.sc_mpr.blksize;		\
 		resid = blksize;					\
 									\
 		tomix = __UNCONST(cb->s.outp);				\
-		orig = (type *)(sc->sc_pr.s.inp);			\
+		orig = (type *)(sc->sc_mixring.sc_mpr.s.inp);		\
 									\
 		while (resid > 0) {					\
 			cc = resid;					\
-			cc1 = sc->sc_pr.s.end - (uint8_t *)orig;	\
+			cc1 = sc->sc_mixring.sc_mpr.s.end -		\
+			    (uint8_t *)orig;				\
 			cc2 = cb->s.end - (uint8_t *)tomix;		\
 			if (cc > cc1)					\
 				cc = cc1;				\
@@ -5507,8 +5525,10 @@ mix_write(void *arg)
 				orig[m] = result;			\
 			}						\
 									\
-			if (&orig[m] >= (type *)sc->sc_pr.s.end)	\
-				orig = (type *)sc->sc_pr.s.start;	\
+			if (&orig[m] >=					\
+			    (type *)sc->sc_mixring.sc_mpr.s.end)	\
+				orig =					\
+				 (type *)sc->sc_mixring.sc_mpr.s.start;	\
 			if (&tomix[m] >= (type *)cb->s.end)		\
 				tomix = (type *)cb->s.start;		\
 									\
@@ -5750,7 +5770,8 @@ audio_play_thread(void *v)
 			kthread_exit(0);
 		}
 
-		while (audio_stream_get_used(&sc->sc_pr.s) < sc->sc_pr.blksize) {
+		while (audio_stream_get_used(&sc->sc_mixring.sc_mpr.s) <
+						sc->sc_mixring.sc_mpr.blksize) {
 			mutex_exit(sc->sc_intr_lock);
 			mutex_enter(sc->sc_lock);
 			audio_mix(sc);

Index: src/sys/dev/audiovar.h
diff -u src/sys/dev/audiovar.h:1.64 src/sys/dev/audiovar.h:1.65
--- src/sys/dev/audiovar.h:1.64	Sun Aug 20 03:13:04 2017
+++ src/sys/dev/audiovar.h	Sun Sep 24 23:40:41 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: audiovar.h,v 1.64 2017/08/20 03:13:04 isaki Exp $	*/
+/*	$NetBSD: audiovar.h,v 1.65 2017/09/24 23:40:41 nat Exp $	*/
 
 /*-
  * Copyright (c) 2002 The NetBSD Foundation, Inc.
@@ -182,6 +182,7 @@ struct audio_softc {
 	device_t	sc_dev;		/* Hardware device struct */
 	struct chan_queue sc_audiochan; /* queue of open audio chans */
 	struct virtual_channel *sc_hwvc;
+	struct virtual_channel	sc_mixring;	/* Play/rec ring to mix into */
 
 	struct audio_encoding_set *sc_encodings;
 	struct	selinfo sc_wsel; /* write selector */
@@ -221,7 +222,7 @@ struct audio_softc {
 	 * (vchans mixed into sc_pr)
 	 *
 	 * play_thread
-	 *    sc_pr
+	 *    sc_mixring.sc_mpr
 	 *      |
 	 *  sc_hwvc->sc_pustream
 	 *      |
@@ -230,8 +231,6 @@ struct audio_softc {
 	 *  hardware
 	 */
 
-	struct audio_ringbuffer	sc_pr;	/* Play ring to mix into */
-
 	/**
 	 *  hardware
 	 *      |
@@ -240,7 +239,7 @@ struct audio_softc {
 	 *      :		 vc to IF
 	 * sc_hwvc->sc_rustream	Audio now in intermediate format (IF)
 	 *      |	mix_read();
-	 *    sc_rr
+	 *    sc_mixring.sc_mrr
 	 *      |	audio_upmix	vc = sc->sc_vchan[n]
 	 * vc->sc_mrr		<list_t::filters[0].param>
 	 *      |  vc->sc_rfilters[0]
@@ -253,7 +252,6 @@ struct audio_softc {
 	 *      |  uiomove(9) & read(2)
 	 *  userland
 	 */
-	struct audio_ringbuffer	sc_rr;		/* Record ring */
 	ulong		sc_last_drops;		/* Drops from mix ring */
 
 	int		sc_eof;		/* EOF, i.e. zero sized write, counter */

Reply via email to