diff --git a/VoiceInk.xcodeproj/project.pbxproj b/VoiceInk.xcodeproj/project.pbxproj index d9a306e..9d0882b 100644 --- a/VoiceInk.xcodeproj/project.pbxproj +++ b/VoiceInk.xcodeproj/project.pbxproj @@ -7,8 +7,8 @@ objects = { /* Begin PBXBuildFile section */ - E1362A1D2DF893B600E86C6E /* whisper.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = E136D0102DA3EE57000E1E8A /* whisper.xcframework */; }; - E1362A1E2DF893B600E86C6E /* whisper.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = E136D0102DA3EE57000E1E8A /* whisper.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + E131EA9E2DFEF894009E79D8 /* whisper.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = E11CB51D2DB1F8AF00F9F3ED /* whisper.xcframework */; }; + E131EA9F2DFEF894009E79D8 /* whisper.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = E11CB51D2DB1F8AF00F9F3ED /* whisper.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; E1A261122CC143AC00B233D1 /* KeyboardShortcuts in Frameworks */ = {isa = PBXBuildFile; productRef = E1A261112CC143AC00B233D1 /* KeyboardShortcuts */; }; E1ADD45A2CC5352A00303ECB /* LaunchAtLogin in Frameworks */ = {isa = PBXBuildFile; productRef = E1ADD4592CC5352A00303ECB /* LaunchAtLogin */; }; E1ADD45F2CC544F100303ECB /* Sparkle in Frameworks */ = {isa = PBXBuildFile; productRef = E1ADD45E2CC544F100303ECB /* Sparkle */; }; @@ -33,13 +33,13 @@ /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ - E1362A1F2DF893B600E86C6E /* Embed Frameworks */ = { + E131EAA02DFEF894009E79D8 /* Embed Frameworks */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; dstPath = ""; dstSubfolderSpec = 10; files = ( - E1362A1E2DF893B600E86C6E /* whisper.xcframework in Embed Frameworks */, + E131EA9F2DFEF894009E79D8 /* whisper.xcframework in Embed Frameworks */, ); name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; @@ -80,7 +80,7 @@ E1ADD45A2CC5352A00303ECB /* LaunchAtLogin in Frameworks */, E1ADD45F2CC544F100303ECB /* Sparkle in Frameworks */, E1A261122CC143AC00B233D1 /* KeyboardShortcuts in Frameworks */, - E1362A1D2DF893B600E86C6E /* whisper.xcframework in Frameworks */, + E131EA9E2DFEF894009E79D8 /* whisper.xcframework in Frameworks */, E1F5FA7A2DA6CBF900B1FD8A /* Zip in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -142,7 +142,7 @@ E11473AC2CBE0F0A00318EE4 /* Sources */, E11473AD2CBE0F0A00318EE4 /* Frameworks */, E11473AE2CBE0F0A00318EE4 /* Resources */, - E1362A1F2DF893B600E86C6E /* Embed Frameworks */, + E131EAA02DFEF894009E79D8 /* Embed Frameworks */, ); buildRules = ( ); diff --git a/VoiceInk/Services/AudioDeviceManager.swift b/VoiceInk/Services/AudioDeviceManager.swift index 6127f2b..e9715c3 100644 --- a/VoiceInk/Services/AudioDeviceManager.swift +++ b/VoiceInk/Services/AudioDeviceManager.swift @@ -86,8 +86,13 @@ class AudioDeviceManager: ObservableObject { } private func fallbackToDefaultDevice() { - selectInputMode(.systemDefault) - logger.info("Switched to system default audio input mode due to fallback.") + logger.info("Temporarily falling back to system default input device – user preference remains intact.") + + if let currentID = selectedDeviceID, !isDeviceAvailable(currentID) { + selectedDeviceID = nil + } + + notifyDeviceChange() } func loadAvailableDevices(completion: (() -> Void)? = nil) { @@ -244,7 +249,11 @@ class AudioDeviceManager: ObservableObject { case .systemDefault: return fallbackDeviceID ?? 0 case .custom: - return selectedDeviceID ?? fallbackDeviceID ?? 0 + if let id = selectedDeviceID, isDeviceAvailable(id) { + return id + } else { + return fallbackDeviceID ?? 0 + } case .prioritized: let sortedDevices = prioritizedDevices.sorted { $0.priority < $1.priority } for device in sortedDevices {