DEVELOPER_DIR=/Applications/Xcode.app/Contents/Developer xcodebuild -workspace Dreamio.xcworkspace -scheme Dreamio -configuration Debug -destination 'generic/platform=iOS Simulator' CODE_SIGNING_ALLOWED=NO build.NativePlayerViewController.Summary of changes: The startup loading overlay now waits for both VLC readiness and the initial subtitle batch completion before dismissing.
+Why this change was made: The device run showed VLC reporting ready during buffering before all 20 startup subtitle candidates had resolved and attached, so the previous background-loading change did not actually hold the visible startup/buffer flow through subtitle loading.
onReady overlay dismissal with finishStartupLoadingIfReady(reason:).Dreamio/NativePlayerViewController.swift · gate startup loading on captions
+11 unmodified lines1213141516272 unmodified lines28328428528628728828929029129229320 unmodified lines31531631731831932032832933033133233333433533611 unmodified linesprivate var audioMenuSignature: String?private var captionsMenuSignature: String?private var controlsMaximumWidthConstraint: NSLayoutConstraint?private let bottomScrimLayer = CAGradientLayer()var onDismiss: (() -> Void)?272 unmodified linesbackend.view.translatesAutoresizingMaskIntoConstraints = falsebackend.onReady = { [weak self] inDispatchQueue.main.async {self?.startupTimer?.invalidate()self?.loadingView.stopAnimating()self?.loadingContainer.isHidden = trueself?.startProgressUpdates()self?.refreshControls()self?.scheduleControlsHide()}}20 unmodified lines}+private func startPlayback() {loadingContainer.isHidden = falseloadingView.startAnimating()failureContainer.isHidden = truerevealControls()}+private func startCaptionLoadingInBackground() {let queuedCount = addSubtitleCandidates(request.subtitleCandidates)#if DEBUGprint("[DreamioNativePlayer] startup captions queued=\(queuedCount) total=\(request.subtitleCandidates.count) playbackAlreadyRequested=true")#endif}11 unmodified lines1213141516171819272 unmodified lines29329429529629729829920 unmodified lines32132232332432532632732832933733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037111 unmodified linesprivate var audioMenuSignature: String?private var captionsMenuSignature: String?private var controlsMaximumWidthConstraint: NSLayoutConstraint?private var isBackendReady = falseprivate var isLoadingStartupCaptions = falseprivate var hasCompletedStartupCaptions = falseprivate let bottomScrimLayer = CAGradientLayer()var onDismiss: (() -> Void)?272 unmodified linesbackend.view.translatesAutoresizingMaskIntoConstraints = falsebackend.onReady = { [weak self] inDispatchQueue.main.async {self?.isBackendReady = trueself?.finishStartupLoadingIfReady(reason: "backend-ready")}}20 unmodified lines}+private func startPlayback() {isBackendReady = falseisLoadingStartupCaptions = falsehasCompletedStartupCaptions = request.subtitleCandidates.isEmptyloadingContainer.isHidden = falseloadingView.startAnimating()failureContainer.isHidden = truerevealControls()}+private func startCaptionLoadingInBackground() {isLoadingStartupCaptions = trueloadingTextLabel.text = "Loading subtitles…"let queuedCount = enqueueSubtitleCandidates(request.subtitleCandidates) { [weak self] inguard let self else { return }self.isLoadingStartupCaptions = falseself.hasCompletedStartupCaptions = trueself.finishStartupLoadingIfReady(reason: "startup-captions-complete")}#if DEBUGprint("[DreamioNativePlayer] startup captions queued=\(queuedCount) total=\(request.subtitleCandidates.count) playbackAlreadyRequested=true")#endif}+private func finishStartupLoadingIfReady(reason: String) {guard isBackendReady, hasCompletedStartupCaptions else {#if DEBUGprint("[DreamioNativePlayer] startup loading waiting reason=\(reason) backendReady=\(isBackendReady) captionsComplete=\(hasCompletedStartupCaptions) loadingCaptions=\(isLoadingStartupCaptions)")#endifreturn}#if DEBUGprint("[DreamioNativePlayer] startup loading complete reason=\(reason)")#endifstartupTimer?.invalidate()loadingView.stopAnimating()loadingContainer.isHidden = trueloadingTextLabel.text = "Opening stream…"startProgressUpdates()refreshControls()scheduleControlsHide()}
+ Related issue: dreamio-e2q.
+