54 lines
1.8 KiB
Swift
54 lines
1.8 KiB
Swift
//
|
|
// CaptureDeviceLiveKey.swift
|
|
// Zashi
|
|
//
|
|
// Created by Lukáš Korba on 11.11.2022.
|
|
//
|
|
|
|
import AVFoundation
|
|
import ComposableArchitecture
|
|
|
|
extension CaptureDeviceClient: DependencyKey {
|
|
public static let liveValue = Self(
|
|
isAuthorized: {
|
|
AVCaptureDevice.authorizationStatus(for: .video) == .authorized
|
|
},
|
|
isTorchAvailable: {
|
|
guard let videoCaptureDevice = AVCaptureDevice.default(for: .video) else {
|
|
return false
|
|
}
|
|
|
|
return videoCaptureDevice.hasTorch
|
|
},
|
|
torch: { isTorchOn in
|
|
var device: AVCaptureDevice?
|
|
|
|
if #available(iOS 17, *) {
|
|
device = AVCaptureDevice.userPreferredCamera
|
|
} else {
|
|
let deviceDiscoverySession = AVCaptureDevice.DiscoverySession(deviceTypes: [.builtInTripleCamera, .builtInDualWideCamera, .builtInUltraWideCamera, .builtInWideAngleCamera, .builtInTrueDepthCamera], mediaType: AVMediaType.video, position: .back)
|
|
device = deviceDiscoverySession.devices.first
|
|
}
|
|
guard let device else {
|
|
throw CaptureDeviceClientError.captureDevice
|
|
}
|
|
|
|
if device.hasTorch && device.isTorchAvailable {
|
|
do {
|
|
try device.lockForConfiguration()
|
|
if isTorchOn {
|
|
try device.setTorchModeOn(level: 1.0)
|
|
} else {
|
|
device.torchMode = .off
|
|
}
|
|
device.unlockForConfiguration()
|
|
} catch {
|
|
throw CaptureDeviceClientError.lockForConfiguration
|
|
}
|
|
} else {
|
|
throw CaptureDeviceClientError.torchUnavailable
|
|
}
|
|
}
|
|
)
|
|
}
|