diff mbox series

ALSA: usb-audio: Add quirk for Focusrite Scarlett Solo

Message ID 20190414111306.6376-1-rpsalmi@gmail.com (mailing list archive)
State New, archived
Headers show
Series ALSA: usb-audio: Add quirk for Focusrite Scarlett Solo | expand

Commit Message

Roope Salmi April 14, 2019, 11:13 a.m. UTC
The device reports Synch: Synchronous on the playback interface.
This causes regular audible napping on sample rates that are not multiples
of 1 kHz. Fix to Synch: Asynchronous.

Specifically observed on Focusrite Scarlett Solo 2nd generation. I assume
the first generation model has a different device ID. A first generation
Scarlett 2i2 I was able to test advertised Synch: Asynchronous by default.

For example, with a sample rate of 44100 Hz, a silent sample is played
every 40.96 seconds (likely 44.0 samples instead of 44.1 transmitted per
USB frame on average, 4096 being the size of some internal buffer).
There may be some other bug at play here since this doesn't happen
on other platforms. However, a feedback endpoint is listed and using it
fixes the issue. That is the only change in the quirk,
but I didn't find a way to declare only it.

Tested on two units and on two different computers.

Signed-off-by: Roope Salmi <rpsalmi@gmail.com>

Comments

Takashi Iwai April 15, 2019, 10:06 a.m. UTC | #1
On Sun, 14 Apr 2019 13:13:06 +0200,
Roope Salmi wrote:
> 
> The device reports Synch: Synchronous on the playback interface.
> This causes regular audible napping on sample rates that are not multiples
> of 1 kHz. Fix to Synch: Asynchronous.
> 
> Specifically observed on Focusrite Scarlett Solo 2nd generation. I assume
> the first generation model has a different device ID. A first generation
> Scarlett 2i2 I was able to test advertised Synch: Asynchronous by default.
> 
> For example, with a sample rate of 44100 Hz, a silent sample is played
> every 40.96 seconds (likely 44.0 samples instead of 44.1 transmitted per
> USB frame on average, 4096 being the size of some internal buffer).
> There may be some other bug at play here since this doesn't happen
> on other platforms. However, a feedback endpoint is listed and using it
> fixes the issue. That is the only change in the quirk,
> but I didn't find a way to declare only it.
> 
> Tested on two units and on two different computers.
> 
> Signed-off-by: Roope Salmi <rpsalmi@gmail.com>

Thanks, applied now.


Takashi
diff mbox series

Patch

diff --git a/sound/usb/quirks-table.h b/sound/usb/quirks-table.h
index 86e80916a..5525f9043 100644
--- a/sound/usb/quirks-table.h
+++ b/sound/usb/quirks-table.h
@@ -2770,6 +2770,90 @@  YAMAHA_DEVICE(0x7010, "UB99"),
 		.type = QUIRK_MIDI_NOVATION
 	}
 },
+{
+	/*
+	 * Focusrite Scarlett Solo 2nd generation
+	 * Reports that playback should use Synch: Synchronous
+	 * while still providing a feedback endpoint. Synchronous causes
+	 * snapping on some sample rates. 
+	 * Force it to use Synch: Asynchronous.
+	 */
+	USB_DEVICE(0x1235, 0x8205),
+	.driver_info = (unsigned long) & (const struct snd_usb_audio_quirk) {
+		.ifnum = QUIRK_ANY_INTERFACE,
+		.type = QUIRK_COMPOSITE,
+		.data = (const struct snd_usb_audio_quirk[]) {
+			{
+				.ifnum = 1,
+				.type = QUIRK_AUDIO_FIXED_ENDPOINT,
+				.data = & (const struct audioformat) {
+					.formats = SNDRV_PCM_FMTBIT_S32_LE,
+					.channels = 2,
+					.iface = 1,
+					.altsetting = 1,
+					.altset_idx = 1,
+					.attributes = 0,
+					.endpoint = 0x01,
+					.ep_attr = USB_ENDPOINT_XFER_ISOC |
+						   USB_ENDPOINT_SYNC_ASYNC,
+					.protocol = UAC_VERSION_2,
+					.rates = SNDRV_PCM_RATE_44100 |
+						 SNDRV_PCM_RATE_48000 |
+						 SNDRV_PCM_RATE_88200 |
+						 SNDRV_PCM_RATE_96000 |
+						 SNDRV_PCM_RATE_176400 |
+						 SNDRV_PCM_RATE_192000,
+					.rate_min = 44100,
+					.rate_max = 192000,
+					.nr_rates = 6,
+					.rate_table = (unsigned int[]) {
+						44100, 48000, 88200,
+						96000, 176400, 192000 
+					},
+					.clock = 41
+				}
+			},
+			{
+				.ifnum = 2,
+				.type = QUIRK_AUDIO_FIXED_ENDPOINT,
+				.data = & (const struct audioformat) {
+					.formats = SNDRV_PCM_FMTBIT_S32_LE,
+					.channels = 2,
+					.iface = 2,
+					.altsetting = 1,
+					.altset_idx = 1,
+					.attributes = 0,
+					.endpoint = 0x82,
+					.ep_attr = USB_ENDPOINT_XFER_ISOC |
+						   USB_ENDPOINT_SYNC_ASYNC |
+						   USB_ENDPOINT_USAGE_IMPLICIT_FB,
+					.protocol = UAC_VERSION_2,
+					.rates = SNDRV_PCM_RATE_44100 |
+						 SNDRV_PCM_RATE_48000 |
+						 SNDRV_PCM_RATE_88200 |
+						 SNDRV_PCM_RATE_96000 |
+						 SNDRV_PCM_RATE_176400 |
+						 SNDRV_PCM_RATE_192000,
+					.rate_min = 44100,
+					.rate_max = 192000,
+					.nr_rates = 6,
+					.rate_table = (unsigned int[]) {
+						44100, 48000, 88200,
+						96000, 176400, 192000 
+					},
+					.clock = 41
+				}
+			},
+ 			{
+ 				.ifnum = 3,
+ 				.type = QUIRK_IGNORE_INTERFACE
+ 			},
+ 			{
+ 				.ifnum = -1
+ 			}
+ 		}
+ 	}
+},
 
 /* Access Music devices */
 {