forked from LeenkxTeam/LNXSDK
		
	
		
			
	
	
		
			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;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 |