ALSA: usb-audio: Add native DSD support for Mytek DACs
authorJussi Laako <jussi@sonarnerd.net>
Tue, 12 Jun 2018 22:43:01 +0000 (01:43 +0300)
committerTakashi Iwai <tiwai@suse.de>
Wed, 13 Jun 2018 05:45:38 +0000 (07:45 +0200)
Add new mostly generic code with Mytek VID to support native DSD mode.

This implementation should be easier to maintain when manufacturers
release new products.

Signed-off-by: Jussi Laako <jussi@sonarnerd.net>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/usb/card.h
sound/usb/format.c
sound/usb/quirks.c

index 1406292d50ece6d9b0da7dba51e7252176ac61d1..9b41b7dda84fafff418d357590efadd5c2763ca7 100644 (file)
@@ -32,6 +32,7 @@ struct audioformat {
        struct snd_pcm_chmap_elem *chmap; /* (optional) channel map */
        bool dsd_dop;                   /* add DOP headers in case of DSD samples */
        bool dsd_bitrev;                /* reverse the bits of each DSD sample */
+       bool dsd_raw;                   /* altsetting is raw DSD */
 };
 
 struct snd_usb_substream;
index 49e7ec6d2399072c456f5f7975a5a2a22a5bf94a..0a2a27f2854d169a09ea658930917435e0f97836 100644 (file)
@@ -64,8 +64,11 @@ static u64 parse_audio_format_i_type(struct snd_usb_audio *chip,
                sample_width = fmt->bBitResolution;
                sample_bytes = fmt->bSubslotSize;
 
-               if (format & UAC2_FORMAT_TYPE_I_RAW_DATA)
+               if (format & UAC2_FORMAT_TYPE_I_RAW_DATA) {
                        pcm_formats |= SNDRV_PCM_FMTBIT_SPECIAL;
+                       /* flag potentially raw DSD capable altsettings */
+                       fp->dsd_raw = true;
+               }
 
                format <<= 1;
                break;
index f4b69173682ccddc8c5f3cfb4d5931c52bc11116..c616c251dbacc0a98c48c65cc19c2aec62ae3a15 100644 (file)
@@ -1443,6 +1443,19 @@ u64 snd_usb_interface_dsd_format_quirks(struct snd_usb_audio *chip,
                        return SNDRV_PCM_FMTBIT_DSD_U32_BE;
        }
 
+       /* Mostly generic method to detect many DSD-capable implementations -
+        * from XMOS/Thesycon
+        */
+       switch (USB_ID_VENDOR(chip->usb_id)) {
+       case 0x25ce:  /* Mytek devices */
+               if (fp->dsd_raw)
+                       return SNDRV_PCM_FMTBIT_DSD_U32_BE;
+               break;
+       default:
+               break;
+
+       }
+
        return 0;
 }