219 lines
5.8 KiB
Haxe
219 lines
5.8 KiB
Haxe
package auratests.channels;
|
|
|
|
import utest.Assert;
|
|
|
|
import kha.arrays.Float32Array;
|
|
|
|
import aura.Types.Balance;
|
|
import aura.channels.UncompBufferChannel;
|
|
import aura.dsp.sourcefx.SourceEffect;
|
|
import aura.types.AudioBuffer;
|
|
|
|
@:access(aura.channels.UncompBufferChannel)
|
|
class TestUncompBufferChannel extends utest.Test {
|
|
static inline var channelLength = 16;
|
|
|
|
var audioChannel: UncompBufferChannel;
|
|
var sourceFX1: SourceFXDummy;
|
|
var sourceFX2: SourceFXDummy;
|
|
|
|
final data = new Float32Array(2 * channelLength);
|
|
|
|
function setupClass() {}
|
|
|
|
function setup() {
|
|
audioChannel = new UncompBufferChannel(data, false);
|
|
sourceFX1 = new SourceFXDummy();
|
|
sourceFX2 = new SourceFXDummy();
|
|
|
|
audioChannel.addSourceEffect(sourceFX1);
|
|
audioChannel.addSourceEffect(sourceFX2);
|
|
}
|
|
|
|
function teardown() {}
|
|
|
|
function test_optionallyApplySourceEffects_isAppliedOnFirstPlay_ifNoEffectIsConfiguredToApplyOnReplay() {
|
|
sourceFX1.applyOnReplay.store(false);
|
|
sourceFX2.applyOnReplay.store(false);
|
|
|
|
Assert.isFalse(sourceFX1.wasProcessCalled);
|
|
Assert.isFalse(sourceFX2.wasProcessCalled);
|
|
|
|
audioChannel.play(false);
|
|
|
|
Assert.isTrue(sourceFX1.wasProcessCalled);
|
|
Assert.isTrue(sourceFX2.wasProcessCalled);
|
|
}
|
|
|
|
function test_optionallyApplySourceEffects_isAppliedOnFirstPlay_ifAnyEffectIsConfiguredToApplyOnReplay() {
|
|
sourceFX1.applyOnReplay.store(false);
|
|
sourceFX2.applyOnReplay.store(true);
|
|
|
|
Assert.isFalse(sourceFX1.wasProcessCalled);
|
|
Assert.isFalse(sourceFX2.wasProcessCalled);
|
|
|
|
audioChannel.play(false);
|
|
|
|
Assert.isTrue(sourceFX1.wasProcessCalled);
|
|
Assert.isTrue(sourceFX2.wasProcessCalled);
|
|
}
|
|
|
|
|
|
function test_optionallyApplySourceEffects_isNotAppliedOnSecondPlayAfterFinish_ifNoEffectIsConfiguredToApplyOnReplay() {
|
|
sourceFX1.applyOnReplay.store(false);
|
|
sourceFX2.applyOnReplay.store(false);
|
|
|
|
audioChannel.play(false);
|
|
audioChannel.stop();
|
|
|
|
sourceFX1.wasProcessCalled = false;
|
|
sourceFX2.wasProcessCalled = false;
|
|
|
|
audioChannel.play(false);
|
|
|
|
Assert.isFalse(sourceFX1.wasProcessCalled);
|
|
Assert.isFalse(sourceFX2.wasProcessCalled);
|
|
}
|
|
|
|
function test_optionallyApplySourceEffects_isAppliedOnSecondPlayAfterFinish_ifAnyEffectIsConfiguredToApplyOnReplay() {
|
|
sourceFX1.applyOnReplay.store(false);
|
|
sourceFX2.applyOnReplay.store(true);
|
|
|
|
audioChannel.play(false);
|
|
audioChannel.stop();
|
|
|
|
sourceFX1.wasProcessCalled = false;
|
|
sourceFX2.wasProcessCalled = false;
|
|
|
|
audioChannel.play(false);
|
|
|
|
Assert.isTrue(sourceFX1.wasProcessCalled);
|
|
Assert.isTrue(sourceFX2.wasProcessCalled);
|
|
}
|
|
|
|
function test_optionallyApplySourceEffects_isNotAppliedOnPlayAfterPause_ifNoEffectIsConfiguredToApplyOnReplay() {
|
|
sourceFX1.applyOnReplay.store(false);
|
|
sourceFX2.applyOnReplay.store(false);
|
|
|
|
audioChannel.play(false);
|
|
audioChannel.pause();
|
|
|
|
sourceFX1.wasProcessCalled = false;
|
|
sourceFX2.wasProcessCalled = false;
|
|
|
|
audioChannel.play(false);
|
|
|
|
Assert.isFalse(sourceFX1.wasProcessCalled);
|
|
Assert.isFalse(sourceFX2.wasProcessCalled);
|
|
}
|
|
|
|
function test_optionallyApplySourceEffects_isNotAppliedOnPlayAfterPause_ifAnyEffectIsConfiguredToApplyOnReplay() {
|
|
sourceFX1.applyOnReplay.store(false);
|
|
sourceFX2.applyOnReplay.store(true);
|
|
|
|
audioChannel.play(false);
|
|
audioChannel.pause();
|
|
|
|
sourceFX1.wasProcessCalled = false;
|
|
sourceFX2.wasProcessCalled = false;
|
|
|
|
audioChannel.play(false);
|
|
|
|
Assert.isFalse(sourceFX1.wasProcessCalled);
|
|
Assert.isFalse(sourceFX2.wasProcessCalled);
|
|
}
|
|
|
|
function test_optionallyApplySourceEffects_isNotAppliedOnRetrigger_ifNoEffectIsConfiguredToApplyOnReplay() {
|
|
sourceFX1.applyOnReplay.store(false);
|
|
sourceFX2.applyOnReplay.store(false);
|
|
|
|
audioChannel.play(false);
|
|
|
|
sourceFX1.wasProcessCalled = false;
|
|
sourceFX2.wasProcessCalled = false;
|
|
|
|
audioChannel.play(true);
|
|
|
|
Assert.isFalse(sourceFX1.wasProcessCalled);
|
|
Assert.isFalse(sourceFX2.wasProcessCalled);
|
|
}
|
|
|
|
function test_optionallyApplySourceEffects_isAppliedOnRetrigger_ifAnyEffectIsConfiguredToApplyOnReplay() {
|
|
sourceFX1.applyOnReplay.store(false);
|
|
sourceFX2.applyOnReplay.store(true);
|
|
|
|
audioChannel.play(false);
|
|
|
|
sourceFX1.wasProcessCalled = false;
|
|
sourceFX2.wasProcessCalled = false;
|
|
|
|
audioChannel.play(true);
|
|
|
|
Assert.isTrue(sourceFX1.wasProcessCalled);
|
|
Assert.isTrue(sourceFX2.wasProcessCalled);
|
|
}
|
|
|
|
function test_optionallyApplySourceEffects_isAppliedOnConsecutivePlays_ifEffectsHaveChanged() {
|
|
sourceFX1.applyOnReplay.store(false);
|
|
sourceFX2.applyOnReplay.store(false);
|
|
|
|
audioChannel.play(false);
|
|
audioChannel.stop();
|
|
|
|
sourceFX1.wasProcessCalled = false;
|
|
sourceFX2.wasProcessCalled = false;
|
|
|
|
final tempSourceFX = new SourceFXDummy();
|
|
audioChannel.addSourceEffect(tempSourceFX);
|
|
|
|
audioChannel.play(false);
|
|
|
|
Assert.isTrue(sourceFX1.wasProcessCalled);
|
|
Assert.isTrue(sourceFX2.wasProcessCalled);
|
|
|
|
audioChannel.stop();
|
|
|
|
sourceFX1.wasProcessCalled = false;
|
|
sourceFX2.wasProcessCalled = false;
|
|
|
|
audioChannel.removeSourceEffect(tempSourceFX);
|
|
|
|
audioChannel.play(false);
|
|
|
|
Assert.isTrue(sourceFX1.wasProcessCalled);
|
|
Assert.isTrue(sourceFX2.wasProcessCalled);
|
|
}
|
|
|
|
function test_nextSamples_onLoop_ApplySourceEffectsOnce() {
|
|
audioChannel.looping = true;
|
|
|
|
Assert.equals(0, sourceFX1.numProcessCalled);
|
|
Assert.equals(0, sourceFX2.numProcessCalled);
|
|
|
|
final outBuffer = new AudioBuffer(2, channelLength + 1);
|
|
audioChannel.nextSamples(outBuffer, 1000);
|
|
|
|
// Make sure process is only called once for _all_ channels
|
|
Assert.equals(1, sourceFX1.numProcessCalled);
|
|
Assert.equals(1, sourceFX2.numProcessCalled);
|
|
}
|
|
}
|
|
|
|
|
|
private class SourceFXDummy extends SourceEffect {
|
|
public var wasProcessCalled = false;
|
|
public var numProcessCalled = 0;
|
|
|
|
public function new() {}
|
|
|
|
function calculateRequiredChannelLength(srcChannelLength: Int): Int {
|
|
return srcChannelLength;
|
|
}
|
|
|
|
function process(srcBuffer: AudioBuffer, srcChannelLength: Int, dstBuffer: AudioBuffer): Int {
|
|
wasProcessCalled = true;
|
|
numProcessCalled++;
|
|
return srcChannelLength;
|
|
}
|
|
}
|