fix: debounce updates when seeking

This commit is contained in:
Fredrik Burmester
2024-10-11 22:20:17 +02:00
parent be867a3b10
commit cab5693ced

View File

@@ -9,6 +9,8 @@ class VlcPlayerView: ExpoView {
private var progressUpdateInterval: TimeInterval = 0.5 private var progressUpdateInterval: TimeInterval = 0.5
private var isPaused: Bool = false private var isPaused: Bool = false
private var currentGeometryCString: [CChar]? private var currentGeometryCString: [CChar]?
private var stateUpdateTimer: Timer?
private var lastReportedState: VLCMediaPlayerState?
// MARK: - Initialization // MARK: - Initialization
@@ -324,16 +326,34 @@ class VlcPlayerView: ExpoView {
// MARK: - Deinitialization // MARK: - Deinitialization
deinit { deinit {
stateUpdateTimer?.invalidate()
release() release()
} }
} }
extension VlcPlayerView: VLCMediaPlayerDelegate { extension VlcPlayerView: VLCMediaPlayerDelegate {
func mediaPlayerStateChanged(_ aNotification: Notification) { func mediaPlayerStateChanged(_ aNotification: Notification) {
guard let player = self.mediaPlayer else { return }
let currentState = player.state
// If the state hasn't changed, don't do anything
guard currentState != lastReportedState else { return }
// Cancel any pending state update
stateUpdateTimer?.invalidate()
// Schedule a new state update
stateUpdateTimer = Timer.scheduledTimer(withTimeInterval: 0.1, repeats: false) {
[weak self] _ in
self?.reportStateChange(currentState)
}
}
private func reportStateChange(_ state: VLCMediaPlayerState) {
DispatchQueue.main.async { DispatchQueue.main.async {
guard let player = self.mediaPlayer else { return } guard let player = self.mediaPlayer else { return }
let state = player.state
var stateInfo: [String: Any] = [ var stateInfo: [String: Any] = [
"target": self.reactTag ?? NSNull(), "target": self.reactTag ?? NSNull(),
"currentTime": player.time.intValue, "currentTime": player.time.intValue,
@@ -350,8 +370,6 @@ extension VlcPlayerView: VLCMediaPlayerDelegate {
stateInfo["type"] = "Stopped" stateInfo["type"] = "Stopped"
case .buffering: case .buffering:
if player.isPlaying { if player.isPlaying {
// If the player is actually playing while in buffering state,
// we'll report it as "Playing"
self.isPaused = false self.isPaused = false
stateInfo["type"] = "Playing" stateInfo["type"] = "Playing"
} else { } else {
@@ -373,6 +391,7 @@ extension VlcPlayerView: VLCMediaPlayerDelegate {
stateInfo["type"] = "Unknown" stateInfo["type"] = "Unknown"
} }
self.lastReportedState = state
self.onVideoStateChange?(stateInfo) self.onVideoStateChange?(stateInfo)
} }
} }
@@ -411,3 +430,19 @@ extension VlcPlayerView: VLCMediaDelegate {
} }
} }
} }
extension VLCMediaPlayerState {
var description: String {
switch self {
case .opening: return "Opening"
case .buffering: return "Buffering"
case .playing: return "Playing"
case .paused: return "Paused"
case .stopped: return "Stopped"
case .ended: return "Ended"
case .error: return "Error"
case .esAdded: return "ESAdded"
@unknown default: return "Unknown"
}
}
}