|
@@ -253,6 +253,39 @@ static bool hw_support_mmap(struct snd_pcm_substream *substream)
|
|
|
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)
|
|
|
{
|
|
@@ -265,6 +298,7 @@ int snd_pcm_hw_refine(struct snd_pcm_substream *substream,
|
|
|
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;
|
|
@@ -278,25 +312,9 @@ int snd_pcm_hw_refine(struct snd_pcm_substream *substream,
|
|
|
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);
|