[alsa-devel] [PATCH 1/2] ALSA: add DSD formats

Takashi Iwai tiwai at suse.de
Sun Apr 7 09:35:11 CEST 2013


At Sat,  6 Apr 2013 13:44:51 +0200,
Daniel Mack wrote:
> 
> This patch adds two formats for Direct Stream Digital (DSD), a
> pulse-density encoding format which is described here:
> https://en.wikipedia.org/wiki/Direct_Stream_Digital
> 
> DSD operates on 2.8, 5.6 or 11.2MHz sample rates and as a 1-bit
> stream. In order to provide a compatibility way for pushing DSD
> samples through ordinary PCM channels, the "DoP open Standard" was
> invented. See http://www.dsd-guide.com for a copy of the documentation.
> 
> The two new types added by this patch describe streams that are capable
> of handling DSD samples in DOP format as 8-bit or in 16-bit (or at a x8
> or x16 data rate, respectively).
> 
> DSD itself specifies samples in *bit*, while DOP and ALSA handle them
> as *bytes*. Hence, a factor of 8 or 16 has to be applied for the sample
> rare configuration, according to the following table:
> 
>                                                    configured hardware
>         352.8kHz       705.6KHz     1411.2KHz  <----       sample rate
> 
> 8-bit     2.8MHz         5.6MHz       11.2MHz
> 16-bit    5.6MHz        11.2MHz
> 
>          `-----------------------------------'
>                  actual DSD sample rates
> 
> Signed-off-by: Daniel Mack <zonque at gmail.com>
> ---
>  include/sound/pcm.h         | 2 ++
>  include/uapi/sound/asound.h | 4 +++-
>  sound/core/pcm.c            | 2 ++
>  3 files changed, 7 insertions(+), 1 deletion(-)
> 
> diff --git a/include/sound/pcm.h b/include/sound/pcm.h
> index aa7b0a8..d957046 100644
> --- a/include/sound/pcm.h
> +++ b/include/sound/pcm.h
> @@ -181,6 +181,8 @@ struct snd_pcm_ops {
>  #define SNDRV_PCM_FMTBIT_G723_24_1B	_SNDRV_PCM_FMTBIT(G723_24_1B)
>  #define SNDRV_PCM_FMTBIT_G723_40	_SNDRV_PCM_FMTBIT(G723_40)
>  #define SNDRV_PCM_FMTBIT_G723_40_1B	_SNDRV_PCM_FMTBIT(G723_40_1B)
> +#define SNDRV_PCM_FMTBIT_DSD_DOP_U8	_SNDRV_PCM_FMTBIT(DSD_DOP_U8)
> +#define SNDRV_PCM_FMTBIT_DSD_DOP_U16	_SNDRV_PCM_FMTBIT(DSD_DOP_U16)
>  
>  #ifdef SNDRV_LITTLE_ENDIAN
>  #define SNDRV_PCM_FMTBIT_S16		SNDRV_PCM_FMTBIT_S16_LE
> diff --git a/include/uapi/sound/asound.h b/include/uapi/sound/asound.h
> index 1774a5c..eb9eda8 100644
> --- a/include/uapi/sound/asound.h
> +++ b/include/uapi/sound/asound.h
> @@ -214,7 +214,9 @@ typedef int __bitwise snd_pcm_format_t;
>  #define	SNDRV_PCM_FORMAT_G723_24_1B	((__force snd_pcm_format_t) 45) /* 1 sample in 1 byte */
>  #define	SNDRV_PCM_FORMAT_G723_40	((__force snd_pcm_format_t) 46) /* 8 Samples in 5 bytes */
>  #define	SNDRV_PCM_FORMAT_G723_40_1B	((__force snd_pcm_format_t) 47) /* 1 sample in 1 byte */
> -#define	SNDRV_PCM_FORMAT_LAST		SNDRV_PCM_FORMAT_G723_40_1B
> +#define	SNDRV_PCM_FORMAT_DSD_DOP_U8	((__force snd_pcm_format_t) 48) /* DSD, 1-byte samples DSD DOP format (x8) */
> +#define	SNDRV_PCM_FORMAT_DSD_DOP_U16	((__force snd_pcm_format_t) 49) /* DSD, 2-byte samples DSD DOP format (x16) */

What about endianess?  I suppose it's limited only to little-endian?
If so, write it clearly in comments.


> +#define	SNDRV_PCM_FORMAT_LAST		SNDRV_PCM_FORMAT_DSD_DOP_U16
>  
>  #ifdef SNDRV_LITTLE_ENDIAN
>  #define	SNDRV_PCM_FORMAT_S16		SNDRV_PCM_FORMAT_S16_LE
> diff --git a/sound/core/pcm.c b/sound/core/pcm.c
> index 578327e..578a761 100644
> --- a/sound/core/pcm.c
> +++ b/sound/core/pcm.c
> @@ -209,6 +209,8 @@ static char *snd_pcm_format_names[] = {
>  	FORMAT(G723_24_1B),
>  	FORMAT(G723_40),
>  	FORMAT(G723_40_1B),
> +	FORMAT(DSD_DOP_U8),
> +	FORMAT(DSD_DOP_U16),
>  };
>  
>  const char *snd_pcm_format_name(snd_pcm_format_t format)

Please update pcm_formats[] table in soud/core/pcm_misc.c, too.


thanks,

Takashi


More information about the Alsa-devel mailing list