Merge branch 'v0.21.x'

This commit is contained in:
Max Kellermann 2019-06-28 09:28:04 +02:00
commit 30ca6b8881
2 changed files with 21 additions and 1 deletions

2
NEWS
View File

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

View File

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