From 2406152576b512c6fedb4eb3b6d3849448d84e6b Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Sun, 31 Aug 2014 13:58:04 +0200 Subject: output/alsa: fix endless loop at end of file in dsd_usb mode --- src/output/AlsaOutputPlugin.cxx | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'src/output') diff --git a/src/output/AlsaOutputPlugin.cxx b/src/output/AlsaOutputPlugin.cxx index 76eea5bd6..f8aae13a1 100644 --- a/src/output/AlsaOutputPlugin.cxx +++ b/src/output/AlsaOutputPlugin.cxx @@ -815,7 +815,16 @@ alsa_play(struct audio_output *ao, const void *chunk, size_t size, } } + const size_t original_size = size; chunk = ad->pcm_export->Export(chunk, size, size); + if (size == 0) + /* the DoP (DSD over PCM) filter converts two frames + at a time and ignores the last odd frame; if there + was only one frame (e.g. the last frame in the + file), the result is empty; to avoid an endless + loop, bail out here, and pretend the one frame has + been played */ + return original_size; assert(size % ad->out_frame_size == 0); -- cgit v1.2.3