feat: add camera selector for mirror mode and fix hover glitch

This commit is contained in:
NekomiRyan 2026-04-09 13:48:11 -04:00 • committed by Hariharan Mudaliar
commit edd8ecc3bb
No known key found for this signature in database
GPG key ID: 025583EB0BE5640E
4 changed files with 64 additions and 8 deletions

View file

@ -22,6 +22,7 @@
import AVFoundation
import SwiftUI
import Defaults
class WebcamManager: NSObject, ObservableObject {
static let shared = WebcamManager()
@ -51,6 +52,12 @@ class WebcamManager: NSObject, ObservableObject {
}
}
@Published var availableCameras: [AVCaptureDevice] = [] {
didSet {
objectWillChange.send()
}
}
private let sessionQueue = DispatchQueue(label: "DynamicIsland.WebcamManager.SessionQueue", qos: .userInitiated)
private var isCleaningUp: Bool = false
@ -132,7 +139,7 @@ class WebcamManager: NSObject, ObservableObject {
/// Checks if any camera devices are available and sets up capture session if needed
func checkCameraAvailability() {
let availableDevices = AVCaptureDevice.DiscoverySession(
deviceTypes: [.external, .builtInWideAngleCamera],
deviceTypes: [.external, .builtInWideAngleCamera, .deskViewCamera, .externalUnknown],
mediaType: .video,
position: .unspecified
).devices
@ -140,6 +147,7 @@ class WebcamManager: NSObject, ObservableObject {
let hasAvailableDevices = !availableDevices.isEmpty
DispatchQueue.main.async {
self.availableCameras = availableDevices
self.cameraAvailable = hasAvailableDevices
}
}
@ -158,14 +166,24 @@ class WebcamManager: NSObject, ObservableObject {
let session = AVCaptureSession()
do {
// Get available devices and prefer external camera if available
// Get available devices
let discoverySession = AVCaptureDevice.DiscoverySession(
deviceTypes: [.external, .builtInWideAngleCamera],
deviceTypes: [.external, .builtInWideAngleCamera, .deskViewCamera, .externalUnknown],
mediaType: .video,
position: .unspecified
)
guard let videoDevice = discoverySession.devices.first else {
let devices = discoverySession.devices
let selectedID = Defaults[.selectedCameraID]
let videoDevice: AVCaptureDevice?
if !selectedID.isEmpty {
videoDevice = devices.first(where: { $0.uniqueID == selectedID }) ?? devices.first
} else {
videoDevice = devices.first
}
guard let videoDevice = videoDevice else {
NSLog("No video devices available")
DispatchQueue.main.async {
self.isSessionRunning = false
@ -175,7 +193,7 @@ class WebcamManager: NSObject, ObservableObject {
return
}
NSLog("Using camera: \(videoDevice.localizedName)")
NSLog("Using camera: \(videoDevice.localizedName) (ID: \(videoDevice.uniqueID))")
// Lock device for configuration
try videoDevice.lockForConfiguration()