diff options
author | Daniel Mack <daniel@caiaq.de> | 2010-05-31 13:35:43 +0200 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2010-05-31 18:17:49 +0200 |
commit | 67e1daa0bb30eda6ec5add27c3abf4536030f5a6 (patch) | |
tree | 7309eecb049e51203c9c6500e7f7a054a9503173 /sound/usb | |
parent | 2e0281d15c220d0a81c45c73872aa08d2f3ae3ef (diff) | |
download | linux-67e1daa0bb30eda6ec5add27c3abf4536030f5a6.tar.bz2 |
ALSA: usb-audio: clean up find_audio_control_unit()
Use a struct to parse the audio units, and return usable descriptors
for all types. There's no need to limit the result set, except for some
kind of sanity check.
Signed-off-by: Daniel Mack <daniel@caiaq.de>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/usb')
-rw-r--r-- | sound/usb/mixer.c | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/sound/usb/mixer.c b/sound/usb/mixer.c index 8be6bf2552b0..cb345360f811 100644 --- a/sound/usb/mixer.c +++ b/sound/usb/mixer.c @@ -165,22 +165,24 @@ static int check_mapped_selector_name(struct mixer_build *state, int unitid, /* * find an audio control unit with the given unit id - * this doesn't return any clock related units, so they need to be handled elsewhere */ static void *find_audio_control_unit(struct mixer_build *state, unsigned char unit) { - unsigned char *p; + /* we just parse the header */ + struct uac_feature_unit_descriptor *hdr = NULL; - p = NULL; - while ((p = snd_usb_find_desc(state->buffer, state->buflen, p, - USB_DT_CS_INTERFACE)) != NULL) { - if (p[0] >= 4 && p[2] >= UAC_INPUT_TERMINAL && p[2] <= UAC2_EXTENSION_UNIT_V2 && p[3] == unit) - return p; + while ((hdr = snd_usb_find_desc(state->buffer, state->buflen, hdr, + USB_DT_CS_INTERFACE)) != NULL) { + if (hdr->bLength >= 4 && + hdr->bDescriptorSubtype >= UAC_INPUT_TERMINAL && + hdr->bDescriptorSubtype <= UAC2_SAMPLE_RATE_CONVERTER && + hdr->bUnitID == unit) + return hdr; } + return NULL; } - /* * copy a string with the given id */ |