mirror of
https://github.com/alsa-project/alsa-lib.git
synced 2025-10-29 05:40:25 -04:00
pcm: Skip avail_min check during draining
snd_pcm_wait() & co checks the current avail value and returns immediately if it satisfies <= avail_min condition. It's good in general except for one situation: draining. When the draining is being performed in the non-blocking mode, apps are supposed to wait via poll(), typically via snd_pcm_wait(). So this ends up with the busy loop because of the immediate return from snd_pcm_wait(). A simple workaround is to put the PCM state check and ignore the avail_min condition if it's DRAINING state. The equivalent check is found in the kernel xfer code, too. Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
7f084af4e4
commit
d3d42f60a6
1 changed files with 3 additions and 1 deletions
|
|
@ -2751,7 +2751,9 @@ int __snd_pcm_wait_in_lock(snd_pcm_t *pcm, int timeout)
|
|||
{
|
||||
int err;
|
||||
|
||||
if (!snd_pcm_may_wait_for_avail_min(pcm, snd_pcm_mmap_avail(pcm))) {
|
||||
/* NOTE: avail_min check can be skipped during draining */
|
||||
if (__snd_pcm_state(pcm) != SND_PCM_STATE_DRAINING &&
|
||||
!snd_pcm_may_wait_for_avail_min(pcm, snd_pcm_mmap_avail(pcm))) {
|
||||
/* check more precisely */
|
||||
err = pcm_state_to_error(__snd_pcm_state(pcm));
|
||||
return err < 0 ? err : 1;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue