Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE
alsa.6660
0038-dmix-plugin-fix-drain-for-nonblock-mode.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 0038-dmix-plugin-fix-drain-for-nonblock-mode.patch of Package alsa.6660
From fdc898d41135b26772d0fffe07e9eb0de6597125 Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela <perex@perex.cz> Date: Mon, 20 Mar 2017 08:34:33 +0100 Subject: [PATCH 38/43] dmix plugin: fix drain for nonblock mode --- src/pcm/pcm_dmix.c | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) --- a/src/pcm/pcm_dmix.c +++ b/src/pcm/pcm_dmix.c @@ -628,7 +628,7 @@ static int __snd_pcm_dmix_drain(snd_pcm_ { snd_pcm_direct_t *dmix = pcm->private_data; snd_pcm_uframes_t stop_threshold; - int err; + int err = 0; switch (snd_pcm_state(dmix->spcm)) { case SND_PCM_STATE_SUSPENDED: @@ -639,8 +639,6 @@ static int __snd_pcm_dmix_drain(snd_pcm_ if (dmix->state == SND_PCM_STATE_OPEN) return -EBADFD; - if (pcm->mode & SND_PCM_NONBLOCK) - return -EAGAIN; if (dmix->state == SND_PCM_STATE_PREPARED) { if (snd_pcm_mmap_playback_hw_avail(pcm) > 0) snd_pcm_dmix_start(pcm); @@ -663,23 +661,33 @@ static int __snd_pcm_dmix_drain(snd_pcm_ err = snd_pcm_dmix_sync_ptr(pcm); if (err < 0) { snd_pcm_dmix_drop(pcm); - return err; + goto done; } if (dmix->state == SND_PCM_STATE_DRAINING) { snd_pcm_dmix_sync_area(pcm); - snd_pcm_wait_nocheck(pcm, -1); - snd_pcm_direct_clear_timer_queue(dmix); /* force poll to wait */ + if ((pcm->mode & SND_PCM_NONBLOCK) == 0) { + snd_pcm_wait_nocheck(pcm, -1); + snd_pcm_direct_clear_timer_queue(dmix); /* force poll to wait */ + } switch (snd_pcm_state(dmix->spcm)) { case SND_PCM_STATE_SUSPENDED: - return -ESTRPIPE; + err = -ESTRPIPE; + goto done; + case SND_PCM_STATE_DRAINING: + if (pcm->mode & SND_PCM_NONBLOCK) { + err = -EAGAIN; + goto done; + } + break; default: break; } } } while (dmix->state == SND_PCM_STATE_DRAINING); +done: pcm->stop_threshold = stop_threshold; - return 0; + return err; } static int snd_pcm_dmix_drain(snd_pcm_t *pcm)
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor