* [PATCH v2] ALSA: usb-audio: Filter out unsupported sample rates on Focusrite devices
@ 2020-04-18 17:58 Alexander Tsoy
2020-04-18 19:09 ` Takashi Iwai
0 siblings, 1 reply; 2+ messages in thread
From: Alexander Tsoy @ 2020-04-18 17:58 UTC (permalink / raw)
To: alsa-devel; +Cc: Takashi Iwai, Alexey Skobkin
Many Focusrite devices supports a limited set of sample rates per
altsetting. These includes audio interfaces with ADAT ports:
- Scarlett 18i6, 18i8 1st gen, 18i20 1st gen;
- Scarlett 18i8 2nd gen, 18i20 2nd gen;
- Scarlett 18i8 3rd gen, 18i20 3rd gen;
- Clarett 2Pre USB, 4Pre USB, 8Pre USB.
Maximum rate is exposed in the last 4 bytes of Format Type descriptor
which has a non-standard bLength = 10.
Tested-by: Alexey Skobkin <skobkin-ru@ya.ru>
Signed-off-by: Alexander Tsoy <alexander@tsoy.me>
---
Notes:
v2: updated description
sound/usb/format.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 51 insertions(+)
diff --git a/sound/usb/format.c b/sound/usb/format.c
index 50e1874c847c..5ffb457cc88c 100644
--- a/sound/usb/format.c
+++ b/sound/usb/format.c
@@ -277,6 +277,52 @@ static bool s1810c_valid_sample_rate(struct audioformat *fp,
return false;
}
+/*
+ * Many Focusrite devices supports a limited set of sampling rates per
+ * altsetting. Maximum rate is exposed in the last 4 bytes of Format Type
+ * descriptor which has a non-standard bLength = 10.
+ */
+static bool focusrite_valid_sample_rate(struct snd_usb_audio *chip,
+ struct audioformat *fp,
+ unsigned int rate)
+{
+ struct usb_interface *iface;
+ struct usb_host_interface *alts;
+ unsigned char *fmt;
+ unsigned int max_rate;
+
+ iface = usb_ifnum_to_if(chip->dev, fp->iface);
+ if (!iface)
+ return true;
+
+ alts = &iface->altsetting[fp->altset_idx];
+ fmt = snd_usb_find_csint_desc(alts->extra, alts->extralen,
+ NULL, UAC_FORMAT_TYPE);
+ if (!fmt)
+ return true;
+
+ if (fmt[0] == 10) { /* bLength */
+ max_rate = combine_quad(&fmt[6]);
+
+ /* Validate max rate */
+ if (max_rate != 48000 &&
+ max_rate != 96000 &&
+ max_rate != 192000 &&
+ max_rate != 384000) {
+
+ usb_audio_info(chip,
+ "%u:%d : unexpected max rate: %u\n",
+ fp->iface, fp->altsetting, max_rate);
+
+ return true;
+ }
+
+ return rate <= max_rate;
+ }
+
+ return true;
+}
+
/*
* Helper function to walk the array of sample rate triplets reported by
* the device. The problem is that we need to parse whole array first to
@@ -319,6 +365,11 @@ static int parse_uac2_sample_rate_range(struct snd_usb_audio *chip,
!s1810c_valid_sample_rate(fp, rate))
goto skip_rate;
+ /* Filter out invalid rates on Focusrite devices */
+ if (USB_ID_VENDOR(chip->usb_id) == 0x1235 &&
+ !focusrite_valid_sample_rate(chip, fp, rate))
+ goto skip_rate;
+
if (fp->rate_table)
fp->rate_table[nr_rates] = rate;
if (!fp->rate_min || rate < fp->rate_min)
--
2.25.3
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH v2] ALSA: usb-audio: Filter out unsupported sample rates on Focusrite devices
2020-04-18 17:58 [PATCH v2] ALSA: usb-audio: Filter out unsupported sample rates on Focusrite devices Alexander Tsoy
@ 2020-04-18 19:09 ` Takashi Iwai
0 siblings, 0 replies; 2+ messages in thread
From: Takashi Iwai @ 2020-04-18 19:09 UTC (permalink / raw)
To: Alexander Tsoy; +Cc: alsa-devel, Alexey Skobkin
On Sat, 18 Apr 2020 19:58:15 +0200,
Alexander Tsoy wrote:
>
> Many Focusrite devices supports a limited set of sample rates per
> altsetting. These includes audio interfaces with ADAT ports:
> - Scarlett 18i6, 18i8 1st gen, 18i20 1st gen;
> - Scarlett 18i8 2nd gen, 18i20 2nd gen;
> - Scarlett 18i8 3rd gen, 18i20 3rd gen;
> - Clarett 2Pre USB, 4Pre USB, 8Pre USB.
>
> Maximum rate is exposed in the last 4 bytes of Format Type descriptor
> which has a non-standard bLength = 10.
>
> Tested-by: Alexey Skobkin <skobkin-ru@ya.ru>
> Signed-off-by: Alexander Tsoy <alexander@tsoy.me>
Applied now. It deserves for Cc to stable, so added the tag, too.
thanks,
Takashi
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2020-04-18 19:10 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-04-18 17:58 [PATCH v2] ALSA: usb-audio: Filter out unsupported sample rates on Focusrite devices Alexander Tsoy
2020-04-18 19:09 ` Takashi Iwai
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).