Commit 717bfb5f authored by Daniel Mack's avatar Daniel Mack Committed by Takashi Iwai

ALSA: snd-usb: handle raw data format of UAC2 devices

UAC2 compliant audio devices may announce the capability to transport
raw audio data on their endpoints. Catch this and handle it as
'special' stream on the ALSA side.
Signed-off-by: default avatarDaniel Mack <zonque@gmail.com>
Reported-by: default avatarAndreas Koch <andreas@akdesigninc.com>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 2fcdb06d
...@@ -170,6 +170,8 @@ struct uac2_as_header_descriptor { ...@@ -170,6 +170,8 @@ struct uac2_as_header_descriptor {
__u8 iChannelNames; __u8 iChannelNames;
} __attribute__((packed)); } __attribute__((packed));
#define UAC2_FORMAT_TYPE_I_RAW_DATA (1 << 31)
/* 4.10.1.2 Class-Specific AS Isochronous Audio Data Endpoint Descriptor */ /* 4.10.1.2 Class-Specific AS Isochronous Audio Data Endpoint Descriptor */
struct uac2_iso_endpoint_descriptor { struct uac2_iso_endpoint_descriptor {
......
...@@ -47,7 +47,7 @@ static u64 parse_audio_format_i_type(struct snd_usb_audio *chip, ...@@ -47,7 +47,7 @@ static u64 parse_audio_format_i_type(struct snd_usb_audio *chip,
int protocol) int protocol)
{ {
int sample_width, sample_bytes; int sample_width, sample_bytes;
u64 pcm_formats; u64 pcm_formats = 0;
switch (protocol) { switch (protocol) {
case UAC_VERSION_1: case UAC_VERSION_1:
...@@ -63,14 +63,17 @@ static u64 parse_audio_format_i_type(struct snd_usb_audio *chip, ...@@ -63,14 +63,17 @@ static u64 parse_audio_format_i_type(struct snd_usb_audio *chip,
struct uac_format_type_i_ext_descriptor *fmt = _fmt; struct uac_format_type_i_ext_descriptor *fmt = _fmt;
sample_width = fmt->bBitResolution; sample_width = fmt->bBitResolution;
sample_bytes = fmt->bSubslotSize; sample_bytes = fmt->bSubslotSize;
if (format & UAC2_FORMAT_TYPE_I_RAW_DATA)
pcm_formats |= SNDRV_PCM_FMTBIT_SPECIAL;
format <<= 1; format <<= 1;
break; break;
} }
} }
pcm_formats = 0; if ((pcm_formats == 0) &&
(format == 0 || format == (1 << UAC_FORMAT_TYPE_I_UNDEFINED))) {
if (format == 0 || format == (1 << UAC_FORMAT_TYPE_I_UNDEFINED)) {
/* some devices don't define this correctly... */ /* some devices don't define this correctly... */
snd_printdd(KERN_INFO "%d:%u:%d : format type 0 is detected, processed as PCM\n", snd_printdd(KERN_INFO "%d:%u:%d : format type 0 is detected, processed as PCM\n",
chip->dev->devnum, fp->iface, fp->altsetting); chip->dev->devnum, fp->iface, fp->altsetting);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment