Commit 4e887af3 authored by Jorge Sanjuan's avatar Jorge Sanjuan Committed by Takashi Iwai

ALSA: usb-audio: Processing Unit controls parsing in UAC2

Current support for UAC2 Processing Units does the parsing
as one control per bit in the bitmap. However, the UAC2 spec
defines the controls as bit pairs where b01 means read-only
and b11 means read/write control.

This patch fixes that and uses the helper functions for checking
controls readability/writability when the control is defined as
bit pairs (UAC2 and UAC3).
Signed-off-by: default avatarJorge Sanjuan <jorge.sanjuan@codethink.co.uk>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent c77e1ef1
...@@ -2300,8 +2300,16 @@ static int build_audio_procunit(struct mixer_build *state, int unitid, ...@@ -2300,8 +2300,16 @@ static int build_audio_procunit(struct mixer_build *state, int unitid,
for (valinfo = info->values; valinfo->control; valinfo++) { for (valinfo = info->values; valinfo->control; valinfo++) {
__u8 *controls = uac_processing_unit_bmControls(desc, state->mixer->protocol); __u8 *controls = uac_processing_unit_bmControls(desc, state->mixer->protocol);
if (!(controls[valinfo->control / 8] & (1 << ((valinfo->control % 8) - 1)))) if (state->mixer->protocol == UAC_VERSION_1) {
continue; if (!(controls[valinfo->control / 8] &
(1 << ((valinfo->control % 8) - 1))))
continue;
} else { /* UAC_VERSION_2/3 */
if (!uac_v2v3_control_is_readable(controls[valinfo->control / 8],
valinfo->control))
continue;
}
map = find_map(state->map, unitid, valinfo->control); map = find_map(state->map, unitid, valinfo->control);
if (check_ignored_ctl(map)) if (check_ignored_ctl(map))
continue; continue;
...@@ -2313,6 +2321,11 @@ static int build_audio_procunit(struct mixer_build *state, int unitid, ...@@ -2313,6 +2321,11 @@ static int build_audio_procunit(struct mixer_build *state, int unitid,
cval->val_type = valinfo->val_type; cval->val_type = valinfo->val_type;
cval->channels = 1; cval->channels = 1;
if (state->mixer->protocol > UAC_VERSION_1 &&
!uac_v2v3_control_is_writeable(controls[valinfo->control / 8],
valinfo->control))
cval->master_readonly = 1;
/* get min/max values */ /* get min/max values */
if (type == UAC_PROCESS_UP_DOWNMIX && cval->control == UAC_UD_MODE_SELECT) { if (type == UAC_PROCESS_UP_DOWNMIX && cval->control == UAC_UD_MODE_SELECT) {
__u8 *control_spec = uac_processing_unit_specific(desc, state->mixer->protocol); __u8 *control_spec = uac_processing_unit_specific(desc, state->mixer->protocol);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment