AudioBufferSourceNode: loop property
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since April 2021.
The loop
property of the AudioBufferSourceNode
interface is a Boolean indicating if the audio asset must be replayed when the end of
the AudioBuffer
is reached.
The loop
property's default value is false
.
Value
A Boolean which is true
if looping is enabled; otherwise, the value is
false
.
When looping is enabled, the sound begins playing at the time specified as the start
point when start()
is called. When the
time specified by the loopEnd
property
is reached, playback continues at the time specified by
loopStart
Examples
Setting loop
In this example, when the user presses "Play", we load an audio track, decode it, and put it into an AudioBufferSourceNode
.
The example then sets the loop
property to true
, so the track loops, and plays the track.
The user can set the loopStart
and loopEnd
properties using range controls.
Note: You can run the full example live (or view the source.)
let audioCtx;
let buffer;
let source;
const play = document.getElementById("play");
const stop = document.getElementById("stop");
const loopstartControl = document.getElementById("loopstart-control");
const loopstartValue = document.getElementById("loopstart-value");
const loopendControl = document.getElementById("loopend-control");
const loopendValue = document.getElementById("loopend-value");
async function loadAudio() {
try {
// Load an audio file
const response = await fetch("rnb-lofi-melody-loop.wav");
// Decode it
buffer = await audioCtx.decodeAudioData(await response.arrayBuffer());
const max = Math.floor(buffer.duration);
loopstartControl.setAttribute("max", max);
loopendControl.setAttribute("max", max);
} catch (err) {
console.error(`Unable to fetch the audio file. Error: ${err.message}`);
}
}
play.addEventListener("click", async () => {
if (!audioCtx) {
audioCtx = new AudioContext();
await loadAudio();
}
source = audioCtx.createBufferSource();
source.buffer = buffer;
source.connect(audioCtx.destination);
source.loop = true;
source.loopStart = loopstartControl.value;
source.loopEnd = loopendControl.value;
source.start();
play.disabled = true;
stop.disabled = false;
loopstartControl.disabled = false;
loopendControl.disabled = false;
});
stop.addEventListener("click", () => {
source.stop();
play.disabled = false;
stop.disabled = true;
loopstartControl.disabled = true;
loopendControl.disabled = true;
});
loopstartControl.addEventListener("input", () => {
source.loopStart = loopstartControl.value;
loopstartValue.textContent = loopstartControl.value;
});
loopendControl.addEventListener("input", () => {
source.loopEnd = loopendControl.value;
loopendValue.textContent = loopendControl.value;
});
Specifications
Specification |
---|
Web Audio API # dom-audiobuffersourcenode-loop |
Browser compatibility
BCD tables only load in the browser