From: Cezary Rojewski Date: Fri, 4 Aug 2023 08:13:40 +0000 (+0200) Subject: pcm: Add MSBITS subformat options X-Git-Tag: v1.2.11~24 X-Git-Url: https://git.alsa-project.org/?a=commitdiff_plain;h=d8000f57fc458a46d1bdb5f6cedafd44fd52691f;p=alsa-lib.git pcm: Add MSBITS subformat options Improve granularity of format selection for S32/U32 formats by adding masks representing 20, 24 and 32 most significant bits. Closes: https://github.com/alsa-project/alsa-lib/pull/342 Signed-off-by: Cezary Rojewski Signed-off-by: Jaroslav Kysela --- diff --git a/include/pcm.h b/include/pcm.h index f18620be..102ff812 100644 --- a/include/pcm.h +++ b/include/pcm.h @@ -286,7 +286,13 @@ typedef enum _snd_pcm_subformat { SND_PCM_SUBFORMAT_UNKNOWN = -1, /** Standard */ SND_PCM_SUBFORMAT_STD = 0, - SND_PCM_SUBFORMAT_LAST = SND_PCM_SUBFORMAT_STD + /** Maximum bits based on PCM format */ + SND_PCM_SUBFORMAT_MSBITS_MAX = 1, + /** 20 most significant bits */ + SND_PCM_SUBFORMAT_MSBITS_20 = 2, + /** 24 most significant bits */ + SND_PCM_SUBFORMAT_MSBITS_24 = 3, + SND_PCM_SUBFORMAT_LAST = SND_PCM_SUBFORMAT_MSBITS_24 } snd_pcm_subformat_t; /** PCM state */ diff --git a/include/sound/uapi/asound.h b/include/sound/uapi/asound.h index 32095ef7..f3b2b94d 100644 --- a/include/sound/uapi/asound.h +++ b/include/sound/uapi/asound.h @@ -274,7 +274,10 @@ typedef int __bitwise snd_pcm_format_t; typedef int __bitwise snd_pcm_subformat_t; #define SNDRV_PCM_SUBFORMAT_STD ((snd_pcm_subformat_t) 0) -#define SNDRV_PCM_SUBFORMAT_LAST SNDRV_PCM_SUBFORMAT_STD +#define SNDRV_PCM_SUBFORMAT_MSBITS_MAX ((snd_pcm_subformat_t) 1) +#define SNDRV_PCM_SUBFORMAT_MSBITS_20 ((snd_pcm_subformat_t) 2) +#define SNDRV_PCM_SUBFORMAT_MSBITS_24 ((snd_pcm_subformat_t) 3) +#define SNDRV_PCM_SUBFORMAT_LAST SNDRV_PCM_SUBFORMAT_MSBITS_24 #define SNDRV_PCM_INFO_MMAP 0x00000001 /* hardware supports mmap */ #define SNDRV_PCM_INFO_MMAP_VALID 0x00000002 /* period data are valid during transfer */ diff --git a/src/pcm/pcm.c b/src/pcm/pcm.c index 8aae5afd..4bb5c759 100644 --- a/src/pcm/pcm.c +++ b/src/pcm/pcm.c @@ -2070,10 +2070,16 @@ static const char *const snd_pcm_type_names[] = { static const char *const snd_pcm_subformat_names[] = { SUBFORMAT(STD), + SUBFORMAT(MSBITS_MAX), + SUBFORMAT(MSBITS_20), + SUBFORMAT(MSBITS_24), }; static const char *const snd_pcm_subformat_descriptions[] = { SUBFORMATD(STD, "Standard"), + SUBFORMATD(MSBITS_MAX, "Maximum based on PCM format"), + SUBFORMATD(MSBITS_20, "20 most significant bits"), + SUBFORMATD(MSBITS_24, "24 most significant bits"), }; static const char *const snd_pcm_start_mode_names[] = { diff --git a/src/pcm/pcm_params.c b/src/pcm/pcm_params.c index 26c70132..c2f78634 100644 --- a/src/pcm/pcm_params.c +++ b/src/pcm/pcm_params.c @@ -2008,7 +2008,10 @@ static const snd_mask_t refine_masks[SND_PCM_HW_PARAM_LAST_MASK - SND_PCM_HW_PAR }, [SND_PCM_HW_PARAM_SUBFORMAT - SND_PCM_HW_PARAM_FIRST_MASK] = { .bits = { - PCM_BIT(SNDRV_PCM_SUBFORMAT_STD) + PCM_BIT(SNDRV_PCM_SUBFORMAT_STD) | + PCM_BIT(SNDRV_PCM_SUBFORMAT_MSBITS_MAX) | + PCM_BIT(SNDRV_PCM_SUBFORMAT_MSBITS_20) | + PCM_BIT(SNDRV_PCM_SUBFORMAT_MSBITS_24), }, }, };