From 99caae07c75f4db6ad08d6defeff036ac6867be5 Mon Sep 17 00:00:00 2001 From: godly-devotion Date: Wed, 8 May 2024 23:14:46 -0400 Subject: [PATCH] refactor: pause playback before going forwards or backwards to improve seek performance --- Front Row/Support/PlayEngine.swift | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/Front Row/Support/PlayEngine.swift b/Front Row/Support/PlayEngine.swift index 3ec10a3..95b6b7d 100644 --- a/Front Row/Support/PlayEngine.swift +++ b/Front Row/Support/PlayEngine.swift @@ -58,6 +58,8 @@ import SwiftUI private(set) var timeRemaining: TimeInterval = 0.0 + private var wasPausedBeforeSeeking = false + var playbackSpeed: Float { get { access(keyPath: \.playbackSpeed) @@ -297,21 +299,31 @@ import SwiftUI func goForwards() async { guard isLoaded else { return } + /// If needed pause playback to improve seek performance + pausePlaybackIfNeeded() + let time = CMTimeAdd( player.currentTime(), CMTimeMakeWithSeconds(Double(skipInterval), preferredTimescale: 1) ) await player.seek(to: time, toleranceBefore: .zero, toleranceAfter: .zero) + + resumePlaybackIfNeeded() } func goBackwards() async { guard isLoaded else { return } + /// If needed pause playback to improve seek performance + pausePlaybackIfNeeded() + let time = CMTimeSubtract( player.currentTime(), CMTimeMakeWithSeconds(Double(skipInterval), preferredTimescale: 1) ) await player.seek(to: time, toleranceBefore: .zero, toleranceAfter: .zero) + + resumePlaybackIfNeeded() } func goToTime(_ timecode: Double) async { @@ -383,6 +395,18 @@ import SwiftUI window.aspectRatio = videoSize } + private func pausePlaybackIfNeeded() { + guard player.rate != 0 else { return } + wasPausedBeforeSeeking = true + player.rate = 0 + } + + private func resumePlaybackIfNeeded() { + guard wasPausedBeforeSeeking else { return } + player.rate = player.defaultRate + wasPausedBeforeSeeking = false + } + private func selectTrack(_ option: AVMediaSelectionOption?, in group: AVMediaSelectionGroup) { guard let item = player.currentItem else { return } item.select(option, in: group)