From 9c02fa2e723a7d7ee0d1b7720f9ccca6ad5696e0 Mon Sep 17 00:00:00 2001 From: Alex Kim Date: Sat, 7 Dec 2024 23:04:21 +1100 Subject: [PATCH] Refactored perfomance change for IOS --- modules/vlc-player/ios/VlcPlayerModule.swift | 4 +-- modules/vlc-player/ios/VlcPlayerView.swift | 35 ++++++++++---------- 2 files changed, 18 insertions(+), 21 deletions(-) diff --git a/modules/vlc-player/ios/VlcPlayerModule.swift b/modules/vlc-player/ios/VlcPlayerModule.swift index 131f4ebf..64d6cad5 100644 --- a/modules/vlc-player/ios/VlcPlayerModule.swift +++ b/modules/vlc-player/ios/VlcPlayerModule.swift @@ -5,9 +5,7 @@ public class VlcPlayerModule: Module { Name("VlcPlayer") View(VlcPlayerView.self) { Prop("source") { (view: VlcPlayerView, source: [String: Any]) in - if !view.hasSource { - view.setSource(source) - } + view.setSource(source) } Prop("paused") { (view: VlcPlayerView, paused: Bool) in diff --git a/modules/vlc-player/ios/VlcPlayerView.swift b/modules/vlc-player/ios/VlcPlayerView.swift index 8feec050..a5a0835d 100644 --- a/modules/vlc-player/ios/VlcPlayerView.swift +++ b/modules/vlc-player/ios/VlcPlayerView.swift @@ -16,6 +16,7 @@ class VlcPlayerView: ExpoView { private var externalTrack: [String: String]? private var progressTimer: DispatchSourceTimer? private var isStopping: Bool = false // Define isStopping here + private var lastProgressCall = Date().timeIntervalSince1970 var hasSource = false // MARK: - Initialization @@ -24,7 +25,6 @@ class VlcPlayerView: ExpoView { super.init(appContext: appContext) setupView() setupNotifications() - setupProgressTimer() } // MARK: - Setup @@ -56,15 +56,6 @@ class VlcPlayerView: ExpoView { name: UIApplication.didBecomeActiveNotification, object: nil) } - private func setupProgressTimer() { - progressTimer = DispatchSource.makeTimerSource(queue: DispatchQueue.main) - progressTimer?.schedule(deadline: .now(), repeating: progressUpdateInterval) - progressTimer?.setEventHandler { [weak self] in - self?.updateVideoProgress() - } - progressTimer?.resume() - } - // MARK: - Public Methods @objc func play() { @@ -88,7 +79,7 @@ class VlcPlayerView: ExpoView { let wasPlaying = player.isPlaying if wasPlaying { - player.pause() + self.pause() } if let duration = player.media?.length.intValue { @@ -101,7 +92,7 @@ class VlcPlayerView: ExpoView { // Wait for a short moment to ensure the seek has been processed DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { if wasPlaying { - player.play() + self.play() } self.updatePlayerState() } @@ -114,6 +105,9 @@ class VlcPlayerView: ExpoView { @objc func setSource(_ source: [String: Any]) { DispatchQueue.main.async { [weak self] in guard let self = self else { return } + if self.hasSource { + return + } let mediaOptions = source["mediaOptions"] as? [String: Any] ?? [:] self.externalTrack = source["externalTrack"] as? [String: String] @@ -158,7 +152,7 @@ class VlcPlayerView: ExpoView { self.setSubtitleTrack(subtitleTrackIndex) self.mediaPlayer?.media = media - hasSource = true + self.hasSource = true if autoplay { print("Playing...") @@ -314,6 +308,7 @@ class VlcPlayerView: ExpoView { let currentTimeMs = player.time.intValue let durationMs = player.media?.length.intValue ?? 0 + print("Debug: Current time: \(currentTimeMs)") if currentTimeMs >= 0 && currentTimeMs < durationMs { if player.isPlaying && !self.isMediaReady { self.isMediaReady = true @@ -345,11 +340,19 @@ class VlcPlayerView: ExpoView { deinit { performStop() - progressTimer?.cancel() } } extension VlcPlayerView: VLCMediaPlayerDelegate { + func mediaPlayerTimeChanged(_ aNotification: Notification) { + // self?.updateVideoProgress() + let timeNow = Date().timeIntervalSince1970 + if timeNow - lastProgressCall >= 1 { + lastProgressCall = timeNow + updateVideoProgress() + } + } + func mediaPlayerStateChanged(_ aNotification: Notification) { self.updatePlayerState() } @@ -395,10 +398,6 @@ extension VlcPlayerView: VLCMediaPlayerDelegate { } } - - func mediaPlayerTimeChanged(_ aNotification: Notification) { - // No need to call updateVideoProgress here as it's handled by the timer - } } extension VlcPlayerView: VLCMediaDelegate {