Audio player modifications should be on main queue

This commit is contained in:
ronaldheft
2022-09-13 20:47:07 -04:00
parent 713999eb83
commit 7294bc7033
+13
View File
@@ -299,11 +299,14 @@ class AudioPlayer: NSObject {
// Start playback, with a seek, for as smooth a scrub bar start as possible // Start playback, with a seek, for as smooth a scrub bar start as possible
let currentTrackStartOffset = session.audioTracks[self.currentTrackIndex].startOffset ?? 0.0 let currentTrackStartOffset = session.audioTracks[self.currentTrackIndex].startOffset ?? 0.0
let seekTime = currentTime - currentTrackStartOffset let seekTime = currentTime - currentTrackStartOffset
DispatchQueue.runOnMainQueue {
self.audioPlayer.seek(to: CMTime(seconds: seekTime, preferredTimescale: 1000), toleranceBefore: .zero, toleranceAfter: .zero) { [weak self] completed in self.audioPlayer.seek(to: CMTime(seconds: seekTime, preferredTimescale: 1000), toleranceBefore: .zero, toleranceAfter: .zero) { [weak self] completed in
guard completed else { return } guard completed else { return }
self?.resumePlayback() self?.resumePlayback()
} }
} }
}
private func calculateSeekBackTimeAtCurrentTime(_ currentTime: Double, lastPlayed: Double) -> Double { private func calculateSeekBackTimeAtCurrentTime(_ currentTime: Double, lastPlayed: Double) -> Double {
let difference = Date.timeIntervalSinceReferenceDate - lastPlayed let difference = Date.timeIntervalSinceReferenceDate - lastPlayed
@@ -337,8 +340,10 @@ class AudioPlayer: NSObject {
self.stopPausedTimer() self.stopPausedTimer()
self.markAudioSessionAs(active: true) self.markAudioSessionAs(active: true)
DispatchQueue.runOnMainQueue {
self.audioPlayer.play() self.audioPlayer.play()
self.audioPlayer.rate = self.tmpRate self.audioPlayer.rate = self.tmpRate
}
self.status = 1 self.status = 1
// Update the progress // Update the progress
@@ -349,7 +354,9 @@ class AudioPlayer: NSObject {
guard self.isInitialized() else { return } guard self.isInitialized() else { return }
NSLog("PAUSE: Pausing playback") NSLog("PAUSE: Pausing playback")
DispatchQueue.runOnMainQueue {
self.audioPlayer.pause() self.audioPlayer.pause()
}
self.markAudioSessionAs(active: false) self.markAudioSessionAs(active: false)
Task { Task {
@@ -394,10 +401,12 @@ class AudioPlayer: NSObject {
self.status = -1 self.status = -1
let playerItems = self.allPlayerItems[indexOfSeek..<self.allPlayerItems.count] let playerItems = self.allPlayerItems[indexOfSeek..<self.allPlayerItems.count]
DispatchQueue.runOnMainQueue {
self.audioPlayer.removeAllItems() self.audioPlayer.removeAllItems()
for item in Array(playerItems) { for item in Array(playerItems) {
self.audioPlayer.insert(item, after:self.audioPlayer.items().last) self.audioPlayer.insert(item, after:self.audioPlayer.items().last)
} }
}
setupQueueItemStatusObserver() setupQueueItemStatusObserver()
} else { } else {
@@ -405,6 +414,7 @@ class AudioPlayer: NSObject {
let currentTrackStartOffset = playbackSession.audioTracks[self.currentTrackIndex].startOffset ?? 0.0 let currentTrackStartOffset = playbackSession.audioTracks[self.currentTrackIndex].startOffset ?? 0.0
let seekTime = to - currentTrackStartOffset let seekTime = to - currentTrackStartOffset
DispatchQueue.runOnMainQueue {
self.audioPlayer.seek(to: CMTime(seconds: seekTime, preferredTimescale: 1000)) { [weak self] completed in self.audioPlayer.seek(to: CMTime(seconds: seekTime, preferredTimescale: 1000)) { [weak self] completed in
guard completed else { return NSLog("SEEK: WARNING: seeking not completed (to \(seekTime)") } guard completed else { return NSLog("SEEK: WARNING: seeking not completed (to \(seekTime)") }
guard let self = self else { return } guard let self = self else { return }
@@ -417,14 +427,17 @@ class AudioPlayer: NSObject {
} }
} }
} }
}
public func setPlaybackRate(_ rate: Float, observed: Bool = false) { public func setPlaybackRate(_ rate: Float, observed: Bool = false) {
let playbackSpeedChanged = rate > 0.0 && rate != self.tmpRate && !(observed && rate == 1) let playbackSpeedChanged = rate > 0.0 && rate != self.tmpRate && !(observed && rate == 1)
if self.audioPlayer.rate != rate { if self.audioPlayer.rate != rate {
NSLog("setPlaybakRate rate changed from \(self.audioPlayer.rate) to \(rate)") NSLog("setPlaybakRate rate changed from \(self.audioPlayer.rate) to \(rate)")
DispatchQueue.runOnMainQueue {
self.audioPlayer.rate = rate self.audioPlayer.rate = rate
} }
}
self.rate = rate self.rate = rate
self.updateNowPlaying() self.updateNowPlaying()