mirror of
https://github.com/advplyr/audiobookshelf-app.git
synced 2025-08-05 02:25:45 +02:00
iOS: resolve race condition when rebuilding queue for seeking back
This commit is contained in:
parent
675c10f7f7
commit
647bd8193b
1 changed files with 14 additions and 0 deletions
|
@ -45,6 +45,8 @@ class AudioPlayer: NSObject {
|
|||
private var queueObserver:NSKeyValueObservation?
|
||||
private var queueItemStatusObserver:NSKeyValueObservation?
|
||||
|
||||
private var isRebuildingQueue = false
|
||||
|
||||
// Sleep timer values
|
||||
internal var sleepTimeChapterStopAt: Double?
|
||||
internal var sleepTimeChapterToken: Any?
|
||||
|
@ -434,10 +436,14 @@ class AudioPlayer: NSObject {
|
|||
let playerItems = self.allPlayerItems[indexOfSeek..<self.allPlayerItems.count]
|
||||
|
||||
DispatchQueue.runOnMainQueue {
|
||||
// Let observers know we're rebuilding the queue
|
||||
// prevents race conditions on stopping sessions if queue is empty.
|
||||
self.isRebuildingQueue = true
|
||||
self.audioPlayer.removeAllItems()
|
||||
for item in Array(playerItems) {
|
||||
self.audioPlayer.insert(item, after:self.audioPlayer.items().last)
|
||||
}
|
||||
self.isRebuildingQueue = false
|
||||
}
|
||||
|
||||
seekInCurrentTrack(to: to, playbackSession: playbackSession)
|
||||
|
@ -460,10 +466,14 @@ class AudioPlayer: NSObject {
|
|||
let playerItems = self.allPlayerItems[indexOfSeek..<self.allPlayerItems.count]
|
||||
|
||||
DispatchQueue.runOnMainQueue {
|
||||
// Let observers know we're rebuilding the queue
|
||||
// prevents race conditions on stopping sessions if queue is empty.
|
||||
self.isRebuildingQueue = true
|
||||
self.audioPlayer.removeAllItems()
|
||||
for item in Array(playerItems) {
|
||||
self.audioPlayer.insert(item, after:self.audioPlayer.items().last)
|
||||
}
|
||||
self.isRebuildingQueue = false
|
||||
}
|
||||
|
||||
seekInCurrentTrack(to: to, playbackSession: playbackSession)
|
||||
|
@ -796,6 +806,10 @@ class AudioPlayer: NSObject {
|
|||
logger.log("WARNING: Item ended")
|
||||
|
||||
if audioPlayer.currentItem == nil {
|
||||
// if the queue is rebuilding, we expect the current item may be nil
|
||||
if self.isRebuildingQueue {
|
||||
return
|
||||
}
|
||||
logger.log("Player ended or next item is nil, marking ended")
|
||||
self.markAudioSessionAs(active: false)
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue