mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00
Media playback fixes
This commit is contained in:
parent
4685d5b2b6
commit
85a51978f0
@ -148,6 +148,16 @@ public protocol SharedMediaPlaylistLocation {
|
|||||||
func isEqual(to: SharedMediaPlaylistLocation) -> Bool
|
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 {
|
public protocol SharedMediaPlaylist: AnyObject {
|
||||||
var id: SharedMediaPlaylistId { get }
|
var id: SharedMediaPlaylistId { get }
|
||||||
var location: SharedMediaPlaylistLocation { get }
|
var location: SharedMediaPlaylistLocation { get }
|
||||||
|
@ -494,57 +494,71 @@ public final class MediaManagerImpl: NSObject, MediaManager {
|
|||||||
switch type {
|
switch type {
|
||||||
case .voice:
|
case .voice:
|
||||||
strongSelf.musicMediaPlayer?.control(.playback(.pause))
|
strongSelf.musicMediaPlayer?.control(.playback(.pause))
|
||||||
strongSelf.voiceMediaPlayer?.stop()
|
|
||||||
if let (account, playlist, settings, storedState) = inputData {
|
if let (account, playlist, settings, storedState) = inputData {
|
||||||
var continueInstantVideoLoopAfterFinish: Bool = true
|
if areSharedMediaPlaylistsEqual(playlist, strongSelf.voiceMediaPlayer?.playlist), case .seek = control {
|
||||||
var controlPlaybackWithProximity: Bool = true
|
strongSelf.voiceMediaPlayer?.control(control)
|
||||||
if let playlist = playlist as? PeerMessagesMediaPlaylist {
|
} else {
|
||||||
continueInstantVideoLoopAfterFinish = playlist.context.sharedContext.energyUsageSettings.autoplayVideo
|
strongSelf.voiceMediaPlayer?.stop()
|
||||||
controlPlaybackWithProximity = playlist.context.sharedContext.currentMediaInputSettings.with({ $0.enableRaiseToSpeak })
|
var continueInstantVideoLoopAfterFinish: Bool = true
|
||||||
}
|
var controlPlaybackWithProximity: Bool = true
|
||||||
|
if let playlist = playlist as? PeerMessagesMediaPlaylist {
|
||||||
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)
|
continueInstantVideoLoopAfterFinish = playlist.context.sharedContext.energyUsageSettings.autoplayVideo
|
||||||
strongSelf.voiceMediaPlayer = voiceMediaPlayer
|
controlPlaybackWithProximity = playlist.context.sharedContext.currentMediaInputSettings.with({ $0.enableRaiseToSpeak })
|
||||||
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
|
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)
|
||||||
if let strongSelf = self, let voiceMediaPlayer = voiceMediaPlayer, voiceMediaPlayer === strongSelf.voiceMediaPlayer {
|
strongSelf.voiceMediaPlayer = voiceMediaPlayer
|
||||||
voiceMediaPlayer.stop()
|
voiceMediaPlayer.playedToEnd = { [weak voiceMediaPlayer] in
|
||||||
strongSelf.voiceMediaPlayer = nil
|
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 {
|
} else {
|
||||||
|
strongSelf.voiceMediaPlayer?.stop()
|
||||||
strongSelf.voiceMediaPlayer = nil
|
strongSelf.voiceMediaPlayer = nil
|
||||||
}
|
}
|
||||||
case .music, .file:
|
case .music, .file:
|
||||||
strongSelf.musicMediaPlayer?.stop()
|
|
||||||
strongSelf.voiceMediaPlayer?.control(.playback(.pause))
|
strongSelf.voiceMediaPlayer?.control(.playback(.pause))
|
||||||
if let (account, playlist, settings, storedState) = inputData {
|
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)
|
if areSharedMediaPlaylistsEqual(playlist, strongSelf.musicMediaPlayer?.playlist), case .seek = control {
|
||||||
strongSelf.musicMediaPlayer = musicMediaPlayer
|
strongSelf.musicMediaPlayer?.control(control)
|
||||||
musicMediaPlayer.cancelled = { [weak musicMediaPlayer] in
|
} else {
|
||||||
if let strongSelf = self, let musicMediaPlayer = musicMediaPlayer, musicMediaPlayer === strongSelf.musicMediaPlayer {
|
strongSelf.musicMediaPlayer?.stop()
|
||||||
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 = nil
|
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 {
|
} else {
|
||||||
|
strongSelf.musicMediaPlayer?.stop()
|
||||||
strongSelf.musicMediaPlayer = nil
|
strongSelf.musicMediaPlayer = nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -116,7 +116,7 @@ final class SharedMediaPlayer {
|
|||||||
private let audioSession: ManagedAudioSession
|
private let audioSession: ManagedAudioSession
|
||||||
private let overlayMediaManager: OverlayMediaManager
|
private let overlayMediaManager: OverlayMediaManager
|
||||||
private let playerIndex: Int32
|
private let playerIndex: Int32
|
||||||
private let playlist: SharedMediaPlaylist
|
let playlist: SharedMediaPlaylist
|
||||||
|
|
||||||
private var playbackRate: AudioPlaybackRate
|
private var playbackRate: AudioPlaybackRate
|
||||||
|
|
||||||
@ -194,6 +194,8 @@ final class SharedMediaPlayer {
|
|||||||
|
|
||||||
if controlPlaybackWithProximity {
|
if controlPlaybackWithProximity {
|
||||||
self.forceAudioToSpeaker = !DeviceProximityManager.shared().currentValue()
|
self.forceAudioToSpeaker = !DeviceProximityManager.shared().currentValue()
|
||||||
|
} else {
|
||||||
|
self.forceAudioToSpeaker = true
|
||||||
}
|
}
|
||||||
|
|
||||||
playlist.currentItemDisappeared = { [weak self] in
|
playlist.currentItemDisappeared = { [weak self] in
|
||||||
|
Loading…
x
Reference in New Issue
Block a user