|
@@ -319,43 +319,23 @@ static int constrain_interval_params(struct snd_pcm_substream *substream,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-int snd_pcm_hw_refine(struct snd_pcm_substream *substream,
|
|
|
- struct snd_pcm_hw_params *params)
|
|
|
+static int constrain_params_by_rules(struct snd_pcm_substream *substream,
|
|
|
+ struct snd_pcm_hw_params *params)
|
|
|
{
|
|
|
+ struct snd_pcm_hw_constraints *constrs =
|
|
|
+ &substream->runtime->hw_constraints;
|
|
|
unsigned int k;
|
|
|
- struct snd_pcm_hardware *hw;
|
|
|
- struct snd_interval *i = NULL;
|
|
|
- struct snd_mask *m = NULL;
|
|
|
- struct snd_pcm_hw_constraints *constrs = &substream->runtime->hw_constraints;
|
|
|
unsigned int rstamps[constrs->rules_num];
|
|
|
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->info = 0;
|
|
|
- params->fifo_size = 0;
|
|
|
- if (params->rmask & (1 << SNDRV_PCM_HW_PARAM_SAMPLE_BITS))
|
|
|
- params->msbits = 0;
|
|
|
- if (params->rmask & (1 << SNDRV_PCM_HW_PARAM_RATE)) {
|
|
|
- params->rate_num = 0;
|
|
|
- params->rate_den = 0;
|
|
|
- }
|
|
|
-
|
|
|
- err = constrain_mask_params(substream, params);
|
|
|
- if (err < 0)
|
|
|
- return err;
|
|
|
-
|
|
|
- err = constrain_interval_params(substream, params);
|
|
|
- if (err < 0)
|
|
|
- return err;
|
|
|
+ struct snd_mask old_mask;
|
|
|
+ struct snd_interval old_interval;
|
|
|
+ int again;
|
|
|
+ int changed;
|
|
|
|
|
|
for (k = 0; k < constrs->rules_num; k++)
|
|
|
rstamps[k] = 0;
|
|
|
- for (k = 0; k <= SNDRV_PCM_HW_PARAM_LAST_INTERVAL; k++)
|
|
|
+ for (k = 0; k <= SNDRV_PCM_HW_PARAM_LAST_INTERVAL; k++)
|
|
|
vstamps[k] = (params->rmask & (1 << k)) ? 1 : 0;
|
|
|
do {
|
|
|
again = 0;
|
|
@@ -405,6 +385,39 @@ int snd_pcm_hw_refine(struct snd_pcm_substream *substream,
|
|
|
stamp++;
|
|
|
}
|
|
|
} while (again);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+int snd_pcm_hw_refine(struct snd_pcm_substream *substream,
|
|
|
+ struct snd_pcm_hw_params *params)
|
|
|
+{
|
|
|
+ struct snd_pcm_hardware *hw;
|
|
|
+ struct snd_interval *i = NULL;
|
|
|
+ struct snd_mask *m = NULL;
|
|
|
+ int err;
|
|
|
+
|
|
|
+ params->info = 0;
|
|
|
+ params->fifo_size = 0;
|
|
|
+ if (params->rmask & (1 << SNDRV_PCM_HW_PARAM_SAMPLE_BITS))
|
|
|
+ params->msbits = 0;
|
|
|
+ if (params->rmask & (1 << SNDRV_PCM_HW_PARAM_RATE)) {
|
|
|
+ params->rate_num = 0;
|
|
|
+ params->rate_den = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ err = constrain_mask_params(substream, params);
|
|
|
+ if (err < 0)
|
|
|
+ return err;
|
|
|
+
|
|
|
+ err = constrain_interval_params(substream, params);
|
|
|
+ if (err < 0)
|
|
|
+ return err;
|
|
|
+
|
|
|
+ err = constrain_params_by_rules(substream, params);
|
|
|
+ if (err < 0)
|
|
|
+ return err;
|
|
|
+
|
|
|
if (!params->msbits) {
|
|
|
i = hw_param_interval(params, SNDRV_PCM_HW_PARAM_SAMPLE_BITS);
|
|
|
if (snd_interval_single(i))
|
|
@@ -432,10 +445,10 @@ int snd_pcm_hw_refine(struct snd_pcm_substream *substream,
|
|
|
i = hw_param_interval(params, SNDRV_PCM_HW_PARAM_CHANNELS);
|
|
|
if (snd_mask_min(m) == snd_mask_max(m) &&
|
|
|
snd_interval_min(i) == snd_interval_max(i)) {
|
|
|
- changed = substream->ops->ioctl(substream,
|
|
|
+ err = substream->ops->ioctl(substream,
|
|
|
SNDRV_PCM_IOCTL1_FIFO_SIZE, params);
|
|
|
- if (changed < 0)
|
|
|
- return changed;
|
|
|
+ if (err < 0)
|
|
|
+ return err;
|
|
|
}
|
|
|
}
|
|
|
params->rmask = 0;
|