summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@nowhere>2016-04-20 13:05:29 +0200
committerwm4 <wm4@nowhere>2016-04-20 13:08:06 +0200
commitcd9ee1a8533a3d5fb4c163802347e83c7db91923 (patch)
tree248cd881180aa405d9b26e47436348aea34d14ac
parent61ac156d478951a5f58cd4b22f762f782d009964 (diff)
downloadmpv-cd9ee1a8533a3d5fb4c163802347e83c7db91923.tar.bz2
mpv-cd9ee1a8533a3d5fb4c163802347e83c7db91923.tar.xz
player: really start audio only once video is ready
The check whether video is ready yet was done only in STATUS_FILLING. But it also switched to STATUS_READY, which means the next time fill_audio_out_buffers() was called, audio would actually be started before video. In most situations, this bug didn't show up, because it was only triggered if the demuxer didn't provide video packets quickly enough, but did for audio packets. Also log when audio is started. (I hate fill_audio_out_buffers(), why did I write it?)
-rw-r--r--player/audio.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/player/audio.c b/player/audio.c
index 3a2c60b8ab..2ce1669366 100644
--- a/player/audio.c
+++ b/player/audio.c
@@ -886,13 +886,18 @@ void fill_audio_out_buffers(struct MPContext *mpctx)
assert(mpctx->audio_status >= STATUS_FILLING);
+ // We already have as much data as the audio device wants, and can start
+ // writing it any time.
+ if (mpctx->audio_status == STATUS_FILLING)
+ mpctx->audio_status = STATUS_READY;
+
// Even if we're done decoding and syncing, let video start first - this is
// required, because sending audio to the AO already starts playback.
- if (mpctx->audio_status == STATUS_FILLING && mpctx->vo_chain &&
- !mpctx->vo_chain->is_coverart && mpctx->video_status <= STATUS_READY)
- {
- mpctx->audio_status = STATUS_READY;
- return;
+ if (mpctx->audio_status == STATUS_READY) {
+ if (mpctx->vo_chain && !mpctx->vo_chain->is_coverart &&
+ mpctx->video_status <= STATUS_READY)
+ return;
+ MP_VERBOSE(mpctx, "starting audio playback\n");
}
bool audio_eof = status == AD_EOF;