The AudioBufferSourceNode
interface is an AudioScheduledSourceNode
which represents an audio source consisting of in-memory audio data, stored in an AudioBuffer
. It's especially useful for playing back audio which has particularly stringent timing accuracy requirements, such as for sounds that must match a specific rhythm and can be kept in memory rather than being played from disk or the network. To play sounds which require accurate timing but must be streamed from the network or played from disk, use a AudioWorkletNode
to implement its playback.
An AudioBufferSourceNode
has no inputs and exactly one output, which has the same number of channels as the AudioBuffer
indicated by its buffer
property. If there's no buffer set—that is, if buffer
is null
—the output contains a single channel of silence (every sample is 0).
An AudioBufferSourceNode
can only be played once; after each call to start()
, you have to create a new node if you want to play the same sound again. Fortunately, these nodes are very inexpensive to create, and the actual AudioBuffer
s can be reused for multiple plays of the sound. Indeed, you can use these nodes in a "fire and forget" manner: create the node, call start()
to begin playing the sound, and don't even bother to hold a reference to it. It will automatically be garbage-collected at an appropriate time, which won't be until sometime after the sound has finished playing.
Multiple calls to AudioBufferSourceNode.stop()
are allowed. The most recent call replaces the previous one, if the AudioBufferSourceNode
has not already reached the end of the buffer.
Number of inputs | 0 |
---|---|
Number of outputs | 1 |
Channel count | defined by the associated AudioBuffer
|
AudioBufferSourceNode()
AudioBufferSourceNode
object. An AudioBufferSourceNode
can be instantiated using the AudioContext.createBufferSource()
method.Inherits properties from its parent, AudioNode
.
AudioBufferSourceNode.buffer
AudioBuffer
that defines the audio asset to be played, or when set to the value null
, defines a single channel of silence (in which every sample is 0.0).AudioBufferSourceNode.detune
AudioParam
representing detuning of playback in cents. This value is compounded with playbackRate
to determine the speed at which the sound is played. Its default value is 0
(meaning no detuning), and its nominal range is -∞ to ∞.AudioBufferSourceNode.loop
AudioBuffer
is reached. Its default value is false
.AudioBufferSourceNode.loopStart
Optional
AudioBuffer
must begin when loop
is true
. Its default value is 0
(meaning that at the beginning of each loop, playback begins at the start of the audio buffer).AudioBufferSourceNode.loopEnd
Optional
AudioBuffer
stops and loops back to the time indicated by loopStart
, if loop
is true
. The default value is 0
.AudioBufferSourceNode.playbackRate
AudioParam
that defines the speed factor at which the audio asset will be played, where a value of 1.0 is the sound's natural sampling rate. Since no pitch correction is applied on the output, this can be used to change the pitch of the sample. This value is compounded with detune
to determine the final playback rate.Inherits event handlers from its parent, AudioScheduledSourceNode
.
Inherits methods from its parent, AudioScheduledSourceNode
.
AudioBufferSourceNode.start()
In this example, we create a two-second buffer, fill it with white noise, and then play it using an AudioBufferSourceNode
. The comments should clearly explain what is going on.
You can also run the code live, or view the source.
var audioCtx = new (window.AudioContext || window.webkitAudioContext)(); // Create an empty three-second stereo buffer at the sample rate of the AudioContext var myArrayBuffer = audioCtx.createBuffer(2, audioCtx.sampleRate * 3, audioCtx.sampleRate); // Fill the buffer with white noise; //just random values between -1.0 and 1.0 for (var channel = 0; channel < myArrayBuffer.numberOfChannels; channel++) { // This gives us the actual ArrayBuffer that contains the data var nowBuffering = myArrayBuffer.getChannelData(channel); for (var i = 0; i < myArrayBuffer.length; i++) { // Math.random() is in [0; 1.0] // audio needs to be in [-1.0; 1.0] nowBuffering[i] = Math.random() * 2 - 1; } } // Get an AudioBufferSourceNode. // This is the AudioNode to use when we want to play an AudioBuffer var source = audioCtx.createBufferSource(); // set the buffer in the AudioBufferSourceNode source.buffer = myArrayBuffer; // connect the AudioBufferSourceNode to the // destination so we can hear the sound source.connect(audioCtx.destination); // start the source playing source.start();
For a decodeAudioData()
example, see the AudioContext.decodeAudioData()
page.
Specification | Status | Comment |
---|---|---|
Web Audio API The definition of 'AudioBufferSourceNode' in that specification. | Working Draft |
Desktop | ||||||
---|---|---|---|---|---|---|
Chrome | Edge | Firefox | Internet Explorer | Opera | Safari | |
Basic support | 14 | Yes | 25 | No | 15 | 6 |
AudioBufferSourceNode() constructor |
55
|
? | 53 | No | 42 | ? |
buffer |
14 | 12 | 25
|
No | 15 | 6 |
detune |
44 | 13 | 40 | No | 31 | No |
loop |
14 | 12 | 25 | No | 15 | 6 |
loopStart |
14 | 12 | 25 | No | 15 | 6 |
loopEnd |
14 | 12 | 25 | No | 15 | 6 |
onended |
14 | ? | ? | ? | ? — 44 | ? |
playbackRate |
14 | 12 | 25 | No | 15 | 6 |
start |
14 — 57 | 12 | 25 | No | 15 | 6 |
stop |
14 | ? | ? | ? | ? — 44 | ? |
Mobile | |||||||
---|---|---|---|---|---|---|---|
Android webview | Chrome for Android | Edge Mobile | Firefox for Android | Opera for Android | iOS Safari | Samsung Internet | |
Basic support | Yes | 18 | Yes | 26 | 15 | ? | Yes |
AudioBufferSourceNode() constructor |
55
|
55
|
? | 53 | 42 | ? | 6.0 |
buffer |
Yes | 18 | Yes | 26
|
15 | ? | Yes |
detune |
44 | 44 | Yes | 40 | 31 | ? | Yes |
loop |
Yes | 18 | Yes | 26 | 15 | ? | Yes |
loopStart |
Yes | 18 | Yes | 26 | 15 | ? | Yes |
loopEnd |
Yes | 18 | Yes | 26 | 15 | ? | Yes |
onended |
Yes | 18 | ? | ? | ? — 44 | ? | ? |
playbackRate |
Yes | 18 | Yes | 26 | 15 | ? | Yes |
start |
Yes | 18 | Yes | 26 | 15 | ? | Yes |
stop |
Yes | 18 | ? | ? | ? — 44 | ? | ? |
© 2005–2018 Mozilla Developer Network and individual contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/API/AudioBufferSourceNode