From 2a7ae64f7da95032714d630e031723cae5b8ee05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adrien=20Coye=20de=20Brune=CC=81lis?= Date: Fri, 9 Aug 2024 13:15:11 +0200 Subject: [PATCH] fix(SingleTrackPlayer): Make sure we can navigate between audio file previews and it works seamlessly --- .../AudioPlayer/SingleTrackPlayer.swift | 25 ++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/kDriveCore/AudioPlayer/SingleTrackPlayer.swift b/kDriveCore/AudioPlayer/SingleTrackPlayer.swift index ea6afe280d..51693d3e18 100644 --- a/kDriveCore/AudioPlayer/SingleTrackPlayer.swift +++ b/kDriveCore/AudioPlayer/SingleTrackPlayer.swift @@ -47,7 +47,7 @@ public final class SingleTrackPlayer { private var interruptionObserver: NSObjectProtocol? private var timeObserver: Any? private var rateObserver: NSKeyValueObservation? - private var statusObserver: NSObjectProtocol? + private var statusObserver: NSKeyValueObservation? private var isInterrupted = false // MARK: Data flow @@ -127,7 +127,6 @@ public final class SingleTrackPlayer { statusObserver = nil player?.pause() - player = nil playerState = .stopped } @@ -215,7 +214,7 @@ public final class SingleTrackPlayer { // MARK: - Observation - func setUpObservers() { + private func setUpObservers() { interruptionObserver = NotificationCenter.default.addObserver(forName: AVAudioSession.interruptionNotification, object: AVAudioSession.sharedInstance(), queue: .main) { [weak self] notification in @@ -240,6 +239,22 @@ public final class SingleTrackPlayer { setUpRemoteControlEvents() } + private func removeAllObservers() { + if let interruptionObserver = interruptionObserver { + NotificationCenter.default.removeObserver(interruptionObserver) + } + + stopPlaybackObservation() + + rateObserver?.invalidate() + rateObserver = nil + + statusObserver?.invalidate() + statusObserver = nil + + removeAllRemoteControlEvents() + } + public func startPlaybackObservationIfNeeded() { guard timeObserver == nil else { return @@ -298,6 +313,10 @@ public final class SingleTrackPlayer { } } + private func removeAllRemoteControlEvents() { + registeredCommands.forEach { $0.removeHandler() } + } + @objc private func playerDidFinishPlaying() { pause() seek(to: 0)