mirror of
https://github.com/servo/servo.git
synced 2025-08-03 04:30:10 +01:00
139 lines
4.9 KiB
HTML
139 lines
4.9 KiB
HTML
<!DOCTYPE html>
|
|
<html>
|
|
<head>
|
|
<title>
|
|
panner-equalpower.html
|
|
</title>
|
|
<script src="/resources/testharness.js"></script>
|
|
<script src="/resources/testharnessreport.js"></script>
|
|
<script src="../../resources/audit-util.js"></script>
|
|
<script src="../../resources/audit.js"></script>
|
|
<script src="../../resources/panner-model-testing.js"></script>
|
|
</head>
|
|
<body>
|
|
<script id="layout-test-code">
|
|
let audit = Audit.createTaskRunner();
|
|
|
|
// To test the panner, we create a number of panner nodes
|
|
// equally spaced on a semicircle at unit distance. The
|
|
// semicircle covers the azimuth range from -90 to 90 deg,
|
|
// covering full left to full right. Each source is an impulse
|
|
// turning at a different time and we check that the rendered
|
|
// impulse has the expected gain.
|
|
audit.define(
|
|
{
|
|
label: 'test',
|
|
description: 'Equal-power panner model of AudioPannerNode',
|
|
},
|
|
(task, should) => {
|
|
// Create offline audio context.
|
|
context = new OfflineAudioContext(
|
|
2, sampleRate * renderLengthSeconds, sampleRate);
|
|
|
|
createTestAndRun(
|
|
context, should, nodesToCreate, 1,
|
|
function(panner, x, y, z) {
|
|
panner.setPosition(x, y, z);
|
|
})
|
|
.then(() => task.done());
|
|
;
|
|
});
|
|
|
|
// Test that a mono source plays out on both the left and right channels
|
|
// when the source and listener positions are the same.
|
|
audit.define(
|
|
{
|
|
label: 'mono source=listener',
|
|
description: 'Source and listener at the same position'
|
|
},
|
|
(task, should) => {
|
|
// Must be stereo to verify output and only need a short duration
|
|
let context =
|
|
new OfflineAudioContext(2, 0.25 * sampleRate, sampleRate);
|
|
|
|
// Arbitrary position for source and listener. Just so we don't use
|
|
// defaults positions.
|
|
let x = 1;
|
|
let y = 2;
|
|
let z = 3;
|
|
|
|
context.listener.setPosition(x, y, z);
|
|
|
|
let src = new OscillatorNode(context);
|
|
let panner = new PannerNode(context, {
|
|
panningModel: 'equalpower',
|
|
positionX: x,
|
|
positionY: y,
|
|
positionZ: z
|
|
});
|
|
|
|
src.connect(panner).connect(context.destination);
|
|
|
|
src.start();
|
|
|
|
context.startRendering()
|
|
.then(renderedBuffer => {
|
|
// Verify that both channels have the same data because they
|
|
// should when the source and listener are at the same
|
|
// position
|
|
let c0 = renderedBuffer.getChannelData(0);
|
|
let c1 = renderedBuffer.getChannelData(1);
|
|
should(c0, 'Mono: Left and right channels').beEqualToArray(c1);
|
|
})
|
|
.then(() => task.done());
|
|
});
|
|
|
|
// Test that a stereo source plays out on both the left and right channels
|
|
// when the source and listener positions are the same.
|
|
audit.define(
|
|
{
|
|
label: 'stereo source=listener',
|
|
description: 'Source and listener at the same position'
|
|
},
|
|
(task, should) => {
|
|
// Must be stereo to verify output and only need a short duration.
|
|
let context =
|
|
new OfflineAudioContext(2, 0.25 * sampleRate, sampleRate);
|
|
|
|
// Arbitrary position for source and listener. Just so we don't use
|
|
// defaults positions.
|
|
let x = 1;
|
|
let y = 2;
|
|
let z = 3;
|
|
|
|
context.listener.setPosition(x, y, z);
|
|
|
|
let src = new OscillatorNode(context);
|
|
let merger = new ChannelMergerNode(context, {numberOfInputs: 2});
|
|
let panner = new PannerNode(context, {
|
|
panningModel: 'equalpower',
|
|
positionX: x,
|
|
positionY: y,
|
|
positionZ: z
|
|
});
|
|
|
|
// Make the oscillator a stereo signal (with identical signals on
|
|
// each channel).
|
|
src.connect(merger, 0, 0);
|
|
src.connect(merger, 0, 1);
|
|
|
|
merger.connect(panner).connect(context.destination);
|
|
|
|
src.start();
|
|
|
|
context.startRendering()
|
|
.then(renderedBuffer => {
|
|
// Verify that both channels have the same data because they
|
|
// should when the source and listener are at the same
|
|
// position.
|
|
let c0 = renderedBuffer.getChannelData(0);
|
|
let c1 = renderedBuffer.getChannelData(1);
|
|
should(c0, 'Stereo: Left and right channels').beEqualToArray(c1);
|
|
})
|
|
.then(() => task.done());
|
|
});
|
|
|
|
audit.run();
|
|
</script>
|
|
</body>
|
|
</html>
|