From c6c0d788a835277b190d267fa4d6b338e4bba30e Mon Sep 17 00:00:00 2001 From: Ricardo Biehl Pasquali Date: Tue, 12 Mar 2019 16:31:04 -0300 Subject: pcm: Allow to wait if capture is not running This allows starting capture from another thread. See the commit 932a81519572 ("ALSA: pcm: Comment why read blocks when PCM is not running") in Linux kernel. Signed-off-by: Ricardo Biehl Pasquali --- src/pcm.c | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/pcm.c b/src/pcm.c index 4710862..a32871e 100644 --- a/src/pcm.c +++ b/src/pcm.c @@ -1282,17 +1282,16 @@ int pcm_mmap_transfer(struct pcm *pcm, void *buffer, unsigned int frames) return -1; state = pcm->mmap_status->state; - /* start capture if frames >= threshold */ - if (!is_playback && state == PCM_STATE_PREPARED) { - if (frames >= pcm->config.start_threshold) { - err = ioctl(pcm->fd, SNDRV_PCM_IOCTL_START); - if (err == -1) - return -1; - /* state = PCM_STATE_RUNNING */ - } else { - /* nothing to do */ - return 0; - } + /* + * If frames < start_threshold, wait indefinitely. + * Another thread may start capture + */ + if (!is_playback && state == PCM_STATE_PREPARED && + frames >= pcm->config.start_threshold) { + err = ioctl(pcm->fd, SNDRV_PCM_IOCTL_START); + if (err == -1) + return -1; + /* state = PCM_STATE_RUNNING */ } avail = pcm_mmap_avail(pcm); -- cgit v1.2.3