122 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
			
		
		
	
	
			122 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Haxe
		
	
	
	
	
	
| package auratests;
 | |
| 
 | |
| import utest.Assert;
 | |
| 
 | |
| import kha.arrays.Float32Array;
 | |
| 
 | |
| import aura.Aura;
 | |
| import aura.Types.Hertz;
 | |
| import aura.types.AudioBuffer;
 | |
| import aura.utils.BufferUtils;
 | |
| 
 | |
| import Utils;
 | |
| 
 | |
| class StaticValueGenerator extends aura.channels.generators.BaseGenerator {
 | |
| 	public var counter = 0;
 | |
| 
 | |
| 	inline function new() {}
 | |
| 
 | |
| 	public static function create(): BaseChannelHandle {
 | |
| 		return new BaseChannelHandle(new StaticValueGenerator());
 | |
| 	}
 | |
| 
 | |
| 	function nextSamples(requestedSamples: AudioBuffer, sampleRate: Hertz) {
 | |
| 		for (i in 0...requestedSamples.channelLength) {
 | |
| 			for (c in 0...requestedSamples.numChannels) {
 | |
| 				requestedSamples.getChannelView(c)[i] = (++counter) / 4096;
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| 
 | |
| @:access(aura.Aura)
 | |
| class TestAura extends utest.Test {
 | |
| 	final staticInput = StaticValueGenerator.create();
 | |
| 
 | |
| 	function setup() {
 | |
| 		staticInput.play();
 | |
| 		@:privateAccess (cast staticInput.channel: StaticValueGenerator).counter = 0;
 | |
| 		Aura.blockBufPos = 0;
 | |
| 	}
 | |
| 
 | |
| 	function teardown() {
 | |
| 		staticInput.setMixChannel(null);
 | |
| 	}
 | |
| 
 | |
| 	function test_audioCallback_zeroIfNoInput() {
 | |
| 		final compareArray = createEmptyF32Array(Aura.BLOCK_SIZE);
 | |
| 
 | |
| 		final buffer = new kha.audio2.Buffer(Aura.BLOCK_SIZE, 2, 44100);
 | |
| 		fillBuffer(buffer.data, -1.0); // Poison buffer
 | |
| 
 | |
| 		Aura.audioCallback(new kha.internal.IntBox(Aura.BLOCK_SIZE), buffer);
 | |
| 		assertEqualsFloat32Array(compareArray, buffer.data);
 | |
| 	}
 | |
| 
 | |
| 	function test_audioCallback_zeroIfNoSampleCache() {
 | |
| 		final compareArray = createEmptyF32Array(Aura.BLOCK_SIZE);
 | |
| 
 | |
| 		staticInput.setMixChannel(Aura.masterChannel);
 | |
| 
 | |
| 		// Force sampleCache to be null
 | |
| 		Aura.p_samplesBuffer.set(null);
 | |
| 		kha.audio2.Audio.disableGcInteractions = true;
 | |
| 
 | |
| 		final buffer = new kha.audio2.Buffer(Aura.BLOCK_SIZE, 2, 44100);
 | |
| 		fillBuffer(buffer.data, -1.0); // Poison buffer
 | |
| 
 | |
| 		Aura.audioCallback(new kha.internal.IntBox(Aura.BLOCK_SIZE), buffer);
 | |
| 		assertEqualsFloat32Array(compareArray, buffer.data);
 | |
| 	}
 | |
| 
 | |
| 	function test_audioCallback_contiguouslyWritesBlocksToOutput() {
 | |
| 		final numRequestedSamples = Aura.BLOCK_SIZE * 2 + 2;
 | |
| 
 | |
| 		final compareArray = new Float32Array(numRequestedSamples);
 | |
| 		for (i in 0...compareArray.length) {
 | |
| 			compareArray[i] = (i + 1) / 4096;
 | |
| 		}
 | |
| 
 | |
| 		staticInput.setMixChannel(Aura.masterChannel);
 | |
| 
 | |
| 		final buffer = new kha.audio2.Buffer(numRequestedSamples, 2, 44100);
 | |
| 		fillBuffer(buffer.data, -1.0); // Poison buffer
 | |
| 
 | |
| 		Aura.audioCallback(new kha.internal.IntBox(numRequestedSamples), buffer);
 | |
| 		assertEqualsFloat32Array(compareArray, buffer.data);
 | |
| 	}
 | |
| 
 | |
| 	function test_audioCallback_splitLargeBlockOverMultipleCallbacks() {
 | |
| 		final numRequestedSamples = Std.int(Aura.BLOCK_SIZE / 2) - 2;
 | |
| 
 | |
| 		final compareArray = new Float32Array(3 * numRequestedSamples);
 | |
| 		for (i in 0...compareArray.length) {
 | |
| 			compareArray[i] = (i + 1) / 4096;
 | |
| 		}
 | |
| 
 | |
| 		staticInput.setMixChannel(Aura.masterChannel);
 | |
| 
 | |
| 		final buffer = new kha.audio2.Buffer(numRequestedSamples, 2, 44100);
 | |
| 		fillBuffer(buffer.data, -1.0); // Poison buffer
 | |
| 		Aura.audioCallback(new kha.internal.IntBox(numRequestedSamples), buffer);
 | |
| 
 | |
| 		assertEqualsFloat32Array(compareArray.subarray(0, numRequestedSamples), buffer.data);
 | |
| 
 | |
| 		fillBuffer(buffer.data, -1.0); // Poison buffer
 | |
| 		Aura.audioCallback(new kha.internal.IntBox(numRequestedSamples), buffer);
 | |
| 		assertEqualsFloat32Array(compareArray.subarray(numRequestedSamples, numRequestedSamples * 2), buffer.data);
 | |
| 
 | |
| 		fillBuffer(buffer.data, -1.0); // Poison buffer
 | |
| 		Aura.audioCallback(new kha.internal.IntBox(numRequestedSamples), buffer);
 | |
| 		assertEqualsFloat32Array(compareArray.subarray(numRequestedSamples * 2, numRequestedSamples * 3), buffer.data);
 | |
| 	}
 | |
| 
 | |
| 	// TODO
 | |
| 	// function test_audioCallback_synchronizesMasterChannel() {}
 | |
| 	// function test_audioCallback_updatesTime() {}
 | |
| 	// function test_audioCallback_numChannelsOtherThanNUM_OUTPUT_CHANNELS() {
 | |
| 		// TODO this needs changes in the audio callback. Too dynamic? But Kha might request this...
 | |
| 	// }
 | |
| }
 |