Linux Sound subsystem development
 help / color / mirror / Atom feed
From: "Péter Ujfalusi" <peter.ujfalusi@linux.intel.com>
To: Takashi Iwai <tiwai@suse.de>
Cc: Jaroslav Kysela <perex@perex.cz>,
	lgirdwood@gmail.com, broonie@kernel.org, tiwai@suse.com,
	linux-sound@vger.kernel.org, kai.vehmanen@linux.intel.com,
	ranjani.sridharan@linux.intel.com,
	yung-chuan.liao@linux.intel.com, pierre-louis.bossart@linux.dev,
	liam.r.girdwood@intel.com
Subject: Re: [PATCH] ALSA: pcm: Release paused streams before suspend if resume is not supported
Date: Thu, 3 Apr 2025 13:13:39 +0300	[thread overview]
Message-ID: <51bf9695-1f70-4749-b70a-2ed4af8c4be7@linux.intel.com> (raw)
In-Reply-To: <87o6xe7l4q.wl-tiwai@suse.de>



On 02/04/2025 16:23, Takashi Iwai wrote:
> On Wed, 02 Apr 2025 14:52:48 +0200,
> Péter Ujfalusi wrote:
>>
>>
>>
>> On 02/04/2025 14:50, Takashi Iwai wrote:
>>> On Wed, 02 Apr 2025 13:43:57 +0200,
>>> Péter Ujfalusi wrote:
>>>>
>>>>
>>>>
>>>> On 02/04/2025 14:21, Takashi Iwai wrote:
>>>>>>> On the second thought, yet another variant would be to introduce only
>>>>>>> one new trigger, SNDRV_PCM_TRIGGER_PAUSE_RESET, for resetting the
>>>>>>> PAUSED state as a step before stopping the stream.  This can be
>>>>>>> applied to all cases for snd_pcm_drop() and snd_pcm_suspend(), too.
>>>>>>> If the driver doesn't support this mode, the PCM core may fall back to
>>>>>>> SNDRV_PCM_TRIGGER_PAUSE_RELEASE.
>>>>>>
>>>>>> This looks identical to my proposed
>>>>>> SNDRV_PCM_TRIGGER_PAUSE_RELEASE_AND_STOP which is more
>>>>>> explanatory. It's not clear what PAUSE_RESET should do (probably the
>>>>>> stream should be kept inactive).
>>>>>
>>>>> There is a slight difference.  My proposal, *_TRIGGER_PAUSE_RESET,
>>>>> doesn't have to stop the stream by itself, but it's only a preparation
>>>>> for stopping.  That is, a proper TRIGGER_STOP always follows after
>>>>> TRIGGER_PAUSE_RESET.
>>>>
>>>> But what state that we move after we reset the PAUSE? is it RUNNING
>>>> (iow, equals to PAUSE_RELEASE) or something else?
>>>
>>> It'll be temporarily set to RUNNING.
>>>
>>>> In case of suspend while the state is paused we will:
>>>> TRIGGER_PAUSE_RESET followed by STOP or SUSPEND?
>>>
>>> For suspend, PAUSE_RESET, then SUSPEND.
>>> For dropping, PAUSE_RESET, then STOP.
>>
>> OK, but this is still the same as PAUSE_RELEASE+SUSPEND when it comes to
>> suspended_state, no?
>> I mean you need to move to RUNNING to be suspend, or stop to skip the
>> suspend.
> 
> Yes, and this needs to be addressed.  e.g. save the suspended_state
> beforehand.
> 
>>>> Most drivers are doing the same thing for STOP and SUSPEND trigger,
>>>> however it is possible to do extra steps for SUSPEND to make sure that
>>>> the whole system is in a lowest power state.
>>>
>>> Yes, that's the reason I proposed PAUSE_RESET.  Then the driver can
>>> handle the following stop or suspend operation differently.
>>>
>>> That said, PAUSE_RESET is just another variant of PAUSE_RELEASE.
>>> But this shouldn't actually enable the audio output again, but prepare
>>> for the next SUSPEND or STOP trigger.
>>
>> I'm not sure how this would be seen in ASoC level. Surely we need to
>> have flag per components that it is handling PAUSE_RESET as codecs would
>> like don't want to do it or they migh, hm.
>> But ASoC maintains another set of state for the dpcm:
>> SND_SOC_DPCM_STATE_* and it has this as well among other state-machine
>> things:
>> case SNDRV_PCM_TRIGGER_SUSPEND:
>> 	if (be->dpcm[stream].state != SND_SOC_DPCM_STATE_START)
>> 		goto next;
>>
>> So, this is dpcm level, but one component can support PAUSE_RESET while
>> the other does not and the transitions are not too clear to me.
> 
> It's a good question.  ASoC may have the own intermediate state
> (SND_SOC_DPCM_STATE_PAUSED_RESET) or just use
> SND_SOC_DPCM_STATE_START but leave all to BE trigger (by passing
> SNDRV_PCM_TRIGGER_PAUSE_RESET).
> 
>> But the idea of resurrecting a paused stream with mute held is not bad.
>>
>> I'm still uncertain how this actually works now on systems where RESUME
>> is supported and we suspend while a PCM is in paused...
> 
> Is it a general question about suspend+resume during pause, or the
> behavior change after PAUSE_RESET?  PAUSE_RESET won't be applied to
> the drivers that support RESUME.
> 
> BTW, I'm not pushing to sell PAUSE_RESET so much for now at all.
> Currently rather in a brain storming phase.  Let's try to pick up the
> more appropriate one.

While I think the patch is a good start to handle the current situation
with a minimal change (and a possibility of dropping it when the more
elaborate and likely laborious one is available), this is how it was
before the patch in regards to suspend while paused:

RESUME is suported:
- Stream is PAUSED
- No SUSPEND trigger is sent (stream is not running), state changes to
SUSPENDED, suspended_state is PAUSED
- On resume, no RESUME trigger is sent (suspended state is not RUNNING
or DRAIN), but the state is changed to PAUSED.
- On PAUSE_RELEASE the trigger is sent (how it is handled in driver is
another question as we had suspended the system in between).

RESUME is not suported:
- Stream is PAUSED
- No SUSPEND trigger is sent (stream is not running), state changes to
SUSPENDED, suspended_state is PAUSED
- On resume, no RESUME trigger is sent (resume is not supported), the
state remains to SUSPENDED, suspended_state is PAUSED
On PAUSE_RELEASE the core will raturn error as the state is not PAUSED,
it is SUSPENDED and we go to xrun recovery
- driver received PAUSE_PUSH but never receives PAUSE_RELEASE

I think that the SUSPEND trigger (or a new similar trigger) should be
sent to a PAUSED stream regardless of RESUME support. Imho it is not a
correct assumption that a PAUSED stream is ready for system suspend, it
might not be, it might needs to be prepared for that.
If we use the same SUSPEND trigger than the drivers need to track their
paused state as well to know what to do - we rely on the enforced state
changes in core to do this implicitly atm.

If there is no RESUME support, then it is a bit more complicated as
after the system suspend the audio hardware's state does not matter,
whenever it was RUNNMING or PAUSED we need to go to xrun recovery to
restart, resume is not supported.

But if RESUME is not supported we do need to send the PAUSE_RELEASE to
balance the PUSH.
Should we set XRUN as suspended_state in case of RESUME is not
supported? Or some other state which indicates that whatever we had
before, we are not going to be able to pick up where we were?

The fact that we discuss this shows how much this corner case have been
excercised (we eneded upm disabling this in CI testing for now in SOF).

-- 
Péter


  reply	other threads:[~2025-04-03 10:12 UTC|newest]

Thread overview: 36+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-04-01 13:36 [PATCH] ALSA: pcm: Release paused streams before suspend if resume is not supported Peter Ujfalusi
2025-04-01 14:49 ` Takashi Iwai
2025-04-01 16:58   ` Jaroslav Kysela
2025-04-01 17:19     ` Takashi Iwai
2025-04-01 18:46       ` Jaroslav Kysela
2025-04-01 19:27         ` Takashi Iwai
2025-04-02  6:41           ` Péter Ujfalusi
2025-04-02  8:14             ` Jaroslav Kysela
2025-04-02  8:09           ` Jaroslav Kysela
2025-04-02  8:39             ` Takashi Iwai
2025-04-02  8:52               ` Jaroslav Kysela
2025-04-02  9:16                 ` Takashi Iwai
2025-04-02 10:45                   ` Jaroslav Kysela
2025-04-02 11:21                     ` Takashi Iwai
2025-04-02 11:43                       ` Péter Ujfalusi
2025-04-02 11:50                         ` Takashi Iwai
2025-04-02 12:52                           ` Péter Ujfalusi
2025-04-02 13:23                             ` Takashi Iwai
2025-04-03 10:13                               ` Péter Ujfalusi [this message]
2025-04-03 14:01                                 ` Takashi Iwai
2025-04-03 15:24                                   ` Jaroslav Kysela
2025-04-03 16:09                                     ` Takashi Iwai
2025-04-03 19:05                                       ` Jaroslav Kysela
2025-04-04 10:44                                         ` Takashi Iwai
2025-04-04 11:33                                           ` Jaroslav Kysela
2025-04-04 14:44                                             ` Takashi Iwai
2025-04-08  7:03                                         ` Péter Ujfalusi
2025-04-08  8:51                                           ` Jaroslav Kysela
2025-04-08  9:45                                             ` Péter Ujfalusi
2025-04-04  8:58                                     ` Péter Ujfalusi
2025-04-04  9:08                                       ` Jaroslav Kysela
2025-04-08  6:35                                   ` Péter Ujfalusi
2025-04-02 12:55                           ` Jaroslav Kysela
2025-04-02  9:28                 ` Péter Ujfalusi
2025-04-02 11:27                   ` Takashi Iwai
2025-04-02 11:53                     ` Takashi Iwai

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=51bf9695-1f70-4749-b70a-2ed4af8c4be7@linux.intel.com \
    --to=peter.ujfalusi@linux.intel.com \
    --cc=broonie@kernel.org \
    --cc=kai.vehmanen@linux.intel.com \
    --cc=lgirdwood@gmail.com \
    --cc=liam.r.girdwood@intel.com \
    --cc=linux-sound@vger.kernel.org \
    --cc=perex@perex.cz \
    --cc=pierre-louis.bossart@linux.dev \
    --cc=ranjani.sridharan@linux.intel.com \
    --cc=tiwai@suse.com \
    --cc=tiwai@suse.de \
    --cc=yung-chuan.liao@linux.intel.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox