diff --git a/src/lib/alsa/PeriodBuffer.hxx b/src/lib/alsa/PeriodBuffer.hxx index 71a47ae7c..7767e8b4b 100644 --- a/src/lib/alsa/PeriodBuffer.hxx +++ b/src/lib/alsa/PeriodBuffer.hxx @@ -77,14 +77,6 @@ public: return tail >= capacity; } - /** - * Has some data already been consumed at the buffer's head in - * this period? - */ - bool WasConsumed() const noexcept { - return head > 0; - } - /** * Has all data for the current period been drained? If not, * then there is pending data. This ignores the partial frame diff --git a/src/output/plugins/AlsaOutputPlugin.cxx b/src/output/plugins/AlsaOutputPlugin.cxx index e1e0495aa..01cd1a1e4 100644 --- a/src/output/plugins/AlsaOutputPlugin.cxx +++ b/src/output/plugins/AlsaOutputPlugin.cxx @@ -747,26 +747,30 @@ AlsaOutput::DrainInternal() /* drain ring_buffer */ CopyRingToPeriodBuffer(); - if (period_buffer.WasConsumed() && !period_buffer.IsFull()) - /* generate some silence to finish the partial - period */ - period_buffer.FillWithSilence(silence, out_frame_size); - /* drain period_buffer */ - if (!period_buffer.IsDrained()) { - auto frames_written = WriteFromPeriodBuffer(); - if (frames_written < 0) { - if (frames_written == -EAGAIN) - return false; + if (!period_buffer.IsCleared()) { + if (!period_buffer.IsFull()) + /* generate some silence to finish the partial + period */ + period_buffer.FillWithSilence(silence, out_frame_size); - throw FormatRuntimeError("snd_pcm_writei() failed: %s", - snd_strerror(-frames_written)); + /* drain period_buffer */ + if (!period_buffer.IsDrained()) { + auto frames_written = WriteFromPeriodBuffer(); + if (frames_written < 0) { + if (frames_written == -EAGAIN) + return false; + + throw FormatRuntimeError("snd_pcm_writei() failed: %s", + snd_strerror(-frames_written)); + } + + /* need to call CopyRingToPeriodBuffer() and + 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 false; } if (!written)