Module Name:    src
Committed By:   martin
Date:           Thu Jun  7 18:24:16 UTC 2018

Modified Files:
        src/distrib/sets/lists/comp [netbsd-8]: mi
        src/distrib/sets/lists/man [netbsd-8]: mi
        src/share/man/man4 [netbsd-8]: audio.4
        src/share/man/man7 [netbsd-8]: Makefile intro.7
        src/share/man/man9 [netbsd-8]: Makefile audio.9 intro.9
        src/sys/dev [netbsd-8]: audio.c
Added Files:
        src/share/man/man9 [netbsd-8]: audio_system.9
Removed Files:
        src/share/man/man7 [netbsd-8]: audio.7

Log Message:
Pull up following revision(s) (requested by nat in ticket #848):

        share/man/man9/Makefile: revision 1.422
        distrib/sets/lists/comp/mi: revision 1.2198
        share/man/man7/Makefile: revision 1.33
        share/man/man9/audio.9: revision 1.47
        share/man/man7/audio.7: file removal
        sys/dev/audio.c: revision 1.456
        sys/dev/audio.c: revision 1.457
        distrib/sets/lists/man/mi: revision 1.1591
        share/man/man9/intro.9: revision 1.20
        share/man/man7/audio.7: revision 1.3
        share/man/man9/audio_system.9: revision 1.1
        share/man/man7/intro.7: revision 1.26
        share/man/man4/audio.4: revision 1.86

Fix a typo with sc_out/inports when setting the hardware recording gain on the
mix ring.  Found by mrg@
XXX pullup-8

Using audioctl without the -p switch defaults to the mix ring.  This allows
setting the hardware gain etc.

Update the audio spec in audio.7 to reflect these changes.
Addresses PR kern/52781.

Move the audio specification to section 9 under audio_system.
Ok wiz@


To generate a diff of this commit:
cvs rdiff -u -r1.2138.2.5 -r1.2138.2.6 src/distrib/sets/lists/comp/mi
cvs rdiff -u -r1.1557.2.4 -r1.1557.2.5 src/distrib/sets/lists/man/mi
cvs rdiff -u -r1.79.2.2 -r1.79.2.3 src/share/man/man4/audio.4
cvs rdiff -u -r1.31.8.1 -r1.31.8.2 src/share/man/man7/Makefile
cvs rdiff -u -r1.2.2.2 -r0 src/share/man/man7/audio.7
cvs rdiff -u -r1.23.24.1 -r1.23.24.2 src/share/man/man7/intro.7
cvs rdiff -u -r1.414 -r1.414.2.1 src/share/man/man9/Makefile
cvs rdiff -u -r1.44.16.1 -r1.44.16.2 src/share/man/man9/audio.9
cvs rdiff -u -r0 -r1.1.2.2 src/share/man/man9/audio_system.9
cvs rdiff -u -r1.18 -r1.18.2.1 src/share/man/man9/intro.9
cvs rdiff -u -r1.357.2.12 -r1.357.2.13 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/distrib/sets/lists/comp/mi
diff -u src/distrib/sets/lists/comp/mi:1.2138.2.5 src/distrib/sets/lists/comp/mi:1.2138.2.6
--- src/distrib/sets/lists/comp/mi:1.2138.2.5	Sun Feb 11 21:17:33 2018
+++ src/distrib/sets/lists/comp/mi	Thu Jun  7 18:24:15 2018
@@ -1,4 +1,4 @@
-#	$NetBSD: mi,v 1.2138.2.5 2018/02/11 21:17:33 snj Exp $
+#	$NetBSD: mi,v 1.2138.2.6 2018/06/07 18:24:15 martin Exp $
 #
 # Note: don't delete entries from here - mark them as "obsolete" instead.
 ./etc/mtree/set.comp				comp-sys-root
@@ -10145,6 +10145,7 @@
 ./usr/share/man/cat9/arpresolve.0		comp-sys-catman		.cat
 ./usr/share/man/cat9/atop.0			comp-sys-catman		.cat
 ./usr/share/man/cat9/audio.0			comp-sys-catman		.cat
+./usr/share/man/cat9/audio_system.0		comp-sys-catman		.cat
 ./usr/share/man/cat9/autoconf.0			comp-sys-catman		.cat
 ./usr/share/man/cat9/bawrite.0			comp-sys-catman		.cat
 ./usr/share/man/cat9/bcdtobin.0			comp-sys-catman		.cat
@@ -17631,6 +17632,7 @@
 ./usr/share/man/html9/arpresolve.html		comp-sys-htmlman	html
 ./usr/share/man/html9/atop.html			comp-sys-htmlman	html
 ./usr/share/man/html9/audio.html		comp-sys-htmlman	html
+./usr/share/man/html9/audio_system.html		comp-sys-htmlman	html
 ./usr/share/man/html9/autoconf.html		comp-sys-htmlman	html
 ./usr/share/man/html9/bawrite.html		comp-sys-htmlman	html
 ./usr/share/man/html9/bcdtobin.html		comp-sys-htmlman	html
@@ -25221,6 +25223,7 @@
 ./usr/share/man/man9/arpresolve.9		comp-sys-man		.man
 ./usr/share/man/man9/atop.9			comp-sys-man		.man
 ./usr/share/man/man9/audio.9			comp-sys-man		.man
+./usr/share/man/man9/audio_system.9		comp-sys-man		.man
 ./usr/share/man/man9/autoconf.9			comp-sys-man		.man
 ./usr/share/man/man9/bawrite.9			comp-sys-man		.man
 ./usr/share/man/man9/bcdtobin.9			comp-sys-man		.man

Index: src/distrib/sets/lists/man/mi
diff -u src/distrib/sets/lists/man/mi:1.1557.2.4 src/distrib/sets/lists/man/mi:1.1557.2.5
--- src/distrib/sets/lists/man/mi:1.1557.2.4	Tue May 15 13:42:50 2018
+++ src/distrib/sets/lists/man/mi	Thu Jun  7 18:24:16 2018
@@ -1,4 +1,4 @@
-# $NetBSD: mi,v 1.1557.2.4 2018/05/15 13:42:50 martin Exp $
+# $NetBSD: mi,v 1.1557.2.5 2018/06/07 18:24:16 martin Exp $
 #
 # Note: don't delete entries from here - mark them as "obsolete" instead.
 #
@@ -2251,7 +2251,7 @@
 ./usr/share/man/cat5/wtmpx.0			man-sys-catman		.cat
 ./usr/share/man/cat5/ypserv.acl.0		man-obsolete		obsolete
 ./usr/share/man/cat7/ascii.0			man-reference-catman	.cat
-./usr/share/man/cat7/audio.0			man-reference-catman	.cat
+./usr/share/man/cat7/audio.0			man-obsolete		obsolete
 ./usr/share/man/cat7/atf.0			man-atf-catman		.cat,atf
 ./usr/share/man/cat7/c.0			man-reference-catman	.cat
 ./usr/share/man/cat7/c78.0			man-reference-catman	.cat
@@ -5272,7 +5272,7 @@
 ./usr/share/man/html5/wtmp.html			man-sys-htmlman		html
 ./usr/share/man/html5/wtmpx.html		man-sys-htmlman		html
 ./usr/share/man/html7/ascii.html		man-reference-htmlman	html
-./usr/share/man/html7/audio.html		man-reference-htmlman	html
+./usr/share/man/html7/audio.html		man-obsolete		obsolete
 ./usr/share/man/html7/atf.html			man-atf-htmlman		html,atf
 ./usr/share/man/html7/c.html			man-reference-htmlman	html
 ./usr/share/man/html7/c78.html			man-reference-htmlman	html
@@ -8263,7 +8263,7 @@
 ./usr/share/man/man5/wtmpx.5			man-sys-man		.man
 ./usr/share/man/man5/ypserv.acl.5		man-obsolete		obsolete
 ./usr/share/man/man7/ascii.7			man-reference-man	.man
-./usr/share/man/man7/audio.7			man-reference-man	.man
+./usr/share/man/man7/audio.7			man-obsolete		obsolete
 ./usr/share/man/man7/atf.7			man-atf-man		.man,atf
 ./usr/share/man/man7/c.7			man-reference-man	.man
 ./usr/share/man/man7/c78.7			man-reference-man	.man

Index: src/share/man/man4/audio.4
diff -u src/share/man/man4/audio.4:1.79.2.2 src/share/man/man4/audio.4:1.79.2.3
--- src/share/man/man4/audio.4:1.79.2.2	Tue May 15 13:42:50 2018
+++ src/share/man/man4/audio.4	Thu Jun  7 18:24:16 2018
@@ -1,4 +1,4 @@
-.\"	$NetBSD: audio.4,v 1.79.2.2 2018/05/15 13:42:50 martin Exp $
+.\"	$NetBSD: audio.4,v 1.79.2.3 2018/06/07 18:24:16 martin Exp $
 .\"
 .\" Copyright (c) 1996 The NetBSD Foundation, Inc.
 .\" All rights reserved.
@@ -790,7 +790,7 @@ string values.
 .Ss USB
 .Xr uaudio 4
 .Ss The NetBSD audio specification
-.Xr audio 7
+.Xr audio_system 9
 .Sh HISTORY
 Support for virtual channels and mixing first appeared in
 .Nx 8.0 .

Index: src/share/man/man7/Makefile
diff -u src/share/man/man7/Makefile:1.31.8.1 src/share/man/man7/Makefile:1.31.8.2
--- src/share/man/man7/Makefile:1.31.8.1	Tue May 15 13:42:49 2018
+++ src/share/man/man7/Makefile	Thu Jun  7 18:24:16 2018
@@ -1,14 +1,14 @@
-#	$NetBSD: Makefile,v 1.31.8.1 2018/05/15 13:42:49 martin Exp $
+#	$NetBSD: Makefile,v 1.31.8.2 2018/06/07 18:24:16 martin Exp $
 #	@(#)Makefile	8.1 (Berkeley) 6/5/93
 
 .include <bsd.init.mk>
 
 # missing: eqnchar.7 man.7 ms.7 term.7
 
-MAN=	ascii.7 audio.7 c.7 environ.7 glob.7 hier.7 hostname.7 intro.7 \
-	mailaddr.7 module.7 nls.7 operator.7 orders.7 pkgsrc.7 release.7 \
-	rfc6056.7 security.7 script.7 setuid.7 signal.7 src.7 sticky.7 \
-	symlink.7 sysctl.7 tests.7
+MAN=	ascii.7 c.7 environ.7 glob.7 hier.7 hostname.7 intro.7 mailaddr.7 \
+	module.7 nls.7 operator.7 orders.7 pkgsrc.7 release.7  rfc6056.7 \
+	security.7 script.7 setuid.7 signal.7 src.7 sticky.7 symlink.7 \
+	sysctl.7 tests.7
 
 CLEANFILES=	tests.7
 .if ${MKKYUA} != "no"

Index: src/share/man/man7/intro.7
diff -u src/share/man/man7/intro.7:1.23.24.1 src/share/man/man7/intro.7:1.23.24.2
--- src/share/man/man7/intro.7:1.23.24.1	Tue May 15 13:42:49 2018
+++ src/share/man/man7/intro.7	Thu Jun  7 18:24:16 2018
@@ -1,4 +1,4 @@
-.\"	$NetBSD: intro.7,v 1.23.24.1 2018/05/15 13:42:49 martin Exp $
+.\"	$NetBSD: intro.7,v 1.23.24.2 2018/06/07 18:24:16 martin Exp $
 .\"
 .\" Copyright (c) 1983, 1990, 1993
 .\"	The Regents of the University of California.  All rights reserved.
@@ -42,9 +42,6 @@ This section contains miscellaneous docu
 map of
 .Tn ASCII
 character set
-.It Xr audio 7
-the
-.Nx audio specification
 .It Xr c 7
 the C programming language
 .It Xr environ 7

Index: src/share/man/man9/Makefile
diff -u src/share/man/man9/Makefile:1.414 src/share/man/man9/Makefile:1.414.2.1
--- src/share/man/man9/Makefile:1.414	Sun May 21 19:07:29 2017
+++ src/share/man/man9/Makefile	Thu Jun  7 18:24:15 2018
@@ -1,9 +1,9 @@
-#       $NetBSD: Makefile,v 1.414 2017/05/21 19:07:29 abhinav Exp $
+#       $NetBSD: Makefile,v 1.414.2.1 2018/06/07 18:24:15 martin Exp $
 
 #	Makefile for section 9 (kernel function and variable) manual pages.
 
 MAN=	accept_filter.9 accf_data.9 accf_http.9 \
-	altq.9 arp.9 audio.9 autoconf.9 \
+	altq.9 arp.9 audio.9 audio_system.9 autoconf.9 \
 	bcdtobin.9 bcmp.9 bcopy.9 bintime_add.9 bluetooth.9 boothowto.9 bpf.9 \
 	buffercache.9 bufferio.9 bufq.9 bus_dma.9 bus_space.9 byteorder.9 \
 	bzero.9 \

Index: src/share/man/man9/audio.9
diff -u src/share/man/man9/audio.9:1.44.16.1 src/share/man/man9/audio.9:1.44.16.2
--- src/share/man/man9/audio.9:1.44.16.1	Tue May 15 13:42:50 2018
+++ src/share/man/man9/audio.9	Thu Jun  7 18:24:15 2018
@@ -1,4 +1,4 @@
-.\"	$NetBSD: audio.9,v 1.44.16.1 2018/05/15 13:42:50 martin Exp $
+.\"	$NetBSD: audio.9,v 1.44.16.2 2018/06/07 18:24:15 martin Exp $
 .\"
 .\" Copyright (c) 1999, 2000 The NetBSD Foundation, Inc.
 .\" All rights reserved.
@@ -592,7 +592,7 @@ of class
 .Dv AudioCmonitor .
 .Sh SEE ALSO
 .Xr audio 4 ,
-.Xr audio 7
+.Xr audio_system 9
 .Sh HISTORY
 This
 .Nm

Index: src/share/man/man9/intro.9
diff -u src/share/man/man9/intro.9:1.18 src/share/man/man9/intro.9:1.18.2.1
--- src/share/man/man9/intro.9:1.18	Tue May 30 13:49:01 2017
+++ src/share/man/man9/intro.9	Thu Jun  7 18:24:15 2018
@@ -1,4 +1,4 @@
-.\"     $NetBSD: intro.9,v 1.18 2017/05/30 13:49:01 abhinav Exp $
+.\"     $NetBSD: intro.9,v 1.18.2.1 2018/06/07 18:24:15 martin Exp $
 .\"
 .\" Copyright (c) 1997, 2007 The NetBSD Foundation, Inc.
 .\" All rights reserved.
@@ -431,6 +431,11 @@ Interface between low and high level aud
 See
 .Xr audio 9 .
 .Pp
+The
+.Nx audio specification.
+See
+.Xr audio_system 9 .
+.Pp
 Bluetooth Device/Protocol API.
 See
 .Xr bluetooth 9 .

Index: src/sys/dev/audio.c
diff -u src/sys/dev/audio.c:1.357.2.12 src/sys/dev/audio.c:1.357.2.13
--- src/sys/dev/audio.c:1.357.2.12	Tue May 15 13:42:50 2018
+++ src/sys/dev/audio.c	Thu Jun  7 18:24:16 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: audio.c,v 1.357.2.12 2018/05/15 13:42:50 martin Exp $	*/
+/*	$NetBSD: audio.c,v 1.357.2.13 2018/06/07 18:24:16 martin 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.357.2.12 2018/05/15 13:42:50 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: audio.c,v 1.357.2.13 2018/06/07 18:24:16 martin Exp $");
 
 #ifdef _KERNEL_OPT
 #include "audio.h"
@@ -234,6 +234,8 @@ int	audiosetinfo(struct audio_softc *, s
 int	audiogetinfo(struct audio_softc *, struct audio_info *, int,
 		     struct virtual_channel *);
 
+int	audioctl_open(dev_t, struct audio_softc *, int, int, struct lwp *,
+		   struct file **);
 int	audio_open(dev_t, struct audio_softc *, int, int, struct lwp *,
 		   struct file **);
 int	audio_close(struct audio_softc *, int, struct audio_chan *);
@@ -1677,9 +1679,11 @@ audioopen(dev_t dev, int flags, int ifmt
 	switch (AUDIODEV(dev)) {
 	case SOUND_DEVICE:
 	case AUDIO_DEVICE:
-	case AUDIOCTL_DEVICE:
 		error = audio_open(dev, sc, flags, ifmt, l, &fp);
 		break;
+	case AUDIOCTL_DEVICE:
+		error = audioctl_open(dev, sc, flags, ifmt, l, &fp);
+		break;
 	case MIXER_DEVICE:
 		error = mixer_open(dev, sc, flags, ifmt, l, &fp);
 		break;
@@ -1713,9 +1717,11 @@ audioclose(struct file *fp)
 	switch (AUDIODEV(dev)) {
 	case SOUND_DEVICE:
 	case AUDIO_DEVICE:
-	case AUDIOCTL_DEVICE:
 		error = audio_close(sc, fp->f_flag, chan);
 		break;
+	case AUDIOCTL_DEVICE:
+		error = 0;
+		break;
 	case MIXER_DEVICE:
 		error = mixer_close(sc, fp->f_flag, chan);
 		break;
@@ -2143,6 +2149,50 @@ audio_calcwater(struct audio_softc *sc, 
 }
 
 int
+audioctl_open(dev_t dev, struct audio_softc *sc, int flags, int ifmt,
+    struct lwp *l, struct file **nfp)
+{
+	struct file *fp;
+	int error, fd;
+	const struct audio_hw_if *hw;
+	struct virtual_channel *vc;
+	struct audio_chan *chan;
+
+	KASSERT(mutex_owned(sc->sc_lock));
+
+	if (sc->sc_usemixer && !sc->sc_ready)
+		return ENXIO;
+
+	hw = sc->hw_if;
+	if (hw == NULL)
+		return ENXIO;
+
+	chan = kmem_zalloc(sizeof(struct audio_chan), KM_SLEEP);
+	if (sc->sc_usemixer)
+		vc = &sc->sc_mixring;
+	else
+		vc = sc->sc_hwvc;
+	chan->vc = vc;
+
+	error = fd_allocfile(&fp, &fd);
+	if (error)
+		goto bad;
+
+	chan->dev = dev;
+	chan->chan = 0;
+	chan->deschan = 0;
+
+	error = fd_clone(fp, fd, flags, &audio_fileops, chan);
+	KASSERT(error == EMOVEFD);
+
+	*nfp = fp;
+	return error;
+bad:
+	kmem_free(chan, sizeof(struct audio_chan));
+	return error;
+}
+
+int
 audio_open(dev_t dev, struct audio_softc *sc, int flags, int ifmt,
     struct lwp *l, struct file **nfp)
 {
@@ -2174,9 +2224,6 @@ audio_open(dev_t dev, struct audio_softc
 		vc = sc->sc_hwvc;
 	chan->vc = vc;
 
-	if (!sc->sc_usemixer && AUDIODEV(dev) == AUDIOCTL_DEVICE)
-		goto audioctl_dev;
-
 	if (sc->sc_usemixer) {
 		vc->sc_open = 0;
 		vc->sc_mode = 0;
@@ -2294,12 +2341,9 @@ audio_open(dev_t dev, struct audio_softc
 	/* audio_close() decreases sc_mpr[n].usedlow, recalculate here */
 	audio_calcwater(sc, vc);
 
-audioctl_dev:
 	error = fd_allocfile(&fp, &fd);
 	if (error)
 		goto bad;
-	if (!sc->sc_usemixer && AUDIODEV(dev) == AUDIOCTL_DEVICE)
-		goto setup_chan;
 
 	DPRINTF(("audio_open: done sc_mode = 0x%x\n", vc->sc_mode));
 
@@ -2310,7 +2354,6 @@ audioctl_dev:
 	if (flags & FWRITE)
 		sc->sc_opens++;
 
-setup_chan:
 	chan->dev = dev;
 	chan->chan = n;
 	chan->deschan = n;
@@ -2487,9 +2530,6 @@ audio_close(struct audio_softc *sc, int 
 
 	KASSERT(mutex_owned(sc->sc_lock));
 	
-	if (!sc->sc_usemixer && AUDIODEV(chan->dev) == AUDIOCTL_DEVICE)
-		return 0;
-
 	if (sc->sc_opens == 0 && sc->sc_recopens == 0)
 		return ENXIO;
 
@@ -3085,7 +3125,7 @@ audio_ioctl(dev_t dev, struct audio_soft
 	} else
 		pchan = chan;
 
-	if (chan->deschan != 0)
+	if (!sc->sc_usemixer || chan->deschan != 0)
 		vc = pchan->vc;
 	else
 		vc = &sc->sc_mixring;
@@ -4757,8 +4797,8 @@ done:
 
 	if (SPECIFIED(r->gain)) {
 		if (!sc->sc_usemixer || vc == &sc->sc_mixring) {
-			au_get_gain(sc, &sc->sc_outports, &gain, &balance);
-			error = au_set_gain(sc, &sc->sc_outports, r->gain, balance);
+			au_get_gain(sc, &sc->sc_inports, &gain, &balance);
+			error = au_set_gain(sc, &sc->sc_inports, r->gain, balance);
 			if (error)
 				goto cleanup;
 		} else

Added files:

Index: src/share/man/man9/audio_system.9
diff -u /dev/null src/share/man/man9/audio_system.9:1.1.2.2
--- /dev/null	Thu Jun  7 18:24:17 2018
+++ src/share/man/man9/audio_system.9	Thu Jun  7 18:24:15 2018
@@ -0,0 +1,307 @@
+.\"	$NetBSD: audio_system.9,v 1.1.2.2 2018/06/07 18:24:15 martin Exp $
+.\"
+.\" Copyright (c) 2016 - 2018  Nathanial Sloss <nathanialsl...@yahoo.com.au>
+.\" All rights reserved.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+.\" PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+.\" POSSIBILITY OF SUCH DAMAGE.
+.\"
+.Dd May 28, 2018
+.Dt AUDIO_SYSTEM 9
+.Os
+.Sh NAME
+.Nm audio_system
+.Nd the
+.Nx
+in-kernel audio mixer specification
+.Sh INTRODUCTION
+This document aims to describe all aspects of the in-kernel audio mixer
+included with
+.Nx 8
+and onwards, describing its current behavior as of 2018.
+.Sh VIRTUAL CHANNEL (VCHAN)
+This is the most fundamental element to the mixer.
+The vchan has all of the properties of the traditional single open
+.Nx
+audio channel.
+It consists of playback and record rings along with
+.Vt audio_info
+structures.
+.Pp
+Upon opening of
+.Pa /dev/audio
+or
+.Pa /dev/sound ,
+a new vchan and mixerctl structure is created.
+In the case of
+.Pa /dev/sound ,
+.Vt audio_info
+structures are inherited from the last open of
+.Pa /dev/audio
+or
+.Pa /dev/sound .
+.Pp
+All vchans are up or down sampled into the mix ring (intermediate) format
+before being sent to hardware.
+.Pp
+It is described in the following diagram:
+.Bd -literal
+	VCHAN1---------\\
+			\\   VCHAN0
+	VCHAN2-------------MIX RING ---- HARDWARE
+		...     /
+	VCHANn---------/
+.Ed
+.Pp
+In the case of
+.Xr sysctl 8
+.Dv usemixer=0
+(see below), there is only one vchan whose play
+and record rings are the hardware play/record rings.
+.Pp
+User accessible vchans are numbered starting at one (1).
+Vchan 0 is used internally by the mixer for the mix ring and its ring buffers
+are not user accessible.
+.Pp
+The only limit to the number of open vchans is the speed of the computer and the
+number of free file descriptors.
+.Sh BLOCK - SIZE / LATENCY
+A block of audio data is the basic unit for audio data.
+Audio applications will not commence playback until three (3) blocks have been
+written - this is the source of latency in the mixer along with the size of the
+audio data block.
+.Pp
+For normal uses of audio read/write there will be three blocks of audio data before
+playback commences one in the vchan, one in the mix ring and one in the
+hardware ring.
+.Pp
+The size of the audio data block is dependent on the audio format configured
+by the application the latency
+.Xr sysctl 8
+and the underlying audio hardware.
+.Pp
+Some audio hardware devices only support a static block size, as such the
+overall latency of the mixer for these devices cannot be changed.
+Other devices such as those supported by
+.Xr hdaudio 4
+allow the hardware block size
+to be changed, allowing the latency of the mixer to change from 4
+milliseconds (ms) to 128 ms with the mixer intermediate format being 16 bit,
+stereo, 48 kHz.
+.Pp
+With regard to mmapped audio, blocks are played back immediately so the latency
+presented to applications is one third of the latency
+.Xr sysctl 8
+value.
+.Pp
+Latency can be calculated by the following formula:
+.Bd -literal
+	Latency (ms) =	 blocksize(bytes) * num blocks * 1000
+			--------------------------------------
+			freq(Hz) * bytes per sample * channels
+.Ed
+.Pp
+Latency in the mixer and latency presented to audio applications is consistent,
+it will be the same regardless of the audio format requested by the audio
+application.
+.Pp
+The default latency configured at boot time is 150ms and is subject to the above
+constraints.
+.Sh ADDED IOCTLS
+Two new ioctls have been added to accommodate mixing of multiple vchans:
+.Bl -tag -width indent
+.It Dv AUDIO_SETCHAN :
+Allows setting the target vchan to operate on for subsequent
+.Xr ioctl 2
+calls.
+.It Dv AUDIO_GETCHAN :
+Returns the current vchan number.
+.El
+.Pp
+These ioctls were necessary as some audio applications like to open an
+.Xr audio 4
+device and an
+.Xr audioctl 4
+device so to check on buffer usage and samples played etc.
+.Pp
+As opening an
+.Xr audioctl 4
+device would represent vchan 0 (the mix ring), these
+ioctls allow setting the target vchan and
+.Vt audio_info
+structure to that of an existing vchan.
+.Sh MIXERCTL INTERFACE / SOFTWARE VOLUME
+Mixerctl structures are allocated when a new vchan is created.
+The mixer control structure allows for setting the software volume for playback -
+.Li vchan.dacN
+or recording -
+.Li vchan.adcN .
+These are 8 bit values and the this value is applied during mixing into the mix
+ring.
+.Pp
+The software volume is applied to all channels (1, 2, 4 etc.) in the vchan and at
+present (2018-05-04) there are no balance controls for user accessible vchans.
+.Pp
+The first vchan corresponds to the
+.Li vchan.dac1/adc1
+mixer controls.
+.Pp
+All vchan mixer controls only have effect upon its own volume and writing to
+.Li outputs.master
+(or equivalent) control is required to change the volume of the hardware.
+.Pp
+Mixer controls are only present whilst the chan is in use and numbering starts
+at one (1).
+Mixer control numbers i.e.
+.Li dac/adc1
+correspond to their vchan number.
+.Sh AUDIOCTL / AUDIO_INFO INTERFACE
+Audioctl allows access to the
+.Vt audio_info
+structure of a given device.
+Due to the audio mixer a
+.Fl p
+flag was added to allow access to a given vchan's
+.Vt audio_info
+structure.
+The values for
+.Fl p
+are numbered starting at zero (0).
+.Pp
+Not specifying
+.Fl p
+is the same as specifying
+.Fl p Ar 0
+and will result in working with vchan 0 (the mix ring).
+This will display the audio parameters of the mix ring and allow
+setting the hardware gain and balance.
+.Pp
+This is for compatibility with existing applications and shell scripts
+that are unaware of the
+.Fl p
+switch.
+.Pp
+The parameters for playback and recording only effect the particular vchan
+being operated on (gain, sample rate, channels, encoding etc), except
+.Fl p Ar 0
+(the mix ring).
+.Sh ADDED SYSCTLS
+With the introduction of the audio mixer the following
+.Xr sysctl 7 Ns s
+have been added:
+.Bl -tag -width indent
+.It Li hw.driverN.frequency :
+.It Li hw.driverN.precision :
+.It Li hw.driverN.channels :
+Intermediate mixing format.
+(see below)
+.It Li hw.driverN.latency :
+Expressed in milliseconds.
+(see above)
+.It Li hw.driverN.multiuser :
+Off/On (0/1), defaults to off.
+This
+.Xr sysctl 7
+determines if multiple users are allowed to access the sound hardware.
+The root user is always allowed access (i.e., for wsbell).
+The first user to open the audio device has full control of the audio device
+if this sysctl is set to off.
+There currently is an outstanding PR about affecting a privileged process -
+PR/52627.
+.Pp
+Ideally if root intervenes with the audio device, it should do so unaffected.
+.Pp
+If this control is set to on, then all users' audio data are mixed and all users
+have access to the audio hardware.
+.It Li hw.driverN.usemixer :
+Off/On (0/1), defaults to on.
+This
+.Xr sysctl 7
+enables or disables the audio mixer.
+When set to off, the audio device can support only one vchan.
+This vchan's play and record ring buffers are the hardware ring buffers.
+.Pp
+This option was added to aid older/slower systems where the extra overhead of
+the audio mixer might pose a problem.
+.El
+.Sh INTERMEDIATE / MIXING FORMAT
+The initial concept was to handle incoming audio data similarly to that of a
+superheterodyne radio receiver:
+.Pp
+.Dl		RF -> IF -> AF
+.Pp
+So the corresponding mixing concept is:
+.Pp
+.Dl		vchan -> mixing format -> hardware
+.Pp
+The
+.Xr sysctl 7 Ns s
+described above determine the format for mixing.
+All vchans are up or down sampled to this format before mixing takes place.
+.Pp
+On most systems this defaults to 16 bit stereo 48kHz.
+The
+.Xr sysctl 7 Ns s
+governing the mixing format may only be changed when there are no
+vchans in use.
+.Pp
+On faster systems the precision (8, 16, 32 bits) may be changed along with the
+sample rate and number of channels (mono, stereo, 4 etc.).
+.Pp
+On older/slower systems utilizing audio mixing, it may be required to lower the
+quality of this format to ease the amount of data processing whilst mixing.
+.Pp
+All possible audio formats (mulaw, alaw, slinear, ulinear, 8, 16, and 32 bit
+precision) are converted for use by the audio mixer.
+.Sh MEMORY MAPPED PLAYBACK
+It is possible to use mmap for audio playback, achieving reduced latency.
+However the audio applications selected format must match the
+mixing/intermediate format (see above).
+.Pp
+It is possible to obtain the
+.Vt audio_info
+for vchan0 which contains the
+intermediate/mixing format to ease applications configuring for mmapped audio.
+.Pp
+At present most applications don't use the mix ring's
+.Vt audio_info
+structure to obtain the requiredplay back parameters and some user
+intervention is required to set the audio format for the application.
+.Sh HARDWARE DRIVER REQUIREMENTS
+Audio mixing requires signed linear support in the host's endianness.
+Driver authors should support slinear_le and slinear_be formats.
+.Pp
+If the audio hardware is intended to be used with the mixer disabled, mulaw 1ch
+8000 hz needs to be supported also.
+.Pp
+This is easily achievable with the auconv framework/filters.
+All new drivers should consider the use of auconv where possible.
+.Sh SEE ALSO
+.Xr audioctl 1 ,
+.Xr mixerctl 1 ,
+.Xr audio 4 ,
+.Xr audio 9
+.Sh AUTHORS
+.An Nathanial Sloss
+.Sh SPECIAL THANKS
+Great appreciation goes to Onno van der Linden, isaki@, maya@, jmcneill@,
+pgoyette@, mrg@, riastradh@ and christos@ \(em without their input, this code would
+not be what it is currently.

Reply via email to