<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<script src="resources/audio-testing.js"></script>
<script src="../resources/js-test-pre.js"></script>
</head>

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

<script>
description("Test AudioContext activeSourceCount and AudioBufferSourceNode playbackState.");

// Create a few sources that start and end playing at various times.  After rendering, check that
// each source is in the correct state and that the number of active sources is correct.

var sampleRate = 44100;

// Render for this long.
var renderTime = 2;
var renderLength = timeToSampleFrame(renderTime, sampleRate);

var context;

// List of AudioBufferSourceNodes sources.
var sources = [];

// List of messages that will be printed out on success (or failure).  Messages are in the same
// order as the sources list above.
var sourceMessages = [];

// List of the expected playback state for each source.  In the same order a sources list above.
var sourceExpectedStates = [];

// Array mapping the playback state to a string.
var playbackStateName = ["UNSCHEDULED_STATE ",
                         "SCHEDULED_STATE   ",
                         "PLAYING_STATE     ",
                         "FINISHED_STATE    "];

function checkResult(event)
{
    var success = true;

    // For each source, verify that the playback state matches our expected playback state.
    for (var k = 0; k < sources.length; ++k) {
        var prefix = playbackStateName[sourceExpectedStates[k]] + sourceMessages[k];
        if (sources[k].playbackState == sourceExpectedStates[k]) {
            testPassed(prefix);
        } else {
            testFailed(prefix + ": Actual = " + playbackStateName[sources[k].playbackState]);
            success = false;
        }
    }

    // Figure out how many active sources there should be from the expected states.
    var playingState = sources[0].PLAYING_STATE

    var expectedActiveCount = 0;
    for (k = 0; k < sourceExpectedStates.length; ++k) {
        if (sourceExpectedStates[k] == playingState) {
            ++expectedActiveCount;
        }
    }
      
    if (context.activeSourceCount == expectedActiveCount) {
        testPassed(context.activeSourceCount + " are currently playing as expected.");
    } else {
        testFailed(context.activeSourceCount + " are currently playing, but expected " + expectedActiveCount + ".");
        success = false;
    }

    if (success) {
        testPassed("activeSourceCount and playbackState tests succeeded.");
    } else {
        testFailed("activeSourceCount and playbackState tests did not succeed.");
    }

    finishJSTest();
}

// sourceLength - length of source in seconds
// noteFunction - function to turn on source appropriately
// expectedState - expected state of the source at the end of rendering
// message - message to be displayed if test passes
function createTest(sourceLength, noteFunction, expectedState, message)
{
    var s = context.createBufferSource();
    s.buffer = createImpulseBuffer(context, timeToSampleFrame(sourceLength, sampleRate));
    s.connect(context.destination);
    noteFunction(s);
    sources.push(s);
    sourceMessages.push(message);
    sourceExpectedStates.push(expectedState);
}

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

    window.jsTestIsAsync = true;

    // Create offline audio context, rendering for renderTime seconds.
    context = new webkitOfflineAudioContext(2, timeToSampleFrame(renderTime, sampleRate), sampleRate);

    // This is only used so we can access the playback state constants.
    var bufferSource = context.createBufferSource();

    // Dummy message so we know how long we're rendering so we can interpret the pass/fail messages
    // correctly.
    testPassed("Rendering time is " + renderTime + " seconds.");

    // Test unscheduled state. Create 3 second source, but don't schedule it.

    createTest(3,
               function(s) { },
               bufferSource.UNSCHEDULED_STATE,
               "Source has been created");

    // Test noteOn.

    createTest(3,
               function(s) { s.noteOn(renderTime + 1); },
               bufferSource.SCHEDULED_STATE,
               "3 second source scheduled to start at time " + (renderTime + 1));

    createTest(2,
               function(s) { s.noteOn(1); },
               bufferSource.PLAYING_STATE,
               "2 second source starting at time 1");
      
    createTest(1.25,
               function(s) { s.noteOn(0); },
               bufferSource.FINISHED_STATE,
               "1.25 second source starting at time 0");

    // Test noteGrainOn.

    createTest(3,
               function(s) { s.noteGrainOn(renderTime + 1, 0, 1); },
               bufferSource.SCHEDULED_STATE,
               "1 second grain scheduled to start at time " + (renderTime + 1));
  
    createTest(3,
               function(s) { s.noteGrainOn(0.5, 0, 2); },
               bufferSource.PLAYING_STATE,
               "2 second grain starting at time 0.5");
      
    createTest(3,
               function(s) { s.noteGrainOn(0.5, 0, 1); },
               bufferSource.FINISHED_STATE,
               "1 second grain starting at time 0.5");

    // Test looping source

    createTest(0.5,
               function(s) { s.loop = true; s.noteOn(renderTime + 1); },
               bufferSource.SCHEDULED_STATE,
               "a looping 0.5 second source scheduled at time " + (renderTime + 1));

    createTest(0.5,
               function(s) { s.loop = true; s.noteOn(1.25); },
               bufferSource.PLAYING_STATE,
               "a looping 0.5 second source starting at time 1.25");

    context.oncomplete = checkResult;
    context.startRendering();
}
      
runTest();
successfullyParsed = true;
  
</script>

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