Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 27 May 2026 15:33:37 +0000
From:      Christos Margiolis <christos@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: 5589a7499add - main - sound: Retire snd_mixer->enuminfo
Message-ID:  <6a170ed1.270cb.17e985b7@gitrepo.freebsd.org>

index | next in thread | raw e-mail

The branch main has been updated by christos:

URL: https://cgit.FreeBSD.org/src/commit/?id=5589a7499add5912a88e9424b0aec843e099fb60

commit 5589a7499add5912a88e9424b0aec843e099fb60
Author:     Christos Margiolis <christos@FreeBSD.org>
AuthorDate: 2026-04-17 17:31:00 +0000
Commit:     Christos Margiolis <christos@FreeBSD.org>
CommitDate: 2026-05-27 15:32:12 +0000

    sound: Retire snd_mixer->enuminfo
    
    Instead of caching this when mix_setrecdevs() is called (which many
    drivers never call), calculate it when we need it. After all, it is
    quite rare that this structure is used by applications.
    
    Sponsored by:   The FreeBSD Foundation
    MFC after:      1 week
    Pull Request:   https://ron-dev.freebsd.org/FreeBSD/src/pulls/18
---
 sys/dev/sound/pcm/mixer.c | 78 ++++++++++++++---------------------------------
 1 file changed, 23 insertions(+), 55 deletions(-)

diff --git a/sys/dev/sound/pcm/mixer.c b/sys/dev/sound/pcm/mixer.c
index 0001ea7b481a..e61371d13610 100644
--- a/sys/dev/sound/pcm/mixer.c
+++ b/sys/dev/sound/pcm/mixer.c
@@ -56,7 +56,6 @@ struct snd_mixer {
 	u_int8_t realdev[32];
 	char name[MIXER_NAMELEN];
 	struct mtx lock;
-	oss_mixer_enuminfo enuminfo;
 	int modify_counter;
 };
 
@@ -493,64 +492,12 @@ mix_setdevs(struct snd_mixer *m, u_int32_t v)
  * recording devices.  This function records that value in a structure
  * used by the rest of the mixer code.
  *
- * This function also populates a structure used by the SNDCTL_DSP_*RECSRC*
- * family of ioctls that are part of OSSV4.  All recording device labels
- * are concatenated in ascending order corresponding to their routing
- * numbers.  (Ex:  a system might have 0 => 'vol', 1 => 'cd', 2 => 'line',
- * etc.)  For now, these labels are just the standard recording device
- * names (cd, line1, etc.), but will eventually be fully dynamic and user
- * controlled.
- *
  * @param m	mixer device context container thing
  * @param v	mask of recording devices
  */
 void
 mix_setrecdevs(struct snd_mixer *m, u_int32_t v)
 {
-	oss_mixer_enuminfo *ei;
-	char *loc;
-	int i, nvalues, nwrote, nleft, ncopied;
-
-	ei = &m->enuminfo;
-
-	nvalues = 0;
-	nwrote = 0;
-	nleft = sizeof(ei->strings);
-	loc = ei->strings;
-
-	for (i = 0; i < SOUND_MIXER_NRDEVICES; i++) {
-		if ((1 << i) & v) {
-			ei->strindex[nvalues] = nwrote;
-			ncopied = strlcpy(loc, snd_mixernames[i], nleft) + 1;
-			    /* strlcpy retval doesn't include terminator */
-
-			nwrote += ncopied;
-			nleft -= ncopied;
-			nvalues++;
-
-			/*
-			 * XXX I don't think this should ever be possible.
-			 * Even with a move to dynamic device/channel names,
-			 * each label is limited to ~16 characters, so that'd
-			 * take a LOT to fill this buffer.
-			 */
-			if ((nleft <= 0) || (nvalues >= OSS_ENUM_MAXVALUE)) {
-				device_printf(m->dev,
-				    "mix_setrecdevs:  Not enough room to store device names--please file a bug report.\n");
-				device_printf(m->dev, 
-				    "mix_setrecdevs:  Please include details about your sound hardware, OS version, etc.\n");
-				break;
-			}
-
-			loc = &ei->strings[nwrote];
-		}
-	}
-
-	/*
-	 * NB:	The SNDCTL_DSP_GET_RECSRC_NAMES ioctl ignores the dev
-	 * 	and ctrl fields.
-	 */
-	ei->nvalues = nvalues;
 	m->recdevs = v;
 }
 
@@ -1104,10 +1051,31 @@ mixer_ioctl_cmd(struct cdev *i_dev, u_long cmd, caddr_t arg, int mode,
 
 	mtx_lock(&m->lock);
 	switch (cmd) {
-	case SNDCTL_DSP_GET_RECSRC_NAMES:
-		bcopy((void *)&m->enuminfo, arg, sizeof(oss_mixer_enuminfo));
+	case SNDCTL_DSP_GET_RECSRC_NAMES: {
+		oss_mixer_enuminfo *ei = (oss_mixer_enuminfo *)arg;
+		char *loc;
+		int i, nvalues, nwrote, nleft, ncopied;
+
+		nvalues = 0;
+		nwrote = 0;
+		nleft = sizeof(ei->strings);
+		loc = ei->strings;
+
+		for (i = 0; i < SOUND_MIXER_NRDEVICES; i++) {
+			if (!((1 << i) & m->recdevs))
+				continue;
+			ei->strindex[nvalues] = nwrote;
+			ncopied = strlcpy(loc, snd_mixernames[i], nleft) + 1;
+			nwrote += ncopied;
+			nleft -= ncopied;
+			nvalues++;
+			loc = &ei->strings[nwrote];
+		}
+		ei->nvalues = nvalues;
+
 		ret = 0;
 		goto done;
+	}
 	case SNDCTL_DSP_GET_RECSRC:
 		ret = mixer_get_recroute(m, arg_i);
 		goto done;


home | help

Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?6a170ed1.270cb.17e985b7>