ALSA: usb-audio: Simplify hw_params rules
authorTakashi Iwai <tiwai@suse.de>
Mon, 23 Nov 2020 08:53:17 +0000 (09:53 +0100)
committerTakashi Iwai <tiwai@suse.de>
Mon, 23 Nov 2020 14:12:56 +0000 (15:12 +0100)
Several hw_params functions narrows the interval via min/max rule in
the very similar way, so factor out those into a helper function and
use commonly.

No functional changes, just minor code refactoring.

Tested-by: Keith Milner <kamilner@superlative.org>
Tested-by: Dylan Robinson <dylan_robinson@motu.com>
Link: https://lore.kernel.org/r/20201123085347.19667-12-tiwai@suse.de
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/usb/pcm.c

index 6d1f527..ecc6bf9 100644 (file)
@@ -1121,6 +1121,36 @@ static int hw_check_valid_format(struct snd_usb_substream *subs,
        return 1;
 }
 
+static int apply_hw_params_minmax(struct snd_interval *it, unsigned int rmin,
+                                 unsigned int rmax)
+{
+       int changed;
+
+       if (rmin > rmax) {
+               hwc_debug("  --> get empty\n");
+               it->empty = 1;
+               return -EINVAL;
+       }
+
+       changed = 0;
+       if (it->min < rmin) {
+               it->min = rmin;
+               it->openmin = 0;
+               changed = 1;
+       }
+       if (it->max > rmax) {
+               it->max = rmax;
+               it->openmax = 0;
+               changed = 1;
+       }
+       if (snd_interval_checkempty(it)) {
+               it->empty = 1;
+               return -EINVAL;
+       }
+       hwc_debug("  --> (%d, %d) (changed = %d)\n", it->min, it->max, changed);
+       return changed;
+}
+
 static int hw_rule_rate(struct snd_pcm_hw_params *params,
                        struct snd_pcm_hw_rule *rule)
 {
@@ -1128,7 +1158,6 @@ static int hw_rule_rate(struct snd_pcm_hw_params *params,
        struct audioformat *fp;
        struct snd_interval *it = hw_param_interval(params, SNDRV_PCM_HW_PARAM_RATE);
        unsigned int rmin, rmax, r;
-       int changed;
        int i;
 
        hwc_debug("hw_rule_rate: (%d,%d)\n", it->min, it->max);
@@ -1151,29 +1180,7 @@ static int hw_rule_rate(struct snd_pcm_hw_params *params,
                }
        }
 
-       if (rmin > rmax) {
-               hwc_debug("  --> get empty\n");
-               it->empty = 1;
-               return -EINVAL;
-       }
-
-       changed = 0;
-       if (it->min < rmin) {
-               it->min = rmin;
-               it->openmin = 0;
-               changed = 1;
-       }
-       if (it->max > rmax) {
-               it->max = rmax;
-               it->openmax = 0;
-               changed = 1;
-       }
-       if (snd_interval_checkempty(it)) {
-               it->empty = 1;
-               return -EINVAL;
-       }
-       hwc_debug("  --> (%d, %d) (changed = %d)\n", it->min, it->max, changed);
-       return changed;
+       return apply_hw_params_minmax(it, rmin, rmax);
 }
 
 
@@ -1184,48 +1191,18 @@ static int hw_rule_channels(struct snd_pcm_hw_params *params,
        struct audioformat *fp;
        struct snd_interval *it = hw_param_interval(params, SNDRV_PCM_HW_PARAM_CHANNELS);
        unsigned int rmin, rmax;
-       int changed;
 
        hwc_debug("hw_rule_channels: (%d,%d)\n", it->min, it->max);
-       changed = 0;
-       rmin = rmax = 0;
+       rmin = UINT_MAX;
+       rmax = 0;
        list_for_each_entry(fp, &subs->fmt_list, list) {
                if (!hw_check_valid_format(subs, params, fp))
                        continue;
-               if (changed++) {
-                       if (rmin > fp->channels)
-                               rmin = fp->channels;
-                       if (rmax < fp->channels)
-                               rmax = fp->channels;
-               } else {
-                       rmin = fp->channels;
-                       rmax = fp->channels;
-               }
+               rmin = min(rmin, fp->channels);
+               rmax = max(rmax, fp->channels);
        }
 
-       if (!changed) {
-               hwc_debug("  --> get empty\n");
-               it->empty = 1;
-               return -EINVAL;
-       }
-
-       changed = 0;
-       if (it->min < rmin) {
-               it->min = rmin;
-               it->openmin = 0;
-               changed = 1;
-       }
-       if (it->max > rmax) {
-               it->max = rmax;
-               it->openmax = 0;
-               changed = 1;
-       }
-       if (snd_interval_checkempty(it)) {
-               it->empty = 1;
-               return -EINVAL;
-       }
-       hwc_debug("  --> (%d, %d) (changed = %d)\n", it->min, it->max, changed);
-       return changed;
+       return apply_hw_params_minmax(it, rmin, rmax);
 }
 
 static int hw_rule_format(struct snd_pcm_hw_params *params,
@@ -1267,7 +1244,6 @@ static int hw_rule_period_time(struct snd_pcm_hw_params *params,
        struct snd_interval *it;
        unsigned char min_datainterval;
        unsigned int pmin;
-       int changed;
 
        it = hw_param_interval(params, SNDRV_PCM_HW_PARAM_PERIOD_TIME);
        hwc_debug("hw_rule_period_time: (%u,%u)\n", it->min, it->max);
@@ -1283,18 +1259,8 @@ static int hw_rule_period_time(struct snd_pcm_hw_params *params,
                return -EINVAL;
        }
        pmin = 125 * (1 << min_datainterval);
-       changed = 0;
-       if (it->min < pmin) {
-               it->min = pmin;
-               it->openmin = 0;
-               changed = 1;
-       }
-       if (snd_interval_checkempty(it)) {
-               it->empty = 1;
-               return -EINVAL;
-       }
-       hwc_debug("  --> (%u,%u) (changed = %d)\n", it->min, it->max, changed);
-       return changed;
+
+       return apply_hw_params_minmax(it, pmin, UINT_MAX);
 }
 
 /* apply PCM hw constraints from the concurrent sync EP */