Fix audio meter Task memory leak
This commit is contained in:
parent
85aa0905bd
commit
c67fdeb73c
@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user