fix: getFreeTrack() would return a track it just returned when the timing coincides

This commit is contained in:
minjaesong
2024-02-21 21:43:55 +09:00
parent 549c03c2b4
commit f7b0dfb5bb
5 changed files with 9 additions and 15 deletions

View File

@@ -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()
}
}
}

View File

@@ -381,15 +381,6 @@ class MixerTrackProcessor(bufferSize: Int, val rate: Int, val track: TerrarumAud
}
private fun <T> Queue<T>.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 {

View File

@@ -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()

View File

@@ -160,6 +160,7 @@ abstract class Actor : Comparable<Actor>, Runnable {
musicTracks[music] = track
musicTracks1.add(track.name)
track.stop()
track.trackingTarget = this
}
else {
// printdbg(this, "Could not get a free track")

View File

@@ -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) {