• Takashi Iwai's avatar
    ALSA: usb-audio: Workaround for XRUN at prepare · 198dde08
    Takashi Iwai authored
    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: default avatarCarl 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.deSigned-off-by: default avatarTakashi Iwai <tiwai@suse.de>
    198dde08
pcm.c 46.5 KB