<!DOCTYPE html>

<!--
Tests that we are able to schedule a series of notes to playback with sample-accuracy.
We use an impulse so we can tell exactly where the rendering is happening.
-->

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

<body>

<div id="description"></div>
<div id="console"></div>

<script>
description("Tests sample-accurate scheduling.");

var sampleRate = 44100.0;
var lengthInSeconds = 4;

var context = 0;
var bufferLoader = 0;
var impulse;

// See if we can render at exactly these sample offsets.
var sampleOffsets = [0, 3, 512, 517, 1000, 1005, 20000, 21234, 37590];

function createImpulse() {
    // An impulse has a value of 1 at time 0, and is otherwise 0.
    impulse = context.createBuffer(2, 512, sampleRate);
    var sampleDataL = impulse.getChannelData(0);
    var sampleDataR = impulse.getChannelData(1);
    sampleDataL[0] = 1.0;
    sampleDataR[0] = 1.0;
}

function playNote(time) {
    var bufferSource = context.createBufferSource();
    bufferSource.buffer = impulse;
    bufferSource.connect(context.destination);
    bufferSource.noteOn(time);
}

function checkSampleAccuracy(event) {
    var buffer = event.renderedBuffer;

    var bufferDataL = buffer.getChannelData(0);
    var bufferDataR = buffer.getChannelData(1);

    var success = true;
    var impulseCount = 0;
    var badOffsetCount = false;
    
    // Go through every sample and make sure it's 0, except at positions in sampleOffsets.
    for (var i = 0; i < buffer.length; ++i) {
        // Make sure left == right
        if (bufferDataL[i] != bufferDataR[i]) {
            testFailed("Rendered buffer left and right channels are not identical.");
            success = false;
            break;
        }
        
        if (bufferDataL[i] != 0) {
            // Make sure this index is  in sampleOffsets
            var found = false;
            for (var j = 0; j < sampleOffsets.length; ++j) {
                if (sampleOffsets[j] == i) {
                    found = true;
                    break;
                }
            }
            ++impulseCount;
            if (!found) {
                testFailed("Non-zero sample found at sample offset " + i);
                success = false;
                ++badOffsetCount;
            }
        }
    }

    if (impulseCount == sampleOffsets.length) {
        if (badOffsetCount == 0) {
            testPassed("Expected number of events found.");
        } else {
            testFailed("Expected number of events found, but " + badOffsetCount + " are at incorrect offsets.");
            success = false;
        }
    } else {
        testFailed("Expected " + sampleOffsets.length + " impulses but only found " + impulseCount);
        success = false;
    }

    if (success) {
        testPassed("All events rendered with sample-accuracy.");
    } else {
        testFailed("Events NOT rendered with sample-accuracy.");
    }

    finishJSTest();
}

function runTest() {
    if (window.testRunner) {
        testRunner.dumpAsText();
        testRunner.waitUntilDone();
    }
    
    window.jsTestIsAsync = true;
        
    // Create offline audio context.
    context = new webkitOfflineAudioContext(2, sampleRate * lengthInSeconds, sampleRate);
    createImpulse();    

    for (var i = 0; i < sampleOffsets.length; ++i) {
        var timeInSeconds = sampleOffsets[i] / sampleRate;
        playNote(timeInSeconds);
    }
    
    context.oncomplete = checkSampleAccuracy;
    context.startRendering();
}

runTest();

</script>

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