Re: Scarlett 18i20 gen 3 Linux - Crackling Audio
Posted: Sun Mar 29, 2020 6:59 pm
Be assured, I can go down on light CPU track. I was testing with a heavy VST track.
creating music freely
https://linuxmusicians.com/
Completely untested:
Code: Select all
diff --git a/sound/usb/pcm.c b/sound/usb/pcm.c
index 44d178ee9177..32c70e136cfb 100644
--- a/sound/usb/pcm.c
+++ b/sound/usb/pcm.c
@@ -314,6 +314,7 @@ static int search_roland_implicit_fb(struct usb_device *dev, int ifnum,
}
static int set_sync_ep_implicit_fb_quirk(struct snd_usb_substream *subs,
+ struct audioformat *fmt,
struct usb_device *dev,
struct usb_interface_descriptor *altsd,
unsigned int attr)
@@ -348,6 +349,15 @@ static int set_sync_ep_implicit_fb_quirk(struct snd_usb_substream *subs,
alts = &iface->altsetting[1];
goto add_sync_ep;
+ case USB_ID(0x1235, 0x8215): /* Focusrite Scarlett 18i20 3rd Gen */
+ ep = 0x81;
+ iface = usb_ifnum_to_if(dev, 2);
+ if (!iface || fmt->altset_idx == 0 ||
+ fmt->altset_idx >= iface->num_altsetting)
+ return -EINVAL;
+
+ alts = &iface->altsetting[fmt->altset_idx];
+ goto add_sync_ep;
}
if (attr == USB_ENDPOINT_SYNC_ASYNC &&
altsd->bInterfaceClass == USB_CLASS_VENDOR_SPEC &&
@@ -407,7 +417,7 @@ static int set_sync_endpoint(struct snd_usb_substream *subs,
subs->data_endpoint->sync_master = NULL;
}
- err = set_sync_ep_implicit_fb_quirk(subs, dev, altsd, attr);
+ err = set_sync_ep_implicit_fb_quirk(subs, fmt, dev, altsd, attr);
if (err < 0)
return err;
How complex?
I want to test your patches on my 18i20 gen3. As far as I understand I need to take second part of the old patch (quirks) and the latest patch which "must not crash the kernel". Am I correct?puleglot wrote: ↑Thu Mar 26, 2020 1:34 pm This is only needed for cards that support different set of sample rates in different modes, like 18i20 and probably 18i8. These sample rate constraints cannon be exposed in a standard UAC2 way, so Focusrite exposes them via non class compliant audio format descriptors that is currently not understood by the driver.
Correct. But instead of an old patch against quirks-table.h please try the attached patch.
Ok. What about this part from the first two pages?
Code: Select all
--- a/sound/usb/pcm.c
+++ b/sound/usb/pcm.c
@@ -365,6 +365,10 @@ static int set_sync_ep_implicit_fb_quirk(struct snd_usb_substream *subs,
ep = 0x81;
ifnum = 2;
goto add_sync_ep_from_ifnum;
+ case USB_ID(0x1235, 0x8215): /* Focusrite Scarlett 18i20 3rd Gen */
+ ep = 0x81;
+ ifnum = 2;
+ goto add_sync_ep_from_ifnum;
Attached patch should fix crackling sound. Note that full duplex mode will work only with jack due to some limitations in the driver.skobkin wrote: ↑Thu Apr 16, 2020 11:59 am Also please tell me what to test. Because I didn't test anything of this thread before.
As far as I understand this patch(es) must remove sound crackling. But I see that you're doing something with sample rate detection in the last patch, so I'm not sure what to test because I hadn't any problems with it.
Ooops, fixed. Thanks.
So if I'm using PulseAudio right now there is nothing for me to improve in the current situation by these patches?
Well, at least playback will be glitch-free.
jackdbus is fairly easy to setup. In QjackCtl it's a matter of enabling two D-Bus-related options in Misc. tab.
Note: earlier I discovered that I'm getting different amount of sound distortions when using different USB ports. And then I ended using the port which caused least crackling.
Code: Select all
$ cat /proc/asound/USB/stream0
Focusrite Scarlett 18i20 USB at usb-0000:01:00.0-2, high speed : USB Audio
Playback:
Status: Running
Interface = 1
Altset = 3
Packet Size = 360
Momentary freq = 44100 Hz (0x5.8333)
Interface 1
Altset 1
Format: S32_LE
Channels: 20
Endpoint: 1 OUT (ASYNC)
Rates: 44100, 48000, 88200, 96000, 176400, 192000
Data packet interval: 125 us
Bits: 24
Interface 1
Altset 2
Format: S32_LE
Channels: 18
Endpoint: 1 OUT (ASYNC)
Rates: 44100, 48000, 88200, 96000, 176400, 192000
Data packet interval: 125 us
Bits: 24
Interface 1
Altset 3
Format: S32_LE
Channels: 10
Endpoint: 1 OUT (ASYNC)
Rates: 44100, 48000, 88200, 96000, 176400, 192000
Data packet interval: 125 us
Bits: 24
Capture:
Status: Stop
Interface 2
Altset 1
Format: S32_LE
Channels: 20
Endpoint: 1 IN (ASYNC)
Rates: 44100, 48000, 88200, 96000, 176400, 192000
Data packet interval: 125 us
Bits: 24
Interface 2
Altset 2
Format: S32_LE
Channels: 18
Endpoint: 1 IN (ASYNC)
Rates: 44100, 48000, 88200, 96000, 176400, 192000
Data packet interval: 125 us
Bits: 24
Interface 2
Altset 3
Format: S32_LE
Channels: 10
Endpoint: 1 IN (ASYNC)
Rates: 44100, 48000, 88200, 96000, 176400, 192000
Data packet interval: 125 us
Bits: 24
Code: Select all
$ uname -a
Linux skobkin-pc 5.6.4-gentoo-skobkin #1 SMP Mon Apr 13 20:44:13 MSK 2020 x86_64 AMD Ryzen Threadripper 1950X 16-Core Processor AuthenticAMD GNU/Linux
Code: Select all
$ cat /etc/portage/patches/sys-kernel/gentoo-sources-5.6.4/*.patch
diff --git a/sound/usb/pcm.c b/sound/usb/pcm.c
index bd258f1ec2dd..4f6709dc8b9f 100644
--- a/sound/usb/pcm.c
+++ b/sound/usb/pcm.c
@@ -365,6 +365,10 @@ static int set_sync_ep_implicit_fb_quirk(struct snd_usb_substream *subs,
ep = 0x81;
ifnum = 2;
goto add_sync_ep_from_ifnum;
+ case USB_ID(0x1235, 0x8215): /* Focusrite Scarlett 18i20 3rd Gen */
+ ep = 0x81;
+ ifnum = 2;
+ goto add_sync_ep_from_ifnum;
case USB_ID(0x0582, 0x01d8): /* BOSS Katana */
/* BOSS Katana amplifiers do not need quirks */
return 0;
@@ -387,10 +391,11 @@ static int set_sync_ep_implicit_fb_quirk(struct snd_usb_substream *subs,
add_sync_ep_from_ifnum:
iface = usb_ifnum_to_if(dev, ifnum);
- if (!iface || iface->num_altsetting < 2)
+ if (!iface || subs->altset_idx == 0 ||
+ subs->altset_idx >= iface->num_altsetting)
return -EINVAL;
- alts = &iface->altsetting[1];
+ alts = &iface->altsetting[subs->altset_idx];
add_sync_ep:
subs->sync_endpoint = snd_usb_add_endpoint(subs->stream->chip,
diff --git a/sound/usb/format.c b/sound/usb/format.c
index d79db71305f6..6a6d35ed25e8 100644
--- a/sound/usb/format.c
+++ b/sound/usb/format.c
@@ -226,6 +226,52 @@ static int parse_audio_format_rates_v1(struct snd_usb_audio *chip, struct audiof
return 0;
}
+/*
+ * Some Focusrite devices supports a limited set of sampling rates per
+ * altsetting. Maximum rate is exposed in the last 4 bytes of Format Type
+ * descriptor.
+ */
+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;
+ struct uac_format_type_i_continuous_descriptor *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->bLength == 10) {
+ max_rate = combine_quad((unsigned char *)&fmt[6]);
+
+ /* Validate max rate */
+ if (max_rate != 48000 &&
+ max_rate != 96000 &&
+ max_rate != 192000 &&
+ max_rate != 384000) {
+
+ usb_audio_info(chip,
+ "%u:%d : max rate validation error.\n",
+ fp->iface, fp->altsetting);
+
+ 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
@@ -262,6 +308,12 @@ static int parse_uac2_sample_rate_range(struct snd_usb_audio *chip,
}
for (rate = min; rate <= max; rate += res) {
+
+ /* 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)
@@ -276,6 +328,7 @@ static int parse_uac2_sample_rate_range(struct snd_usb_audio *chip,
break;
}
+skip_rate:
/* avoid endless loop */
if (res == 0)
break;
Code: Select all
# lsusb | fgrep Focusrite
Bus 001 Device 002: ID 1235:8215 Focusrite-Novation Scarlett 18i20 USB
# journalctl -b -k | fgrep -A3 -B3 'max rate'
Apr 16 19:16:01 skobkin-pc kernel: hid-generic 0003:04B4:0510.0004: input,hidraw3: USB HID v1.11 Keyboard [HID Keyboard HID Keyboard] on usb-0000:08:00.3-4.2/input1
Apr 16 19:16:01 skobkin-pc kernel: Bluetooth: hci0: read Intel version: 370810225019140f35
Apr 16 19:16:01 skobkin-pc kernel: Bluetooth: hci0: Intel device is already patched. patch num: 35
Apr 16 19:16:01 skobkin-pc kernel: usb 1-2: 1:1 : max rate validation error.
Apr 16 19:16:01 skobkin-pc kernel: usb 1-2: 1:1 : max rate validation error.
Apr 16 19:16:01 skobkin-pc kernel: usb 1-2: 1:1 : max rate validation error.
Apr 16 19:16:01 skobkin-pc kernel: usb 1-2: 1:1 : max rate validation error.
Apr 16 19:16:01 skobkin-pc kernel: usb 1-2: 1:1 : max rate validation error.
Apr 16 19:16:01 skobkin-pc kernel: usb 1-2: 1:1 : max rate validation error.
Apr 16 19:16:01 skobkin-pc kernel: usb 1-2: 1:1 : max rate validation error.
Apr 16 19:16:01 skobkin-pc kernel: usb 1-2: 1:1 : max rate validation error.
Apr 16 19:16:01 skobkin-pc kernel: usb 1-2: 1:1 : max rate validation error.
Apr 16 19:16:01 skobkin-pc kernel: usb 1-2: 1:1 : max rate validation error.
Apr 16 19:16:01 skobkin-pc kernel: usb 1-2: 1:1 : max rate validation error.
Apr 16 19:16:01 skobkin-pc kernel: usb 1-2: 1:1 : max rate validation error.
Apr 16 19:16:01 skobkin-pc kernel: EDAC amd64: F17h detected (node 0).
Apr 16 19:16:01 skobkin-pc kernel: EDAC amd64: Node 0: DRAM ECC disabled.
Apr 16 19:16:01 skobkin-pc kernel: Bluetooth: BNEP (Ethernet Emulation) ver 1.3
--
Apr 16 19:16:02 skobkin-pc kernel: EDAC amd64: F17h detected (node 0).
Apr 16 19:16:02 skobkin-pc kernel: EDAC amd64: Node 0: DRAM ECC disabled.
Apr 16 19:16:02 skobkin-pc kernel: usb 3-4.3: new high-speed USB device number 4 using xhci_hcd
Apr 16 19:16:02 skobkin-pc kernel: usb 1-2: 1:2 : max rate validation error.
Apr 16 19:16:02 skobkin-pc kernel: usb 1-2: 1:2 : max rate validation error.
Apr 16 19:16:02 skobkin-pc kernel: usb 1-2: 1:2 : max rate validation error.
Apr 16 19:16:02 skobkin-pc kernel: usb 1-2: 1:2 : max rate validation error.
Apr 16 19:16:02 skobkin-pc kernel: usb 1-2: 1:2 : max rate validation error.
Apr 16 19:16:02 skobkin-pc kernel: usb 1-2: 1:2 : max rate validation error.
Apr 16 19:16:02 skobkin-pc kernel: usb 1-2: 1:2 : max rate validation error.
Apr 16 19:16:02 skobkin-pc kernel: usb 1-2: 1:2 : max rate validation error.
Apr 16 19:16:02 skobkin-pc kernel: usb 1-2: 1:2 : max rate validation error.
Apr 16 19:16:02 skobkin-pc kernel: usb 1-2: 1:2 : max rate validation error.
Apr 16 19:16:02 skobkin-pc kernel: usb 1-2: 1:2 : max rate validation error.
Apr 16 19:16:02 skobkin-pc kernel: usb 1-2: 1:2 : max rate validation error.
Apr 16 19:16:02 skobkin-pc kernel: EDAC amd64: F17h detected (node 0).
Apr 16 19:16:02 skobkin-pc kernel: EDAC amd64: Node 0: DRAM ECC disabled.
Apr 16 19:16:02 skobkin-pc kernel: usb 1-2: 1:3 : max rate validation error.
Apr 16 19:16:02 skobkin-pc kernel: usb 1-2: 1:3 : max rate validation error.
Apr 16 19:16:02 skobkin-pc kernel: usb 1-2: 1:3 : max rate validation error.
Apr 16 19:16:02 skobkin-pc kernel: usb 1-2: 1:3 : max rate validation error.
Apr 16 19:16:02 skobkin-pc kernel: usb 1-2: 1:3 : max rate validation error.
Apr 16 19:16:02 skobkin-pc kernel: usb 1-2: 1:3 : max rate validation error.
Apr 16 19:16:02 skobkin-pc kernel: usb 1-2: 1:3 : max rate validation error.
Apr 16 19:16:02 skobkin-pc kernel: usb 1-2: 1:3 : max rate validation error.
Apr 16 19:16:02 skobkin-pc kernel: usb 1-2: 1:3 : max rate validation error.
Apr 16 19:16:02 skobkin-pc kernel: usb 1-2: 1:3 : max rate validation error.
Apr 16 19:16:02 skobkin-pc kernel: usb 1-2: 1:3 : max rate validation error.
Apr 16 19:16:02 skobkin-pc kernel: usb 1-2: 1:3 : max rate validation error.
Apr 16 19:16:02 skobkin-pc kernel: EDAC amd64: F17h detected (node 0).
Apr 16 19:16:02 skobkin-pc kernel: EDAC amd64: Node 0: DRAM ECC disabled.
Apr 16 19:16:02 skobkin-pc kernel: usb 1-2: 2:1 : max rate validation error.
Apr 16 19:16:02 skobkin-pc kernel: usb 1-2: 2:1 : max rate validation error.
Apr 16 19:16:02 skobkin-pc kernel: usb 1-2: 2:1 : max rate validation error.
Apr 16 19:16:02 skobkin-pc kernel: usb 1-2: 2:1 : max rate validation error.
Apr 16 19:16:02 skobkin-pc kernel: usb 1-2: 2:1 : max rate validation error.
Apr 16 19:16:02 skobkin-pc kernel: usb 1-2: 2:1 : max rate validation error.
Apr 16 19:16:02 skobkin-pc kernel: usb 1-2: 2:1 : max rate validation error.
Apr 16 19:16:02 skobkin-pc kernel: usb 1-2: 2:1 : max rate validation error.
Apr 16 19:16:02 skobkin-pc kernel: usb 1-2: 2:1 : max rate validation error.
Apr 16 19:16:02 skobkin-pc kernel: usb 1-2: 2:1 : max rate validation error.
Apr 16 19:16:02 skobkin-pc kernel: usb 1-2: 2:1 : max rate validation error.
Apr 16 19:16:02 skobkin-pc kernel: usb 1-2: 2:1 : max rate validation error.
Apr 16 19:16:02 skobkin-pc kernel: EDAC amd64: F17h detected (node 0).
Apr 16 19:16:02 skobkin-pc kernel: EDAC amd64: Node 0: DRAM ECC disabled.
Apr 16 19:16:02 skobkin-pc kernel: usb 1-2: 2:2 : max rate validation error.
Apr 16 19:16:02 skobkin-pc kernel: usb 1-2: 2:2 : max rate validation error.
Apr 16 19:16:02 skobkin-pc kernel: usb 1-2: 2:2 : max rate validation error.
Apr 16 19:16:02 skobkin-pc kernel: usb 1-2: 2:2 : max rate validation error.
Apr 16 19:16:02 skobkin-pc kernel: usb 1-2: 2:2 : max rate validation error.
Apr 16 19:16:02 skobkin-pc kernel: usb 1-2: 2:2 : max rate validation error.
Apr 16 19:16:02 skobkin-pc kernel: usb 1-2: 2:2 : max rate validation error.
Apr 16 19:16:02 skobkin-pc kernel: usb 1-2: 2:2 : max rate validation error.
Apr 16 19:16:02 skobkin-pc kernel: usb 1-2: 2:2 : max rate validation error.
Apr 16 19:16:02 skobkin-pc kernel: usb 1-2: 2:2 : max rate validation error.
Apr 16 19:16:02 skobkin-pc kernel: usb 1-2: 2:2 : max rate validation error.
Apr 16 19:16:02 skobkin-pc kernel: usb 1-2: 2:2 : max rate validation error.
Apr 16 19:16:02 skobkin-pc kernel: EDAC amd64: F17h detected (node 0).
Apr 16 19:16:02 skobkin-pc kernel: EDAC amd64: Node 0: DRAM ECC disabled.
Apr 16 19:16:02 skobkin-pc kernel: usb 1-2: 2:3 : max rate validation error.
Apr 16 19:16:02 skobkin-pc kernel: usb 1-2: 2:3 : max rate validation error.
Apr 16 19:16:02 skobkin-pc kernel: usb 1-2: 2:3 : max rate validation error.
Apr 16 19:16:02 skobkin-pc kernel: usb 1-2: 2:3 : max rate validation error.
Apr 16 19:16:02 skobkin-pc kernel: usb 1-2: 2:3 : max rate validation error.
Apr 16 19:16:02 skobkin-pc kernel: usb 1-2: 2:3 : max rate validation error.
Apr 16 19:16:02 skobkin-pc kernel: usb 1-2: 2:3 : max rate validation error.
Apr 16 19:16:02 skobkin-pc kernel: usb 1-2: 2:3 : max rate validation error.
Apr 16 19:16:02 skobkin-pc kernel: usb 1-2: 2:3 : max rate validation error.
Apr 16 19:16:02 skobkin-pc kernel: usb 1-2: 2:3 : max rate validation error.
Apr 16 19:16:02 skobkin-pc kernel: usb 1-2: 2:3 : max rate validation error.
Apr 16 19:16:02 skobkin-pc kernel: usb 1-2: 2:3 : max rate validation error.
Apr 16 19:16:02 skobkin-pc kernel: nvidia-modeset: Loading NVIDIA Kernel Mode Setting Driver for UNIX platforms 440.82 Wed Apr 1 19:41:29 UTC 2020
Apr 16 19:16:02 skobkin-pc kernel: EDAC amd64: F17h detected (node 0).
Apr 16 19:16:02 skobkin-pc kernel: EDAC amd64: Node 0: DRAM ECC disabled.