From 7ab228629e8184a43782606e9fb0319110c8eee8 Mon Sep 17 00:00:00 2001 From: wm4 Date: Thu, 4 Sep 2014 23:35:11 +0200 Subject: audio: fix obscure audio resync failure with timelines Somehow, there was a larger misunderstanding in the code: ao_buffer does not need to be preserved over audio reinit for proper support of gapless audio. The actual AO internal buffer takes care of this. In fact, preserving ao_buffer just breaks audio resync. In the ordered chapter case, end_pts is used, which means not all audio data in the buffer is played, thus some data is left over when audio decoding resumes on the next segment. This triggers some code that aborts resync if there's "audio decoded" (ao_buffer contains something), but no PTS is known (nothing was actually decoded yet). Simplify, and always bind the output buffer to the decoder. CC: @mpv-player/stable (maybe) --- player/audio.c | 6 +++--- player/loadfile.c | 3 +++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/player/audio.c b/player/audio.c index 67ac16a2be..23913b9b11 100644 --- a/player/audio.c +++ b/player/audio.c @@ -96,6 +96,8 @@ void reset_audio_state(struct MPContext *mpctx) { if (mpctx->d_audio) audio_reset_decoding(mpctx->d_audio); + if (mpctx->ao_buffer) + mp_audio_buffer_clear(mpctx->ao_buffer); mpctx->audio_status = mpctx->d_audio ? STATUS_SYNCING : STATUS_EOF; } @@ -120,15 +122,13 @@ void reinit_audio_chain(struct MPContext *mpctx) mpctx->d_audio->opts = opts; mpctx->d_audio->header = sh; mpctx->d_audio->replaygain_data = sh->audio->replaygain_data; + mpctx->ao_buffer = mp_audio_buffer_create(NULL); if (!audio_init_best_codec(mpctx->d_audio, opts->audio_decoders)) goto init_error; reset_audio_state(mpctx); } assert(mpctx->d_audio); - if (!mpctx->ao_buffer) - mpctx->ao_buffer = mp_audio_buffer_create(mpctx); - struct mp_audio in_format; mp_audio_buffer_get_format(mpctx->d_audio->decode_buffer, &in_format); diff --git a/player/loadfile.c b/player/loadfile.c index 00a10aa34f..c136cc3a19 100644 --- a/player/loadfile.c +++ b/player/loadfile.c @@ -84,8 +84,11 @@ void uninit_player(struct MPContext *mpctx, unsigned int mask) mixer_uninit_audio(mpctx->mixer); audio_uninit(mpctx->d_audio); mpctx->d_audio = NULL; + talloc_free(mpctx->ao_buffer); mpctx->audio_status = STATUS_EOF; reselect_demux_streams(mpctx); + if (mpctx->ao_buffer) + mp_audio_buffer_clear(mpctx->ao_buffer); } if (mask & INITIALIZED_SUB) { -- cgit v1.2.3