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:
parent
81d8c5d519
commit
abbaaaa6e7
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user