lkml.org 
[lkml]   [2021]   [Dec]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 6/6] ASoC: soc-pcm: fix BE handling of PAUSE_RELEASE
    Date
    A BE connected to more than one FE, e.g. in a mixer case, can go
    through the following transitions.

    play FE1 -> BE state is START
    pause FE1 -> BE state is PAUSED
    play FE2 -> BE state is START
    stop FE2 -> BE state is STOP (see note [1] below)
    release FE1 -> BE state is START
    stop FE1 -> BE state is STOP

    play FE1 -> BE state is START
    pause FE1 -> BE state is PAUSED
    play FE2 -> BE state is START
    release FE1 -> BE state is START
    stop FE2 -> BE state is START
    stop FE1 -> BE state is STOP

    play FE1 -> BE state is START
    play FE2 -> BE state is START (no change)
    pause FE1 -> BE state is START (no change)
    pause FE2 -> BE state is PAUSED
    release FE1 -> BE state is START
    release FE2 -> BE state is START (no change)
    stop FE1 -> BE state is START (no change)
    stop FE2 -> BE state is STOP

    The existing code for PAUSE_RELEASE only allows for the case where the
    BE is paused, which clearly would not work in the sequences above.

    Extend the allowed states to restart the BE when PAUSE_RELEASE is
    received, and increase the refcount if the BE is already in START.

    [1] the existing logic does not move the BE state back to PAUSED when
    the FE2 is stopped. This patch does not change the logic; it would be
    painful to keep a history of changes on the FE side, the state machine
    is already rather complicated with transitions based on the last BE
    state and the trigger type.

    Reported-by: Bard Liao <bard.liao@intel.com>
    Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
    Reviewed-by: Kai Vehmanen <kai.vehmanen@linux.intel.com>
    Reviewed-by: Bard Liao <yung-chuan.liao@linux.intel.com>
    Reviewed-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
    ---
    sound/soc/soc-pcm.c | 5 ++++-
    1 file changed, 4 insertions(+), 1 deletion(-)

    diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c
    index 05a0f52eb11b..7abfc48b26ca 100644
    --- a/sound/soc/soc-pcm.c
    +++ b/sound/soc/soc-pcm.c
    @@ -2140,7 +2140,10 @@ int dpcm_be_dai_trigger(struct snd_soc_pcm_runtime *fe, int stream,
    be->dpcm[stream].state = SND_SOC_DPCM_STATE_START;
    break;
    case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
    - if ((be->dpcm[stream].state != SND_SOC_DPCM_STATE_PAUSED))
    + if (!be->dpcm[stream].be_start &&
    + (be->dpcm[stream].state != SND_SOC_DPCM_STATE_START) &&
    + (be->dpcm[stream].state != SND_SOC_DPCM_STATE_STOP) &&
    + (be->dpcm[stream].state != SND_SOC_DPCM_STATE_PAUSED))
    goto next;

    be->dpcm[stream].be_start++;
    --
    2.25.1
    \
     
     \ /
      Last update: 2021-12-07 19:11    [W:2.948 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site