diff --git a/src/output/plugins/AlsaOutputPlugin.cxx b/src/output/plugins/AlsaOutputPlugin.cxx index 29510f870..01ad5e356 100644 --- a/src/output/plugins/AlsaOutputPlugin.cxx +++ b/src/output/plugins/AlsaOutputPlugin.cxx @@ -258,10 +258,12 @@ private: /** * Drain all buffers. To be run in #EventLoop's thread. * + * Throws on error. + * * @return true if draining is complete, false if this method * needs to be called again later */ - bool DrainInternal() noexcept; + bool DrainInternal(); /** * Stop playback immediately, dropping all buffers. To be run @@ -711,7 +713,7 @@ AlsaOutput::Recover(int err) noexcept } inline bool -AlsaOutput::DrainInternal() noexcept +AlsaOutput::DrainInternal() { /* drain ring_buffer */ CopyRingToPeriodBuffer(); @@ -747,7 +749,13 @@ AlsaOutput::DrainInternal() noexcept } else result = snd_pcm_drain(pcm); - return result != -EAGAIN; + if (result == 0) + return true; + else if (result == -EAGAIN) + return false; + else + throw FormatRuntimeError("snd_pcm_drain() failed: %s", + snd_strerror(-result)); } void