<!DOCTYPE html>
<html>
<head>
<style>
body {
  background-color: rgb(255, 255, 255);
}

.row {
  position: absolute;
}

.tile {
  background-color: rgb(190, 195, 255);
  display: contents;
  font-size: x-large;
  font-weight: bold;
  height: max-content;
  width: max-content;
  margin: 8px;
  padding: 8px;
  text-align: center;
  align-content: center;
}
</style>
</head>
<body>

<div class="row">
  <div class="tile">
    <p>
      WebAudio API Test
    </p>
  </div>
</div>

<script>
  function testWebAudioApi() {
    // Settings for the test.
    var source_count = 3;
    var buffer_duration_seconds = 3.0;
    var source_start_delay_seconds = 5.0;
    var sample_rate = 44100.0;

    console.log("WebAudio API Test:");
    console.log(" source_count=" + source_count.toString());
    console.log(" buffer_duration_seconds=" + buffer_duration_seconds.toString());
    console.log(" source_start_delay_seconds=" + source_start_delay_seconds.toString());
    console.log(" sample_rate=" + source_count.toString());

    // Create Float32Array of samples containing sin wave.
    var audio_sample_count = sample_rate * buffer_duration_seconds;
    var audio_array = new Float32Array(audio_sample_count);
    for (var i = 0; i < audio_sample_count; ++i) {
      audio_array[i] = Math.sin(440.0 * 2.0 * Math.PI * i / sample_rate);
    }
    console.log("Created Float32Array of samples containing sin wave");

    // Create audio context.
    var context = new AudioContext();
    console.log("Created AudioContext");

    // Create and initialize contents of audio buffer.
    var audio_buffer =
      context.createBuffer(1, audio_sample_count, sample_rate);
    console.log("Created AudioBuffer");
    audio_buffer.copyToChannel(audio_array, 0);
    console.log("Initialized AudioBuffer contents with Float32Array");

    // Create and initialize |source_count| audio buffer source nodes.
    var source_nodes = new Array(source_count);
    for (var i = 0; i < source_count; ++i)
    {
      source_nodes[i] = context.createBufferSource();
      console.log(
        "source_nodes["+ i.toString() +"]: Created AudioBufferSourceNode");
      source_nodes[i].buffer = audio_buffer;
      source_nodes[i].connect(context.destination);
      console.log(
        "source_nodes["+ i.toString() +"]: Initialized AudioBufferSourceNode");

      // Capture a copy of |i| for delayed calls.
      (function (i) {
        // Delay a call by |i| * |source_start_delay_seconds| seconds.
        setTimeout(
          // The call to delay: A lambda that adds an event listener for the
          // "ended" event and starts |source_nodes[i]|.
          function() {
            source_nodes[i].addEventListener(
              "ended",
              function () {
                console.log(
                  "source_nodes["+ i.toString() +"]: ended event handled");
              });
            source_nodes[i].start(0);
            console.log("source_nodes["+ i.toString() +"]: start called");
          },
          i * source_start_delay_seconds * 1000);
      }) (i);
    }
  };

  // Delay the entire test for a short time to allow |console| to initialize.
  setTimeout(testWebAudioApi, 500);
</script>

</body>
</html>
