diff --git a/ios/App/Shared/player/AudioPlayer.swift b/ios/App/Shared/player/AudioPlayer.swift index 5ba8f9cb..4287d897 100644 --- a/ios/App/Shared/player/AudioPlayer.swift +++ b/ios/App/Shared/player/AudioPlayer.swift @@ -423,8 +423,13 @@ class AudioPlayer: NSObject { private func rescheduleSleepTimerAtTime(time: Double, secondsRemaining: Int?) { // Not a chapter sleep timer + let hadToCancelChapterSleepTimer = decideIfChapterSleepTimerNeedsToBeCanceled(time: time) + guard !hadToCancelChapterSleepTimer else { return } guard PlayerHandler.sleepTimerChapterStopTime == nil else { return } + // Verify sleep timer is set + guard self.sleepTimeToken != nil else { return } + // Update the sleep timer if let secondsRemaining = secondsRemaining { let newSleepTimerPosition = time + Double(secondsRemaining) @@ -432,6 +437,19 @@ class AudioPlayer: NSObject { } } + private func decideIfChapterSleepTimerNeedsToBeCanceled(time: Double) -> Bool { + if let chapterSleepTime = PlayerHandler.sleepTimerChapterStopTime { + let sleepIsBeforeCurrentTime = Double(chapterSleepTime) <= time + if sleepIsBeforeCurrentTime { + PlayerHandler.sleepTimerChapterStopTime = nil + self.removeSleepTimer() + return true + } + } + + return false + } + public func increaseSleepTime(extraTimeInSeconds: Double) { if let sleepTime = PlayerHandler.remainingSleepTime { let currentTime = getCurrentTime() diff --git a/ios/App/Shared/player/PlayerHandler.swift b/ios/App/Shared/player/PlayerHandler.swift index ae97120e..c565690d 100644 --- a/ios/App/Shared/player/PlayerHandler.swift +++ b/ios/App/Shared/player/PlayerHandler.swift @@ -63,16 +63,22 @@ class PlayerHandler { get { guard let player = player else { return nil } - // Consider paused as playing at 1x - let rate = Double(player.rate > 0 ? player.rate : 1) - + // Return the player time until sleep + var timeUntilSleep: Double? = nil if let sleepTimerChapterStopTime = sleepTimerChapterStopTime { - let timeUntilChapterEnd = Double(sleepTimerChapterStopTime) - player.getCurrentTime() - let timeUntilChapterEndScaled = timeUntilChapterEnd / rate - return Int(timeUntilChapterEndScaled.rounded()) + timeUntilSleep = Double(sleepTimerChapterStopTime) - player.getCurrentTime() } else if let stopAt = player.getSleepStopAt() { - let timeUntilSleep = stopAt - player.getCurrentTime() + timeUntilSleep = stopAt - player.getCurrentTime() + } + + // Scale the time until sleep based on the playback rate + if let timeUntilSleep = timeUntilSleep { + // Consider paused as playing at 1x + let rate = Double(player.rate > 0 ? player.rate : 1) + let timeUntilSleepScaled = timeUntilSleep / rate + guard timeUntilSleepScaled.isNaN == false else { return nil } + return Int(timeUntilSleepScaled.rounded()) } else { return nil