Commit 46f5710f authored by Roope Salmi's avatar Roope Salmi Committed by Takashi Iwai

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

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: default avatarRoope Salmi <rpsalmi@gmail.com>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent e61ab9f0
...@@ -2770,6 +2770,90 @@ YAMAHA_DEVICE(0x7010, "UB99"), ...@@ -2770,6 +2770,90 @@ YAMAHA_DEVICE(0x7010, "UB99"),
.type = QUIRK_MIDI_NOVATION .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 */ /* Access Music devices */
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment