Media playback fixes

This commit is contained in:
Ilya Laktyushin 2023-03-14 10:51:51 +04:00
parent 4685d5b2b6
commit 85a51978f0
3 changed files with 65 additions and 39 deletions

View File

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

View File

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

View File

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