All of lore.kernel.org
 help / color / mirror / Atom feed
* dsd formats in ALSA plugins
@ 2018-06-27 18:34 slava
  2018-06-28  6:06 ` Takashi Iwai
  0 siblings, 1 reply; 4+ messages in thread
From: slava @ 2018-06-27 18:34 UTC (permalink / raw)
  To: alsa-devel

Sorry, don't receive my own post, so can't reply

Find in alsa-lib-1.1.6 file src/pcm/pcm-params.c line 1945

static const snd_mask_t refine_masks[SND_PCM_HW_PARAM_LAST_MASK - 
SND_PCM_HW_PARAM_FIRST_MASK + 1] = {
     [SND_PCM_HW_PARAM_ACCESS - SND_PCM_HW_PARAM_FIRST_MASK] = {
         .bits = { 0x1f },
     },
     [SND_PCM_HW_PARAM_FORMAT - SND_PCM_HW_PARAM_FIRST_MASK] = {
         .bits = { 0x81ffffff, 0xfff},

Change last 0xfff to 0xfffff and now can use DSD formats

How i understand, in version 1.0.27 last format = 43
and when new format was added but mask not changed

May be i absolutely wrong and what i do has side effects or
needed any else?

Thanks
_______________________________________________
Alsa-devel mailing list
Alsa-devel@alsa-project.org
http://mailman.alsa-project.org/mailman/listinfo/alsa-devel

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: dsd formats in ALSA plugins
  2018-06-27 18:34 dsd formats in ALSA plugins slava
@ 2018-06-28  6:06 ` Takashi Iwai
  0 siblings, 0 replies; 4+ messages in thread
From: Takashi Iwai @ 2018-06-28  6:06 UTC (permalink / raw)
  To: slava; +Cc: alsa-devel

On Wed, 27 Jun 2018 20:34:34 +0200,
slava wrote:
> 
> Sorry, don't receive my own post, so can't reply
> 
> Find in alsa-lib-1.1.6 file src/pcm/pcm-params.c line 1945
> 
> static const snd_mask_t refine_masks[SND_PCM_HW_PARAM_LAST_MASK - 
> SND_PCM_HW_PARAM_FIRST_MASK + 1] = {
>     [SND_PCM_HW_PARAM_ACCESS - SND_PCM_HW_PARAM_FIRST_MASK] = {
>         .bits = { 0x1f },
>     },
>     [SND_PCM_HW_PARAM_FORMAT - SND_PCM_HW_PARAM_FIRST_MASK] = {
>         .bits = { 0x81ffffff, 0xfff},
> 
> Change last 0xfff to 0xfffff and now can use DSD formats
> 
> How i understand, in version 1.0.27 last format = 43
> and when new format was added but mask not changed
> 
> May be i absolutely wrong and what i do has side effects or
> needed any else?

That's the correct observation, the needed bits are missing.

We should have listed each bit explicitly to avoid such an overlook
from the beginning.

Below is the fix patch.  Could you check whether it works as expected?


thanks,

Takashi

-- 8< --
From: Takashi Iwai <tiwai@suse.de>
Subject: [PATCH] pcm: Define refine mask bits explicitly (and fix missing DSD
 support)

Instead of the expanded bit numbers like 0x81ffffff, list up the all
supported PCM bits explicitly for refine_masks[] in pcm_params.c.
This makes easier to update any additional formats or other
parameters, and easier to spot out missing ones.

Actually the GSM and DSD formats were missing; with this commit, they
are supported properly now.

Signed-off-by: Takashi Iwai <tiwai@suse.de>
---
 src/pcm/pcm_params.c | 70 ++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 67 insertions(+), 3 deletions(-)

diff --git a/src/pcm/pcm_params.c b/src/pcm/pcm_params.c
index 608a2324cb26..8826bc3d3197 100644
--- a/src/pcm/pcm_params.c
+++ b/src/pcm/pcm_params.c
@@ -1936,16 +1936,80 @@ static const snd_pcm_hw_rule_t refine_rules[] = {
 };
 
 #define RULES (sizeof(refine_rules) / sizeof(refine_rules[0]))
+#define PCM_BIT(x) \
+	(1U << ((x) < 32 ? (x) : ((x) - 32)))
 
 static const snd_mask_t refine_masks[SND_PCM_HW_PARAM_LAST_MASK - SND_PCM_HW_PARAM_FIRST_MASK + 1] = {
 	[SND_PCM_HW_PARAM_ACCESS - SND_PCM_HW_PARAM_FIRST_MASK] = {
-		.bits = { 0x1f },
+		.bits = {
+			PCM_BIT(SNDRV_PCM_ACCESS_MMAP_INTERLEAVED) |
+			PCM_BIT(SNDRV_PCM_ACCESS_MMAP_NONINTERLEAVED) |
+			PCM_BIT(SNDRV_PCM_ACCESS_MMAP_COMPLEX) |
+			PCM_BIT(SNDRV_PCM_ACCESS_RW_INTERLEAVED) |
+			PCM_BIT(SNDRV_PCM_ACCESS_RW_NONINTERLEAVED)
+		},
 	},
 	[SND_PCM_HW_PARAM_FORMAT - SND_PCM_HW_PARAM_FIRST_MASK] = {
-		.bits = { 0x81ffffff, 0xfff},
+		.bits = {
+			/* first 32bits */
+			PCM_BIT(SNDRV_PCM_FORMAT_S8) |
+			PCM_BIT(SNDRV_PCM_FORMAT_U8) |
+			PCM_BIT(SNDRV_PCM_FORMAT_S16_LE) |
+			PCM_BIT(SNDRV_PCM_FORMAT_S16_BE) |
+			PCM_BIT(SNDRV_PCM_FORMAT_U16_LE) |
+			PCM_BIT(SNDRV_PCM_FORMAT_U16_BE) |
+			PCM_BIT(SNDRV_PCM_FORMAT_S24_LE) |
+			PCM_BIT(SNDRV_PCM_FORMAT_S24_BE) |
+			PCM_BIT(SNDRV_PCM_FORMAT_U24_LE) |
+			PCM_BIT(SNDRV_PCM_FORMAT_U24_BE) |
+			PCM_BIT(SNDRV_PCM_FORMAT_S32_LE) |
+			PCM_BIT(SNDRV_PCM_FORMAT_S32_BE) |
+			PCM_BIT(SNDRV_PCM_FORMAT_U32_LE) |
+			PCM_BIT(SNDRV_PCM_FORMAT_U32_BE) |
+			PCM_BIT(SNDRV_PCM_FORMAT_FLOAT_LE) |
+			PCM_BIT(SNDRV_PCM_FORMAT_FLOAT_BE) |
+			PCM_BIT(SNDRV_PCM_FORMAT_FLOAT64_LE) |
+			PCM_BIT(SNDRV_PCM_FORMAT_FLOAT64_BE) |
+			PCM_BIT(SNDRV_PCM_FORMAT_IEC958_SUBFRAME) |
+			PCM_BIT(SNDRV_PCM_FORMAT_IEC958_SUBFRAME) |
+			PCM_BIT(SNDRV_PCM_FORMAT_MU_LAW) |
+			PCM_BIT(SNDRV_PCM_FORMAT_A_LAW) |
+			PCM_BIT(SNDRV_PCM_FORMAT_IMA_ADPCM) |
+			PCM_BIT(SNDRV_PCM_FORMAT_MPEG) |
+			PCM_BIT(SNDRV_PCM_FORMAT_GSM) |
+			PCM_BIT(SNDRV_PCM_FORMAT_S20_LE) |
+			PCM_BIT(SNDRV_PCM_FORMAT_S20_BE) |
+			PCM_BIT(SNDRV_PCM_FORMAT_U20_LE) |
+			PCM_BIT(SNDRV_PCM_FORMAT_U20_BE) |
+			PCM_BIT(SNDRV_PCM_FORMAT_SPECIAL),
+			/* second 32bits */
+			PCM_BIT(SNDRV_PCM_FORMAT_S24_3LE) |
+			PCM_BIT(SNDRV_PCM_FORMAT_S24_3BE) |
+			PCM_BIT(SNDRV_PCM_FORMAT_U24_3LE) |
+			PCM_BIT(SNDRV_PCM_FORMAT_U24_3BE) |
+			PCM_BIT(SNDRV_PCM_FORMAT_S20_3LE) |
+			PCM_BIT(SNDRV_PCM_FORMAT_S20_3BE) |
+			PCM_BIT(SNDRV_PCM_FORMAT_U20_3LE) |
+			PCM_BIT(SNDRV_PCM_FORMAT_U20_3BE) |
+			PCM_BIT(SNDRV_PCM_FORMAT_S18_3LE) |
+			PCM_BIT(SNDRV_PCM_FORMAT_S18_3BE) |
+			PCM_BIT(SNDRV_PCM_FORMAT_U18_3LE) |
+			PCM_BIT(SNDRV_PCM_FORMAT_U18_3BE) |
+			PCM_BIT(SNDRV_PCM_FORMAT_G723_24) |
+			PCM_BIT(SNDRV_PCM_FORMAT_G723_24) |
+			PCM_BIT(SNDRV_PCM_FORMAT_G723_40) |
+			PCM_BIT(SNDRV_PCM_FORMAT_G723_40) |
+			PCM_BIT(SNDRV_PCM_FORMAT_DSD_U8) |
+			PCM_BIT(SNDRV_PCM_FORMAT_DSD_U16_LE) |
+			PCM_BIT(SNDRV_PCM_FORMAT_DSD_U32_LE) |
+			PCM_BIT(SNDRV_PCM_FORMAT_DSD_U16_BE) |
+			PCM_BIT(SNDRV_PCM_FORMAT_DSD_U32_BE)
+		},
 	},
 	[SND_PCM_HW_PARAM_SUBFORMAT - SND_PCM_HW_PARAM_FIRST_MASK] = {
-		.bits = { 0x1 },
+		.bits = {
+			PCM_BIT(SNDRV_PCM_SUBFORMAT_STD)
+		},
 	},
 };
   
-- 
2.17.1

_______________________________________________
Alsa-devel mailing list
Alsa-devel@alsa-project.org
http://mailman.alsa-project.org/mailman/listinfo/alsa-devel

^ permalink raw reply related	[flat|nested] 4+ messages in thread

* dsd formats in ALSA plugins
@ 2018-06-29 22:08 slava
  0 siblings, 0 replies; 4+ messages in thread
From: slava @ 2018-06-29 22:08 UTC (permalink / raw)
  To: alsa-devel

Yes, patch from previous post  works as expected.

I try to write external filter plugin for dinamically change
slave format ( dsd_xxx -> xxx), unsuccessfully (
It suppose only static config or i mistake?

Thanks
_______________________________________________
Alsa-devel mailing list
Alsa-devel@alsa-project.org
http://mailman.alsa-project.org/mailman/listinfo/alsa-devel

^ permalink raw reply	[flat|nested] 4+ messages in thread

* dsd formats in ALSA plugins
@ 2018-06-26 22:58 slava
  0 siblings, 0 replies; 4+ messages in thread
From: slava @ 2018-06-26 22:58 UTC (permalink / raw)
  To: alsa-devel

Hello.
I'm writing plugin with external filter plugin SDK,
they make some manipulation on received samples.
But i can't use dsd formats.
As i understand, they not allowed in all plugins (extplug, ioplug and 
internal alsa-lib)?
params_any + params_test_format(... dsd_u32_le) = error -22
Is this a ALSA lib restriction or i do something wrong

Thanks

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2018-06-29 22:08 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-06-27 18:34 dsd formats in ALSA plugins slava
2018-06-28  6:06 ` Takashi Iwai
  -- strict thread matches above, loose matches on Subject: below --
2018-06-29 22:08 slava
2018-06-26 22:58 slava

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.