<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<script src="resources/audio-testing.js"></script>
<script src="../fast/js/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 webkitAudioContext(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="../fast/js/resources/js-test-post.js"></script>
</body>
</html>
