sound: usb: format: don't warn that raw DSD is unsupported
authorAdrian Ratiu <adrian.ratiu@collabora.com>
Mon, 9 Dec 2024 09:05:29 +0000 (11:05 +0200)
committerTakashi Iwai <tiwai@suse.de>
Mon, 9 Dec 2024 09:57:20 +0000 (10:57 +0100)
UAC 2 & 3 DAC's set bit 31 of the format to signal support for a
RAW_DATA type, typically used for DSD playback.

This is correctly tested by (format & UAC*_FORMAT_TYPE_I_RAW_DATA),
fp->dsd_raw = true; and call snd_usb_interface_dsd_format_quirks(),
however a confusing and unnecessary message gets printed because
the bit is not properly tested in the last "unsupported" if test:
if (format & ~0x3F) { ... }

For example the output:

usb 7-1: new high-speed USB device number 5 using xhci_hcd
usb 7-1: New USB device found, idVendor=262a, idProduct=9302, bcdDevice=0.01
usb 7-1: New USB device strings: Mfr=1, Product=2, SerialNumber=6
usb 7-1: Product: TC44C
usb 7-1: Manufacturer: TC44C
usb 7-1: SerialNumber: 5000000001
hid-generic 0003:262A:9302.001E: No inputs registered, leaving
hid-generic 0003:262A:9302.001E: hidraw6: USB HID v1.00 Device [DDHIFI TC44C] on usb-0000:08:00.3-1/input0
usb 7-1: 2:4 : unsupported format bits 0x100000000

This last "unsupported format" is actually wrong: we know the
format is a RAW_DATA which we assume is DSD, so there is no need
to print the confusing message.

This we unset bit 31 of the format after recognizing it, to avoid
the message.

Suggested-by: Takashi Iwai <tiwai@suse.com>
Signed-off-by: Adrian Ratiu <adrian.ratiu@collabora.com>
Link: https://patch.msgid.link/20241209090529.16134-2-adrian.ratiu@collabora.com
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/usb/format.c

index 0cbf1d4fbe6edd3820937cb9b9ae2ea0fd5ab9e8..6049d957694ca610eac3463e87c0c0e32cd98207 100644 (file)
@@ -60,6 +60,8 @@ static u64 parse_audio_format_i_type(struct snd_usb_audio *chip,
                        pcm_formats |= SNDRV_PCM_FMTBIT_SPECIAL;
                        /* flag potentially raw DSD capable altsettings */
                        fp->dsd_raw = true;
+                       /* clear special format bit to avoid "unsupported format" msg below */
+                       format &= ~UAC2_FORMAT_TYPE_I_RAW_DATA;
                }
 
                format <<= 1;
@@ -71,8 +73,11 @@ static u64 parse_audio_format_i_type(struct snd_usb_audio *chip,
                sample_width = as->bBitResolution;
                sample_bytes = as->bSubslotSize;
 
-               if (format & UAC3_FORMAT_TYPE_I_RAW_DATA)
+               if (format & UAC3_FORMAT_TYPE_I_RAW_DATA) {
                        pcm_formats |= SNDRV_PCM_FMTBIT_SPECIAL;
+                       /* clear special format bit to avoid "unsupported format" msg below */
+                       format &= ~UAC3_FORMAT_TYPE_I_RAW_DATA;
+               }
 
                format <<= 1;
                break;