From 436ba3c96c91a71d2acdbb545b693eb2ba57612c Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Wed, 14 Nov 2018 13:35:17 +0100 Subject: [PATCH] output/alsa: drain the whole `ring_buffer`, not just one period This fixes a problem which caused a failure with snd_pcm_writei() because snd_pcm_drain() had already been called in the previous iteration. This commit makes sure that snd_pcm_drain() is only called after the final snd_pcm_writei() call. This fixes discarded samples at the end of playback. --- NEWS | 1 + src/output/plugins/AlsaOutputPlugin.cxx | 9 ++++----- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/NEWS b/NEWS index 179ad5f28..002ef277f 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,7 @@ ver 0.21.3 (not yet released) * output - alsa: fix crash bug - alsa: fix stuttering at start of playback + - alsa: fix discarded samples at end of song - alsa: clear error after reopening device * log: default to journal if MPD was started as systemd service diff --git a/src/output/plugins/AlsaOutputPlugin.cxx b/src/output/plugins/AlsaOutputPlugin.cxx index 7f403265c..4cf0c3bd2 100644 --- a/src/output/plugins/AlsaOutputPlugin.cxx +++ b/src/output/plugins/AlsaOutputPlugin.cxx @@ -749,11 +749,10 @@ AlsaOutput::DrainInternal() snd_strerror(-frames_written)); } - if (!period_buffer.IsEmpty()) - /* need to call WriteFromPeriodBuffer() again - in the next iteration, so don't finish the - drain just yet */ - return false; + /* need to call CopyRingToPeriodBuffer() and + WriteFromPeriodBuffer() again in the next + iteration, so don't finish the drain just yet */ + return period_buffer.IsEmpty(); } /* .. and finally drain the ALSA hardware buffer */