Mix partial stream PCM without copying stale buffer tails
This commit is contained in:
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)
|
||||
|
||||
Reference in new issue
Block a user