player/video: rewrite display-sync audio drift compensation
The old code had several interacting problems that prevented A/V from reaching a steady state. When the A/V difference was large, it applied the maximum allowed compensation in one step. That was fine for catching up, but the value was never re-evaluated, so audio speed routinely overshot the target. Once the difference crossed zero (or re-entered the acceptable range) it would run a linear regression over recent av_diff samples and snap the audio speed to the estimated drift. The fatal flaw was that those samples already included the controller's own compensation: even when the underlying drift was zero, the controller would "detect" the drift it had just induced and try to cancel it. Between these rare, sparse updates audio speed stayed frozen, so in practice the controller was introducing drift more than it was fixing it. On high fps outputs, where the vsync range is tight, this degenerated into a ping-pong: overshoot, snap back, overshoot again, never settling. The new code replaces the bang-bang direction controller and one-shot regression with a proportional controller driven by a low-pass-filtered av_diff. The LP filter (1 s time constant) rejects per-frame vsync jitter so the compensation no longer chases noise. The target then decays av_diff exponentially toward zero with a 10 s recovery time. Adaptive slew caps per-frame motion to the desired correction magnitude, so large excursions are absorbed quickly while near-equilibrium motion stays below audibility. The result is a continuous, gentle control loop that actually reaches steady state and does so without audible audio-speed modulation.
K
Kacper Michajłow committed
68b1d10da5d319f879a92aa880108ba5b656e9fa
Parent: 382e3e7