<!DOCTYPE html>

<!--
Tests that AudioGainNode is properly scaling the gain.
We'll render 11 notes, starting at a gain of 1.0, decreasing in gain by 0.1.
The 11th note will be of gain 0.0, so it should be silent (at the end in the rendered output).
-->

<html>
<head>
<script type="text/javascript" src="resources/audio-testing.js"></script>

</head>
<body>

<script>

window.onload = init;

var sampleRate = 44100.0;
var bufferDurationSeconds = 0.125;
var numberOfNotes = 11;
var noteSpacing = bufferDurationSeconds + 0.020; // leave 20ms of silence between each "note"
var lengthInSeconds = numberOfNotes * noteSpacing;

var context = 0;
var sinWaveBuffer = 0;

function createSinWaveBuffer(lengthInSeconds, frequency) {
    var audioBuffer = context.createBuffer(2, lengthInSeconds * sampleRate, sampleRate);

    var n = audioBuffer.length;
    var channelL = audioBuffer.getChannelData(0);
    var channelR = audioBuffer.getChannelData(1);

    for (var i = 0; i < n; ++i) {
        channelL[i] = Math.sin(frequency * 2.0*Math.PI * i / sampleRate);
        channelR[i] = channelL[i];
    }

    return audioBuffer;
}

function playNote(time, gain) {
    var source = context.createBufferSource();
    source.buffer = sinWaveBuffer;

    var gainNode = context.createGainNode();
    gainNode.gain.value = gain;

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

    source.noteOn(time);
}

function init() {
    if (!window.testRunner)
        return;

    // Create offline audio context.
    context = new webkitAudioContext(2, sampleRate * lengthInSeconds, sampleRate);

    // Create a buffer for a short "note".
    sinWaveBuffer = createSinWaveBuffer(bufferDurationSeconds, 880.0);

    // Render 11 notes, starting at a gain of 1.0, decreasing in gain by 0.1.
    // The last note will be of gain 0.0, so shouldn't be perceptible in the rendered output.
    for (var i = 0; i < numberOfNotes; ++i) {
        var time = i * noteSpacing;
        var gain = 1.0 - i / (numberOfNotes - 1);
        playNote(time, gain);
    }

    context.oncomplete = finishAudioTest;
    context.startRendering();

    testRunner.waitUntilDone();
}

</script>

</body>
</html>
