xref: /openbmc/linux/include/sound/pcm_params.h (revision 5554743d)
11a59d1b8SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */
21da177e4SLinus Torvalds #ifndef __SOUND_PCM_PARAMS_H
31da177e4SLinus Torvalds #define __SOUND_PCM_PARAMS_H
41da177e4SLinus Torvalds 
51da177e4SLinus Torvalds /*
61da177e4SLinus Torvalds  *  PCM params helpers
71da177e4SLinus Torvalds  *  Copyright (c) by Abramo Bagnara <abramo@alsa-project.org>
81da177e4SLinus Torvalds  */
91da177e4SLinus Torvalds 
10f3761c39SMark Brown #include <sound/pcm.h>
11f3761c39SMark Brown 
12e88e8ae6STakashi Iwai int snd_pcm_hw_param_first(struct snd_pcm_substream *pcm,
13e88e8ae6STakashi Iwai 			   struct snd_pcm_hw_params *params,
141da177e4SLinus Torvalds 			   snd_pcm_hw_param_t var, int *dir);
15e88e8ae6STakashi Iwai int snd_pcm_hw_param_last(struct snd_pcm_substream *pcm,
16e88e8ae6STakashi Iwai 			  struct snd_pcm_hw_params *params,
171da177e4SLinus Torvalds 			  snd_pcm_hw_param_t var, int *dir);
18e88e8ae6STakashi Iwai int snd_pcm_hw_param_value(const struct snd_pcm_hw_params *params,
19e88e8ae6STakashi Iwai 			   snd_pcm_hw_param_t var, int *dir);
201da177e4SLinus Torvalds 
211da177e4SLinus Torvalds #define SNDRV_MASK_BITS	64	/* we use so far 64bits only */
221da177e4SLinus Torvalds #define SNDRV_MASK_SIZE	(SNDRV_MASK_BITS / 32)
231da177e4SLinus Torvalds #define MASK_OFS(i)	((i) >> 5)
241da177e4SLinus Torvalds #define MASK_BIT(i)	(1U << ((i) & 31))
251da177e4SLinus Torvalds 
snd_mask_none(struct snd_mask * mask)269bb22e21STakashi Iwai static inline void snd_mask_none(struct snd_mask *mask)
271da177e4SLinus Torvalds {
281da177e4SLinus Torvalds 	memset(mask, 0, sizeof(*mask));
291da177e4SLinus Torvalds }
301da177e4SLinus Torvalds 
snd_mask_any(struct snd_mask * mask)319bb22e21STakashi Iwai static inline void snd_mask_any(struct snd_mask *mask)
321da177e4SLinus Torvalds {
331da177e4SLinus Torvalds 	memset(mask, 0xff, SNDRV_MASK_SIZE * sizeof(u_int32_t));
341da177e4SLinus Torvalds }
351da177e4SLinus Torvalds 
snd_mask_empty(const struct snd_mask * mask)369bb22e21STakashi Iwai static inline int snd_mask_empty(const struct snd_mask *mask)
371da177e4SLinus Torvalds {
381da177e4SLinus Torvalds 	int i;
391da177e4SLinus Torvalds 	for (i = 0; i < SNDRV_MASK_SIZE; i++)
401da177e4SLinus Torvalds 		if (mask->bits[i])
411da177e4SLinus Torvalds 			return 0;
421da177e4SLinus Torvalds 	return 1;
431da177e4SLinus Torvalds }
441da177e4SLinus Torvalds 
snd_mask_min(const struct snd_mask * mask)459bb22e21STakashi Iwai static inline unsigned int snd_mask_min(const struct snd_mask *mask)
461da177e4SLinus Torvalds {
471da177e4SLinus Torvalds 	int i;
481da177e4SLinus Torvalds 	for (i = 0; i < SNDRV_MASK_SIZE; i++) {
491da177e4SLinus Torvalds 		if (mask->bits[i])
50599ee329SLars-Peter Clausen 			return __ffs(mask->bits[i]) + (i << 5);
511da177e4SLinus Torvalds 	}
521da177e4SLinus Torvalds 	return 0;
531da177e4SLinus Torvalds }
541da177e4SLinus Torvalds 
snd_mask_max(const struct snd_mask * mask)559bb22e21STakashi Iwai static inline unsigned int snd_mask_max(const struct snd_mask *mask)
561da177e4SLinus Torvalds {
571da177e4SLinus Torvalds 	int i;
581da177e4SLinus Torvalds 	for (i = SNDRV_MASK_SIZE - 1; i >= 0; i--) {
591da177e4SLinus Torvalds 		if (mask->bits[i])
60757b0376SLars-Peter Clausen 			return __fls(mask->bits[i]) + (i << 5);
611da177e4SLinus Torvalds 	}
621da177e4SLinus Torvalds 	return 0;
631da177e4SLinus Torvalds }
641da177e4SLinus Torvalds 
snd_mask_set(struct snd_mask * mask,unsigned int val)659bb22e21STakashi Iwai static inline void snd_mask_set(struct snd_mask *mask, unsigned int val)
661da177e4SLinus Torvalds {
671da177e4SLinus Torvalds 	mask->bits[MASK_OFS(val)] |= MASK_BIT(val);
681da177e4SLinus Torvalds }
691da177e4SLinus Torvalds 
700b62834eSTakashi Iwai /* Most of drivers need only this one */
snd_mask_set_format(struct snd_mask * mask,snd_pcm_format_t format)710b62834eSTakashi Iwai static inline void snd_mask_set_format(struct snd_mask *mask,
720b62834eSTakashi Iwai 				       snd_pcm_format_t format)
730b62834eSTakashi Iwai {
740b62834eSTakashi Iwai 	snd_mask_set(mask, (__force unsigned int)format);
750b62834eSTakashi Iwai }
760b62834eSTakashi Iwai 
snd_mask_reset(struct snd_mask * mask,unsigned int val)779bb22e21STakashi Iwai static inline void snd_mask_reset(struct snd_mask *mask, unsigned int val)
781da177e4SLinus Torvalds {
791da177e4SLinus Torvalds 	mask->bits[MASK_OFS(val)] &= ~MASK_BIT(val);
801da177e4SLinus Torvalds }
811da177e4SLinus Torvalds 
snd_mask_set_range(struct snd_mask * mask,unsigned int from,unsigned int to)829bb22e21STakashi Iwai static inline void snd_mask_set_range(struct snd_mask *mask,
839bb22e21STakashi Iwai 				      unsigned int from, unsigned int to)
841da177e4SLinus Torvalds {
851da177e4SLinus Torvalds 	unsigned int i;
861da177e4SLinus Torvalds 	for (i = from; i <= to; i++)
871da177e4SLinus Torvalds 		mask->bits[MASK_OFS(i)] |= MASK_BIT(i);
881da177e4SLinus Torvalds }
891da177e4SLinus Torvalds 
snd_mask_reset_range(struct snd_mask * mask,unsigned int from,unsigned int to)909bb22e21STakashi Iwai static inline void snd_mask_reset_range(struct snd_mask *mask,
919bb22e21STakashi Iwai 					unsigned int from, unsigned int to)
921da177e4SLinus Torvalds {
931da177e4SLinus Torvalds 	unsigned int i;
941da177e4SLinus Torvalds 	for (i = from; i <= to; i++)
951da177e4SLinus Torvalds 		mask->bits[MASK_OFS(i)] &= ~MASK_BIT(i);
961da177e4SLinus Torvalds }
971da177e4SLinus Torvalds 
snd_mask_leave(struct snd_mask * mask,unsigned int val)989bb22e21STakashi Iwai static inline void snd_mask_leave(struct snd_mask *mask, unsigned int val)
991da177e4SLinus Torvalds {
1001da177e4SLinus Torvalds 	unsigned int v;
1011da177e4SLinus Torvalds 	v = mask->bits[MASK_OFS(val)] & MASK_BIT(val);
1021da177e4SLinus Torvalds 	snd_mask_none(mask);
1031da177e4SLinus Torvalds 	mask->bits[MASK_OFS(val)] = v;
1041da177e4SLinus Torvalds }
1051da177e4SLinus Torvalds 
snd_mask_intersect(struct snd_mask * mask,const struct snd_mask * v)1069bb22e21STakashi Iwai static inline void snd_mask_intersect(struct snd_mask *mask,
1079bb22e21STakashi Iwai 				      const struct snd_mask *v)
1081da177e4SLinus Torvalds {
1091da177e4SLinus Torvalds 	int i;
1101da177e4SLinus Torvalds 	for (i = 0; i < SNDRV_MASK_SIZE; i++)
1111da177e4SLinus Torvalds 		mask->bits[i] &= v->bits[i];
1121da177e4SLinus Torvalds }
1131da177e4SLinus Torvalds 
snd_mask_eq(const struct snd_mask * mask,const struct snd_mask * v)1149bb22e21STakashi Iwai static inline int snd_mask_eq(const struct snd_mask *mask,
1159bb22e21STakashi Iwai 			      const struct snd_mask *v)
1161da177e4SLinus Torvalds {
1171da177e4SLinus Torvalds 	return ! memcmp(mask, v, SNDRV_MASK_SIZE * sizeof(u_int32_t));
1181da177e4SLinus Torvalds }
1191da177e4SLinus Torvalds 
snd_mask_copy(struct snd_mask * mask,const struct snd_mask * v)1209bb22e21STakashi Iwai static inline void snd_mask_copy(struct snd_mask *mask,
1219bb22e21STakashi Iwai 				 const struct snd_mask *v)
1221da177e4SLinus Torvalds {
1231da177e4SLinus Torvalds 	*mask = *v;
1241da177e4SLinus Torvalds }
1251da177e4SLinus Torvalds 
snd_mask_test(const struct snd_mask * mask,unsigned int val)1269bb22e21STakashi Iwai static inline int snd_mask_test(const struct snd_mask *mask, unsigned int val)
1271da177e4SLinus Torvalds {
1281da177e4SLinus Torvalds 	return mask->bits[MASK_OFS(val)] & MASK_BIT(val);
1291da177e4SLinus Torvalds }
1301da177e4SLinus Torvalds 
131b9c7d410STakashi Iwai /* Most of drivers need only this one */
snd_mask_test_format(const struct snd_mask * mask,snd_pcm_format_t format)132b9c7d410STakashi Iwai static inline int snd_mask_test_format(const struct snd_mask *mask,
133b9c7d410STakashi Iwai 				       snd_pcm_format_t format)
134b9c7d410STakashi Iwai {
135b9c7d410STakashi Iwai 	return snd_mask_test(mask, (__force unsigned int)format);
136b9c7d410STakashi Iwai }
137b9c7d410STakashi Iwai 
snd_mask_single(const struct snd_mask * mask)1389bb22e21STakashi Iwai static inline int snd_mask_single(const struct snd_mask *mask)
1391da177e4SLinus Torvalds {
1401da177e4SLinus Torvalds 	int i, c = 0;
1411da177e4SLinus Torvalds 	for (i = 0; i < SNDRV_MASK_SIZE; i++) {
1421da177e4SLinus Torvalds 		if (! mask->bits[i])
1431da177e4SLinus Torvalds 			continue;
1441da177e4SLinus Torvalds 		if (mask->bits[i] & (mask->bits[i] - 1))
1451da177e4SLinus Torvalds 			return 0;
1461da177e4SLinus Torvalds 		if (c)
1471da177e4SLinus Torvalds 			return 0;
1481da177e4SLinus Torvalds 		c++;
1491da177e4SLinus Torvalds 	}
1501da177e4SLinus Torvalds 	return 1;
1511da177e4SLinus Torvalds }
1521da177e4SLinus Torvalds 
snd_mask_refine(struct snd_mask * mask,const struct snd_mask * v)1539bb22e21STakashi Iwai static inline int snd_mask_refine(struct snd_mask *mask,
1549bb22e21STakashi Iwai 				  const struct snd_mask *v)
1551da177e4SLinus Torvalds {
156877211f5STakashi Iwai 	struct snd_mask old;
1571da177e4SLinus Torvalds 	snd_mask_copy(&old, mask);
1581da177e4SLinus Torvalds 	snd_mask_intersect(mask, v);
1591da177e4SLinus Torvalds 	if (snd_mask_empty(mask))
1601da177e4SLinus Torvalds 		return -EINVAL;
1611da177e4SLinus Torvalds 	return !snd_mask_eq(mask, &old);
1621da177e4SLinus Torvalds }
1631da177e4SLinus Torvalds 
snd_mask_refine_first(struct snd_mask * mask)1649bb22e21STakashi Iwai static inline int snd_mask_refine_first(struct snd_mask *mask)
1651da177e4SLinus Torvalds {
1661da177e4SLinus Torvalds 	if (snd_mask_single(mask))
1671da177e4SLinus Torvalds 		return 0;
1681da177e4SLinus Torvalds 	snd_mask_leave(mask, snd_mask_min(mask));
1691da177e4SLinus Torvalds 	return 1;
1701da177e4SLinus Torvalds }
1711da177e4SLinus Torvalds 
snd_mask_refine_last(struct snd_mask * mask)1729bb22e21STakashi Iwai static inline int snd_mask_refine_last(struct snd_mask *mask)
1731da177e4SLinus Torvalds {
1741da177e4SLinus Torvalds 	if (snd_mask_single(mask))
1751da177e4SLinus Torvalds 		return 0;
1761da177e4SLinus Torvalds 	snd_mask_leave(mask, snd_mask_max(mask));
1771da177e4SLinus Torvalds 	return 1;
1781da177e4SLinus Torvalds }
1791da177e4SLinus Torvalds 
snd_mask_refine_min(struct snd_mask * mask,unsigned int val)1809bb22e21STakashi Iwai static inline int snd_mask_refine_min(struct snd_mask *mask, unsigned int val)
1811da177e4SLinus Torvalds {
1821da177e4SLinus Torvalds 	if (snd_mask_min(mask) >= val)
1831da177e4SLinus Torvalds 		return 0;
1841da177e4SLinus Torvalds 	snd_mask_reset_range(mask, 0, val - 1);
1851da177e4SLinus Torvalds 	if (snd_mask_empty(mask))
1861da177e4SLinus Torvalds 		return -EINVAL;
1871da177e4SLinus Torvalds 	return 1;
1881da177e4SLinus Torvalds }
1891da177e4SLinus Torvalds 
snd_mask_refine_max(struct snd_mask * mask,unsigned int val)1909bb22e21STakashi Iwai static inline int snd_mask_refine_max(struct snd_mask *mask, unsigned int val)
1911da177e4SLinus Torvalds {
1921da177e4SLinus Torvalds 	if (snd_mask_max(mask) <= val)
1931da177e4SLinus Torvalds 		return 0;
1941da177e4SLinus Torvalds 	snd_mask_reset_range(mask, val + 1, SNDRV_MASK_BITS);
1951da177e4SLinus Torvalds 	if (snd_mask_empty(mask))
1961da177e4SLinus Torvalds 		return -EINVAL;
1971da177e4SLinus Torvalds 	return 1;
1981da177e4SLinus Torvalds }
1991da177e4SLinus Torvalds 
snd_mask_refine_set(struct snd_mask * mask,unsigned int val)2009bb22e21STakashi Iwai static inline int snd_mask_refine_set(struct snd_mask *mask, unsigned int val)
2011da177e4SLinus Torvalds {
2021da177e4SLinus Torvalds 	int changed;
2031da177e4SLinus Torvalds 	changed = !snd_mask_single(mask);
2041da177e4SLinus Torvalds 	snd_mask_leave(mask, val);
2051da177e4SLinus Torvalds 	if (snd_mask_empty(mask))
2061da177e4SLinus Torvalds 		return -EINVAL;
2071da177e4SLinus Torvalds 	return changed;
2081da177e4SLinus Torvalds }
2091da177e4SLinus Torvalds 
snd_mask_value(const struct snd_mask * mask)2109bb22e21STakashi Iwai static inline int snd_mask_value(const struct snd_mask *mask)
2111da177e4SLinus Torvalds {
2121da177e4SLinus Torvalds 	return snd_mask_min(mask);
2131da177e4SLinus Torvalds }
2141da177e4SLinus Torvalds 
snd_interval_any(struct snd_interval * i)2159bb22e21STakashi Iwai static inline void snd_interval_any(struct snd_interval *i)
2161da177e4SLinus Torvalds {
2171da177e4SLinus Torvalds 	i->min = 0;
2181da177e4SLinus Torvalds 	i->openmin = 0;
2191da177e4SLinus Torvalds 	i->max = UINT_MAX;
2201da177e4SLinus Torvalds 	i->openmax = 0;
2211da177e4SLinus Torvalds 	i->integer = 0;
2221da177e4SLinus Torvalds 	i->empty = 0;
2231da177e4SLinus Torvalds }
2241da177e4SLinus Torvalds 
snd_interval_none(struct snd_interval * i)2259bb22e21STakashi Iwai static inline void snd_interval_none(struct snd_interval *i)
2261da177e4SLinus Torvalds {
2271da177e4SLinus Torvalds 	i->empty = 1;
2281da177e4SLinus Torvalds }
2291da177e4SLinus Torvalds 
snd_interval_checkempty(const struct snd_interval * i)2309bb22e21STakashi Iwai static inline int snd_interval_checkempty(const struct snd_interval *i)
2311da177e4SLinus Torvalds {
2321da177e4SLinus Torvalds 	return (i->min > i->max ||
2331da177e4SLinus Torvalds 		(i->min == i->max && (i->openmin || i->openmax)));
2341da177e4SLinus Torvalds }
2351da177e4SLinus Torvalds 
snd_interval_empty(const struct snd_interval * i)2369bb22e21STakashi Iwai static inline int snd_interval_empty(const struct snd_interval *i)
2371da177e4SLinus Torvalds {
2381da177e4SLinus Torvalds 	return i->empty;
2391da177e4SLinus Torvalds }
2401da177e4SLinus Torvalds 
snd_interval_single(const struct snd_interval * i)2419bb22e21STakashi Iwai static inline int snd_interval_single(const struct snd_interval *i)
2421da177e4SLinus Torvalds {
2431da177e4SLinus Torvalds 	return (i->min == i->max ||
2445363857bSTakashi Iwai 		(i->min + 1 == i->max && (i->openmin || i->openmax)));
2451da177e4SLinus Torvalds }
2461da177e4SLinus Torvalds 
snd_interval_value(const struct snd_interval * i)2479bb22e21STakashi Iwai static inline int snd_interval_value(const struct snd_interval *i)
2481da177e4SLinus Torvalds {
2495363857bSTakashi Iwai 	if (i->openmin && !i->openmax)
2505363857bSTakashi Iwai 		return i->max;
2511da177e4SLinus Torvalds 	return i->min;
2521da177e4SLinus Torvalds }
2531da177e4SLinus Torvalds 
snd_interval_min(const struct snd_interval * i)2549bb22e21STakashi Iwai static inline int snd_interval_min(const struct snd_interval *i)
2551da177e4SLinus Torvalds {
2561da177e4SLinus Torvalds 	return i->min;
2571da177e4SLinus Torvalds }
2581da177e4SLinus Torvalds 
snd_interval_max(const struct snd_interval * i)2599bb22e21STakashi Iwai static inline int snd_interval_max(const struct snd_interval *i)
2601da177e4SLinus Torvalds {
2611da177e4SLinus Torvalds 	unsigned int v;
2621da177e4SLinus Torvalds 	v = i->max;
2631da177e4SLinus Torvalds 	if (i->openmax)
2641da177e4SLinus Torvalds 		v--;
2651da177e4SLinus Torvalds 	return v;
2661da177e4SLinus Torvalds }
2671da177e4SLinus Torvalds 
snd_interval_test(const struct snd_interval * i,unsigned int val)2689bb22e21STakashi Iwai static inline int snd_interval_test(const struct snd_interval *i, unsigned int val)
2691da177e4SLinus Torvalds {
2701da177e4SLinus Torvalds 	return !((i->min > val || (i->min == val && i->openmin) ||
2711da177e4SLinus Torvalds 		  i->max < val || (i->max == val && i->openmax)));
2721da177e4SLinus Torvalds }
2731da177e4SLinus Torvalds 
snd_interval_copy(struct snd_interval * d,const struct snd_interval * s)2749bb22e21STakashi Iwai static inline void snd_interval_copy(struct snd_interval *d, const struct snd_interval *s)
2751da177e4SLinus Torvalds {
2761da177e4SLinus Torvalds 	*d = *s;
2771da177e4SLinus Torvalds }
2781da177e4SLinus Torvalds 
snd_interval_setinteger(struct snd_interval * i)2799bb22e21STakashi Iwai static inline int snd_interval_setinteger(struct snd_interval *i)
2801da177e4SLinus Torvalds {
2811da177e4SLinus Torvalds 	if (i->integer)
2821da177e4SLinus Torvalds 		return 0;
2831da177e4SLinus Torvalds 	if (i->openmin && i->openmax && i->min == i->max)
2841da177e4SLinus Torvalds 		return -EINVAL;
2851da177e4SLinus Torvalds 	i->integer = 1;
2861da177e4SLinus Torvalds 	return 1;
2871da177e4SLinus Torvalds }
2881da177e4SLinus Torvalds 
snd_interval_eq(const struct snd_interval * i1,const struct snd_interval * i2)2899bb22e21STakashi Iwai static inline int snd_interval_eq(const struct snd_interval *i1, const struct snd_interval *i2)
2901da177e4SLinus Torvalds {
2911da177e4SLinus Torvalds 	if (i1->empty)
2921da177e4SLinus Torvalds 		return i2->empty;
2931da177e4SLinus Torvalds 	if (i2->empty)
2941da177e4SLinus Torvalds 		return i1->empty;
2951da177e4SLinus Torvalds 	return i1->min == i2->min && i1->openmin == i2->openmin &&
2961da177e4SLinus Torvalds 		i1->max == i2->max && i1->openmax == i2->openmax;
2971da177e4SLinus Torvalds }
2981da177e4SLinus Torvalds 
29989827ca9SLars-Peter Clausen /**
30089827ca9SLars-Peter Clausen  * params_access - get the access type from the hw params
30189827ca9SLars-Peter Clausen  * @p: hw params
30289827ca9SLars-Peter Clausen  */
params_access(const struct snd_pcm_hw_params * p)303744c2ad2SLars-Peter Clausen static inline snd_pcm_access_t params_access(const struct snd_pcm_hw_params *p)
304744c2ad2SLars-Peter Clausen {
305744c2ad2SLars-Peter Clausen 	return (__force snd_pcm_access_t)snd_mask_min(hw_param_mask_c(p,
306744c2ad2SLars-Peter Clausen 		SNDRV_PCM_HW_PARAM_ACCESS));
307744c2ad2SLars-Peter Clausen }
308744c2ad2SLars-Peter Clausen 
30989827ca9SLars-Peter Clausen /**
31089827ca9SLars-Peter Clausen  * params_format - get the sample format from the hw params
31189827ca9SLars-Peter Clausen  * @p: hw params
31289827ca9SLars-Peter Clausen  */
params_format(const struct snd_pcm_hw_params * p)313744c2ad2SLars-Peter Clausen static inline snd_pcm_format_t params_format(const struct snd_pcm_hw_params *p)
314744c2ad2SLars-Peter Clausen {
315744c2ad2SLars-Peter Clausen 	return (__force snd_pcm_format_t)snd_mask_min(hw_param_mask_c(p,
316744c2ad2SLars-Peter Clausen 		SNDRV_PCM_HW_PARAM_FORMAT));
317744c2ad2SLars-Peter Clausen }
318744c2ad2SLars-Peter Clausen 
31989827ca9SLars-Peter Clausen /**
32089827ca9SLars-Peter Clausen  * params_subformat - get the sample subformat from the hw params
32189827ca9SLars-Peter Clausen  * @p: hw params
32289827ca9SLars-Peter Clausen  */
323744c2ad2SLars-Peter Clausen static inline snd_pcm_subformat_t
params_subformat(const struct snd_pcm_hw_params * p)324744c2ad2SLars-Peter Clausen params_subformat(const struct snd_pcm_hw_params *p)
325744c2ad2SLars-Peter Clausen {
326744c2ad2SLars-Peter Clausen 	return (__force snd_pcm_subformat_t)snd_mask_min(hw_param_mask_c(p,
327744c2ad2SLars-Peter Clausen 		SNDRV_PCM_HW_PARAM_SUBFORMAT));
328744c2ad2SLars-Peter Clausen }
3291da177e4SLinus Torvalds 
33089827ca9SLars-Peter Clausen /**
33189827ca9SLars-Peter Clausen  * params_period_bytes - get the period size (in bytes) from the hw params
33289827ca9SLars-Peter Clausen  * @p: hw params
33389827ca9SLars-Peter Clausen  */
334b51beb75STakashi Iwai static inline unsigned int
params_period_bytes(const struct snd_pcm_hw_params * p)335b51beb75STakashi Iwai params_period_bytes(const struct snd_pcm_hw_params *p)
336b51beb75STakashi Iwai {
337cd9978f1SLars-Peter Clausen 	return hw_param_interval_c(p, SNDRV_PCM_HW_PARAM_PERIOD_BYTES)->min;
338b51beb75STakashi Iwai }
339b51beb75STakashi Iwai 
34089827ca9SLars-Peter Clausen /**
34189827ca9SLars-Peter Clausen  * params_width - get the number of bits of the sample format from the hw params
34289827ca9SLars-Peter Clausen  * @p: hw params
34389827ca9SLars-Peter Clausen  *
34489827ca9SLars-Peter Clausen  * This function returns the number of bits per sample that the selected sample
34589827ca9SLars-Peter Clausen  * format of the hw params has.
34689827ca9SLars-Peter Clausen  */
params_width(const struct snd_pcm_hw_params * p)34789827ca9SLars-Peter Clausen static inline int params_width(const struct snd_pcm_hw_params *p)
3488c5178fcSMark Brown {
3498c5178fcSMark Brown 	return snd_pcm_format_width(params_format(p));
3508c5178fcSMark Brown }
3518c5178fcSMark Brown 
35289827ca9SLars-Peter Clausen /*
35389827ca9SLars-Peter Clausen  * params_physical_width - get the storage size of the sample format from the hw params
35489827ca9SLars-Peter Clausen  * @p: hw params
35589827ca9SLars-Peter Clausen  *
35689827ca9SLars-Peter Clausen  * This functions returns the number of bits per sample that the selected sample
35789827ca9SLars-Peter Clausen  * format of the hw params takes up in memory. This will be equal or larger than
35889827ca9SLars-Peter Clausen  * params_width().
35989827ca9SLars-Peter Clausen  */
params_physical_width(const struct snd_pcm_hw_params * p)36089827ca9SLars-Peter Clausen static inline int params_physical_width(const struct snd_pcm_hw_params *p)
3618c5178fcSMark Brown {
3628c5178fcSMark Brown 	return snd_pcm_format_physical_width(params_format(p));
3638c5178fcSMark Brown }
3648c5178fcSMark Brown 
365052a9f69SFang, Yang A static inline void
params_set_format(struct snd_pcm_hw_params * p,snd_pcm_format_t fmt)366052a9f69SFang, Yang A params_set_format(struct snd_pcm_hw_params *p, snd_pcm_format_t fmt)
367052a9f69SFang, Yang A {
3680b62834eSTakashi Iwai 	snd_mask_set_format(hw_param_mask(p, SNDRV_PCM_HW_PARAM_FORMAT), fmt);
369052a9f69SFang, Yang A }
370052a9f69SFang, Yang A 
371b51beb75STakashi Iwai #endif /* __SOUND_PCM_PARAMS_H */
372