The promise-based startRendering()
method of the OfflineAudioContext
Interface starts rendering the audio graph, taking into account the current connections and the current scheduled changes.
When the method is invoked, the rendering is started and a promise is raised. When the rendering is completed, the promise resolves with an AudioBuffer
containing the rendered audio.
Syntax
offlineAudioCtx.startRendering().then(function(renderedBuffer) { // do something with the output buffer });
Return value
A Promise
, which resolves with an AudioBuffer
.
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 startRendering()
promise resolves, rendering has completed and the output AudioBuffer
is returned out of the promise.
At this point we create another audio context, create an AudioBufferSourceNode
inside it, and set its buffer to be equal to the promise AudioBuffer
. This is then played as part of a simple standard audio graph.
Note: For a working example, see our offline-audio-context-promise 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(); // use XHR to load an audio track, and // decodeAudioData to decode it and OfflineAudioContext to render it 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().then(function(renderedBuffer) { console.log('Rendering completed successfully'); var audioCtx = new (window.AudioContext || window.webkitAudioContext)(); var song = audioCtx.createBufferSource(); song.buffer = renderedBuffer; song.connect(audioCtx.destination); play.onclick = function() { song.start(); } }).catch(function(err) { console.log('Rendering failed: ' + err); // Note: The promise should reject when startRendering is called a second time on an OfflineAudioContext }); }); } request.send(); } // Run getData to start the process off getData();
Parameters
None.
Specifications
Specification | Status | Comment |
---|---|---|
Web Audio API The definition of 'startRendering()' in that specification. |
Working Draft | Initial definition |
Browser compatibility
Feature | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari (WebKit) |
---|---|---|---|---|---|
Basic support | 42.0 | 37.0 (37.0) | ? | ? | ? |
Feature | Chrome for Android | Firefox Mobile (Gecko) | Firefox OS | IE Mobile | Opera Mobile | Safari Mobile | Android Webview |
---|---|---|---|---|---|---|---|
Basic support | 42.0 | 37.0 (37.0) | 2.2 | ? | ? | ? | ? |