lkml.org 
[lkml]   [2021]   [Dec]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.15 011/207] ALSA: usb-audio: Switch back to non-latency mode at a later point
    Date
    From: Takashi Iwai <tiwai@suse.de>

    commit eee5d6f1356a016105a974fb176b491288439efa upstream.

    The recent regression report revealed that the judgment of the
    low-latency playback mode based on the runtime->stop_threshold cannot
    work reliably at the prepare stage, as sw_params call may happen at
    any time, and PCM dmix actually sets it up after the prepare call.
    This ended up with the stall of the stream as PCM ack won't be issued
    at all.

    For addressing this, check the free-wheeling mode again at the PCM
    trigger right before starting the stream again, and allow switching to
    the non-LL mode at a late stage.

    Fixes: d5f871f89e21 ("ALSA: usb-audio: Improved lowlatency playback support")
    Reported-and-tested-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
    Link: https://lore.kernel.org/r/20211117161855.m45mxcqszkfcetai@box.shutemov.name
    Link: https://lore.kernel.org/r/20211119102459.7055-1-tiwai@suse.de
    Signed-off-by: Takashi Iwai <tiwai@suse.de>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    sound/usb/pcm.c | 11 +++++++++--
    1 file changed, 9 insertions(+), 2 deletions(-)

    --- a/sound/usb/pcm.c
    +++ b/sound/usb/pcm.c
    @@ -581,6 +581,12 @@ static int snd_usb_hw_free(struct snd_pc
    return 0;
    }

    +/* free-wheeling mode? (e.g. dmix) */
    +static int in_free_wheeling_mode(struct snd_pcm_runtime *runtime)
    +{
    + return runtime->stop_threshold > runtime->buffer_size;
    +}
    +
    /* check whether early start is needed for playback stream */
    static int lowlatency_playback_available(struct snd_pcm_runtime *runtime,
    struct snd_usb_substream *subs)
    @@ -592,8 +598,7 @@ static int lowlatency_playback_available
    /* disabled via module option? */
    if (!chip->lowlatency)
    return false;
    - /* free-wheeling mode? (e.g. dmix) */
    - if (runtime->stop_threshold > runtime->buffer_size)
    + if (in_free_wheeling_mode(runtime))
    return false;
    /* implicit feedback mode has own operation mode */
    if (snd_usb_endpoint_implicit_feedback_sink(subs->data_endpoint))
    @@ -1545,6 +1550,8 @@ static int snd_usb_substream_playback_tr
    subs);
    if (subs->lowlatency_playback &&
    cmd == SNDRV_PCM_TRIGGER_START) {
    + if (in_free_wheeling_mode(substream->runtime))
    + subs->lowlatency_playback = false;
    err = start_endpoints(subs);
    if (err < 0) {
    snd_usb_endpoint_set_callback(subs->data_endpoint,

    \
     
     \ /
      Last update: 2021-12-06 17:11    [W:4.165 / U:0.004 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site