ALSA: usb-audio: Workaround for XRUN at prepare
authorTakashi Iwai <tiwai@suse.de>
Mon, 5 Dec 2022 13:21:24 +0000 (14:21 +0100)
committerTakashi Iwai <tiwai@suse.de>
Mon, 5 Dec 2022 13:22:48 +0000 (14:22 +0100)
commit198dde085ecc0138e4f0b0b69d18a0c870f2dea6
tree6f6850158c7361816c88cd8e51a5a45a725a3258
parente661c4886965e6f48d9378d8608f1d7dd7401a41
ALSA: usb-audio: Workaround for XRUN at prepare

Under certain situations (typically in the implicit feedback mode),
USB-audio driver starts a playback stream already at PCM prepare call
even before the actual PCM trigger-START call.  For implicit feedback
mode, this effectively starts two streams for data and sync
endpoints, and if a coupled sync stream gets XRUN at this point, it
results in an error -EPIPE.

The problem is that currently we return -EPIPE error as is from the
prepare.  Then application tries to recover again via the prepare
call, but it'll fail again because the sync-stop is missing.  The
sync-stop is missing because it's an internal trigger call (hence the
PCM core isn't involved).

Since we'll need to re-issue the prepare in anyway when trapped into
this pitfall, this patch attempts to address it in a bit different
way; namely, the driver tries to prepare once again after syncing the
stop manually by itself -- so applications don't see the internal
error.  At the second failure, we report the error as is, but this
shouldn't happen in normal situations.

Reported-and-tested-by: Carl Hetherington <lists@carlh.net>
Cc: <stable@vger.kernel.org>
Link: https://lore.kernel.org/r/b4e71631-4a94-613-27b2-fb595792630@carlh.net
Link: https://lore.kernel.org/r/20221205132124.11585-4-tiwai@suse.de
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/usb/pcm.c