aboutsummaryrefslogtreecommitdiffstats
path: root/plugins/alsa/alsa-core-pcm.c
diff options
context:
space:
mode:
authorJonathan Aillet <jonathan.aillet@iot.bzh>2018-11-07 17:00:36 +0900
committerThierry Bultel <thierry.bultel@iot.bzh>2018-11-13 14:33:45 +0100
commit6ee71f44ebbb19809c75fb3b2ec4ca184b6e60fd (patch)
tree8a0f2928ab4cd6fbb2f04ddfef592cba5711642d /plugins/alsa/alsa-core-pcm.c
parent5e48bc1f57a61302588d59eb686a2b1a5db0cd24 (diff)
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 <jonathan.aillet@iot.bzh>
Diffstat (limited to 'plugins/alsa/alsa-core-pcm.c')
-rw-r--r--plugins/alsa/alsa-core-pcm.c16
1 files changed, 15 insertions, 1 deletions
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 (;;) {