import MusubiCore import NDIKit import Observation @MainActor @Observable final class SourceListModel { enum State { case idle, searching, unavailable } private(set) var sources: [Source] = [] private(set) var state: State = .idle private var finder: NDIFinder? func start() { guard state == .idle else { return } guard NDI.initialize() else { Log.ndi.error("NDI initialization failed (unsupported CPU)") state = .unavailable return } Log.ndi.info("NDI \(NDI.version, privacy: .public)") guard let finder = NDIFinder() else { Log.ndi.error("Could not create NDI finder") state = .unavailable return } self.finder = finder state = .searching Task { [weak self] in for await list in finder.sources { Log.ndi.info("Sources: \(list.map(\.ndiName), privacy: .public)") self?.sources = list.sorted { $0.ndiName.localizedStandardCompare($1.ndiName) == .orderedAscending } } } } }