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;
 | 
						|
	}
 | 
						|
}
 |