diff --git a/src/net/torvald/terrarum/audio/AudioMixer.kt b/src/net/torvald/terrarum/audio/AudioMixer.kt index 55827bfe5..10512e5ac 100644 --- a/src/net/torvald/terrarum/audio/AudioMixer.kt +++ b/src/net/torvald/terrarum/audio/AudioMixer.kt @@ -124,7 +124,7 @@ class AudioMixer : Disposable { */ fun getFreeTrackNoMatterWhat(): TerrarumAudioMixerTrack { synchronized(this) { - return getFreeTrack() ?: dynamicTracks.minBy { it.playStartedTime } + return getFreeTrack() ?: dynamicTracks.minBy { it.playStartedTime }.also { it.checkedOutTime = System.nanoTime() } } } @@ -134,7 +134,10 @@ class AudioMixer : Disposable { fun getFreeTrack(): TerrarumAudioMixerTrack? { synchronized(this) { return dynamicTracks.filter { it.trackingTarget == null && !it.isPlaying } - .minByOrNull { it.playStartedTime } + .minByOrNull { maxOf(it.checkedOutTime, it.playStartedTime) } + .also { + it?.checkedOutTime = System.nanoTime() + } } } diff --git a/src/net/torvald/terrarum/audio/MixerTrackProcessor.kt b/src/net/torvald/terrarum/audio/MixerTrackProcessor.kt index 5e0f08e61..e1504e7ae 100644 --- a/src/net/torvald/terrarum/audio/MixerTrackProcessor.kt +++ b/src/net/torvald/terrarum/audio/MixerTrackProcessor.kt @@ -381,15 +381,6 @@ class MixerTrackProcessor(bufferSize: Int, val rate: Int, val track: TerrarumAud } -private fun Queue.removeFirstOrElse(function: () -> T): T { - return if (this.isEmpty) { - this.removeFirst() - } - else { - function() - } -} - class FeedSamplesToAdev(val bufferSize: Int, val rate: Int, val track: TerrarumAudioMixerTrack) : Runnable { init { diff --git a/src/net/torvald/terrarum/audio/TerrarumAudioMixerTrack.kt b/src/net/torvald/terrarum/audio/TerrarumAudioMixerTrack.kt index 87fdf86d7..5db2c266b 100644 --- a/src/net/torvald/terrarum/audio/TerrarumAudioMixerTrack.kt +++ b/src/net/torvald/terrarum/audio/TerrarumAudioMixerTrack.kt @@ -65,7 +65,7 @@ class TerrarumAudioMixerTrack( internal val streamPlaying = AtomicBoolean(false) var playStartedTime = 0L; internal set - + var checkedOutTime = 0L; internal set fun copyStatusTo(other: TerrarumAudioMixerTrack) { other.pullNextTrack = this.pullNextTrack @@ -163,7 +163,7 @@ class TerrarumAudioMixerTrack( fun stop() { printdbg("TerrarumAudioMixerTrack $name", "Stop music (mixertrack=${this.name}, musictrack=$currentTrack)") - printStackTrace("TerrarumAudioMixerTrack $name") +// printStackTrace("TerrarumAudioMixerTrack $name") currentTrack?.reset() diff --git a/src/net/torvald/terrarum/gameactors/Actor.kt b/src/net/torvald/terrarum/gameactors/Actor.kt index 5a8ba8485..10225d8fd 100644 --- a/src/net/torvald/terrarum/gameactors/Actor.kt +++ b/src/net/torvald/terrarum/gameactors/Actor.kt @@ -160,6 +160,7 @@ abstract class Actor : Comparable, Runnable { musicTracks[music] = track musicTracks1.add(track.name) track.stop() + track.trackingTarget = this } else { // printdbg(this, "Could not get a free track") diff --git a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureFurnaceAndAnvil.kt b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureFurnaceAndAnvil.kt index c6fc605d2..a5984b767 100644 --- a/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureFurnaceAndAnvil.kt +++ b/src/net/torvald/terrarum/modulebasegame/gameactors/FixtureFurnaceAndAnvil.kt @@ -112,8 +112,7 @@ class FixtureFurnaceAndAnvil : FixtureBase, CraftingStation { // manage audio getTrackByAudio(static).let { - printdbg(this, "hasbuf=${it?.processor?.streamBuf}, playing=${it?.isPlaying}, playRequested=${it?.playRequested}") - +// printdbg(this, "Checking out track ${it?.name}") if (it != null) { if (audioStatus == 0) {