summaryrefslogtreecommitdiffstats
path: root/sound
diff options
context:
space:
mode:
authorJussi Laako <jussi@sonarnerd.net>2018-06-13 01:43:01 +0300
committerTakashi Iwai <tiwai@suse.de>2018-06-13 07:45:38 +0200
commit3a572d94bcff98a14c94fe686881a169a26f3fca (patch)
tree9ad5db93be9d9a27537e85fd3ae4d14e0c830637 /sound
parentc7273bd6c1922adcfd3ed5783c1fa69aa075f0f8 (diff)
downloadop-kernel-dev-3a572d94bcff98a14c94fe686881a169a26f3fca.zip
op-kernel-dev-3a572d94bcff98a14c94fe686881a169a26f3fca.tar.gz
ALSA: usb-audio: Add native DSD support for Mytek DACs
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>
Diffstat (limited to 'sound')
-rw-r--r--sound/usb/card.h1
-rw-r--r--sound/usb/format.c5
-rw-r--r--sound/usb/quirks.c13
3 files changed, 18 insertions, 1 deletions
diff --git a/sound/usb/card.h b/sound/usb/card.h
index 1406292..9b41b7d 100644
--- a/sound/usb/card.h
+++ b/sound/usb/card.h
@@ -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;
diff --git a/sound/usb/format.c b/sound/usb/format.c
index 49e7ec6..0a2a27f 100644
--- a/sound/usb/format.c
+++ b/sound/usb/format.c
@@ -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;
diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c
index f4b6917..c616c25 100644
--- a/sound/usb/quirks.c
+++ b/sound/usb/quirks.c
@@ -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;
}
OpenPOWER on IntegriCloud