Commit 30ca6b88 authored by Max Kellermann's avatar Max Kellermann

Merge branch 'v0.21.x'

parents cf631fca c9260215
...@@ -18,6 +18,8 @@ ver 0.21.11 (not yet released) ...@@ -18,6 +18,8 @@ ver 0.21.11 (not yet released)
* decoder * decoder
- wildmidi: log error if library initialization fails - wildmidi: log error if library initialization fails
* output * output
- alsa: fix busy loop while draining
- alsa: fix missing drain call
- alsa, osx: fix distortions with DSD_U32 and DoP on 32 bit CPUs - alsa, osx: fix distortions with DSD_U32 and DoP on 32 bit CPUs
* protocol * protocol
- fix "list" with multiple "group" levels - fix "list" with multiple "group" levels
......
...@@ -766,7 +766,7 @@ AlsaOutput::DrainInternal() ...@@ -766,7 +766,7 @@ AlsaOutput::DrainInternal()
/* need to call CopyRingToPeriodBuffer() and /* need to call CopyRingToPeriodBuffer() and
WriteFromPeriodBuffer() again in the next WriteFromPeriodBuffer() again in the next
iteration, so don't finish the drain just yet */ iteration, so don't finish the drain just yet */
return period_buffer.IsEmpty(); return false;
} }
if (!written) if (!written)
...@@ -774,6 +774,24 @@ AlsaOutput::DrainInternal() ...@@ -774,6 +774,24 @@ AlsaOutput::DrainInternal()
don't need to drain it */ don't need to drain it */
return true; 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 */ /* .. and finally drain the ALSA hardware buffer */
int result; int result;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment