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; }