blob: 82211bd6e59acf9c05426355c4ccdef46dfab79a [file] [log] [blame]
<!DOCTYPE html>
<html>
<head>
<title>
automatic-pull-node.html
</title>
<script src="../../imported/w3c/web-platform-tests/resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<script src="../resources/audit-util.js"></script>
<script src="../resources/audit.js"></script>
</head>
<body>
<script id="layout-test-code">
// This test verifies that the AudioBasicInspectorNode based nodes work
// correctly
let audit = Audit.createTaskRunner();
let sampleRate = 44100.0;
// We carefully arrange the renderLengthInFrames to be a multiple of the
// AudioNode rendering quantum (AudioNode::ProcessingSizeInFrames) so that
// AudioSourceNode will not feed tailing zeroes into the context and fail
// this test.
let renderLengthInFrames = 256;
let fftSize = 64;
let audioDataOne = 255; // Audio data 1.0 in Uint8 format will be 255.
let audioDataZero = 128; // Audio data 0 in Uint8 format will be 128.
let context;
let constantBuffer;
let bufferSource;
let analyser;
function constructCommonGraph() {
// Create offline audio context.
context = new OfflineAudioContext(1, renderLengthInFrames, sampleRate);
constantBuffer = createConstantBuffer(context, renderLengthInFrames, 1);
bufferSource = context.createBufferSource();
bufferSource.buffer = constantBuffer;
analyser = context.createAnalyser();
analyser.fftSize = fftSize;
bufferSource.connect(analyser);
}
function test1Finished(should) {
let timeDomainData = new Uint8Array(fftSize);
analyser.getByteTimeDomainData(timeDomainData);
should(
timeDomainData[0] >= audioDataOne,
'RealtimeAnalyserNode got pulled when connected from upstream node but not to downstream node')
.beTrue();
}
// To verify the realtimeAnalyser can pull data when there is an upstream
// node connected to it but it's not connected to a downstream node.
audit.define('test1', function(task, should) {
constructCommonGraph();
bufferSource.start(0);
context.startRendering()
.then(function() {
test1Finished(should);
})
.then(task.done.bind(task));
});
function test2Finished(should) {
let timeDomainData = new Uint8Array(fftSize);
analyser.getByteTimeDomainData(timeDomainData);
should(
timeDomainData[0] >= audioDataOne,
'RealtimeAnalyserNode got pulled when connected from upstream node and to destination node')
.beTrue();
}
// To verify the realtimeAnalyser can process normally when there is an
// upstream node connected to it and it's also connected to a downstream
// node which ultimately connect to audio destination.
audit.define('test2', function(task, should) {
constructCommonGraph();
analyser.connect(context.destination);
bufferSource.start(0);
context.startRendering()
.then(function() {
test2Finished(should);
})
.then(task.done.bind(task));
});
function test3Finished(should) {
let timeDomainData = new Uint8Array(fftSize);
analyser.getByteTimeDomainData(timeDomainData);
// If realtimeAnalyser hasn't pulled any data, the data in buffer will
// be 0.
should(
timeDomainData[0] == audioDataZero,
'RealtimeAnalyserNode didn\'t get pulled when it should not')
.beTrue();
;
}
// To verify the realtimeAnalyser will stop pulling if it is connected to
// a downstream node which is not ultimatly connected to any audio
// destination.
audit.define('test3', function(task, should) {
constructCommonGraph();
let gain = context.createGain();
analyser.connect(gain);
bufferSource.start(0);
context.startRendering()
.then(function() {
test3Finished(should);
})
.then(task.done.bind(task));
});
audit.run();
</script>
</body>
</html>