output/alsa: use IsCleared() instead of IsDrained() in DrainInternal()

Really drain all data from the period_buffer in any case.
This commit is contained in:
Max Kellermann
2019-06-27 21:53:28 +02:00
parent d66f5a8590
commit a92aa0bedc
2 changed files with 21 additions and 25 deletions

View File

@@ -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)