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