summaryrefslogtreecommitdiff
path: root/sound/core/pcm_native.c
diff options
context:
space:
mode:
authorTakashi Sakamoto <o-takashi@sakamocchi.jp>2017-06-09 06:36:59 +0900
committerTakashi Iwai <tiwai@suse.de>2017-06-08 23:40:27 +0200
commit561e1cadb4dca3783de82cfa453a142129953e4d (patch)
tree79650a26228d6aad7a5677aecd4f6892f79b60e8 /sound/core/pcm_native.c
parent55799c5ab99e8762e58c387e39f9fa36e8f14158 (diff)
ALSA: pcm: add a helper function to constrain mask-type parameters
Application of constraints to mask-type parameters for PCM substream is done in a call of snd_pcm_hw_refine(), while the function includes much codes and is not enough friendly to readers. This commit splits the codes to a separated function so that readers can get it easily. I leave desicion into compilers to merge the function into its callee. Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp> Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/core/pcm_native.c')
-rw-r--r--sound/core/pcm_native.c56
1 files changed, 37 insertions, 19 deletions
diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c
index 2bde07a4a87f..1dee5f960fbe 100644
--- a/sound/core/pcm_native.c
+++ b/sound/core/pcm_native.c
@@ -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);