David Walsh Blog

Web Audio API

The Web Audio API allows developers to load and decode audio on demand using JavaScript.  The more I evaluate awesome games for Firefox OS TVs, the more I get to learn about these APIs that I normally wouldn’t touch.  The following is a very basic introduction to the WebAudio API, often used for JavaScript games or apps allowing modification of audio on the front end.

Let’s start with a reduced Web Audio API code sample:


// Create an AudioContext instance for this sound
var audioContext = new (window.AudioContext || window.webkitAudioContext)();
// Create a buffer for the incoming sound content
var source = audioContext.createBufferSource();
// Create the XHR which will grab the audio contents
var request = new XMLHttpRequest();
// Set the audio file src here
request.open('GET', 'sound-effect.mp3', true);
// Setting the responseType to arraybuffer sets up the audio decoding
request.responseType = 'arraybuffer';
request.onload = function() {
  // Decode the audio once the require is complete
  audioContext.decodeAudioData(request.response, function(buffer) {
    source.buffer = buffer;
    // Connect the audio to source (multiple audio buffers can be connected!)
    source.connect(audioContext.destination);
    // Simple setting for the buffer
    source.loop = true;
    // Play the sound!
    source.start(0);
  }, function(e) {
    console.log('Audio error! ', e);
  });
}
// Send the request which kicks off 
request.send();

I’ve tried to comment within the code to describe the process as best as possible.  Remember that the above is a very reduced example; there’s much more you can do with Web Audio.

I won’t pretend to be an expert of all the nuances with Web Audio — I was simply super excited to see all of this working.  Web Audio does way more than simply allow you to play the audio; you can modify the audio with filters, ramping, and a bunch more.  You can learn more about WebAudio from these awesome sources:

Have you done anything awesome with Web Audio?  Please share with the noobs like me!