mirror of
https://github.com/alsa-project/alsa-lib.git
synced 2025-11-01 22:58:49 -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;
|
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 */
|
/* check more precisely */
|
||||||
err = pcm_state_to_error(__snd_pcm_state(pcm));
|
err = pcm_state_to_error(__snd_pcm_state(pcm));
|
||||||
return err < 0 ? err : 1;
|
return err < 0 ? err : 1;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue