Add no audio detection warning

This commit is contained in:
Beingpax 2025-06-22 11:38:17 +05:45
parent 60838c7ad9
commit e0ff033581

View File

@ -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<Void, Never>?
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 {