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 <[email protected]>
@@ -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 */