diff --git a/NEWS b/NEWS index b0657d4a9..1d066d290 100644 --- a/NEWS +++ b/NEWS @@ -4,6 +4,7 @@ ver 0.21.11 (not yet released) * decoder - wildmidi: log error if library initialization fails * output + - alsa: fix busy loop while draining - alsa, osx: fix distortions with DSD_U32 and DoP on 32 bit CPUs * protocol - fix "list" with multiple "group" levels diff --git a/src/output/plugins/AlsaOutputPlugin.cxx b/src/output/plugins/AlsaOutputPlugin.cxx index 8f32cf8d7..eefb7f467 100644 --- a/src/output/plugins/AlsaOutputPlugin.cxx +++ b/src/output/plugins/AlsaOutputPlugin.cxx @@ -774,6 +774,24 @@ AlsaOutput::DrainInternal() don't need to drain it */ return true; + switch (snd_pcm_state(pcm)) { + case SND_PCM_STATE_PREPARED: + case SND_PCM_STATE_RUNNING: + /* these states require a call to snd_pcm_drain() */ + break; + + case SND_PCM_STATE_DRAINING: + /* already draining, but not yet finished; this is + probably a spurious epoll event, and we should wait + for the next one */ + return false; + + default: + /* all other states cannot be drained, and we're + done */ + return true; + } + /* .. and finally drain the ALSA hardware buffer */ int result;