return true;
 }
 
+static int constrain_mask_params(struct snd_pcm_substream *substream,
+                                struct snd_pcm_hw_params *params)
+{
+       struct snd_pcm_hw_constraints *constrs =
+                                       &substream->runtime->hw_constraints;
+       struct snd_mask *m;
+       unsigned int k;
+       struct snd_mask old_mask;
+       int changed;
+
+       for (k = SNDRV_PCM_HW_PARAM_FIRST_MASK; k <= SNDRV_PCM_HW_PARAM_LAST_MASK; k++) {
+               m = hw_param_mask(params, k);
+               if (snd_mask_empty(m))
+                       return -EINVAL;
+               if (!(params->rmask & (1 << k)))
+                       continue;
+
+               if (trace_hw_mask_param_enabled())
+                       old_mask = *m;
+
+               changed = snd_mask_refine(m, constrs_mask(constrs, k));
+
+               trace_hw_mask_param(substream, k, 0, &old_mask, m);
+
+               if (changed)
+                       params->cmask |= 1 << k;
+               if (changed < 0)
+                       return changed;
+       }
+
+       return 0;
+}
+
 int snd_pcm_hw_refine(struct snd_pcm_substream *substream, 
                      struct snd_pcm_hw_params *params)
 {
        unsigned int vstamps[SNDRV_PCM_HW_PARAM_LAST_INTERVAL + 1];
        unsigned int stamp = 2;
        int changed, again;
+       int err;
 
        struct snd_mask __maybe_unused old_mask;
        struct snd_interval __maybe_unused old_interval;
                params->rate_den = 0;
        }
 
-       for (k = SNDRV_PCM_HW_PARAM_FIRST_MASK; k <= SNDRV_PCM_HW_PARAM_LAST_MASK; k++) {
-               m = hw_param_mask(params, k);
-               if (snd_mask_empty(m))
-                       return -EINVAL;
-               if (!(params->rmask & (1 << k)))
-                       continue;
-
-               if (trace_hw_mask_param_enabled())
-                       old_mask = *m;
-
-               changed = snd_mask_refine(m, constrs_mask(constrs, k));
-
-               trace_hw_mask_param(substream, k, 0, &old_mask, m);
-
-               if (changed)
-                       params->cmask |= 1 << k;
-               if (changed < 0)
-                       return changed;
-       }
+       err = constrain_mask_params(substream, params);
+       if (err < 0)
+               return err;
 
        for (k = SNDRV_PCM_HW_PARAM_FIRST_INTERVAL; k <= SNDRV_PCM_HW_PARAM_LAST_INTERVAL; k++) {
                i = hw_param_interval(params, k);