aboutsummaryrefslogtreecommitdiffstats
path: root/src/output/plugins
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2014-08-31 15:01:12 +0200
committerMax Kellermann <max@duempel.org>2014-08-31 15:03:34 +0200
commit6e04d66a354c02910ebd849f2233e52de8b6e3c4 (patch)
tree99665a9e8c728828f24e18f5bc475f9ac86b892f /src/output/plugins
parent26bef5d20944d60b7bda1b1e6fc421e5d49e38b8 (diff)
parent86e8b3b4bd213f6013a0a2e8e0a9dd6d279494c1 (diff)
downloadmpd-6e04d66a354c02910ebd849f2233e52de8b6e3c4.tar.gz
mpd-6e04d66a354c02910ebd849f2233e52de8b6e3c4.tar.xz
mpd-6e04d66a354c02910ebd849f2233e52de8b6e3c4.zip
Merge tag 'v0.18.13'
Diffstat (limited to 'src/output/plugins')
-rw-r--r--src/output/plugins/AlsaOutputPlugin.cxx11
-rw-r--r--src/output/plugins/OssOutputPlugin.cxx4
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) {