diff --git a/submodules/AccountContext/Sources/SharedMediaPlayer.swift b/submodules/AccountContext/Sources/SharedMediaPlayer.swift index d95a4f6e46..38db88febe 100644 --- a/submodules/AccountContext/Sources/SharedMediaPlayer.swift +++ b/submodules/AccountContext/Sources/SharedMediaPlayer.swift @@ -148,6 +148,16 @@ public protocol SharedMediaPlaylistLocation { func isEqual(to: SharedMediaPlaylistLocation) -> Bool } +public func areSharedMediaPlaylistsEqual(_ lhs: SharedMediaPlaylist?, _ rhs: SharedMediaPlaylist?) -> Bool { + if let lhs = lhs, let rhs = rhs { + return lhs.id.isEqual(to: rhs.id) && lhs.location.isEqual(to: rhs.location) + } else if (lhs != nil) != (rhs != nil) { + return false + } else { + return true + } +} + public protocol SharedMediaPlaylist: AnyObject { var id: SharedMediaPlaylistId { get } var location: SharedMediaPlaylistLocation { get } diff --git a/submodules/TelegramUI/Sources/MediaManager.swift b/submodules/TelegramUI/Sources/MediaManager.swift index 376906d3e6..05b6aebaf7 100644 --- a/submodules/TelegramUI/Sources/MediaManager.swift +++ b/submodules/TelegramUI/Sources/MediaManager.swift @@ -494,57 +494,71 @@ public final class MediaManagerImpl: NSObject, MediaManager { switch type { case .voice: strongSelf.musicMediaPlayer?.control(.playback(.pause)) - strongSelf.voiceMediaPlayer?.stop() if let (account, playlist, settings, storedState) = inputData { - var continueInstantVideoLoopAfterFinish: Bool = true - var controlPlaybackWithProximity: Bool = true - if let playlist = playlist as? PeerMessagesMediaPlaylist { - continueInstantVideoLoopAfterFinish = playlist.context.sharedContext.energyUsageSettings.autoplayVideo - controlPlaybackWithProximity = playlist.context.sharedContext.currentMediaInputSettings.with({ $0.enableRaiseToSpeak }) - } - - let voiceMediaPlayer = SharedMediaPlayer(mediaManager: strongSelf, inForeground: strongSelf.inForeground, account: account, audioSession: strongSelf.audioSession, overlayMediaManager: strongSelf.overlayMediaManager, playlist: playlist, initialOrder: .reversed, initialLooping: .none, initialPlaybackRate: settings.voicePlaybackRate, playerIndex: nextPlayerIndex, controlPlaybackWithProximity: controlPlaybackWithProximity, type: type, continueInstantVideoLoopAfterFinish: continueInstantVideoLoopAfterFinish) - strongSelf.voiceMediaPlayer = voiceMediaPlayer - voiceMediaPlayer.playedToEnd = { [weak voiceMediaPlayer] in - if let strongSelf = self, let voiceMediaPlayer = voiceMediaPlayer, voiceMediaPlayer === strongSelf.voiceMediaPlayer { - voiceMediaPlayer.stop() - strongSelf.voiceMediaPlayer = nil + if areSharedMediaPlaylistsEqual(playlist, strongSelf.voiceMediaPlayer?.playlist), case .seek = control { + strongSelf.voiceMediaPlayer?.control(control) + } else { + strongSelf.voiceMediaPlayer?.stop() + var continueInstantVideoLoopAfterFinish: Bool = true + var controlPlaybackWithProximity: Bool = true + if let playlist = playlist as? PeerMessagesMediaPlaylist { + continueInstantVideoLoopAfterFinish = playlist.context.sharedContext.energyUsageSettings.autoplayVideo + controlPlaybackWithProximity = playlist.context.sharedContext.currentMediaInputSettings.with({ $0.enableRaiseToSpeak }) } - } - voiceMediaPlayer.cancelled = { [weak voiceMediaPlayer] in - if let strongSelf = self, let voiceMediaPlayer = voiceMediaPlayer, voiceMediaPlayer === strongSelf.voiceMediaPlayer { - voiceMediaPlayer.stop() - strongSelf.voiceMediaPlayer = nil + + let voiceMediaPlayer = SharedMediaPlayer(mediaManager: strongSelf, inForeground: strongSelf.inForeground, account: account, audioSession: strongSelf.audioSession, overlayMediaManager: strongSelf.overlayMediaManager, playlist: playlist, initialOrder: .reversed, initialLooping: .none, initialPlaybackRate: settings.voicePlaybackRate, playerIndex: nextPlayerIndex, controlPlaybackWithProximity: controlPlaybackWithProximity, type: type, continueInstantVideoLoopAfterFinish: continueInstantVideoLoopAfterFinish) + strongSelf.voiceMediaPlayer = voiceMediaPlayer + voiceMediaPlayer.playedToEnd = { [weak voiceMediaPlayer] in + if let strongSelf = self, let voiceMediaPlayer = voiceMediaPlayer, voiceMediaPlayer === strongSelf.voiceMediaPlayer { + voiceMediaPlayer.stop() + strongSelf.voiceMediaPlayer = nil + } } + voiceMediaPlayer.cancelled = { [weak voiceMediaPlayer] in + if let strongSelf = self, let voiceMediaPlayer = voiceMediaPlayer, voiceMediaPlayer === strongSelf.voiceMediaPlayer { + voiceMediaPlayer.stop() + strongSelf.voiceMediaPlayer = nil + } + } + + var control = control + if case .seek = control { + } else if let timestamp = storedState?.timestamp { + control = .seek(timestamp) + } + voiceMediaPlayer.control(control) + voiceMediaPlayer.control(.playback(.play)) } - - var control = control - if let timestamp = storedState?.timestamp { - control = .seek(timestamp) - } - voiceMediaPlayer.control(control) } else { + strongSelf.voiceMediaPlayer?.stop() strongSelf.voiceMediaPlayer = nil } case .music, .file: - strongSelf.musicMediaPlayer?.stop() strongSelf.voiceMediaPlayer?.control(.playback(.pause)) if let (account, playlist, settings, storedState) = inputData { - let musicMediaPlayer = SharedMediaPlayer(mediaManager: strongSelf, inForeground: strongSelf.inForeground, account: account, audioSession: strongSelf.audioSession, overlayMediaManager: strongSelf.overlayMediaManager, playlist: playlist, initialOrder: settings.order, initialLooping: settings.looping, initialPlaybackRate: storedState?.playbackRate ?? .x1, playerIndex: nextPlayerIndex, controlPlaybackWithProximity: false, type: type, continueInstantVideoLoopAfterFinish: true) - strongSelf.musicMediaPlayer = musicMediaPlayer - musicMediaPlayer.cancelled = { [weak musicMediaPlayer] in - if let strongSelf = self, let musicMediaPlayer = musicMediaPlayer, musicMediaPlayer === strongSelf.musicMediaPlayer { - musicMediaPlayer.stop() - strongSelf.musicMediaPlayer = nil + if areSharedMediaPlaylistsEqual(playlist, strongSelf.musicMediaPlayer?.playlist), case .seek = control { + strongSelf.musicMediaPlayer?.control(control) + } else { + strongSelf.musicMediaPlayer?.stop() + let musicMediaPlayer = SharedMediaPlayer(mediaManager: strongSelf, inForeground: strongSelf.inForeground, account: account, audioSession: strongSelf.audioSession, overlayMediaManager: strongSelf.overlayMediaManager, playlist: playlist, initialOrder: settings.order, initialLooping: settings.looping, initialPlaybackRate: storedState?.playbackRate ?? .x1, playerIndex: nextPlayerIndex, controlPlaybackWithProximity: false, type: type, continueInstantVideoLoopAfterFinish: true) + strongSelf.musicMediaPlayer = musicMediaPlayer + musicMediaPlayer.cancelled = { [weak musicMediaPlayer] in + if let strongSelf = self, let musicMediaPlayer = musicMediaPlayer, musicMediaPlayer === strongSelf.musicMediaPlayer { + musicMediaPlayer.stop() + strongSelf.musicMediaPlayer = nil + } } + + var control = control + if case .seek = control { + } else if let timestamp = storedState?.timestamp { + control = .seek(timestamp) + } + strongSelf.musicMediaPlayer?.control(control) + strongSelf.musicMediaPlayer?.control(.playback(.play)) } - - var control = control - if let timestamp = storedState?.timestamp { - control = .seek(timestamp) - } - strongSelf.musicMediaPlayer?.control(control) } else { + strongSelf.musicMediaPlayer?.stop() strongSelf.musicMediaPlayer = nil } } diff --git a/submodules/TelegramUI/Sources/SharedMediaPlayer.swift b/submodules/TelegramUI/Sources/SharedMediaPlayer.swift index 988dfca6dd..c7887119d3 100644 --- a/submodules/TelegramUI/Sources/SharedMediaPlayer.swift +++ b/submodules/TelegramUI/Sources/SharedMediaPlayer.swift @@ -116,7 +116,7 @@ final class SharedMediaPlayer { private let audioSession: ManagedAudioSession private let overlayMediaManager: OverlayMediaManager private let playerIndex: Int32 - private let playlist: SharedMediaPlaylist + let playlist: SharedMediaPlaylist private var playbackRate: AudioPlaybackRate @@ -194,6 +194,8 @@ final class SharedMediaPlayer { if controlPlaybackWithProximity { self.forceAudioToSpeaker = !DeviceProximityManager.shared().currentValue() + } else { + self.forceAudioToSpeaker = true } playlist.currentItemDisappeared = { [weak self] in