From 92e0380860dbc556ef2a1f9fbc0cd7eb99edad69 Mon Sep 17 00:00:00 2001 From: Jonathan Aillet Date: Wed, 7 Nov 2018 17:00:36 +0900 Subject: Handle too small card PCM buffer when writing In the writing thread, handle the case when 'writing threshold' was smaller than ALSA sound card's PCM buffer (defined in the driver). This avoids waiting indefinitely for a buffer to contain a wanted number of frames that it cannot contain. Change-Id: Ie1aa69ea1a93471ed46d571c669ec08a1b827476 Signed-off-by: Jonathan Aillet --- plugins/alsa/alsa-core-pcm.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/plugins/alsa/alsa-core-pcm.c b/plugins/alsa/alsa-core-pcm.c index 509e1ac..f41aed0 100644 --- a/plugins/alsa/alsa-core-pcm.c +++ b/plugins/alsa/alsa-core-pcm.c @@ -555,7 +555,21 @@ static void *writeThreadEntry(void *handle) { alsa_ringbuf_t * rbuf = pcmCopyHandle->rbuf; - const snd_pcm_sframes_t threshold = 1000; + snd_pcm_status_t *pcmOutStatus; + snd_pcm_uframes_t pcmOutSize; + + snd_pcm_sframes_t threshold; + + snd_pcm_status_alloca(&pcmOutStatus); + snd_pcm_status(pcmOut, pcmOutStatus); + pcmOutSize = snd_pcm_status_get_avail_max(pcmOutStatus); + + /* This threshold is the expected space available in the hw output buffer + * The aim is to wait to have a significant amount of space, in order to + * avoid to write to the device too often, or take a very small amount of + * frames from the ring buffer. So basically, this saves some CPU load */ + + threshold = pcmOutSize / 3; for (;;) { -- cgit 1.2.3-korg