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