OSDN Git Service

ALSA: usb-audio: Tidy up logic for Processing Unit min/max values
authorJorge Sanjuan <jorge.sanjuan@codethink.co.uk>
Wed, 11 Jul 2018 12:37:55 +0000 (13:37 +0100)
committerTakashi Iwai <tiwai@suse.de>
Mon, 16 Jul 2018 14:36:15 +0000 (16:36 +0200)
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: Jorge Sanjuan <jorge.sanjuan@codethink.co.uk>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/usb/mixer.c

index 87f18cb..73e811f 100644 (file)
@@ -2376,25 +2376,49 @@ 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 */
-                       cval->min = 1;
-                       cval->max = control_spec[0];
-                       cval->res = 1;
-                       cval->initialized = 1;
-               } else {
-                       if (type == USB_XU_CLOCK_RATE) {
-                               /*
-                                * E-Mu USB 0404/0202/TrackerPre/0204
-                                * samplerate control quirk
-                                */
-                               cval->min = 0;
-                               cval->max = 5;
+               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
-                               get_min_max(cval, valinfo->min_value);
+                               break;
+                       }
+
+                       get_min_max(cval, valinfo->min_value);
+                       break;
+               }
+               case USB_XU_CLOCK_RATE:
+                       /*
+                        * E-Mu USB 0404/0202/TrackerPre/0204
+                        * samplerate control quirk
+                        */
+                       cval->min = 0;
+                       cval->max = 5;
+                       cval->res = 1;
+                       cval->initialized = 1;
+                       break;
+               default:
+                       get_min_max(cval, valinfo->min_value);
+                       break;
                }
 
                kctl = snd_ctl_new1(&mixer_procunit_ctl, cval);