From 3e31e727343fd52820994d5d9a7fe18427dd0848 Mon Sep 17 00:00:00 2001 From: ronaldheft Date: Thu, 25 Aug 2022 18:31:09 -0400 Subject: [PATCH] Configure time observer on the main queue --- ios/App/Shared/player/AudioPlayer.swift | 31 ++++++++++++++----------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/ios/App/Shared/player/AudioPlayer.swift b/ios/App/Shared/player/AudioPlayer.swift index b002b3ad..77f4dbce 100644 --- a/ios/App/Shared/player/AudioPlayer.swift +++ b/ios/App/Shared/player/AudioPlayer.swift @@ -137,21 +137,24 @@ class AudioPlayer: NSObject { } private func setupTimeObserver() { - removeTimeObserver() - - let timeScale = CMTimeScale(NSEC_PER_SEC) - // Rate will be different depending on playback speed, aim for 2 observations/sec - let seconds = 0.5 * (self.rate > 0 ? self.rate : 1.0) - let time = CMTime(seconds: Double(seconds), preferredTimescale: timeScale) - self.timeObserverToken = self.audioPlayer.addPeriodicTimeObserver(forInterval: time, queue: queue) { [weak self] time in - Task { - // Let the player update the current playback positions - await PlayerProgress.shared.syncFromPlayer(currentTime: time.seconds, includesPlayProgress: true, isStopping: false) - } + // Time observer should be configured on the main queue + DispatchQueue.main.sync { + self.removeTimeObserver() - // Update the sleep time, if set - if self?.sleepTimeStopAt != nil { - NotificationCenter.default.post(name: NSNotification.Name(PlayerEvents.sleepSet.rawValue), object: nil) + let timeScale = CMTimeScale(NSEC_PER_SEC) + // Rate will be different depending on playback speed, aim for 2 observations/sec + let seconds = 0.5 * (self.rate > 0 ? self.rate : 1.0) + let time = CMTime(seconds: Double(seconds), preferredTimescale: timeScale) + self.timeObserverToken = self.audioPlayer.addPeriodicTimeObserver(forInterval: time, queue: queue) { [weak self] time in + Task { + // Let the player update the current playback positions + await PlayerProgress.shared.syncFromPlayer(currentTime: time.seconds, includesPlayProgress: true, isStopping: false) + } + + // Update the sleep time, if set + if self?.sleepTimeStopAt != nil { + NotificationCenter.default.post(name: NSNotification.Name(PlayerEvents.sleepSet.rawValue), object: nil) + } } } }