From c52b4e100761de5000e1ad10f445d8c71c04e995 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Toni=20F=C3=B6rster?= Date: Mon, 16 Sep 2024 10:02:34 +0200 Subject: [PATCH] tweaked A/V-sync for MPV MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Toni Förster --- Model/Player/Backends/MPVClient.swift | 9 ++++++++- Model/Player/PlayerModel.swift | 19 +++++++++++++++---- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/Model/Player/Backends/MPVClient.swift b/Model/Player/Backends/MPVClient.swift index b257a4f7..fd7510c2 100644 --- a/Model/Player/Backends/MPVClient.swift +++ b/Model/Player/Backends/MPVClient.swift @@ -79,14 +79,21 @@ final class MPVClient: ObservableObject { checkError(mpv_set_option_string(mpv, "user-agent", UserAgentManager.shared.userAgent)) checkError(mpv_set_option_string(mpv, "initial-audio-sync", Defaults[.mpvInitialAudioSync] ? "yes" : "no")) + // A/V-SYNC // + // Enable VSYNC – needed for `video-sync` checkError(mpv_set_option_string(mpv, "opengl-swapinterval", "1")) checkError(mpv_set_option_string(mpv, "video-sync", "display-resample")) checkError(mpv_set_option_string(mpv, "interpolation", "yes")) checkError(mpv_set_option_string(mpv, "tscale", "mitchell")) checkError(mpv_set_option_string(mpv, "tscale-window", "blackman")) - checkError(mpv_set_option_string(mpv, "vd-lavc-framedrop", "nonref")) + checkError(mpv_set_option_string(mpv, "vd-lavc-framedrop", "no")) checkError(mpv_set_option_string(mpv, "display-fps-override", "\(String(getScreenRefreshRate()))")) + checkError(mpv_set_option_string(mpv, "video-sync-max-factor", "1.1")) + checkError(mpv_set_option_string(mpv, "video-sync-max-video-change", "10")) + checkError(mpv_set_option_string(mpv, "audio-buffer", "0.2")) + checkError(mpv_set_option_string(mpv, "audio-wait-open", "no")) + checkError(mpv_set_option_string(mpv, "force-window", "yes")) // CPU // diff --git a/Model/Player/PlayerModel.swift b/Model/Player/PlayerModel.swift index a39f4537..c1e79132 100644 --- a/Model/Player/PlayerModel.swift +++ b/Model/Player/PlayerModel.swift @@ -269,6 +269,15 @@ final class PlayerModel: ObservableObject { } #endif + DispatchQueue.global(qos: .userInteractive).async { [weak self] in + guard let self else { return } + + if !self.musicMode, self.activeBackend == .mpv { + self.mpvBackend.setVideoToAuto() + self.mpvBackend.controls.resetTimer() + } + } + presentingPlayer = true #if os(macOS) @@ -290,6 +299,9 @@ final class PlayerModel: ObservableObject { DispatchQueue.main.async { [weak self] in Delay.by(0.3) { self?.exitFullScreen(showControls: false) + if self?.activeBackend == .mpv, !(self?.musicMode ?? false) { + self?.mpvBackend.setVideoToNo() + } } } @@ -1013,10 +1025,9 @@ final class PlayerModel: ObservableObject { #else func handleEnterForeground() { DispatchQueue.global(qos: .userInteractive).async { [weak self] in - guard let self = self else { return } + guard let self else { return } - if !self.musicMode, self.activeBackend == .mpv { - self.mpvBackend.addVideoTrackFromStream() + if !self.musicMode, self.activeBackend == .mpv, presentingPlayer { self.mpvBackend.setVideoToAuto() self.mpvBackend.controls.resetTimer() } else if !self.musicMode, self.activeBackend == .appleAVPlayer { @@ -1047,7 +1058,7 @@ final class PlayerModel: ObservableObject { pause() } else if !playingInPictureInPicture, activeBackend == .appleAVPlayer { avPlayerBackend.removePlayerFromLayer() - } else if activeBackend == .mpv, !musicMode { + } else if activeBackend == .mpv, !musicMode, presentingPlayer { mpvBackend.setVideoToNo() } }