Fix seek on paused state

This commit is contained in:
Florian Renaud 2022-11-04 23:42:02 +01:00
parent b2f35fa135
commit 436e76c756
6 changed files with 37 additions and 15 deletions

View File

@ -133,7 +133,7 @@ sealed class RoomDetailAction : VectorViewModelAction {
data class PlayOrResume(val voiceBroadcast: VoiceBroadcast) : Listening() data class PlayOrResume(val voiceBroadcast: VoiceBroadcast) : Listening()
object Pause : Listening() object Pause : Listening()
object Stop : Listening() object Stop : Listening()
data class SeekTo(val voiceBroadcast: VoiceBroadcast, val positionMillis: Int) : Listening() data class SeekTo(val voiceBroadcast: VoiceBroadcast, val positionMillis: Int, val duration: Int) : Listening()
} }
} }
} }

View File

@ -637,7 +637,7 @@ class TimelineViewModel @AssistedInject constructor(
is VoiceBroadcastAction.Listening.PlayOrResume -> voiceBroadcastHelper.playOrResumePlayback(action.voiceBroadcast) is VoiceBroadcastAction.Listening.PlayOrResume -> voiceBroadcastHelper.playOrResumePlayback(action.voiceBroadcast)
VoiceBroadcastAction.Listening.Pause -> voiceBroadcastHelper.pausePlayback() VoiceBroadcastAction.Listening.Pause -> voiceBroadcastHelper.pausePlayback()
VoiceBroadcastAction.Listening.Stop -> voiceBroadcastHelper.stopPlayback() VoiceBroadcastAction.Listening.Stop -> voiceBroadcastHelper.stopPlayback()
is VoiceBroadcastAction.Listening.SeekTo -> voiceBroadcastHelper.seekTo(action.voiceBroadcast, action.positionMillis) is VoiceBroadcastAction.Listening.SeekTo -> voiceBroadcastHelper.seekTo(action.voiceBroadcast, action.positionMillis, action.duration)
} }
} }
} }

View File

@ -94,7 +94,7 @@ abstract class MessageVoiceBroadcastListeningItem : AbsMessageVoiceBroadcastItem
} }
override fun onStopTrackingTouch(seekBar: SeekBar) { override fun onStopTrackingTouch(seekBar: SeekBar) {
callback?.onTimelineItemAction(VoiceBroadcastAction.Listening.SeekTo(voiceBroadcast, seekBar.progress)) callback?.onTimelineItemAction(VoiceBroadcastAction.Listening.SeekTo(voiceBroadcast, seekBar.progress, duration))
isUserSeeking = false isUserSeeking = false
} }
}) })

View File

@ -48,7 +48,7 @@ class VoiceBroadcastHelper @Inject constructor(
fun stopPlayback() = voiceBroadcastPlayer.stop() fun stopPlayback() = voiceBroadcastPlayer.stop()
fun seekTo(voiceBroadcast: VoiceBroadcast, positionMillis: Int) { fun seekTo(voiceBroadcast: VoiceBroadcast, positionMillis: Int, duration: Int) {
voiceBroadcastPlayer.seekTo(voiceBroadcast, positionMillis) voiceBroadcastPlayer.seekTo(voiceBroadcast, positionMillis, duration)
} }
} }

View File

@ -48,7 +48,7 @@ interface VoiceBroadcastPlayer {
/** /**
* Seek the given voice broadcast playback to the given position, is milliseconds. * Seek the given voice broadcast playback to the given position, is milliseconds.
*/ */
fun seekTo(voiceBroadcast: VoiceBroadcast, positionMillis: Int) fun seekTo(voiceBroadcast: VoiceBroadcast, positionMillis: Int, duration: Int)
/** /**
* Add a [Listener] to the given voice broadcast. * Add a [Listener] to the given voice broadcast.

View File

@ -94,8 +94,7 @@ class VoiceBroadcastPlayerImpl @Inject constructor(
} }
override fun pause() { override fun pause() {
currentMediaPlayer?.pause() pausePlayback()
playingState = State.PAUSED
} }
override fun stop() { override fun stop() {
@ -212,17 +211,40 @@ class VoiceBroadcastPlayerImpl @Inject constructor(
} }
} }
private fun resumePlayback() { private fun pausePlayback(positionMillis: Int? = null) {
currentMediaPlayer?.start() if (positionMillis == null) {
playingState = State.PLAYING currentMediaPlayer?.pause()
} else {
stopPlayer()
currentVoiceBroadcast?.voiceBroadcastId?.let { id ->
playbackTracker.updatePausedAtPlaybackTime(id, positionMillis, positionMillis.toFloat() / playlist.duration)
}
}
playingState = State.PAUSED
} }
override fun seekTo(voiceBroadcast: VoiceBroadcast, positionMillis: Int) { private fun resumePlayback() {
if (voiceBroadcast != currentVoiceBroadcast) { if (currentMediaPlayer != null) {
playbackTracker.updatePausedAtPlaybackTime(voiceBroadcast.voiceBroadcastId, positionMillis, 0f) currentMediaPlayer?.start()
playingState = State.PLAYING
} else { } else {
val position = currentVoiceBroadcast?.voiceBroadcastId?.let { playbackTracker.getPlaybackTime(it) }
startPlayback(position)
}
}
override fun seekTo(voiceBroadcast: VoiceBroadcast, positionMillis: Int, duration: Int) {
when {
voiceBroadcast != currentVoiceBroadcast -> {
playbackTracker.updatePausedAtPlaybackTime(voiceBroadcast.voiceBroadcastId, positionMillis, positionMillis.toFloat() / duration)
}
playingState == State.PLAYING || playingState == State.BUFFERING -> {
startPlayback(positionMillis) startPlayback(positionMillis)
} }
playingState == State.IDLE || playingState == State.PAUSED -> {
pausePlayback(positionMillis)
}
}
} }
private fun prepareNextMediaPlayer() { private fun prepareNextMediaPlayer() {