From 1ab91ad4ef5c55e8247bf1899026f04bcf2c60f7 Mon Sep 17 00:00:00 2001 From: Beingpax Date: Thu, 4 Dec 2025 21:12:30 +0545 Subject: [PATCH] Add audio input device selection option in menu bar --- VoiceInk/Views/MenuBarView.swift | 50 ++++++++++++++++++++------------ 1 file changed, 32 insertions(+), 18 deletions(-) diff --git a/VoiceInk/Views/MenuBarView.swift b/VoiceInk/Views/MenuBarView.swift index bf7543d..38c8245 100644 --- a/VoiceInk/Views/MenuBarView.swift +++ b/VoiceInk/Views/MenuBarView.swift @@ -8,6 +8,7 @@ struct MenuBarView: View { @EnvironmentObject var updaterViewModel: UpdaterViewModel @EnvironmentObject var enhancementService: AIEnhancementService @EnvironmentObject var aiService: AIService + @ObservedObject var audioDeviceManager = AudioDeviceManager.shared @State private var launchAtLoginEnabled = LaunchAtLogin.isEnabled @State private var menuRefreshTrigger = false // Added to force menu updates @State private var isHovered = false @@ -70,7 +71,6 @@ struct MenuBarView: View { .font(.system(size: 10)) } } - .disabled(!enhancementService.isEnhancementEnabled) Menu { ForEach(aiService.connectedProviders, id: \.self) { provider in @@ -85,17 +85,11 @@ struct MenuBarView: View { } } } - + if aiService.connectedProviders.isEmpty { Text("No providers connected") .foregroundColor(.secondary) } - - Divider() - - Button("Manage AI Providers") { - menuBarManager.openMainWindowAndNavigate(to: "Enhancement") - } } label: { HStack { Text("AI Provider: \(aiService.selectedProvider.rawValue)") @@ -103,7 +97,6 @@ struct MenuBarView: View { .font(.system(size: 10)) } } - .disabled(!enhancementService.isEnhancementEnabled) Menu { ForEach(aiService.availableModels, id: \.self) { model in @@ -118,17 +111,11 @@ struct MenuBarView: View { } } } - + if aiService.availableModels.isEmpty { Text("No models available") .foregroundColor(.secondary) } - - Divider() - - Button("Manage AI Models") { - menuBarManager.openMainWindowAndNavigate(to: "Enhancement") - } } label: { HStack { Text("AI Model: \(aiService.currentModel)") @@ -136,10 +123,37 @@ struct MenuBarView: View { .font(.system(size: 10)) } } - .disabled(!enhancementService.isEnhancementEnabled) LanguageSelectionView(whisperState: whisperState, displayMode: .menuItem, whisperPrompt: whisperState.whisperPrompt) - + + Menu { + ForEach(audioDeviceManager.availableDevices, id: \.id) { device in + Button { + // Switch to Custom mode and select this device + audioDeviceManager.inputMode = .custom + audioDeviceManager.selectDevice(id: device.id) + } label: { + HStack { + Text(device.name) + if audioDeviceManager.getCurrentDevice() == device.id { + Image(systemName: "checkmark") + } + } + } + } + + if audioDeviceManager.availableDevices.isEmpty { + Text("No devices available") + .foregroundColor(.secondary) + } + } label: { + HStack { + Text("Audio Input") + Image(systemName: "chevron.up.chevron.down") + .font(.system(size: 10)) + } + } + Menu("Additional") { Button { enhancementService.useClipboardContext.toggle()