From 986099d32356bb2c9520ae32b987e7155be55605 Mon Sep 17 00:00:00 2001 From: wm4 Date: Thu, 24 Jul 2014 15:26:07 +0200 Subject: audio: fix race condition in EOF code Don't return an EOF code if there's still buffered data. Also, don't call demux_stream_eof() in the playloop. There's probably nothing wrong with it, but it's cleaner not to use it. Also give AD_EOF its own value, so that a decoding error doesn't drain audio by causing an EOF condition. --- audio/decode/dec_audio.c | 4 ++-- audio/decode/dec_audio.h | 2 +- player/audio.c | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/audio/decode/dec_audio.c b/audio/decode/dec_audio.c index 4cd823e029..218063a699 100644 --- a/audio/decode/dec_audio.c +++ b/audio/decode/dec_audio.c @@ -274,13 +274,13 @@ static int filter_n_bytes(struct dec_audio *da, struct mp_audio_buffer *outbuf, filter_data.rate = da->afilter->input.rate; // due to playback speed change len = MPMIN(filter_data.samples, len); filter_data.samples = len; - bool eof = filter_data.samples == 0 && error < 0; + bool eof = error == AD_EOF && filter_data.samples == 0; if (af_filter(da->afilter, &filter_data, eof ? AF_FILTER_FLAG_EOF : 0) < 0) return AD_ERR; mp_audio_buffer_append(outbuf, &filter_data); - if (eof && filter_data.samples > 0) + if (error == AD_EOF && filter_data.samples > 0) error = 0; // don't end playback yet // remove processed data from decoder buffer: diff --git a/audio/decode/dec_audio.h b/audio/decode/dec_audio.h index c1b5eafb49..f9269b5272 100644 --- a/audio/decode/dec_audio.h +++ b/audio/decode/dec_audio.h @@ -51,9 +51,9 @@ struct dec_audio { enum { AD_OK = 0, AD_ERR = -1, - AD_EOF = -1, // same as AD_ERR for now AD_NEW_FMT = -2, AD_ASYNC_PLAY_DONE = -3, + AD_EOF = -4, }; struct mp_decoder_list *audio_decoder_list(void); diff --git a/player/audio.c b/player/audio.c index 26d9f196a3..6b2260dc89 100644 --- a/player/audio.c +++ b/player/audio.c @@ -427,7 +427,7 @@ int fill_audio_out_buffers(struct MPContext *mpctx, double endpts) return -1; } else if (res == AD_ASYNC_PLAY_DONE) return 0; - else if (demux_stream_eof(d_audio->header)) + else if (res == AD_EOF) audio_eof = true; } -- cgit v1.2.3