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