Skip to content

Commit c3b97bf

Browse files
committed
use GCD after async to schedule updating wave view for playing
1 parent 90b2d08 commit c3b97bf

File tree

1 file changed

+13
-6
lines changed

1 file changed

+13
-6
lines changed

Sources/ChatGPTUI/ViewModels/VoiceChatViewModel.swift

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -158,12 +158,9 @@ open class VoiceChatViewModel<CustomContent: View>: NSObject, AVAudioRecorderDel
158158
audioPlayer.delegate = self
159159
audioPlayer.play()
160160

161-
animationTimer = Timer.scheduledTimer(withTimeInterval: 0.2, repeats: true, block: { [unowned self]_ in
162-
guard self.audioPlayer != nil else { return }
163-
self.audioPlayer.updateMeters()
164-
let power = min(1, max(0, 1 - abs(Double(self.audioPlayer.averagePower(forChannel: 0)) / 160) ))
165-
self.audioPower = power
166-
})
161+
// Scheduled timer interval cause wave view to not updated when scrolling as audio plays
162+
// Use GCD after with recursion until further cleaner solution can be found
163+
self.scheduleAudioPlayerPowerUpdate()
167164
}
168165

169166
open func cancelRecording() {
@@ -196,6 +193,16 @@ open class VoiceChatViewModel<CustomContent: View>: NSObject, AVAudioRecorderDel
196193
}
197194
}
198195

196+
func scheduleAudioPlayerPowerUpdate() {
197+
DispatchQueue.main.asyncAfter(deadline: .now() + 0.2) {
198+
guard let audioPlayer = self.audioPlayer else { return }
199+
audioPlayer.updateMeters()
200+
let power = min(1, max(0, 1 - abs(Double(audioPlayer.averagePower(forChannel: 0)) / 160) ))
201+
self.audioPower = power
202+
self.scheduleAudioPlayerPowerUpdate()
203+
}
204+
}
205+
199206
open func resetValues() {
200207
audioPower = 0
201208
prevAudioPower = nil

0 commit comments

Comments
 (0)