diff options
Diffstat (limited to 'sound/core/pcm_misc.c')
| -rw-r--r-- | sound/core/pcm_misc.c | 39 | 
1 files changed, 39 insertions, 0 deletions
diff --git a/sound/core/pcm_misc.c b/sound/core/pcm_misc.c index 43f24cce3de..4560ca0e565 100644 --- a/sound/core/pcm_misc.c +++ b/sound/core/pcm_misc.c @@ -514,3 +514,42 @@ unsigned int snd_pcm_rate_bit_to_rate(unsigned int rate_bit)  	return 0;  }  EXPORT_SYMBOL(snd_pcm_rate_bit_to_rate); + +static unsigned int snd_pcm_rate_mask_sanitize(unsigned int rates) +{ +	if (rates & SNDRV_PCM_RATE_CONTINUOUS) +		return SNDRV_PCM_RATE_CONTINUOUS; +	else if (rates & SNDRV_PCM_RATE_KNOT) +		return SNDRV_PCM_RATE_KNOT; +	return rates; +} + +/** + * snd_pcm_rate_mask_intersect - computes the intersection between two rate masks + * @rates_a: The first rate mask + * @rates_b: The second rate mask + * + * This function computes the rates that are supported by both rate masks passed + * to the function. It will take care of the special handling of + * SNDRV_PCM_RATE_CONTINUOUS and SNDRV_PCM_RATE_KNOT. + * + * Return: A rate mask containing the rates that are supported by both rates_a + * and rates_b. + */ +unsigned int snd_pcm_rate_mask_intersect(unsigned int rates_a, +	unsigned int rates_b) +{ +	rates_a = snd_pcm_rate_mask_sanitize(rates_a); +	rates_b = snd_pcm_rate_mask_sanitize(rates_b); + +	if (rates_a & SNDRV_PCM_RATE_CONTINUOUS) +		return rates_b; +	else if (rates_b & SNDRV_PCM_RATE_CONTINUOUS) +		return rates_a; +	else if (rates_a & SNDRV_PCM_RATE_KNOT) +		return rates_b; +	else if (rates_b & SNDRV_PCM_RATE_KNOT) +		return rates_a; +	return rates_a & rates_b; +} +EXPORT_SYMBOL_GPL(snd_pcm_rate_mask_intersect);  | 
