From abbaaaa6e7b565758822fb6aa90ebbb10353f699 Mon Sep 17 00:00:00 2001 From: wm4 Date: Tue, 10 Feb 2015 22:45:07 +0100 Subject: player: skip audio filter reinit on some types of speed changes This avoids potentially dropping some small amount of audio data buffered in filters. Reinit can be skipped only if the filter is af_scaletempo (which maps to AF_CONTROL_SET_PLAYBACK_SPEED). The other case using af_lavrresample is much more complicated due to filter chain politics. Also, changing speed between 1.0 and something higher typically inserts or removes the filter, so this obviously requires reinitialization. It can be prevented by forcing the filter with --af=scaletempo. --- player/audio.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) (limited to 'player/audio.c') diff --git a/player/audio.c b/player/audio.c index 5e0497c84e..b63201029f 100644 --- a/player/audio.c +++ b/player/audio.c @@ -66,6 +66,7 @@ static int recreate_audio_filters(struct MPContext *mpctx) struct MPOpts *opts = mpctx->opts; struct af_stream *afs = mpctx->d_audio->afilter; + bool need_reinit = false; double speed = opts->playback_speed; @@ -89,8 +90,15 @@ static int recreate_audio_filters(struct MPContext *mpctx) // Try again. if (!af_control_any_rev(afs, method, &speed)) return -1; + } else { + method = AF_CONTROL_SET_PLAYBACK_SPEED; } } + // AF_CONTROL_SET_PLAYBACK_SPEED does not require reinitialization, + // while AF_CONTROL_SET_PLAYBACK_SPEED_RESAMPLE requires updating + // the samplerate on the resampler, and possibly inserting the + // resampler itself. + need_reinit |= (method == AF_CONTROL_SET_PLAYBACK_SPEED_RESAMPLE); } else { if (af_remove_by_label(afs, "playback-speed") < 0) return -1; @@ -99,7 +107,9 @@ static int recreate_audio_filters(struct MPContext *mpctx) af_control_any_rev(afs, AF_CONTROL_SET_PLAYBACK_SPEED_RESAMPLE, &speed); } - if (af_init(afs) < 0) { + need_reinit |= afs->initialized < 1; + + if (need_reinit && af_init(afs) < 0) { MP_ERR(mpctx, "Couldn't find matching filter/ao format!\n"); return -1; } -- cgit v1.2.3