From 8fce0475a5fc4bde4b13d5d553e151e573708b26 Mon Sep 17 00:00:00 2001 From: Beingpax Date: Sun, 11 Jan 2026 09:14:52 +0545 Subject: [PATCH] Fix potential crashes and silent failures in audio recording: guard against division by zero in audio metering, check ExtAudioFileWrite return status, and safely unwrap downloads directory --- VoiceInk/CoreAudioRecorder.swift | 8 +++++++- VoiceInk/Services/LogExporter.swift | 4 +++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/VoiceInk/CoreAudioRecorder.swift b/VoiceInk/CoreAudioRecorder.swift index 489270d..8c30bcd 100644 --- a/VoiceInk/CoreAudioRecorder.swift +++ b/VoiceInk/CoreAudioRecorder.swift @@ -586,11 +586,14 @@ final class CoreAudioRecorder { private func calculateMeters(from bufferList: inout AudioBufferList, frameCount: UInt32) { guard let data = bufferList.mBuffers.mData else { return } + guard frameCount > 0 else { return } let samples = data.assumingMemoryBound(to: Float32.self) let channelCount = Int(deviceFormat.mChannelsPerFrame) let totalSamples = Int(frameCount) * channelCount + guard totalSamples > 0 else { return } + var sum: Float = 0.0 var peak: Float = 0.0 @@ -683,7 +686,10 @@ final class CoreAudioRecorder { ) ) - ExtAudioFileWrite(file, outputFrameCount, &outputBufferList) + let writeStatus = ExtAudioFileWrite(file, outputFrameCount, &outputBufferList) + if writeStatus != noErr { + logger.error("🎙️ ExtAudioFileWrite failed with status: \(writeStatus)") + } } // MARK: - Device Info Logging diff --git a/VoiceInk/Services/LogExporter.swift b/VoiceInk/Services/LogExporter.swift index a7ad266..6ca4bb1 100644 --- a/VoiceInk/Services/LogExporter.swift +++ b/VoiceInk/Services/LogExporter.swift @@ -101,7 +101,9 @@ final class LogExporter { let fileName = "VoiceInk_Logs_\(timestamp).log" // Get Downloads folder - let downloadsURL = FileManager.default.urls(for: .downloadsDirectory, in: .userDomainMask).first! + guard let downloadsURL = FileManager.default.urls(for: .downloadsDirectory, in: .userDomainMask).first else { + throw NSError(domain: "LogExporter", code: 1, userInfo: [NSLocalizedDescriptionKey: "Downloads directory unavailable"]) + } let fileURL = downloadsURL.appendingPathComponent(fileName) let content = logs.joined(separator: "\n")