diff --git a/player/audio.c b/player/audio.c index 8422e109f1..598e145147 100644 --- a/player/audio.c +++ b/player/audio.c @@ -1225,10 +1225,8 @@ void fill_audio_out_buffers(struct MPContext *mpctx) // 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_READY) { - if (mpctx->vo_chain && !mpctx->vo_chain->is_coverart && - mpctx->video_status <= STATUS_READY) - return; - MP_VERBOSE(mpctx, "starting audio playback\n"); + // Warning: relies on handle_playback_restart() being called afterwards. + return; } bool audio_eof = status == AD_EOF; diff --git a/player/playloop.c b/player/playloop.c index 2e714823f9..3db5818773 100644 --- a/player/playloop.c +++ b/player/playloop.c @@ -976,7 +976,15 @@ static void handle_playback_restart(struct MPContext *mpctx) return; } + // Video needed, but not started yet -> wait. + if (mpctx->vo_chain && !mpctx->vo_chain->is_coverart && + mpctx->video_status <= STATUS_READY) + return; + + MP_VERBOSE(mpctx, "starting audio playback\n"); + mpctx->audio_status = STATUS_PLAYING; fill_audio_out_buffers(mpctx); // actually play prepared buffer + mp_wakeup_core(mpctx); } if (!mpctx->restart_complete) {