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