OfflineAudioContext.startRendering()

This article needs a technical review. How you can help.

The startRendering() method of the OfflineAudioContext Interface starts rendering the audio graph, taking into account the current connections and the current scheduled changes.

The complete event (of type OfflineAudioCompletionEvent) is raised when the rendering is finished, containing the resulting AudioBuffer in its renderedBuffer property.

Note: This version is to be superceded by the promise-based version, but currently both mechanisms are provided for legacy reasons.

Syntax

offlineAudioCtx.startRendering();
offlineAudioCtx.oncomplete = function(e) {
  // e.renderedBuffer contains the output buffer
}

Parameters

None.

Returns

Void.

Example

In this simple example, we declare both an AudioContext and an OfflineAudioContext object. We use the AudioContext to load an audio track via XHR (AudioContext.decodeAudioData), then the OfflineAudioContext to render the audio into an AudioBufferSourceNode and play the track through. After the offline audio graph is set up, you need to render it to an AudioBuffer using OfflineAudioContext.startRendering.

When the rendering has completed, the output AudioBuffer is made available in the renderedBuffer property of the OfflineAudioCompletionEvent (available in OfflineAudioContext.oncomplete handler when the complete event fires.)

At this point we create another audio context, create an AudioBufferSourceNode inside it, and set its buffer to be equal to the renderedBuffer property. This is then played as part of a simple standard audio graph.

Note: For a working example, see our offline-audio-context Github repo (see the source code too.)

// define online and offline audio context

var audioCtx = new AudioContext();
var offlineCtx = new OfflineAudioContext(2,44100*40,44100);

source = offlineCtx.createBufferSource();

// define variables

var pre = document.querySelector('pre');
var myScript = document.querySelector('script');
var play = document.querySelector('.play');
var stop = document.querySelector('.stop');

// use XHR to load an audio track, and
// decodeAudioData to decode it and stick it in a buffer.
// Then we put the buffer into the source

function getData() {
  request = new XMLHttpRequest();

  request.open('GET', 'viper.ogg', true);

  request.responseType = 'arraybuffer';

  request.onload = function() {
    var audioData = request.response;

    audioCtx.decodeAudioData(audioData, function(buffer) {
        myBuffer = buffer;
        source.buffer = myBuffer;
        source.connect(offlineCtx.destination);
        source.start();
        //source.loop = true;
        offlineCtx.startRendering();
      },

      function(e){"Error with decoding audio data" + e.err});

  }

  request.send();
}

// wire up buttons to stop and play audio, and range slider control

getData();

offlineCtx.oncomplete = function(e) {
  var audioCtx = new (window.AudioContext || window.webkitAudioContext)();
  var song = audioCtx.createBufferSource();
  song.buffer = e.renderedBuffer;

  song.connect(audioCtx.destination);

  play.onclick = function() {
    song.start();
  }

  console.log("completed!");
}

Specifications

Specification Status Comment
Web Audio API
The definition of 'startRendering()' in that specification.
Working Draft  

Browser compatibility

Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari (WebKit)
Basic support 10.0webkit 25.0 (25.0)  No support 15.0webkit
22 (unprefixed)
6.0webkit
Feature Android Android Webview Firefox Mobile (Gecko) Firefox OS IE Mobile Opera Mobile Safari Mobile Chrome for Android
Basic support ? (Yes) 26.0 1.2 ? ? ? 33.0

See also

Document Tags and Contributors

 Contributors to this page: jpmedley, fscholz, chrisdavidmills
 Last updated by: jpmedley,