1
0
mirror of https://github.com/mpv-player/mpv synced 2025-02-05 22:52:18 +00:00

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.
This commit is contained in:
wm4 2015-02-10 22:45:07 +01:00
parent 81d8c5d519
commit abbaaaa6e7

View File

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