Commit 561e1cad authored by Takashi Sakamoto's avatar Takashi Sakamoto Committed by Takashi Iwai
Browse files

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: default avatarTakashi Sakamoto <o-takashi@sakamocchi.jp>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 55799c5a
Loading
Loading
Loading
Loading
+37 −19
Original line number Diff line number Diff line
@@ -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);