18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
28c2ecf20Sopenharmony_ci#ifndef __SOUND_PCM_PARAMS_H
38c2ecf20Sopenharmony_ci#define __SOUND_PCM_PARAMS_H
48c2ecf20Sopenharmony_ci
58c2ecf20Sopenharmony_ci/*
68c2ecf20Sopenharmony_ci *  PCM params helpers
78c2ecf20Sopenharmony_ci *  Copyright (c) by Abramo Bagnara <abramo@alsa-project.org>
88c2ecf20Sopenharmony_ci */
98c2ecf20Sopenharmony_ci
108c2ecf20Sopenharmony_ci#include <sound/pcm.h>
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_ciint snd_pcm_hw_param_first(struct snd_pcm_substream *pcm,
138c2ecf20Sopenharmony_ci			   struct snd_pcm_hw_params *params,
148c2ecf20Sopenharmony_ci			   snd_pcm_hw_param_t var, int *dir);
158c2ecf20Sopenharmony_ciint snd_pcm_hw_param_last(struct snd_pcm_substream *pcm,
168c2ecf20Sopenharmony_ci			  struct snd_pcm_hw_params *params,
178c2ecf20Sopenharmony_ci			  snd_pcm_hw_param_t var, int *dir);
188c2ecf20Sopenharmony_ciint snd_pcm_hw_param_value(const struct snd_pcm_hw_params *params,
198c2ecf20Sopenharmony_ci			   snd_pcm_hw_param_t var, int *dir);
208c2ecf20Sopenharmony_ci
218c2ecf20Sopenharmony_ci#define SNDRV_MASK_BITS	64	/* we use so far 64bits only */
228c2ecf20Sopenharmony_ci#define SNDRV_MASK_SIZE	(SNDRV_MASK_BITS / 32)
238c2ecf20Sopenharmony_ci#define MASK_OFS(i)	((i) >> 5)
248c2ecf20Sopenharmony_ci#define MASK_BIT(i)	(1U << ((i) & 31))
258c2ecf20Sopenharmony_ci
268c2ecf20Sopenharmony_cistatic inline void snd_mask_none(struct snd_mask *mask)
278c2ecf20Sopenharmony_ci{
288c2ecf20Sopenharmony_ci	memset(mask, 0, sizeof(*mask));
298c2ecf20Sopenharmony_ci}
308c2ecf20Sopenharmony_ci
318c2ecf20Sopenharmony_cistatic inline void snd_mask_any(struct snd_mask *mask)
328c2ecf20Sopenharmony_ci{
338c2ecf20Sopenharmony_ci	memset(mask, 0xff, SNDRV_MASK_SIZE * sizeof(u_int32_t));
348c2ecf20Sopenharmony_ci}
358c2ecf20Sopenharmony_ci
368c2ecf20Sopenharmony_cistatic inline int snd_mask_empty(const struct snd_mask *mask)
378c2ecf20Sopenharmony_ci{
388c2ecf20Sopenharmony_ci	int i;
398c2ecf20Sopenharmony_ci	for (i = 0; i < SNDRV_MASK_SIZE; i++)
408c2ecf20Sopenharmony_ci		if (mask->bits[i])
418c2ecf20Sopenharmony_ci			return 0;
428c2ecf20Sopenharmony_ci	return 1;
438c2ecf20Sopenharmony_ci}
448c2ecf20Sopenharmony_ci
458c2ecf20Sopenharmony_cistatic inline unsigned int snd_mask_min(const struct snd_mask *mask)
468c2ecf20Sopenharmony_ci{
478c2ecf20Sopenharmony_ci	int i;
488c2ecf20Sopenharmony_ci	for (i = 0; i < SNDRV_MASK_SIZE; i++) {
498c2ecf20Sopenharmony_ci		if (mask->bits[i])
508c2ecf20Sopenharmony_ci			return __ffs(mask->bits[i]) + (i << 5);
518c2ecf20Sopenharmony_ci	}
528c2ecf20Sopenharmony_ci	return 0;
538c2ecf20Sopenharmony_ci}
548c2ecf20Sopenharmony_ci
558c2ecf20Sopenharmony_cistatic inline unsigned int snd_mask_max(const struct snd_mask *mask)
568c2ecf20Sopenharmony_ci{
578c2ecf20Sopenharmony_ci	int i;
588c2ecf20Sopenharmony_ci	for (i = SNDRV_MASK_SIZE - 1; i >= 0; i--) {
598c2ecf20Sopenharmony_ci		if (mask->bits[i])
608c2ecf20Sopenharmony_ci			return __fls(mask->bits[i]) + (i << 5);
618c2ecf20Sopenharmony_ci	}
628c2ecf20Sopenharmony_ci	return 0;
638c2ecf20Sopenharmony_ci}
648c2ecf20Sopenharmony_ci
658c2ecf20Sopenharmony_cistatic inline void snd_mask_set(struct snd_mask *mask, unsigned int val)
668c2ecf20Sopenharmony_ci{
678c2ecf20Sopenharmony_ci	mask->bits[MASK_OFS(val)] |= MASK_BIT(val);
688c2ecf20Sopenharmony_ci}
698c2ecf20Sopenharmony_ci
708c2ecf20Sopenharmony_ci/* Most of drivers need only this one */
718c2ecf20Sopenharmony_cistatic inline void snd_mask_set_format(struct snd_mask *mask,
728c2ecf20Sopenharmony_ci				       snd_pcm_format_t format)
738c2ecf20Sopenharmony_ci{
748c2ecf20Sopenharmony_ci	snd_mask_set(mask, (__force unsigned int)format);
758c2ecf20Sopenharmony_ci}
768c2ecf20Sopenharmony_ci
778c2ecf20Sopenharmony_cistatic inline void snd_mask_reset(struct snd_mask *mask, unsigned int val)
788c2ecf20Sopenharmony_ci{
798c2ecf20Sopenharmony_ci	mask->bits[MASK_OFS(val)] &= ~MASK_BIT(val);
808c2ecf20Sopenharmony_ci}
818c2ecf20Sopenharmony_ci
828c2ecf20Sopenharmony_cistatic inline void snd_mask_set_range(struct snd_mask *mask,
838c2ecf20Sopenharmony_ci				      unsigned int from, unsigned int to)
848c2ecf20Sopenharmony_ci{
858c2ecf20Sopenharmony_ci	unsigned int i;
868c2ecf20Sopenharmony_ci	for (i = from; i <= to; i++)
878c2ecf20Sopenharmony_ci		mask->bits[MASK_OFS(i)] |= MASK_BIT(i);
888c2ecf20Sopenharmony_ci}
898c2ecf20Sopenharmony_ci
908c2ecf20Sopenharmony_cistatic inline void snd_mask_reset_range(struct snd_mask *mask,
918c2ecf20Sopenharmony_ci					unsigned int from, unsigned int to)
928c2ecf20Sopenharmony_ci{
938c2ecf20Sopenharmony_ci	unsigned int i;
948c2ecf20Sopenharmony_ci	for (i = from; i <= to; i++)
958c2ecf20Sopenharmony_ci		mask->bits[MASK_OFS(i)] &= ~MASK_BIT(i);
968c2ecf20Sopenharmony_ci}
978c2ecf20Sopenharmony_ci
988c2ecf20Sopenharmony_cistatic inline void snd_mask_leave(struct snd_mask *mask, unsigned int val)
998c2ecf20Sopenharmony_ci{
1008c2ecf20Sopenharmony_ci	unsigned int v;
1018c2ecf20Sopenharmony_ci	v = mask->bits[MASK_OFS(val)] & MASK_BIT(val);
1028c2ecf20Sopenharmony_ci	snd_mask_none(mask);
1038c2ecf20Sopenharmony_ci	mask->bits[MASK_OFS(val)] = v;
1048c2ecf20Sopenharmony_ci}
1058c2ecf20Sopenharmony_ci
1068c2ecf20Sopenharmony_cistatic inline void snd_mask_intersect(struct snd_mask *mask,
1078c2ecf20Sopenharmony_ci				      const struct snd_mask *v)
1088c2ecf20Sopenharmony_ci{
1098c2ecf20Sopenharmony_ci	int i;
1108c2ecf20Sopenharmony_ci	for (i = 0; i < SNDRV_MASK_SIZE; i++)
1118c2ecf20Sopenharmony_ci		mask->bits[i] &= v->bits[i];
1128c2ecf20Sopenharmony_ci}
1138c2ecf20Sopenharmony_ci
1148c2ecf20Sopenharmony_cistatic inline int snd_mask_eq(const struct snd_mask *mask,
1158c2ecf20Sopenharmony_ci			      const struct snd_mask *v)
1168c2ecf20Sopenharmony_ci{
1178c2ecf20Sopenharmony_ci	return ! memcmp(mask, v, SNDRV_MASK_SIZE * sizeof(u_int32_t));
1188c2ecf20Sopenharmony_ci}
1198c2ecf20Sopenharmony_ci
1208c2ecf20Sopenharmony_cistatic inline void snd_mask_copy(struct snd_mask *mask,
1218c2ecf20Sopenharmony_ci				 const struct snd_mask *v)
1228c2ecf20Sopenharmony_ci{
1238c2ecf20Sopenharmony_ci	*mask = *v;
1248c2ecf20Sopenharmony_ci}
1258c2ecf20Sopenharmony_ci
1268c2ecf20Sopenharmony_cistatic inline int snd_mask_test(const struct snd_mask *mask, unsigned int val)
1278c2ecf20Sopenharmony_ci{
1288c2ecf20Sopenharmony_ci	return mask->bits[MASK_OFS(val)] & MASK_BIT(val);
1298c2ecf20Sopenharmony_ci}
1308c2ecf20Sopenharmony_ci
1318c2ecf20Sopenharmony_ci/* Most of drivers need only this one */
1328c2ecf20Sopenharmony_cistatic inline int snd_mask_test_format(const struct snd_mask *mask,
1338c2ecf20Sopenharmony_ci				       snd_pcm_format_t format)
1348c2ecf20Sopenharmony_ci{
1358c2ecf20Sopenharmony_ci	return snd_mask_test(mask, (__force unsigned int)format);
1368c2ecf20Sopenharmony_ci}
1378c2ecf20Sopenharmony_ci
1388c2ecf20Sopenharmony_cistatic inline int snd_mask_single(const struct snd_mask *mask)
1398c2ecf20Sopenharmony_ci{
1408c2ecf20Sopenharmony_ci	int i, c = 0;
1418c2ecf20Sopenharmony_ci	for (i = 0; i < SNDRV_MASK_SIZE; i++) {
1428c2ecf20Sopenharmony_ci		if (! mask->bits[i])
1438c2ecf20Sopenharmony_ci			continue;
1448c2ecf20Sopenharmony_ci		if (mask->bits[i] & (mask->bits[i] - 1))
1458c2ecf20Sopenharmony_ci			return 0;
1468c2ecf20Sopenharmony_ci		if (c)
1478c2ecf20Sopenharmony_ci			return 0;
1488c2ecf20Sopenharmony_ci		c++;
1498c2ecf20Sopenharmony_ci	}
1508c2ecf20Sopenharmony_ci	return 1;
1518c2ecf20Sopenharmony_ci}
1528c2ecf20Sopenharmony_ci
1538c2ecf20Sopenharmony_cistatic inline int snd_mask_refine(struct snd_mask *mask,
1548c2ecf20Sopenharmony_ci				  const struct snd_mask *v)
1558c2ecf20Sopenharmony_ci{
1568c2ecf20Sopenharmony_ci	struct snd_mask old;
1578c2ecf20Sopenharmony_ci	snd_mask_copy(&old, mask);
1588c2ecf20Sopenharmony_ci	snd_mask_intersect(mask, v);
1598c2ecf20Sopenharmony_ci	if (snd_mask_empty(mask))
1608c2ecf20Sopenharmony_ci		return -EINVAL;
1618c2ecf20Sopenharmony_ci	return !snd_mask_eq(mask, &old);
1628c2ecf20Sopenharmony_ci}
1638c2ecf20Sopenharmony_ci
1648c2ecf20Sopenharmony_cistatic inline int snd_mask_refine_first(struct snd_mask *mask)
1658c2ecf20Sopenharmony_ci{
1668c2ecf20Sopenharmony_ci	if (snd_mask_single(mask))
1678c2ecf20Sopenharmony_ci		return 0;
1688c2ecf20Sopenharmony_ci	snd_mask_leave(mask, snd_mask_min(mask));
1698c2ecf20Sopenharmony_ci	return 1;
1708c2ecf20Sopenharmony_ci}
1718c2ecf20Sopenharmony_ci
1728c2ecf20Sopenharmony_cistatic inline int snd_mask_refine_last(struct snd_mask *mask)
1738c2ecf20Sopenharmony_ci{
1748c2ecf20Sopenharmony_ci	if (snd_mask_single(mask))
1758c2ecf20Sopenharmony_ci		return 0;
1768c2ecf20Sopenharmony_ci	snd_mask_leave(mask, snd_mask_max(mask));
1778c2ecf20Sopenharmony_ci	return 1;
1788c2ecf20Sopenharmony_ci}
1798c2ecf20Sopenharmony_ci
1808c2ecf20Sopenharmony_cistatic inline int snd_mask_refine_min(struct snd_mask *mask, unsigned int val)
1818c2ecf20Sopenharmony_ci{
1828c2ecf20Sopenharmony_ci	if (snd_mask_min(mask) >= val)
1838c2ecf20Sopenharmony_ci		return 0;
1848c2ecf20Sopenharmony_ci	snd_mask_reset_range(mask, 0, val - 1);
1858c2ecf20Sopenharmony_ci	if (snd_mask_empty(mask))
1868c2ecf20Sopenharmony_ci		return -EINVAL;
1878c2ecf20Sopenharmony_ci	return 1;
1888c2ecf20Sopenharmony_ci}
1898c2ecf20Sopenharmony_ci
1908c2ecf20Sopenharmony_cistatic inline int snd_mask_refine_max(struct snd_mask *mask, unsigned int val)
1918c2ecf20Sopenharmony_ci{
1928c2ecf20Sopenharmony_ci	if (snd_mask_max(mask) <= val)
1938c2ecf20Sopenharmony_ci		return 0;
1948c2ecf20Sopenharmony_ci	snd_mask_reset_range(mask, val + 1, SNDRV_MASK_BITS);
1958c2ecf20Sopenharmony_ci	if (snd_mask_empty(mask))
1968c2ecf20Sopenharmony_ci		return -EINVAL;
1978c2ecf20Sopenharmony_ci	return 1;
1988c2ecf20Sopenharmony_ci}
1998c2ecf20Sopenharmony_ci
2008c2ecf20Sopenharmony_cistatic inline int snd_mask_refine_set(struct snd_mask *mask, unsigned int val)
2018c2ecf20Sopenharmony_ci{
2028c2ecf20Sopenharmony_ci	int changed;
2038c2ecf20Sopenharmony_ci	changed = !snd_mask_single(mask);
2048c2ecf20Sopenharmony_ci	snd_mask_leave(mask, val);
2058c2ecf20Sopenharmony_ci	if (snd_mask_empty(mask))
2068c2ecf20Sopenharmony_ci		return -EINVAL;
2078c2ecf20Sopenharmony_ci	return changed;
2088c2ecf20Sopenharmony_ci}
2098c2ecf20Sopenharmony_ci
2108c2ecf20Sopenharmony_cistatic inline int snd_mask_value(const struct snd_mask *mask)
2118c2ecf20Sopenharmony_ci{
2128c2ecf20Sopenharmony_ci	return snd_mask_min(mask);
2138c2ecf20Sopenharmony_ci}
2148c2ecf20Sopenharmony_ci
2158c2ecf20Sopenharmony_cistatic inline void snd_interval_any(struct snd_interval *i)
2168c2ecf20Sopenharmony_ci{
2178c2ecf20Sopenharmony_ci	i->min = 0;
2188c2ecf20Sopenharmony_ci	i->openmin = 0;
2198c2ecf20Sopenharmony_ci	i->max = UINT_MAX;
2208c2ecf20Sopenharmony_ci	i->openmax = 0;
2218c2ecf20Sopenharmony_ci	i->integer = 0;
2228c2ecf20Sopenharmony_ci	i->empty = 0;
2238c2ecf20Sopenharmony_ci}
2248c2ecf20Sopenharmony_ci
2258c2ecf20Sopenharmony_cistatic inline void snd_interval_none(struct snd_interval *i)
2268c2ecf20Sopenharmony_ci{
2278c2ecf20Sopenharmony_ci	i->empty = 1;
2288c2ecf20Sopenharmony_ci}
2298c2ecf20Sopenharmony_ci
2308c2ecf20Sopenharmony_cistatic inline int snd_interval_checkempty(const struct snd_interval *i)
2318c2ecf20Sopenharmony_ci{
2328c2ecf20Sopenharmony_ci	return (i->min > i->max ||
2338c2ecf20Sopenharmony_ci		(i->min == i->max && (i->openmin || i->openmax)));
2348c2ecf20Sopenharmony_ci}
2358c2ecf20Sopenharmony_ci
2368c2ecf20Sopenharmony_cistatic inline int snd_interval_empty(const struct snd_interval *i)
2378c2ecf20Sopenharmony_ci{
2388c2ecf20Sopenharmony_ci	return i->empty;
2398c2ecf20Sopenharmony_ci}
2408c2ecf20Sopenharmony_ci
2418c2ecf20Sopenharmony_cistatic inline int snd_interval_single(const struct snd_interval *i)
2428c2ecf20Sopenharmony_ci{
2438c2ecf20Sopenharmony_ci	return (i->min == i->max ||
2448c2ecf20Sopenharmony_ci		(i->min + 1 == i->max && (i->openmin || i->openmax)));
2458c2ecf20Sopenharmony_ci}
2468c2ecf20Sopenharmony_ci
2478c2ecf20Sopenharmony_cistatic inline int snd_interval_value(const struct snd_interval *i)
2488c2ecf20Sopenharmony_ci{
2498c2ecf20Sopenharmony_ci	if (i->openmin && !i->openmax)
2508c2ecf20Sopenharmony_ci		return i->max;
2518c2ecf20Sopenharmony_ci	return i->min;
2528c2ecf20Sopenharmony_ci}
2538c2ecf20Sopenharmony_ci
2548c2ecf20Sopenharmony_cistatic inline int snd_interval_min(const struct snd_interval *i)
2558c2ecf20Sopenharmony_ci{
2568c2ecf20Sopenharmony_ci	return i->min;
2578c2ecf20Sopenharmony_ci}
2588c2ecf20Sopenharmony_ci
2598c2ecf20Sopenharmony_cistatic inline int snd_interval_max(const struct snd_interval *i)
2608c2ecf20Sopenharmony_ci{
2618c2ecf20Sopenharmony_ci	unsigned int v;
2628c2ecf20Sopenharmony_ci	v = i->max;
2638c2ecf20Sopenharmony_ci	if (i->openmax)
2648c2ecf20Sopenharmony_ci		v--;
2658c2ecf20Sopenharmony_ci	return v;
2668c2ecf20Sopenharmony_ci}
2678c2ecf20Sopenharmony_ci
2688c2ecf20Sopenharmony_cistatic inline int snd_interval_test(const struct snd_interval *i, unsigned int val)
2698c2ecf20Sopenharmony_ci{
2708c2ecf20Sopenharmony_ci	return !((i->min > val || (i->min == val && i->openmin) ||
2718c2ecf20Sopenharmony_ci		  i->max < val || (i->max == val && i->openmax)));
2728c2ecf20Sopenharmony_ci}
2738c2ecf20Sopenharmony_ci
2748c2ecf20Sopenharmony_cistatic inline void snd_interval_copy(struct snd_interval *d, const struct snd_interval *s)
2758c2ecf20Sopenharmony_ci{
2768c2ecf20Sopenharmony_ci	*d = *s;
2778c2ecf20Sopenharmony_ci}
2788c2ecf20Sopenharmony_ci
2798c2ecf20Sopenharmony_cistatic inline int snd_interval_setinteger(struct snd_interval *i)
2808c2ecf20Sopenharmony_ci{
2818c2ecf20Sopenharmony_ci	if (i->integer)
2828c2ecf20Sopenharmony_ci		return 0;
2838c2ecf20Sopenharmony_ci	if (i->openmin && i->openmax && i->min == i->max)
2848c2ecf20Sopenharmony_ci		return -EINVAL;
2858c2ecf20Sopenharmony_ci	i->integer = 1;
2868c2ecf20Sopenharmony_ci	return 1;
2878c2ecf20Sopenharmony_ci}
2888c2ecf20Sopenharmony_ci
2898c2ecf20Sopenharmony_cistatic inline int snd_interval_eq(const struct snd_interval *i1, const struct snd_interval *i2)
2908c2ecf20Sopenharmony_ci{
2918c2ecf20Sopenharmony_ci	if (i1->empty)
2928c2ecf20Sopenharmony_ci		return i2->empty;
2938c2ecf20Sopenharmony_ci	if (i2->empty)
2948c2ecf20Sopenharmony_ci		return i1->empty;
2958c2ecf20Sopenharmony_ci	return i1->min == i2->min && i1->openmin == i2->openmin &&
2968c2ecf20Sopenharmony_ci		i1->max == i2->max && i1->openmax == i2->openmax;
2978c2ecf20Sopenharmony_ci}
2988c2ecf20Sopenharmony_ci
2998c2ecf20Sopenharmony_ci/**
3008c2ecf20Sopenharmony_ci * params_access - get the access type from the hw params
3018c2ecf20Sopenharmony_ci * @p: hw params
3028c2ecf20Sopenharmony_ci */
3038c2ecf20Sopenharmony_cistatic inline snd_pcm_access_t params_access(const struct snd_pcm_hw_params *p)
3048c2ecf20Sopenharmony_ci{
3058c2ecf20Sopenharmony_ci	return (__force snd_pcm_access_t)snd_mask_min(hw_param_mask_c(p,
3068c2ecf20Sopenharmony_ci		SNDRV_PCM_HW_PARAM_ACCESS));
3078c2ecf20Sopenharmony_ci}
3088c2ecf20Sopenharmony_ci
3098c2ecf20Sopenharmony_ci/**
3108c2ecf20Sopenharmony_ci * params_format - get the sample format from the hw params
3118c2ecf20Sopenharmony_ci * @p: hw params
3128c2ecf20Sopenharmony_ci */
3138c2ecf20Sopenharmony_cistatic inline snd_pcm_format_t params_format(const struct snd_pcm_hw_params *p)
3148c2ecf20Sopenharmony_ci{
3158c2ecf20Sopenharmony_ci	return (__force snd_pcm_format_t)snd_mask_min(hw_param_mask_c(p,
3168c2ecf20Sopenharmony_ci		SNDRV_PCM_HW_PARAM_FORMAT));
3178c2ecf20Sopenharmony_ci}
3188c2ecf20Sopenharmony_ci
3198c2ecf20Sopenharmony_ci/**
3208c2ecf20Sopenharmony_ci * params_subformat - get the sample subformat from the hw params
3218c2ecf20Sopenharmony_ci * @p: hw params
3228c2ecf20Sopenharmony_ci */
3238c2ecf20Sopenharmony_cistatic inline snd_pcm_subformat_t
3248c2ecf20Sopenharmony_ciparams_subformat(const struct snd_pcm_hw_params *p)
3258c2ecf20Sopenharmony_ci{
3268c2ecf20Sopenharmony_ci	return (__force snd_pcm_subformat_t)snd_mask_min(hw_param_mask_c(p,
3278c2ecf20Sopenharmony_ci		SNDRV_PCM_HW_PARAM_SUBFORMAT));
3288c2ecf20Sopenharmony_ci}
3298c2ecf20Sopenharmony_ci
3308c2ecf20Sopenharmony_ci/**
3318c2ecf20Sopenharmony_ci * params_period_bytes - get the period size (in bytes) from the hw params
3328c2ecf20Sopenharmony_ci * @p: hw params
3338c2ecf20Sopenharmony_ci */
3348c2ecf20Sopenharmony_cistatic inline unsigned int
3358c2ecf20Sopenharmony_ciparams_period_bytes(const struct snd_pcm_hw_params *p)
3368c2ecf20Sopenharmony_ci{
3378c2ecf20Sopenharmony_ci	return hw_param_interval_c(p, SNDRV_PCM_HW_PARAM_PERIOD_BYTES)->min;
3388c2ecf20Sopenharmony_ci}
3398c2ecf20Sopenharmony_ci
3408c2ecf20Sopenharmony_ci/**
3418c2ecf20Sopenharmony_ci * params_width - get the number of bits of the sample format from the hw params
3428c2ecf20Sopenharmony_ci * @p: hw params
3438c2ecf20Sopenharmony_ci *
3448c2ecf20Sopenharmony_ci * This function returns the number of bits per sample that the selected sample
3458c2ecf20Sopenharmony_ci * format of the hw params has.
3468c2ecf20Sopenharmony_ci */
3478c2ecf20Sopenharmony_cistatic inline int params_width(const struct snd_pcm_hw_params *p)
3488c2ecf20Sopenharmony_ci{
3498c2ecf20Sopenharmony_ci	return snd_pcm_format_width(params_format(p));
3508c2ecf20Sopenharmony_ci}
3518c2ecf20Sopenharmony_ci
3528c2ecf20Sopenharmony_ci/*
3538c2ecf20Sopenharmony_ci * params_physical_width - get the storage size of the sample format from the hw params
3548c2ecf20Sopenharmony_ci * @p: hw params
3558c2ecf20Sopenharmony_ci *
3568c2ecf20Sopenharmony_ci * This functions returns the number of bits per sample that the selected sample
3578c2ecf20Sopenharmony_ci * format of the hw params takes up in memory. This will be equal or larger than
3588c2ecf20Sopenharmony_ci * params_width().
3598c2ecf20Sopenharmony_ci */
3608c2ecf20Sopenharmony_cistatic inline int params_physical_width(const struct snd_pcm_hw_params *p)
3618c2ecf20Sopenharmony_ci{
3628c2ecf20Sopenharmony_ci	return snd_pcm_format_physical_width(params_format(p));
3638c2ecf20Sopenharmony_ci}
3648c2ecf20Sopenharmony_ci
3658c2ecf20Sopenharmony_cistatic inline void
3668c2ecf20Sopenharmony_ciparams_set_format(struct snd_pcm_hw_params *p, snd_pcm_format_t fmt)
3678c2ecf20Sopenharmony_ci{
3688c2ecf20Sopenharmony_ci	snd_mask_set_format(hw_param_mask(p, SNDRV_PCM_HW_PARAM_FORMAT), fmt);
3698c2ecf20Sopenharmony_ci}
3708c2ecf20Sopenharmony_ci
3718c2ecf20Sopenharmony_ci#endif /* __SOUND_PCM_PARAMS_H */
372