On 06.04.2013 13:44, Daniel Mack wrote: > Unfortunately, none of the UAC standards provides a way to identify DSD > (Direct Stream Digital) formats. Hence, this patch adds a quirks > handler to identify USB interfaces that are capable of handling DSD. > > That quirks handler can augment the already parsed formats bit-field, > typically by any of the new SNDRV_PCM_FMTBIT_DSD_DOP_{U8_U16}, and it > currently does so for USB devices matching the 'Playback Design' > vendor id. Sorry - this identical message got sent twice unintentionally. Please ignore one of the two ... Daniel > Signed-off-by: Daniel Mack <zonque@xxxxxxxxx> > --- > sound/usb/format.c | 3 +++ > sound/usb/quirks.c | 23 +++++++++++++++++++++++ > sound/usb/quirks.h | 4 ++++ > 3 files changed, 30 insertions(+) > > diff --git a/sound/usb/format.c b/sound/usb/format.c > index a695caf..a73d67a 100644 > --- a/sound/usb/format.c > +++ b/sound/usb/format.c > @@ -136,6 +136,9 @@ static u64 parse_audio_format_i_type(struct snd_usb_audio *chip, > snd_printk(KERN_INFO "%d:%u:%d : unsupported format bits %#x\n", > chip->dev->devnum, fp->iface, fp->altsetting, format); > } > + > + pcm_formats |= snd_usb_interface_dsd_format_quirks(chip, fp, sample_bytes); > + > return pcm_formats; > } > > diff --git a/sound/usb/quirks.c b/sound/usb/quirks.c > index a2ac004..2fcc984 100644 > --- a/sound/usb/quirks.c > +++ b/sound/usb/quirks.c > @@ -905,3 +905,26 @@ void snd_usb_ctl_msg_quirk(struct usb_device *dev, unsigned int pipe, > mdelay(20); > } > > +/* > + * snd_usb_interface_dsd_format_quirks() is called from format.c to > + * augment the PCM format bit-field for DSD types. The UAC standards > + * don't have a designated bit field to denote DSD-capable interfaces, > + * hence all hardware that is known to support this format has to be > + * listed here. > + */ > +u64 snd_usb_interface_dsd_format_quirks(struct snd_usb_audio *chip, > + struct audioformat *fp, > + unsigned int sample_bytes) > +{ > + if ((le16_to_cpu(chip->dev->descriptor.idVendor) == 0x23ba) && > + fp->altsetting > 1) { > + switch (sample_bytes) { > + case 1: > + return SNDRV_PCM_FMTBIT_DSD_DOP_U8; > + case 2: > + return SNDRV_PCM_FMTBIT_DSD_DOP_U16; > + } > + } > + > + return 0; > +} > diff --git a/sound/usb/quirks.h b/sound/usb/quirks.h > index 0ca9e91..f10d00e 100644 > --- a/sound/usb/quirks.h > +++ b/sound/usb/quirks.h > @@ -30,4 +30,8 @@ void snd_usb_ctl_msg_quirk(struct usb_device *dev, unsigned int pipe, > __u8 request, __u8 requesttype, __u16 value, > __u16 index, void *data, __u16 size); > > +u64 snd_usb_interface_dsd_format_quirks(struct snd_usb_audio *chip, > + struct audioformat *fp, > + unsigned int sample_bytes); > + > #endif /* __USBAUDIO_QUIRKS_H */ > _______________________________________________ Alsa-devel mailing list Alsa-devel@xxxxxxxxxxxxxxxx http://mailman.alsa-project.org/mailman/listinfo/alsa-devel