svn commit: r359876 - stable/12/sys/dev/sound/usb

Hans Petter Selasky hselasky at FreeBSD.org
Mon Apr 13 16:25:12 UTC 2020


Author: hselasky
Date: Mon Apr 13 16:25:11 2020
New Revision: 359876
URL: https://svnweb.freebsd.org/changeset/base/359876

Log:
  MFC r359323:
  Be more intelligent when classifying USB audio terminal types, so that we
  don't end up using SOUND_MIXER_VOLUME for all undefined types.
  
  Sponsored by:	Mellanox Technologies

Modified:
  stable/12/sys/dev/sound/usb/uaudio.c
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/sys/dev/sound/usb/uaudio.c
==============================================================================
--- stable/12/sys/dev/sound/usb/uaudio.c	Mon Apr 13 16:24:21 2020	(r359875)
+++ stable/12/sys/dev/sound/usb/uaudio.c	Mon Apr 13 16:25:11 2020	(r359876)
@@ -4511,52 +4511,61 @@ static const struct uaudio_tt_to_feature uaudio_tt_to_
 	{UATF_MULTITRACK, SOUND_MIXER_VOLUME},
 	{0xffff, SOUND_MIXER_VOLUME},
 
-	/* default */
-	{0x0000, SOUND_MIXER_VOLUME},
+	/* end */
+	{}
 };
 
 static uint16_t
-uaudio_mixer_feature_name(const struct uaudio_terminal_node *iot,
-    struct uaudio_mixer_node *mix)
+uaudio_mixer_feature_name_sub(uint16_t terminal_type)
 {
 	const struct uaudio_tt_to_feature *uat = uaudio_tt_to_feature;
-	uint16_t terminal_type = uaudio_mixer_determine_class(iot, mix);
+	uint16_t retval;
 
-	if ((mix->class == UAC_RECORD) && (terminal_type == 0)) {
-		return (SOUND_MIXER_IMIX);
-	}
-	while (uat->terminal_type) {
-		if (uat->terminal_type == terminal_type) {
-			break;
+	while (1) {
+		if (uat->terminal_type == 0) {
+			switch (terminal_type >> 8) {
+			case UATI_UNDEFINED >> 8:
+				retval = SOUND_MIXER_RECLEV;
+				goto done;
+			case UATO_UNDEFINED >> 8:
+				retval = SOUND_MIXER_PCM;
+				goto done;
+			default:
+				retval = SOUND_MIXER_VOLUME;
+				goto done;
+			}
+		} else if (uat->terminal_type == terminal_type) {
+			retval = uat->feature;
+			goto done;
 		}
 		uat++;
 	}
-
+done:
 	DPRINTF("terminal_type=0x%04x -> %d\n",
-	    terminal_type, uat->feature);
+	    terminal_type, retval);
+	return (retval);
+}
 
-	return (uat->feature);
+static uint16_t
+uaudio_mixer_feature_name(const struct uaudio_terminal_node *iot,
+    struct uaudio_mixer_node *mix)
+{
+	uint16_t terminal_type = uaudio_mixer_determine_class(iot, mix);
+
+	if (mix->class == UAC_RECORD && terminal_type == 0)
+		return (SOUND_MIXER_IMIX);
+	return (uaudio_mixer_feature_name_sub(terminal_type));
 }
 
 static uint16_t
 uaudio20_mixer_feature_name(const struct uaudio_terminal_node *iot,
     struct uaudio_mixer_node *mix)
 {
-	const struct uaudio_tt_to_feature *uat;
 	uint16_t terminal_type = uaudio20_mixer_determine_class(iot, mix);
 
-	if ((mix->class == UAC_RECORD) && (terminal_type == 0))
+	if (mix->class == UAC_RECORD && terminal_type == 0)
 		return (SOUND_MIXER_IMIX);
-	
-	for (uat = uaudio_tt_to_feature; uat->terminal_type != 0; uat++) {
-		if (uat->terminal_type == terminal_type)
-			break;
-	}
-
-	DPRINTF("terminal_type=0x%04x -> %d\n",
-	    terminal_type, uat->feature);
-
-	return (uat->feature);
+	return (uaudio_mixer_feature_name_sub(terminal_type));
 }
 
 static const struct uaudio_terminal_node *


More information about the svn-src-stable-12 mailing list