<!DOCTYPE html>

<!--
Tests that multiple audio-rate signals (AudioNode outputs) can be connected to an AudioParam
and that these signals are summed, along with the AudioParams intrinsic value.
-->

<html>
<head>
<link rel="stylesheet" href="../fast/js/resources/js-test-style.css"/>
<script src="resources/audio-testing.js"></script>
<script src="resources/mix-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;

// Buffers used by the two gain controlling sources.
var linearRampBuffer;
var toneBuffer;
var toneFrequency = 440;

// Arbitrary non-zero value.
var baselineGain = 5;

// Allow for a small round-off error.
var maxAllowedError = 1e-6;

function checkResult(event) {
    var renderedBuffer = event.renderedBuffer;
    var renderedData = renderedBuffer.getChannelData(0);

    // Get buffer data from the two sources used to control gain.
    var linearRampData = linearRampBuffer.getChannelData(0);
    var toneData = toneBuffer.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 sum of the intrinsic gain plus the two sources 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) {
        var expectedValue = baselineGain + linearRampData[i] + toneData[i];
        var error = Math.abs(expectedValue - renderedData[i]);

        if (error > maxAllowedError) {
            success = false;
            break;
        }
    }

    if (success) {
        testPassed("Rendered signal matches sum of two audio-rate gain changing signals plus baseline gain.");
    } else {
        testFailed("Rendered signal differs from the sum of two audio-rate gain changing signals plus baseline gain.");
    }

    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.
    var constantOneBuffer = createConstantBuffer(context, sampleFrameLength, 1);
    var constantSource = context.createBufferSource();
    constantSource.buffer = constantOneBuffer;

    // Create 1st buffer used to control gain (a linear ramp).
    linearRampBuffer = createLinearRampBuffer(context, sampleFrameLength);
    var gainSource1 = context.createBufferSource();
    gainSource1.buffer = linearRampBuffer;

    // Create 2st buffer used to control gain (a simple sine wave tone).
    toneBuffer = createToneBuffer(context, toneFrequency, lengthInSeconds, 1);
    var gainSource2 = context.createBufferSource();
    gainSource2.buffer = toneBuffer;

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

    // Intrinsic baseline gain.
    // This gain value should be summed with gainSource1 and gainSource2.
    gainNode.gain.value = baselineGain;

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

    // Connect two audio-rate signals to control the .gain AudioParam.
    gainSource1.connect(gainNode.gain);
    gainSource2.connect(gainNode.gain);

    // Start all sources at time 0.
    constantSource.noteOn(0);
    gainSource1.noteOn(0);
    gainSource2.noteOn(0);

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

runTest();
successfullyParsed = true;

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

</body>
</html>
