diff --git a/Sources/SwiftVLC/Player/Player.swift b/Sources/SwiftVLC/Player/Player.swift index b545d46f..ab64b12e 100644 --- a/Sources/SwiftVLC/Player/Player.swift +++ b/Sources/SwiftVLC/Player/Player.swift @@ -972,7 +972,13 @@ public final class Player { // MARK: - Track Refresh - func refreshTracks() { + /// Refreshes all observable track lists from the native player. + /// + /// The track arrays are asynchronously mirrored snapshots. Receiving the payload-free + /// ``PlayerEvent/tracksChanged`` or ``PlayerEvent/mediaChanged`` event does not guarantee + /// they are updated; consumers requiring an immediate native read should call this + /// method after either event. This also invalidates selected-track observations. + public func refreshTracks() { audioTracks = fetchTracks(type: .audio) videoTracks = fetchTracks(type: .video) subtitleTracks = fetchTracks(type: .subtitle) diff --git a/Tests/SwiftVLCTests/Player/PlayerPublicTrackRefreshTests.swift b/Tests/SwiftVLCTests/Player/PlayerPublicTrackRefreshTests.swift new file mode 100644 index 00000000..73794535 --- /dev/null +++ b/Tests/SwiftVLCTests/Player/PlayerPublicTrackRefreshTests.swift @@ -0,0 +1,16 @@ +import SwiftVLC +import Testing + +@Suite(.tags(.mainActor)) +@MainActor struct PlayerPublicTrackRefreshTests { + @Test + func `refreshTracks without media leaves public track lists empty`() { + let player = Player() + + player.refreshTracks() + + #expect(player.audioTracks.isEmpty) + #expect(player.videoTracks.isEmpty) + #expect(player.subtitleTracks.isEmpty) + } +}