• Max Kellermann's avatar
    output/alsa: don't call snd_pcm_drain() if nothing was written · 4cdcaa86
    Max Kellermann authored
    Works around a problem where MPD goes into a busy loop because
    snd_pcm_drain() always returns `-EAGAIN` without making any progress
    (fixes #425).
    
    This problem was triggered by snd_pcm_drain() after snd_pcm_cancel()
    and snd_pcm_prepare(), but without submitting any data with
    snd_pcm_writei().
    
    I believe this is a kernel bug: in non-blocking mode, the kernel's
    snd_pcm_drain() function returns early.  In this mode, it only checks
    whether snd_pcm_drain_done() has been called already, but
    snd_pcm_drain_done() is never called if no data was submitted.
    
    In blocking mode, the following `for` loop detects this condition, so
    snd_pcm_drain_done() is not necessary, but without this extra check,
    we get `-EAGAIN` forever.
    4cdcaa86
Name
Last commit
Last update
..
AudioCompress Loading commit data...
android Loading commit data...
archive Loading commit data...
client Loading commit data...
command Loading commit data...
config Loading commit data...
db Loading commit data...
decoder Loading commit data...
encoder Loading commit data...
event Loading commit data...
filter Loading commit data...
fs Loading commit data...
haiku Loading commit data...
input Loading commit data...
java Loading commit data...
lib Loading commit data...
mixer Loading commit data...
neighbor Loading commit data...
net Loading commit data...
output Loading commit data...
pcm Loading commit data...
player Loading commit data...
playlist Loading commit data...
protocol Loading commit data...
queue Loading commit data...
song Loading commit data...
sticker Loading commit data...
storage Loading commit data...
system Loading commit data...
tag Loading commit data...
thread Loading commit data...
unix Loading commit data...
util Loading commit data...
win32 Loading commit data...
zeroconf Loading commit data...
AudioFormat.cxx Loading commit data...
AudioFormat.hxx Loading commit data...
AudioParser.cxx Loading commit data...
AudioParser.hxx Loading commit data...
BulkEdit.hxx Loading commit data...
CheckAudioFormat.cxx Loading commit data...
CheckAudioFormat.hxx Loading commit data...
Chrono.hxx Loading commit data...
CommandLine.cxx Loading commit data...
CommandLine.hxx Loading commit data...
GitVersion.cxx Loading commit data...
GitVersion.hxx Loading commit data...
IcyMetaDataParser.cxx Loading commit data...
IcyMetaDataParser.hxx Loading commit data...
Idle.cxx Loading commit data...
Idle.hxx Loading commit data...
IdleFlags.cxx Loading commit data...
IdleFlags.hxx Loading commit data...
Instance.cxx Loading commit data...
Instance.hxx Loading commit data...
Listen.cxx Loading commit data...
Listen.hxx Loading commit data...
LocateUri.cxx Loading commit data...
LocateUri.hxx Loading commit data...
Log.cxx Loading commit data...
Log.hxx Loading commit data...
LogBackend.cxx Loading commit data...
LogBackend.hxx Loading commit data...
LogInit.cxx Loading commit data...
LogInit.hxx Loading commit data...
LogLevel.hxx Loading commit data...
LogV.hxx Loading commit data...
Main.cxx Loading commit data...
Main.hxx Loading commit data...
Mapper.cxx Loading commit data...
Mapper.hxx Loading commit data...
MixRampInfo.hxx Loading commit data...
MusicBuffer.cxx Loading commit data...
MusicBuffer.hxx Loading commit data...
MusicChunk.cxx Loading commit data...
MusicChunk.hxx Loading commit data...
MusicChunkPtr.cxx Loading commit data...
MusicChunkPtr.hxx Loading commit data...
MusicPipe.cxx Loading commit data...
MusicPipe.hxx Loading commit data...
Partition.cxx Loading commit data...
Partition.hxx Loading commit data...
Permission.cxx Loading commit data...
Permission.hxx Loading commit data...
PlaylistDatabase.cxx Loading commit data...
PlaylistDatabase.hxx Loading commit data...
PlaylistError.cxx Loading commit data...
PlaylistError.hxx Loading commit data...
PlaylistFile.cxx Loading commit data...
PlaylistFile.hxx Loading commit data...
PlaylistPrint.cxx Loading commit data...
PlaylistPrint.hxx Loading commit data...
PlaylistSave.cxx Loading commit data...
PlaylistSave.hxx Loading commit data...
PluginUnavailable.hxx Loading commit data...
RemoteTagCache.cxx Loading commit data...
RemoteTagCache.hxx Loading commit data...
RemoteTagCacheHandler.hxx Loading commit data...
ReplayGainConfig.hxx Loading commit data...
ReplayGainGlobal.cxx Loading commit data...
ReplayGainGlobal.hxx Loading commit data...
ReplayGainInfo.cxx Loading commit data...
ReplayGainInfo.hxx Loading commit data...
ReplayGainMode.cxx Loading commit data...
ReplayGainMode.hxx Loading commit data...
SingleMode.cxx Loading commit data...
SingleMode.hxx Loading commit data...
SongLoader.cxx Loading commit data...
SongLoader.hxx Loading commit data...
SongPrint.cxx Loading commit data...
SongPrint.hxx Loading commit data...
SongSave.cxx Loading commit data...
SongSave.hxx Loading commit data...
SongUpdate.cxx Loading commit data...
StateFile.cxx Loading commit data...
StateFile.hxx Loading commit data...
StateFileConfig.cxx Loading commit data...
StateFileConfig.hxx Loading commit data...
Stats.cxx Loading commit data...
Stats.hxx Loading commit data...
TagArchive.cxx Loading commit data...
TagArchive.hxx Loading commit data...
TagFile.cxx Loading commit data...
TagFile.hxx Loading commit data...
TagPrint.cxx Loading commit data...
TagPrint.hxx Loading commit data...
TagSave.cxx Loading commit data...
TagSave.hxx Loading commit data...
TagStream.cxx Loading commit data...
TagStream.hxx Loading commit data...
TimePrint.cxx Loading commit data...
TimePrint.hxx Loading commit data...
check.h Loading commit data...
ls.cxx Loading commit data...
ls.hxx Loading commit data...
open.h Loading commit data...