ALSA: add DSD formats
authorDaniel Mack <zonque@gmail.com>
Tue, 16 Apr 2013 16:01:36 +0000 (00:01 +0800)
committerTakashi Iwai <tiwai@suse.de>
Thu, 18 Apr 2013 08:02:33 +0000 (10:02 +0200)
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.

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
        176.4KHz   352.8kHz   705.6KHz     <----       sample rate

8-bit                2.8MHz     5.6MHz
16-bit    2.8Mhz     5.6MHz    11.2MHz

         `-----------------------------'
             actual DSD sample rates

Signed-off-by: Daniel Mack <zonque@gmail.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
include/sound/pcm.h
include/uapi/sound/asound.h
sound/core/pcm.c
sound/core/pcm_misc.c

index aa7b0a8385cb4c951678b9ed8729355722da4b16..1b0c6484e71abce23955462d19b5a0e26e4b953e 100644 (file)
@@ -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_U8                _SNDRV_PCM_FMTBIT(DSD_U8)
+#define SNDRV_PCM_FMTBIT_DSD_U16_LE    _SNDRV_PCM_FMTBIT(DSD_U16_LE)
 
 #ifdef SNDRV_LITTLE_ENDIAN
 #define SNDRV_PCM_FMTBIT_S16           SNDRV_PCM_FMTBIT_S16_LE
index 1774a5c3ef102354de2808899c5ce73c8ff47b0e..e3983d508272cf1fd1b566eec395800bd14a2a96 100644 (file)
@@ -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_U8         ((__force snd_pcm_format_t) 48) /* DSD, 1-byte samples DSD (x8) */
+#define        SNDRV_PCM_FORMAT_DSD_U16_LE     ((__force snd_pcm_format_t) 49) /* DSD, 2-byte samples DSD (x16), little endian */
+#define        SNDRV_PCM_FORMAT_LAST           SNDRV_PCM_FORMAT_DSD_U16_LE
 
 #ifdef SNDRV_LITTLE_ENDIAN
 #define        SNDRV_PCM_FORMAT_S16            SNDRV_PCM_FORMAT_S16_LE
index 578327e2bc26fb3731c05d9685fde1ffaa1d473a..17f45e8aa89cd49561cce6c40cbc174f416d9c49 100644 (file)
@@ -209,6 +209,8 @@ static char *snd_pcm_format_names[] = {
        FORMAT(G723_24_1B),
        FORMAT(G723_40),
        FORMAT(G723_40_1B),
+       FORMAT(DSD_U8),
+       FORMAT(DSD_U16_LE),
 };
 
 const char *snd_pcm_format_name(snd_pcm_format_t format)
index b875b19f2d55dadd714d006d5fa0d605ff23709a..43f24cce3dec1b6375edb94e02be9b5819829121 100644 (file)
@@ -140,6 +140,14 @@ static struct pcm_format_data pcm_formats[(INT)SNDRV_PCM_FORMAT_LAST+1] = {
                .width = 5, .phys = 5, .le = -1, .signd = -1,
                .silence = {},
        },
+       [SNDRV_PCM_FORMAT_DSD_U8] = {
+               .width = 8, .phys = 8, .le = 1, .signd = 0,
+               .silence = {},
+       },
+       [SNDRV_PCM_FORMAT_DSD_U16_LE] = {
+               .width = 16, .phys = 16, .le = 1, .signd = 0,
+               .silence = {},
+       },
        /* FIXME: the following three formats are not defined properly yet */
        [SNDRV_PCM_FORMAT_MPEG] = {
                .le = -1, .signd = -1,