Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 55b8cb46 authored by Jorge Sanjuan's avatar Jorge Sanjuan Committed by Takashi Iwai
Browse files

ALSA: usb-audio: Tidy up logic for Processing Unit min/max values



This patch refactors the processing units min/max calculation logic
for the mixer controls and fixes an issue where the Mode Select
checking of the Up/Down mixers doesn't differentiate between the
UAC1 and UAC2 Control Selector (0x02) and the UAC3 one which is
different (0x01).

Signed-off-by: default avatarJorge Sanjuan <jorge.sanjuan@codethink.co.uk>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 8b3a087f
Loading
Loading
Loading
Loading
+41 −17
Original line number Diff line number Diff line
@@ -2376,15 +2376,37 @@ static int build_audio_procunit(struct mixer_build *state, int unitid,
			cval->master_readonly = 1;

		/* get min/max values */
		if (type == UAC_PROCESS_UP_DOWNMIX && cval->control == UAC_UD_MODE_SELECT) {
			__u8 *control_spec = uac_processing_unit_specific(desc, state->mixer->protocol);
			/* FIXME: hard-coded */
		switch (type) {
		case UAC_PROCESS_UP_DOWNMIX: {
			bool mode_sel = false;

			switch (state->mixer->protocol) {
			case UAC_VERSION_1:
			case UAC_VERSION_2:
			default:
				if (cval->control == UAC_UD_MODE_SELECT)
					mode_sel = true;
				break;
			case UAC_VERSION_3:
				if (cval->control == UAC3_UD_MODE_SELECT)
					mode_sel = true;
				break;
			}

			if (mode_sel) {
				__u8 *control_spec = uac_processing_unit_specific(desc,
								state->mixer->protocol);
				cval->min = 1;
				cval->max = control_spec[0];
				cval->res = 1;
				cval->initialized = 1;
		} else {
			if (type == USB_XU_CLOCK_RATE) {
				break;
			}

			get_min_max(cval, valinfo->min_value);
			break;
		}
		case USB_XU_CLOCK_RATE:
			/*
			 * E-Mu USB 0404/0202/TrackerPre/0204
			 * samplerate control quirk
@@ -2393,8 +2415,10 @@ static int build_audio_procunit(struct mixer_build *state, int unitid,
			cval->max = 5;
			cval->res = 1;
			cval->initialized = 1;
			} else
			break;
		default:
			get_min_max(cval, valinfo->min_value);
			break;
		}

		kctl = snd_ctl_new1(&mixer_procunit_ctl, cval);