AVPlayer misreads the duration of some fragmented MP4 streams (it reports
double the real length, leaving the second half silent and never ending the
track). Playback on iOS now goes through VLCKit 4, added as a Swift package
pinned to videolan/vlckit@6b87735.
- NativePlayerEngine (iosMain): single-media engine contract that Swift
implements and registers at launch; VLCKit ships as an SPM binary target,
so it can't be bound with cinterop from Gradle.
- AudioPlayer.ios.kt: rewritten on the engine. Playlist, loop modes, shuffle
and auto-advance live in Kotlin, mirroring the JVM player (the old iOS
player never advanced to the next track).
- VlcPlayerEngine.swift: VLCKit-backed engine. VLCKit 4 has no "ended" state,
so natural ends are told apart from requested stops; after a pause/resume
it stops reporting time, so a no-op seek restores position updates.