[PATCH v2 2/2] ASoC: Intel: avs: Disconnect substream if suspend or resume fails
Cezary Rojewski
cezary.rojewski at intel.com
Mon Nov 14 16:58:57 CET 2022
On 2022-11-14 3:26 PM, Takashi Iwai wrote:
> On Mon, 14 Nov 2022 15:08:17 +0100,
> Cezary Rojewski wrote:
>> On 2022-11-14 2:02 PM, Takashi Iwai wrote:
>>> Hm, that might work, but note that, once when the stream is set with
>>> the disconnected state, it won't be taken back to the normal state any
>>> longer on most sound backends. That is, it'll be gone and won't
>>> revive unless you completely unload and reload the whole stuff. If
>>> that's the intended behavior, that's fine, of course. So just to make
>>> sure.
>>
>> Good point.
>>
>> Our intention: if we fail e.g.: on resume, we would like the framework
>> to invoke ->hw_free() and close us. Right now, if we pretend that
>> everything is okay, invalid actions can be performed on our
>> streams. This all comes down to userspace calling "just"
>> snd_pcm_resume(). If we had an option to opt-in to a _hw_params() +
>> _prepare() + _resume() path, then things would look differently.
>
> So you'd rather like to make the stream appearing and working after
> re-opening the stream again? Then DISCONNECTED state might be too
> strong.
>
> If the broken state could be recovered by the PCM PREPARE phase, then
> we may (ab-)use XRUN state, instead. Then application shall
> re-setup via PCM prepare call. But if hw_free/hw_params is required,
> it won't work.
To resume properly an AudioDSP stream, operations typically found in
hw_params() and prepare() need to be re-executed _before_ actual
_TRIGGER_RESUME can be called on a stream.
Since implementations found in userspace apps such as aplay and
pulseaudio first invoke snd_pcm_resume() and then snd_pcm_prepare() if
the former fails, one could abuse this flow by doing hw_params-related
operations in _resume() and returning a specific error code e.g.:
-ESTRPIPE when they succeed (if they fail, the internal error code would
be returned instead of course). Prepare tasks are left to
snd_pcm_prepare() just like in standard case.
I believe such code is a good example of _code smell_ though.
First we abuse the error path, second we basically drop the
_TRIGGER_RESUME entirely - after all, in such approach it mimics
hw_params() and will always fail, either with an internal error code or
hardcoded -ESTRPIPE. _TRIGGER_START/STOP would be reused once
snd_pcm_prepare() succeeds causing another problem - no differentiation
between start and resume and thus lack of information when to or when
not to poll DRSM.
Thus, we ended up with 'state = DISCONNECTED' if we encounter a firmware
issue during PCM-pm. Keeps things sane.
> Other than that, there is no such PCM state that forces to close and
> re-open, I'm afraid. You can have an internal error state and let the
> stream returning an error at each operation, instead, too.
>
> And, creating a new PCM state is very difficult. It would influence
> way too much, IMO, as each application code has to be modified to
> handle the new PCM state.
Agree, this basically screams not to follow that path.
Regards,
Czarek
More information about the Alsa-devel
mailing list