From e0ff03358134c559f594dd4281d1064cfd9ad791 Mon Sep 17 00:00:00 2001 From: Beingpax Date: Sun, 22 Jun 2025 11:38:17 +0545 Subject: [PATCH] Add no audio detection warning --- VoiceInk/Recorder.swift | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/VoiceInk/Recorder.swift b/VoiceInk/Recorder.swift index 30c1ad4..efecca6 100644 --- a/VoiceInk/Recorder.swift +++ b/VoiceInk/Recorder.swift @@ -12,6 +12,8 @@ class Recorder: ObservableObject { private var isReconfiguring = false private let mediaController = MediaController.shared @Published var audioMeter = AudioMeter(averagePower: 0, peakPower: 0) + private var audioLevelCheckTask: Task? + private var hasDetectedAudioInCurrentSession = false enum RecorderError: Error { case couldNotStartRecording @@ -78,6 +80,8 @@ class Recorder: ObservableObject { } UserDefaults.standard.set(String(currentDeviceID), forKey: "lastUsedMicrophoneDeviceID") + hasDetectedAudioInCurrentSession = false + Task { await mediaController.muteSystemAudio() } @@ -112,6 +116,8 @@ class Recorder: ObservableObject { throw RecorderError.couldNotStartRecording } + audioLevelCheckTask?.cancel() + Task { while recorder != nil { updateAudioMeter() @@ -119,6 +125,22 @@ class Recorder: ObservableObject { } } + audioLevelCheckTask = Task { + try? await Task.sleep(nanoseconds: 5_000_000_000) + + if Task.isCancelled { return } + + if !self.hasDetectedAudioInCurrentSession { + await MainActor.run { + NotificationManager.shared.showNotification( + title: "No Audio Detected", + message: "Is your microphone muted? Please check your audio input settings.", + type: .warning + ) + } + } + } + } catch { logger.error("Failed to create audio recorder: \(error.localizedDescription)") stopRecording() @@ -127,6 +149,7 @@ class Recorder: ObservableObject { } func stopRecording() { + audioLevelCheckTask?.cancel() recorder?.stop() recorder = nil audioMeter = AudioMeter(averagePower: 0, peakPower: 0) @@ -164,7 +187,13 @@ class Recorder: ObservableObject { normalizedPeak = (peakPower - minVisibleDb) / (maxVisibleDb - minVisibleDb) } - audioMeter = AudioMeter(averagePower: Double(normalizedAverage), peakPower: Double(normalizedPeak)) + let newAudioMeter = AudioMeter(averagePower: Double(normalizedAverage), peakPower: Double(normalizedPeak)) + + if !hasDetectedAudioInCurrentSession && newAudioMeter.averagePower > 0.01 { + hasDetectedAudioInCurrentSession = true + } + + audioMeter = newAudioMeter } deinit {