ALSA: usb-audio: Work around for XRUN with low latency playback
authorTakashi Iwai <tiwai@suse.de>
Fri, 27 Aug 2021 20:33:11 +0000 (22:33 +0200)
committerTakashi Iwai <tiwai@suse.de>
Fri, 27 Aug 2021 20:34:59 +0000 (22:34 +0200)
commit4267c5a8f3133db0572cd9abee059b42cafbbdad
treed6c25eff3c4ab13c0caf20eba6592125f2aef54d
parentf3eef46f0518a2b32ca1244015820c35a22cfe4a
ALSA: usb-audio: Work around for XRUN with low latency playback

The recent change for low latency playback works in most of test cases
but it turned out still to hit errors on some use cases, most notably
with JACK with small buffer sizes.  This is because USB-audio driver
fills up and submits full URBs at the beginning, while the URBs would
return immediately and try to fill more -- that can easily trigger
XRUN.  It was more or less expected, but in the small buffer size, the
problem became pretty obvious.

Fixing this behavior properly would require the change of the
fundamental driver design, so it's no trivial task, unfortunately.
Instead, here we work around the problem just by switching back to the
old method when the given configuration is too fragile with the low
latency stream handling.  As a threshold, we calculate the total
buffer bytes in all plus one URBs, and check whether it's beyond the
PCM buffer bytes.  The one extra URB is needed because XRUN happens at
the next submission after the first round.

Fixes: 307cc9baac5c ("ALSA: usb-audio: Reduce latency at playback start, take#2")
Cc: <stable@vger.kernel.org>
Link: https://lore.kernel.org/r/20210827203311.5987-1-tiwai@suse.de
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/usb/card.h
sound/usb/endpoint.c
sound/usb/pcm.c