55 lines
1.5 KiB
Swift
55 lines
1.5 KiB
Swift
|
//
|
||
|
// WrappedCaptureDevice.swift
|
||
|
// secant-testnet
|
||
|
//
|
||
|
// Created by Lukáš Korba on 17.05.2022.
|
||
|
//
|
||
|
|
||
|
import Foundation
|
||
|
import AVFoundation
|
||
|
|
||
|
struct WrappedCaptureDevice {
|
||
|
enum WrappedCaptureDeviceError: Error {
|
||
|
case captureDeviceFailed
|
||
|
case lockFailed
|
||
|
case torchUnavailable
|
||
|
}
|
||
|
|
||
|
let isTorchAvailable: () throws -> Bool
|
||
|
let torch: (Bool) throws -> Void
|
||
|
}
|
||
|
|
||
|
extension WrappedCaptureDevice {
|
||
|
static let real = WrappedCaptureDevice(
|
||
|
isTorchAvailable: {
|
||
|
guard let videoCaptureDevice = AVCaptureDevice.default(for: .video) else {
|
||
|
throw WrappedCaptureDeviceError.captureDeviceFailed
|
||
|
}
|
||
|
|
||
|
return videoCaptureDevice.hasTorch
|
||
|
},
|
||
|
torch: { isTorchOn in
|
||
|
guard let videoCaptureDevice = AVCaptureDevice.default(for: .video) else {
|
||
|
throw WrappedCaptureDeviceError.captureDeviceFailed
|
||
|
}
|
||
|
|
||
|
guard videoCaptureDevice.hasTorch else {
|
||
|
throw WrappedCaptureDeviceError.torchUnavailable
|
||
|
}
|
||
|
|
||
|
do {
|
||
|
try videoCaptureDevice.lockForConfiguration()
|
||
|
videoCaptureDevice.torchMode = isTorchOn ? .on : .off
|
||
|
videoCaptureDevice.unlockForConfiguration()
|
||
|
} catch {
|
||
|
throw WrappedCaptureDeviceError.lockFailed
|
||
|
}
|
||
|
}
|
||
|
)
|
||
|
|
||
|
static let none = WrappedCaptureDevice(
|
||
|
isTorchAvailable: { false },
|
||
|
torch: { _ in }
|
||
|
)
|
||
|
}
|