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... | ||
|  | 	// } | ||
|  | } |