spb/focale Public
Swift 100%
1//2// DeviceCapabilities.swift3// Focale4//5// Author: Simon-Pierre Boucher6// Contact: contact@spboucher.ai7//8// Every hardware capability is queried before a control is exposed9// (CLAUDE.md §4): no dead buttons, no assumptions about iPhone model.10//1112import Foundation1314/// Sendable snapshot of what the active capture device supports.15struct DeviceCapabilities: Sendable {16 var availableLenses: [LensKind]17 var supportsProRAW: Bool18 var isoRange: ClosedRange<Float>19 var shutterRange: ClosedRange<Double> // seconds20 var exposureBiasRange: ClosedRange<Float> // EV21 var maxWhiteBalanceGain: Float22 var maxZoomFactor: Double23 var supportsManualFocus: Bool24 var hasDepthCapture: Bool // LiDAR / depth for SceneSignal25 var hasFlash: Bool2627 static let none = DeviceCapabilities(28 availableLenses: [],29 supportsProRAW: false,30 isoRange: 100...100,31 shutterRange: 0.008...0.008,32 exposureBiasRange: 0...0,33 maxWhiteBalanceGain: 1,34 maxZoomFactor: 1,35 supportsManualFocus: false,36 hasDepthCapture: false,37 hasFlash: false38 )3940 func supports(_ control: CaptureControl) -> Bool {41 switch control {42 case .iso: isoRange.lowerBound < isoRange.upperBound43 case .shutterSpeed: shutterRange.lowerBound < shutterRange.upperBound44 case .exposureBias: exposureBiasRange.lowerBound < exposureBiasRange.upperBound45 case .focus: supportsManualFocus46 case .whiteBalance: maxWhiteBalanceGain > 147 case .zoom: maxZoomFactor > 148 }49 }50}51