From 86c6f008f9182c753d7da5496789c522013f4630 Mon Sep 17 00:00:00 2001 From: minjaesong Date: Mon, 8 Jul 2024 18:06:44 +0900 Subject: [PATCH] working arbitrary track queueing --- .../musicplayer/gui/MusicPlayerControl.kt | 4 +++- src/net/torvald/terrarum/MusicService.kt | 11 ++++++----- .../torvald/terrarum/TerrarumMusicPlaylist.kt | 18 +++++++++++++++--- .../terrarum/transaction/Transaction.kt | 15 +++++++++++++-- 4 files changed, 37 insertions(+), 11 deletions(-) diff --git a/MusicPlayer/src/net/torvald/terrarum/musicplayer/gui/MusicPlayerControl.kt b/MusicPlayer/src/net/torvald/terrarum/musicplayer/gui/MusicPlayerControl.kt index f1c8d553a..ad7c7d917 100644 --- a/MusicPlayer/src/net/torvald/terrarum/musicplayer/gui/MusicPlayerControl.kt +++ b/MusicPlayer/src/net/torvald/terrarum/musicplayer/gui/MusicPlayerControl.kt @@ -1051,6 +1051,8 @@ class MusicPlayerControl(private val ingame: TerrarumIngame) : UICanvas() { private val playControlAnimAkku = FloatArray(5) // how many control buttons? private val playControlAnimLength = 0.2f + private val colInactive = Color(0xaaaaaaff.toInt()) + private fun drawControls(delta: Float, batch: SpriteBatch, posX: Float, posY: Float) { val (alpha, reverse) = if (mode < MODE_MOUSE_UP && modeNext == MODE_MOUSE_UP) (transitionAkku / TRANSITION_LENGTH).let { if (it.isNaN()) 0f else it } to false @@ -1070,7 +1072,7 @@ class MusicPlayerControl(private val ingame: TerrarumIngame) : UICanvas() { else 0f - val baseCol = if (MusicService.transactionLocked) Color.RED else Color.WHITE + val baseCol = if (MusicService.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 db96dcf80..191e1ec42 100644 --- a/src/net/torvald/terrarum/MusicService.kt +++ b/src/net/torvald/terrarum/MusicService.kt @@ -114,14 +114,14 @@ object MusicService : TransactionListener() { override fun onFailure(e: Throwable, state: TransactionState) { printdbg(this, "FIREPLAY resume OK but startMusic failed, entering intermission") - enterSTATE_INTERMISSION(getRandomMusicInterval()) // will try again after a random interval + enterIntermissionAndWaitForPlaylist() // will try again } }) }, /* onFailure: (Throwable) -> Unit */ { printdbg(this, "FIREPLAY resume failed, entering intermission") - enterSTATE_INTERMISSION(getRandomMusicInterval()) // will try again after a random interval + enterIntermissionAndWaitForPlaylist() // will try again }, // onFinally: () -> Unit { @@ -297,7 +297,6 @@ object MusicService : TransactionListener() { } override fun onSuccess(state: TransactionState) { - enterSTATE_INTERMISSION(0f) enterSTATE_FIREPLAY() onSuccess() @@ -320,8 +319,8 @@ object MusicService : TransactionListener() { App.audioMixer.requestFadeOut(App.audioMixer.musicTrack) { try { // callback: play prev song in the playlist - // TODO queue the nth song on the playlist, the actual playback will be done by the state machine update - + // queue the nth song on the playlist, the actual playback will be done by the state machine update + (state["currentPlaylist"] as TerrarumMusicPlaylist).queueNthSong(index) fadedOut = true } @@ -335,6 +334,8 @@ object MusicService : TransactionListener() { } override fun onSuccess(state: TransactionState) { + enterSTATE_INTERMISSION(0f) + enterSTATE_FIREPLAY() onSuccess() } override fun onFailure(e: Throwable, state: TransactionState) { diff --git a/src/net/torvald/terrarum/TerrarumMusicPlaylist.kt b/src/net/torvald/terrarum/TerrarumMusicPlaylist.kt index 75214bce1..d11f51642 100644 --- a/src/net/torvald/terrarum/TerrarumMusicPlaylist.kt +++ b/src/net/torvald/terrarum/TerrarumMusicPlaylist.kt @@ -84,9 +84,21 @@ class TerrarumMusicPlaylist( } fun queueNthSong(n: Int): MusicContainer { - checkRefill() - internalIndices.add(currentIndexCursor, n) - currentIndexCursor -= 1 + if (shuffled) { + internalIndices.clear() + refillInternalIndices() + internalIndices.add(n) + refillInternalIndices() + currentIndexCursor = musicList.size - 1 + } + else { + internalIndices.clear() + refillInternalIndices() + refillInternalIndices() + currentIndexCursor = musicList.size - 1 + n + checkRefill() + } + return musicList[internalIndices[currentIndexCursor]] } diff --git a/src/net/torvald/terrarum/transaction/Transaction.kt b/src/net/torvald/terrarum/transaction/Transaction.kt index 584119dbe..f4b0692de 100644 --- a/src/net/torvald/terrarum/transaction/Transaction.kt +++ b/src/net/torvald/terrarum/transaction/Transaction.kt @@ -33,6 +33,17 @@ abstract class TransactionListener { val transactionLockingClass: AtomicReference = AtomicReference(null) val transactionLocked: Boolean; get() = (transactionLockingClass.get() != null) + private fun acquireLock(locker: Transaction) { + synchronized(this) { + transactionLockingClass.set(locker) + } + } + + private fun releaseLock() { + synchronized(this) { + transactionLockingClass.set(null) + } + } /** * Transaction modifies a given state to a new state, then applies the new state to the object. @@ -47,7 +58,7 @@ abstract class TransactionListener { val state = getCurrentStatusForTransaction() val currentLock = transactionLockingClass.get() if (currentLock == null) { - transactionLockingClass.set(transaction) + acquireLock(transaction) try { transaction.start(state) // if successful: @@ -62,7 +73,7 @@ abstract class TransactionListener { transaction.onFailure(e, state) } finally { - transactionLockingClass.set(null) + releaseLock() onFinally() } }