<!DOCTYPE html>

<!--
Tests that an audio-rate signal (AudioNode output) can be connected to an AudioParam.
Specifically, this tests that an audio-rate signal coming from an AudioBufferSourceNode
playing an AudioBuffer containing a specific curve can be connected to an AudioGainNode's
.gain attribute (an AudioParam).  Another AudioBufferSourceNode will be the audio source
having its gain changed.  We load this one with an AudioBuffer containing a constant value of 1.
Thus it's easy to check that the resultant signal should be equal to the gain-scaling curve.
-->

<html>
<head>
<link rel="stylesheet" href="../fast/js/resources/js-test-style.css"/>
<script src="resources/audio-testing.js"></script>
<script src="../fast/js/resources/js-test-pre.js"></script>

</head>
<body>

<script>

var sampleRate = 44100.0;
var lengthInSeconds = 1;

var context = 0;
var constantOneBuffer = 0;
var linearRampBuffer = 0;

function checkResult(event) {
    var renderedBuffer = event.renderedBuffer;
    var renderedData = renderedBuffer.getChannelData(0);
    var expectedData = linearRampBuffer.getChannelData(0);
    var n = renderedBuffer.length;

    if (n == linearRampBuffer.length) {
        testPassed("Rendered signal is of correct length.");
    } else {
        testFailed("Rendered signal is not of correct length.");
    }

    // Check that the rendered result exactly matches the buffer used to control gain.
    // This is because we're changing the gain of a signal having constant value 1.
    var success = true;
    for (var i = 0; i < n; ++i) {
        if (renderedData[i] != expectedData[i]) {
            success = false;
            break;
        }
    }

    if (success) {
        testPassed("Rendered signal exactly matches the audio-rate gain changing signal.");
    } else {
        testFailed("Rendered signal differs from the audio-rate gain changing signal.");
    }

    finishJSTest();
}

function runTest() {
    if (window.testRunner) {
        testRunner.dumpAsText();
        testRunner.waitUntilDone();
    }

    window.jsTestIsAsync = true;

    var sampleFrameLength = sampleRate * lengthInSeconds;

    // Create offline audio context.
    context = new webkitAudioContext(1, sampleFrameLength, sampleRate);

    // Create buffer used by the source which will have its gain controlled.
    constantOneBuffer = createConstantBuffer(context, sampleFrameLength, 1);

    // Create buffer used to control gain.
    linearRampBuffer = createLinearRampBuffer(context, sampleFrameLength);

    // Create the two sources.

    var constantSource = context.createBufferSource();
    constantSource.buffer = constantOneBuffer;

    var gainChangingSource = context.createBufferSource();
    gainChangingSource.buffer = linearRampBuffer;

    // Create a gain node controlling the gain of constantSource and make the connections.
    var gainNode = context.createGainNode();

    // Intrinsic baseline gain of zero.
    gainNode.gain.value = 0;

    constantSource.connect(gainNode);
    gainNode.connect(context.destination);

    // Connect an audio-rate signal to control the .gain AudioParam.
    // This is the heart of what is being tested.
    gainChangingSource.connect(gainNode.gain);

    // Start both sources at time 0.
    constantSource.noteOn(0);
    gainChangingSource.noteOn(0);

    context.oncomplete = checkResult;
    context.startRendering();
}

runTest();
successfullyParsed = true;

</script>
<script src="../fast/js/resources/js-test-post.js"></script>

</body>
</html>
