Mix partial stream PCM without copying stale buffer tails

This commit is contained in:
evgeny committed 2026-10-21 01:11:35 +02:00
1 parent c6ed01110e
commit 50cf61e9cd
2 files changed
+14 -4

No files matched your search

@@ -30,14 +30,14 @@ internal class StreamMixBuffer(val frames: Int = 480) {
private var gain = 1f
fun clear() = sum.fill(0f)
fun add(pcm: ShortArray, fadeFrames: Int = 480): Int {
require(pcm.size <= sum.size && pcm.size % 2 == 0)
for (i in 0 until pcm.size / 2) {
fun add(pcm: ShortArray, fadeFrames: Int = 480, count: Int = pcm.size / 2): Int {
require(pcm.size % 2 == 0 && count in 0..min(frames, pcm.size / 2))
for (i in 0 until count) {
val volume = min(1f, (fadeFrames + i + 1) / 480f) / 32768f
sum[2 * i] += pcm[2 * i] * volume
sum[2 * i + 1] += pcm[2 * i + 1] * volume
}
return min(480, fadeFrames + pcm.size / 2)
return min(480, fadeFrames + count)
}
fun finish(): ShortArray {
@@ -7,6 +7,16 @@ import kotlin.math.abs
import kotlin.math.sin
class StreamAudioMixTest {
@Test fun reusedPcmOnlyMixesTheNewlyPreparedPrefix() {
val mix = StreamMixBuffer()
val pcm = ShortArray(960) { 12000 }
mix.clear(); assertEquals(480, mix.add(pcm, 480, 120))
val output = mix.finish()
for (i in output.indices) assertEquals(if (i < 240) 12000 else 0, output[i].toInt())
mix.clear(); mix.add(pcm, 480, 0)
assertTrue(mix.finish().all { it == 0.toShort() })
}
@Test fun joiningAndResetUseTheirOwnOutputOrigin() {
val first = StreamMixTimeline()
first.append(0, 480); first.append(480, 480)