From c72f7cddc8916f53b03de86ad4130e669fc15ebe Mon Sep 17 00:00:00 2001 From: Adam Traeger Date: Thu, 13 Mar 2025 22:48:06 -0500 Subject: [PATCH 1/4] Mark session as inactive if end of queue is reached. Ensures UI shows paused and stops incrementing session time. --- ios/App/Shared/player/AudioPlayer.swift | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ios/App/Shared/player/AudioPlayer.swift b/ios/App/Shared/player/AudioPlayer.swift index 80cb9010..8231fbd9 100644 --- a/ios/App/Shared/player/AudioPlayer.swift +++ b/ios/App/Shared/player/AudioPlayer.swift @@ -768,6 +768,11 @@ class AudioPlayer: NSObject { if keyPath == #keyPath(AVPlayer.currentItem) { NotificationCenter.default.post(name: NSNotification.Name(PlayerEvents.update.rawValue), object: nil) logger.log("WARNING: Item ended") + + if audioPlayer.currentItem == nil { + logger.log("Player ended or next item is nil, marking ended") + self.markAudioSessionAs(active: false) + } } } else { super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context) From 78d7ba69dfb008715bf0e468a80c376675c7ce98 Mon Sep 17 00:00:00 2001 From: Adam Traeger Date: Thu, 13 Mar 2025 22:50:30 -0500 Subject: [PATCH 2/4] Fallback to session details if player has no active track. Provides better handling if end of book has been reached. --- ios/App/Shared/player/AudioPlayer.swift | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/ios/App/Shared/player/AudioPlayer.swift b/ios/App/Shared/player/AudioPlayer.swift index 8231fbd9..dda8e55e 100644 --- a/ios/App/Shared/player/AudioPlayer.swift +++ b/ios/App/Shared/player/AudioPlayer.swift @@ -487,9 +487,17 @@ class AudioPlayer: NSObject { public func getCurrentTime() -> Double? { guard let playbackSession = self.getPlaybackSession() else { return nil } - let currentTrackTime = self.audioPlayer.currentTime().seconds let audioTrack = playbackSession.audioTracks[currentTrackIndex] let startOffset = audioTrack.startOffset ?? 0.0 + + // if the currentTrackTime is not a number, then track isn't loaded + // fall back on session. + var currentTrackTime = self.audioPlayer.currentTime().seconds + if currentTrackTime.isNaN { + if let currentChapter = playbackSession.getCurrentChapter() { + currentTrackTime = currentChapter.getRelativeChapterCurrentTime(sessionCurrentTime:playbackSession.currentTime) + } + } return startOffset + currentTrackTime } From 45d3a15c68026cb769039150ac642e7a6bc5ff5b Mon Sep 17 00:00:00 2001 From: Adam Traeger Date: Thu, 13 Mar 2025 23:00:53 -0500 Subject: [PATCH 3/4] Rebuild track queue while seeking if player does not have a current track. --- ios/App/Shared/player/AudioPlayer.swift | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/ios/App/Shared/player/AudioPlayer.swift b/ios/App/Shared/player/AudioPlayer.swift index dda8e55e..7d96c7b7 100644 --- a/ios/App/Shared/player/AudioPlayer.swift +++ b/ios/App/Shared/player/AudioPlayer.swift @@ -424,6 +424,27 @@ class AudioPlayer: NSObject { let indexOfSeek = getItemIndexForTime(time: to) logger.log("SEEK: Seek to index \(indexOfSeek) | Current index \(self.currentTrackIndex)") + if self.audioPlayer.currentItem == nil { + self.currentTrackIndex = indexOfSeek + + try? playbackSession.update { + playbackSession.currentTime = to + } + + let playerItems = self.allPlayerItems[indexOfSeek.. Date: Fri, 14 Mar 2025 20:07:33 -0500 Subject: [PATCH 4/4] Fix getCurrentTime for streaming session. This simplifies logic to use session current time when session current track start offset is unavailable. --- ios/App/Shared/player/AudioPlayer.swift | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/ios/App/Shared/player/AudioPlayer.swift b/ios/App/Shared/player/AudioPlayer.swift index 7d96c7b7..90b54e4f 100644 --- a/ios/App/Shared/player/AudioPlayer.swift +++ b/ios/App/Shared/player/AudioPlayer.swift @@ -511,13 +511,10 @@ class AudioPlayer: NSObject { let audioTrack = playbackSession.audioTracks[currentTrackIndex] let startOffset = audioTrack.startOffset ?? 0.0 - // if the currentTrackTime is not a number, then track isn't loaded - // fall back on session. - var currentTrackTime = self.audioPlayer.currentTime().seconds + // if the currentTrackTime isNan, then fall back on session. + let currentTrackTime = self.audioPlayer.currentTime().seconds if currentTrackTime.isNaN { - if let currentChapter = playbackSession.getCurrentChapter() { - currentTrackTime = currentChapter.getRelativeChapterCurrentTime(sessionCurrentTime:playbackSession.currentTime) - } + return playbackSession.currentTime } return startOffset + currentTrackTime }