Fix audio meter Task memory leak

This commit is contained in:
Beingpax 2025-08-29 17:26:07 +05:45
parent 85aa0905bd
commit c67fdeb73c

View File

@ -14,6 +14,7 @@ class Recorder: NSObject, ObservableObject, AVAudioRecorderDelegate {
private let playbackController = PlaybackController.shared private let playbackController = PlaybackController.shared
@Published var audioMeter = AudioMeter(averagePower: 0, peakPower: 0) @Published var audioMeter = AudioMeter(averagePower: 0, peakPower: 0)
private var audioLevelCheckTask: Task<Void, Never>? private var audioLevelCheckTask: Task<Void, Never>?
private var audioMeterUpdateTask: Task<Void, Never>?
private var hasDetectedAudioInCurrentSession = false private var hasDetectedAudioInCurrentSession = false
enum RecorderError: Error { enum RecorderError: Error {
@ -111,9 +112,10 @@ class Recorder: NSObject, ObservableObject, AVAudioRecorderDelegate {
} }
audioLevelCheckTask?.cancel() audioLevelCheckTask?.cancel()
audioMeterUpdateTask?.cancel()
Task { audioMeterUpdateTask = Task {
while recorder != nil { while recorder != nil && !Task.isCancelled {
updateAudioMeter() updateAudioMeter()
try? await Task.sleep(nanoseconds: 33_000_000) try? await Task.sleep(nanoseconds: 33_000_000)
} }
@ -149,6 +151,7 @@ class Recorder: NSObject, ObservableObject, AVAudioRecorderDelegate {
func stopRecording() { func stopRecording() {
audioLevelCheckTask?.cancel() audioLevelCheckTask?.cancel()
audioMeterUpdateTask?.cancel()
recorder?.stop() recorder?.stop()
recorder = nil recorder = nil
audioMeter = AudioMeter(averagePower: 0, peakPower: 0) audioMeter = AudioMeter(averagePower: 0, peakPower: 0)
@ -225,6 +228,8 @@ class Recorder: NSObject, ObservableObject, AVAudioRecorderDelegate {
} }
deinit { deinit {
audioLevelCheckTask?.cancel()
audioMeterUpdateTask?.cancel()
if let observer = deviceObserver { if let observer = deviceObserver {
NotificationCenter.default.removeObserver(observer) NotificationCenter.default.removeObserver(observer)
} }