diff options
author | Max Kellermann <max@duempel.org> | 2014-08-31 15:01:12 +0200 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2014-08-31 15:03:34 +0200 |
commit | 6e04d66a354c02910ebd849f2233e52de8b6e3c4 (patch) | |
tree | 99665a9e8c728828f24e18f5bc475f9ac86b892f /src/output | |
parent | 26bef5d20944d60b7bda1b1e6fc421e5d49e38b8 (diff) | |
parent | 86e8b3b4bd213f6013a0a2e8e0a9dd6d279494c1 (diff) | |
download | mpd-6e04d66a354c02910ebd849f2233e52de8b6e3c4.tar.gz mpd-6e04d66a354c02910ebd849f2233e52de8b6e3c4.tar.xz mpd-6e04d66a354c02910ebd849f2233e52de8b6e3c4.zip |
Merge tag 'v0.18.13'
Diffstat (limited to '')
-rw-r--r-- | src/output/plugins/AlsaOutputPlugin.cxx | 11 | ||||
-rw-r--r-- | src/output/plugins/OssOutputPlugin.cxx | 4 |
2 files changed, 15 insertions, 0 deletions
diff --git a/src/output/plugins/AlsaOutputPlugin.cxx b/src/output/plugins/AlsaOutputPlugin.cxx index a18cedc70..0ebf3ddbe 100644 --- a/src/output/plugins/AlsaOutputPlugin.cxx +++ b/src/output/plugins/AlsaOutputPlugin.cxx @@ -825,6 +825,7 @@ alsa_play(AudioOutput *ao, const void *chunk, size_t size, { AlsaOutput *ad = (AlsaOutput *)ao; + assert(size > 0); assert(size % ad->in_frame_size == 0); if (ad->must_prepare) { @@ -838,12 +839,22 @@ alsa_play(AudioOutput *ao, const void *chunk, size_t size, } const auto e = ad->pcm_export->Export({chunk, size}); + if (e.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 size; + chunk = e.data; size = e.size; assert(size % ad->out_frame_size == 0); size /= ad->out_frame_size; + assert(size > 0); while (true) { snd_pcm_sframes_t ret = ad->writei(ad->pcm, chunk, size); diff --git a/src/output/plugins/OssOutputPlugin.cxx b/src/output/plugins/OssOutputPlugin.cxx index f2618491c..39d87fc35 100644 --- a/src/output/plugins/OssOutputPlugin.cxx +++ b/src/output/plugins/OssOutputPlugin.cxx @@ -724,6 +724,8 @@ oss_output_play(AudioOutput *ao, const void *chunk, size_t size, OssOutput *od = (OssOutput *)ao; ssize_t ret; + assert(size > 0); + /* reopen the device since it was closed by dropBufferedAudio */ if (od->fd < 0 && !oss_reopen(od, error)) return 0; @@ -734,6 +736,8 @@ oss_output_play(AudioOutput *ao, const void *chunk, size_t size, size = e.size; #endif + assert(size > 0); + while (true) { ret = write(od->fd, chunk, size); if (ret > 0) { |