Fix edge case when seeking past chapter

This commit is contained in:
ronaldheft 2022-08-26 18:35:47 -04:00
parent eb7a241e94
commit 2076b93e19
2 changed files with 31 additions and 7 deletions

View file

@ -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()

View file

@ -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