Properly handle repeat modes
This commit is contained in:
parent
e46c39a33f
commit
016070bfaa
9 changed files with 28 additions and 32 deletions
|
@ -289,8 +289,7 @@ class TrackActivity : SimpleControllerActivity(), PlaybackSpeedListener {
|
|||
toast(newPlaybackSetting.descriptionStringRes)
|
||||
setupPlaybackSettingButton()
|
||||
withPlayer {
|
||||
setRepeatMode(config.playbackSetting)
|
||||
setupNextTrackInfo(nextMediaItem)
|
||||
sendCommand(CustomCommands.TOGGLE_REPEAT_MODE)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -2,8 +2,6 @@ package com.simplemobiletools.musicplayer.extensions
|
|||
|
||||
import androidx.media3.common.MediaItem
|
||||
import androidx.media3.common.Player
|
||||
import com.simplemobiletools.musicplayer.helpers.PlaybackSetting
|
||||
import com.simplemobiletools.musicplayer.playback.player.PlayerListener
|
||||
|
||||
val Player.isReallyPlaying: Boolean
|
||||
get() = when (playbackState) {
|
||||
|
@ -20,15 +18,3 @@ val Player.nextMediaItem: MediaItem?
|
|||
} else {
|
||||
null
|
||||
}
|
||||
|
||||
/**
|
||||
* [PlaybackSetting.STOP_AFTER_CURRENT_TRACK] is handled manually as it isn't supported by media3 player. See [PlayerListener.onMediaItemTransition].
|
||||
*/
|
||||
fun Player.setRepeatMode(playbackSetting: PlaybackSetting) {
|
||||
repeatMode = when (playbackSetting) {
|
||||
PlaybackSetting.REPEAT_OFF -> Player.REPEAT_MODE_OFF
|
||||
PlaybackSetting.REPEAT_PLAYLIST -> Player.REPEAT_MODE_ALL
|
||||
PlaybackSetting.REPEAT_TRACK -> Player.REPEAT_MODE_ONE
|
||||
PlaybackSetting.STOP_AFTER_CURRENT_TRACK -> Player.REPEAT_MODE_ONE
|
||||
}
|
||||
}
|
||||
|
|
|
@ -14,6 +14,7 @@ enum class CustomCommands(val customAction: String) {
|
|||
CLOSE_PLAYER(customAction = PATH + "CLOSE_PLAYER"),
|
||||
RELOAD_CONTENT(customAction = PATH + "RELOAD_CONTENT"),
|
||||
SAVE_QUEUE(customAction = PATH + "SAVE_QUEUE"),
|
||||
TOGGLE_REPEAT_MODE(customAction = PATH + "TOGGLE_REPEAT_MODE"),
|
||||
TOGGLE_SLEEP_TIMER(customAction = PATH + "TOGGLE_SLEEP_TIMER"),
|
||||
TOGGLE_SKIP_SILENCE(customAction = PATH + "TOGGLE_SKIP_SILENCE");
|
||||
|
||||
|
|
|
@ -68,6 +68,7 @@ internal fun PlaybackService.getMediaSessionCallback() = object : MediaLibrarySe
|
|||
CustomCommands.CLOSE_PLAYER -> stopService()
|
||||
CustomCommands.RELOAD_CONTENT -> reloadContent()
|
||||
CustomCommands.SAVE_QUEUE -> saveRecentItems()
|
||||
CustomCommands.TOGGLE_REPEAT_MODE -> updateRepeatMode()
|
||||
CustomCommands.TOGGLE_SLEEP_TIMER -> toggleSleepTimer()
|
||||
CustomCommands.TOGGLE_SKIP_SILENCE -> player.setSkipSilence(config.gaplessPlayback)
|
||||
}
|
||||
|
|
|
@ -11,6 +11,7 @@ import androidx.media3.session.*
|
|||
import com.simplemobiletools.commons.extensions.hasPermission
|
||||
import com.simplemobiletools.musicplayer.extensions.*
|
||||
import com.simplemobiletools.musicplayer.helpers.NotificationHelper
|
||||
import com.simplemobiletools.musicplayer.helpers.PlaybackSetting
|
||||
import com.simplemobiletools.musicplayer.helpers.getPermissionToRequest
|
||||
import com.simplemobiletools.musicplayer.playback.library.MediaItemProvider
|
||||
import com.simplemobiletools.musicplayer.playback.player.PlayerListener
|
||||
|
@ -69,7 +70,20 @@ class PlaybackService : MediaLibraryService() {
|
|||
stopSelf()
|
||||
}
|
||||
|
||||
internal fun withPlayer(callback: Player.() -> Unit) {
|
||||
internal fun updateRepeatMode() {
|
||||
withPlayer {
|
||||
val playbackSetting = config.playbackSetting
|
||||
setPauseAtEndOfMediaItems(playbackSetting == PlaybackSetting.STOP_AFTER_CURRENT_TRACK)
|
||||
repeatMode = when (playbackSetting) {
|
||||
PlaybackSetting.REPEAT_OFF -> Player.REPEAT_MODE_OFF
|
||||
PlaybackSetting.REPEAT_PLAYLIST -> Player.REPEAT_MODE_ALL
|
||||
PlaybackSetting.REPEAT_TRACK -> Player.REPEAT_MODE_ONE
|
||||
PlaybackSetting.STOP_AFTER_CURRENT_TRACK -> Player.REPEAT_MODE_ALL
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal fun withPlayer(callback: SimpleMusicPlayer.() -> Unit) {
|
||||
player.applicationLooper.post { callback(player) }
|
||||
}
|
||||
|
||||
|
|
|
@ -19,7 +19,7 @@ object SimpleEqualizer {
|
|||
fun setupEqualizer(context: Context, player: SimpleMusicPlayer) {
|
||||
try {
|
||||
val preset = context.config.equalizerPreset
|
||||
instance = Equalizer(0, player.exoPlayer.audioSessionId)
|
||||
instance = Equalizer(0, player.getAudioSessionId())
|
||||
if (!instance.enabled) {
|
||||
instance.enabled = true
|
||||
}
|
||||
|
|
|
@ -14,7 +14,6 @@ import androidx.media3.exoplayer.ExoPlayer
|
|||
import androidx.media3.session.MediaLibraryService
|
||||
import com.simplemobiletools.musicplayer.activities.MainActivity
|
||||
import com.simplemobiletools.musicplayer.extensions.config
|
||||
import com.simplemobiletools.musicplayer.extensions.setRepeatMode
|
||||
import com.simplemobiletools.musicplayer.helpers.SEEK_INTERVAL_MS
|
||||
import com.simplemobiletools.musicplayer.playback.PlaybackService
|
||||
import com.simplemobiletools.musicplayer.playback.SimpleEqualizer
|
||||
|
@ -34,7 +33,7 @@ internal fun PlaybackService.initializeSessionAndPlayer(handleAudioFocus: Boolea
|
|||
|
||||
withPlayer {
|
||||
addListener(listener!!)
|
||||
setRepeatMode(config.playbackSetting)
|
||||
updateRepeatMode()
|
||||
setPlaybackSpeed(config.playbackSpeed)
|
||||
shuffleModeEnabled = config.isShuffleEnabled
|
||||
mediaSession.setCustomLayout(getCustomLayout())
|
||||
|
|
|
@ -1,16 +1,13 @@
|
|||
package com.simplemobiletools.musicplayer.playback.player
|
||||
|
||||
import android.widget.Toast
|
||||
import androidx.media3.common.MediaItem
|
||||
import androidx.media3.common.PlaybackException
|
||||
import androidx.media3.common.Player
|
||||
import androidx.media3.common.util.UnstableApi
|
||||
import com.simplemobiletools.commons.extensions.toast
|
||||
import com.simplemobiletools.musicplayer.R
|
||||
import com.simplemobiletools.musicplayer.extensions.broadcastUpdateWidgetState
|
||||
import com.simplemobiletools.musicplayer.extensions.config
|
||||
import com.simplemobiletools.musicplayer.extensions.currentMediaItems
|
||||
import com.simplemobiletools.musicplayer.helpers.PlaybackSetting
|
||||
import com.simplemobiletools.musicplayer.playback.PlaybackService
|
||||
import com.simplemobiletools.musicplayer.playback.PlaybackService.Companion.updatePlaybackInfo
|
||||
|
||||
|
@ -36,15 +33,6 @@ class PlayerListener(private val context: PlaybackService) : Player.Listener {
|
|||
}
|
||||
}
|
||||
|
||||
override fun onMediaItemTransition(mediaItem: MediaItem?, reason: Int) {
|
||||
// We handle this manually because this mode isn't supported in the media3 player.
|
||||
// It's possible using Exoplayer.setPauseAtEndOfMediaItems() but that would require rebuilding the player.
|
||||
val isReasonRepeat = reason == Player.MEDIA_ITEM_TRANSITION_REASON_REPEAT
|
||||
if (isReasonRepeat && context.config.playbackSetting == PlaybackSetting.STOP_AFTER_CURRENT_TRACK) {
|
||||
player.pause()
|
||||
}
|
||||
}
|
||||
|
||||
private fun updatePlaybackInfo() {
|
||||
updatePlaybackInfo(player)
|
||||
val currentMediaItem = player.currentMediaItem
|
||||
|
|
|
@ -29,7 +29,15 @@ class SimpleMusicPlayer(val exoPlayer: ExoPlayer) : ForwardingPlayer(exoPlayer)
|
|||
playWhenReady = true
|
||||
}
|
||||
|
||||
fun getAudioSessionId(): Int {
|
||||
return exoPlayer.audioSessionId
|
||||
}
|
||||
|
||||
fun setSkipSilence(skipSilence: Boolean) {
|
||||
exoPlayer.skipSilenceEnabled = skipSilence
|
||||
}
|
||||
|
||||
fun setPauseAtEndOfMediaItems(pauseAtEnd: Boolean) {
|
||||
exoPlayer.pauseAtEndOfMediaItems = pauseAtEnd
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue