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-all
mailing list