diff --git a/MusicPlayer/src/net/torvald/terrarum/musicplayer/gui/MusicPlayerControl.kt b/MusicPlayer/src/net/torvald/terrarum/musicplayer/gui/MusicPlayerControl.kt index f0da327a7..8a4b17afb 100644 --- a/MusicPlayer/src/net/torvald/terrarum/musicplayer/gui/MusicPlayerControl.kt +++ b/MusicPlayer/src/net/torvald/terrarum/musicplayer/gui/MusicPlayerControl.kt @@ -176,7 +176,10 @@ class MusicPlayerControl(private val ingame: TerrarumIngame) : UICanvas() { private var mouseOnButton: Int? = null private var mouseOnList: Int? = null + private var transactionLocked = MusicService.transactionLocked + override fun updateImpl(delta: Float) { + transactionLocked = MusicService.transactionLocked // the value need to be "latched" val currentPlaylist = getCurrentPlaylist() // process transition request @@ -296,9 +299,13 @@ class MusicPlayerControl(private val ingame: TerrarumIngame) : UICanvas() { else { mouseOnButton = null } + //// manually nullify the buttons that does nothing when locked + if (transactionLocked && mode < MODE_SHOW_LIST && (mouseOnButton == 1 || mouseOnButton == 3)) { + mouseOnButton = null + } // mouse is over which list - mouseOnList = if (mode >= MODE_SHOW_LIST && + mouseOnList = if (!transactionLocked && mode >= MODE_SHOW_LIST && relativeMouseY.toFloat() in _posY + 9.._posY + 9 + PLAYLIST_LINES*PLAYLIST_LINE_HEIGHT && relativeMouseX.toFloat() in _posX.._posX + width) { @@ -335,9 +342,11 @@ class MusicPlayerControl(private val ingame: TerrarumIngame) : UICanvas() { 1 -> { // prev // prev song if (mode < MODE_SHOW_LIST) { - MusicService.playPrevSongInPlaylist { - iHitTheStopButton = false - stopRequested = false + if (!transactionLocked) { + MusicService.playPrevSongInPlaylist(true) { + iHitTheStopButton = false + stopRequested = false + } } } // prev page in the playlist @@ -365,7 +374,7 @@ class MusicPlayerControl(private val ingame: TerrarumIngame) : UICanvas() { if (thisMusic is MusicContainer) thisMusic.let { ingame.backgroundMusicPlayer.queueMusicToPlayNext(it) } iHitTheStopButton = true*/ - MusicService.stopPlaylistPlayback { + MusicService.stopPlaylistPlayback(true) { iHitTheStopButton = true } } @@ -391,9 +400,11 @@ class MusicPlayerControl(private val ingame: TerrarumIngame) : UICanvas() { 3 -> { // next // next song if (mode < MODE_SHOW_LIST) { - MusicService.playNextSongInPlaylist { - iHitTheStopButton = false - stopRequested = false + if (!transactionLocked) { + MusicService.playNextSongInPlaylist(true) { + iHitTheStopButton = false + stopRequested = false + } } } // next page in the playlist @@ -435,9 +446,11 @@ class MusicPlayerControl(private val ingame: TerrarumIngame) : UICanvas() { if (index < currentPlaylist.musicList.size) { // if selected song != currently playing if (App.audioMixer.musicTrack.currentTrack == null || currentPlaylist.musicList[index] != App.audioMixer.musicTrack.currentTrack) { - MusicService.playNthSongInPlaylist(index) { - iHitTheStopButton = false - stopRequested = false + if (!transactionLocked) { + MusicService.playNthSongInPlaylist(index, true) { + iHitTheStopButton = false + stopRequested = false + } } } } @@ -452,9 +465,11 @@ class MusicPlayerControl(private val ingame: TerrarumIngame) : UICanvas() { // if selected album is not the same album currently playing, queue that album immediately // (navigating into the selected album involves too much complication :p) if (MusicService.currentPlaylist?.source != albumsList[index].canonicalPath) { - val playlist = loadNewAlbum(albumsList[index]) - MusicService.putNewPlaylistAndResumePlayback(playlist) { - resetPlaylistScroll(App.audioMixer.musicTrack.nextTrack as? MusicContainer) + if (!transactionLocked) { + val playlist = loadNewAlbum(albumsList[index]) + MusicService.putNewPlaylistAndResumePlayback(playlist, true) { + resetPlaylistScroll(App.audioMixer.musicTrack.nextTrack as? MusicContainer) + } } } } @@ -680,7 +695,7 @@ class MusicPlayerControl(private val ingame: TerrarumIngame) : UICanvas() { // debug codes //// transaction state - /*if (MusicService.transactionLocked) { + /*if (transactionLocked) { batch.color = Color.RED Toolkit.drawTextCentered(batch, App.fontSmallNumbers, "LOCKED", Toolkit.drawWidth, 0, _posY.toInt() + height + 5) } @@ -1020,7 +1035,7 @@ class MusicPlayerControl(private val ingame: TerrarumIngame) : UICanvas() { } private val playControlAnimAkku = FloatArray(5) // how many control buttons? - private val playControlAnimLength = 0.2f + private val playControlAnimLength = 0.16f private val colInactive = Color(0xaaaaaaff.toInt()) @@ -1043,7 +1058,7 @@ class MusicPlayerControl(private val ingame: TerrarumIngame) : UICanvas() { else 0f - val baseCol = if (MusicService.transactionLocked) colInactive else Color.WHITE + val baseCol = if (transactionLocked) colInactive else Color.WHITE if (alpha > 0f) { val alpha0 = alpha.coerceIn(0f, 1f).organicOvershoot().coerceAtMost(1f) diff --git a/src/net/torvald/terrarum/MusicService.kt b/src/net/torvald/terrarum/MusicService.kt index 69d920c55..38a0187bd 100644 --- a/src/net/torvald/terrarum/MusicService.kt +++ b/src/net/torvald/terrarum/MusicService.kt @@ -256,7 +256,7 @@ object MusicService : TransactionListener() { * @param playlist An instance of a [TerrarumMusicPlaylist] to be changed into * @param onSuccess What to do after the transaction */ - private fun createTransactionPlaylistChangeAndPlayImmediately(playlist: TerrarumMusicPlaylist, onSuccess: () -> Unit): Transaction { + private fun createTransactionPlaylistChangeAndPlayImmediately(playlist: TerrarumMusicPlaylist, fadeLen: Double, onSuccess: () -> Unit): Transaction { return object : Transaction { var oldPlaylist: TerrarumMusicPlaylist? = null var oldState = currentPlaybackState.get() @@ -273,7 +273,7 @@ object MusicService : TransactionListener() { if (App.audioMixer.musicTrack.isPlaying) { var fadedOut = false - App.audioMixer.requestFadeOut(App.audioMixer.musicTrack) { + App.audioMixer.requestFadeOut(App.audioMixer.musicTrack, fadeLen) { // put new playlist state["currentPlaylist"] = playlist @@ -329,7 +329,7 @@ object MusicService : TransactionListener() { } } - private fun createTransactionForNextMusicInPlaylist(onSuccess: () -> Unit): Transaction { + private fun createTransactionForNextMusicInPlaylist(fadeLen: Double, onSuccess: () -> Unit): Transaction { return object : Transaction { var oldState = currentPlaybackState.get() var oldAkku = waitAkku @@ -339,7 +339,7 @@ object MusicService : TransactionListener() { var fadedOut = false var err: Throwable? = null // request fadeout - App.audioMixer.requestFadeOut(App.audioMixer.musicTrack) { + App.audioMixer.requestFadeOut(App.audioMixer.musicTrack, fadeLen) { try { // do nothing, really @@ -374,7 +374,7 @@ object MusicService : TransactionListener() { } } - private fun createTransactionForPrevMusicInPlaylist(onSuccess: () -> Unit): Transaction { + private fun createTransactionForPrevMusicInPlaylist(fadeLen: Double, onSuccess: () -> Unit): Transaction { return object : Transaction { var oldState = currentPlaybackState.get() var oldAkku = waitAkku @@ -384,7 +384,7 @@ object MusicService : TransactionListener() { var fadedOut = false var err: Throwable? = null // request fadeout - App.audioMixer.requestFadeOut(App.audioMixer.musicTrack) { + App.audioMixer.requestFadeOut(App.audioMixer.musicTrack, fadeLen) { try { // unshift the playlist // FIREPLAY always pulls next track, that's why we need two prev() @@ -425,7 +425,7 @@ object MusicService : TransactionListener() { } } - private fun createTransactionForNthMusicInPlaylist(index: Int, onSuccess: () -> Unit): Transaction { + private fun createTransactionForNthMusicInPlaylist(index: Int, fadeLen: Double, onSuccess: () -> Unit): Transaction { return object : Transaction { var oldState = currentPlaybackState.get() var oldAkku = waitAkku @@ -435,7 +435,7 @@ object MusicService : TransactionListener() { var fadedOut = false var err: Throwable? = null // request fadeout - App.audioMixer.requestFadeOut(App.audioMixer.musicTrack) { + App.audioMixer.requestFadeOut(App.audioMixer.musicTrack, fadeLen) { try { // callback: play prev song in the playlist // queue the nth song on the playlist, the actual playback will be done by the state machine update @@ -584,11 +584,11 @@ object MusicService : TransactionListener() { else runTransaction(createTransactionPlaylistChange(playlist, {})) } - fun putNewPlaylistAndResumePlayback(playlist: TerrarumMusicPlaylist, onSuccess: (() -> Unit)? = null) { + fun putNewPlaylistAndResumePlayback(playlist: TerrarumMusicPlaylist, shortFade: Boolean = false, onSuccess: (() -> Unit)? = null) { if (onSuccess != null) - runTransaction(createTransactionPlaylistChangeAndPlayImmediately(playlist, onSuccess)) + runTransaction(createTransactionPlaylistChangeAndPlayImmediately(playlist, DEFAULT_FADEOUT_LEN / shortFade.toInt().plus(1), onSuccess)) else - runTransaction(createTransactionPlaylistChangeAndPlayImmediately(playlist, {})) + runTransaction(createTransactionPlaylistChangeAndPlayImmediately(playlist, DEFAULT_FADEOUT_LEN / shortFade.toInt().plus(1), {})) } fun putNewPlaylist(playlist: TerrarumMusicPlaylist, onSuccess: () -> Unit, onFinally: () -> Unit) { runTransaction(createTransactionPlaylistChange(playlist, onSuccess), onFinally) @@ -603,25 +603,25 @@ object MusicService : TransactionListener() { runTransaction(createTransactionPausePlaylistForMusicalFixture(action, musicFinished, onSuccess, onFailure), onFinally) } - fun playNextSongInPlaylist(onSuccess: () -> Unit) { - runTransaction(createTransactionForNextMusicInPlaylist(onSuccess)) + fun playNextSongInPlaylist(shortFade: Boolean = false, onSuccess: () -> Unit) { + runTransaction(createTransactionForNextMusicInPlaylist(DEFAULT_FADEOUT_LEN / shortFade.toInt().plus(1), onSuccess)) } - fun playNextSongInPlaylist(onSuccess: () -> Unit, onFinally: () -> Unit) { - runTransaction(createTransactionForNextMusicInPlaylist(onSuccess), onFinally) + fun playNextSongInPlaylist(shortFade: Boolean = false, onSuccess: () -> Unit, onFinally: () -> Unit) { + runTransaction(createTransactionForNextMusicInPlaylist(DEFAULT_FADEOUT_LEN / shortFade.toInt().plus(1), onSuccess), onFinally) } - fun playPrevSongInPlaylist(onSuccess: () -> Unit) { - runTransaction(createTransactionForPrevMusicInPlaylist(onSuccess)) + fun playPrevSongInPlaylist(shortFade: Boolean = false, onSuccess: () -> Unit) { + runTransaction(createTransactionForPrevMusicInPlaylist(DEFAULT_FADEOUT_LEN / shortFade.toInt().plus(1), onSuccess)) } - fun playPrevSongInPlaylist(onSuccess: () -> Unit, onFinally: () -> Unit) { - runTransaction(createTransactionForPrevMusicInPlaylist(onSuccess), onFinally) + fun playPrevSongInPlaylist(shortFade: Boolean = false, onSuccess: () -> Unit, onFinally: () -> Unit) { + runTransaction(createTransactionForPrevMusicInPlaylist(DEFAULT_FADEOUT_LEN / shortFade.toInt().plus(1), onSuccess), onFinally) } - fun playNthSongInPlaylist(index: Int, onSuccess: () -> Unit) { - runTransaction(createTransactionForNthMusicInPlaylist(index, onSuccess)) + fun playNthSongInPlaylist(index: Int, shortFade: Boolean = false, onSuccess: () -> Unit) { + runTransaction(createTransactionForNthMusicInPlaylist(index, DEFAULT_FADEOUT_LEN / shortFade.toInt().plus(1), onSuccess)) } - fun playNthSongInPlaylist(index: Int, onSuccess: () -> Unit, onFinally: () -> Unit) { - runTransaction(createTransactionForNthMusicInPlaylist(index, onSuccess), onFinally) + fun playNthSongInPlaylist(index: Int, shortFade: Boolean = false, onSuccess: () -> Unit, onFinally: () -> Unit) { + runTransaction(createTransactionForNthMusicInPlaylist(index, DEFAULT_FADEOUT_LEN / shortFade.toInt().plus(1), onSuccess), onFinally) } fun stopPlaylistPlayback(onSuccess: () -> Unit) {