Signatur
Beschreibung
Die schreibgeschützte Eigenschaft destination eines BaseAudioContext (also eines AudioContext oder OfflineAudioContext) gibt einen AudioDestinationNode zurück. Dieser Knoten ist das endgültige Ziel aller Audiosignale im Kontext. Bei einem AudioContext ist das in der Regel das Standard-Ausgabegerät (Lautsprecher, Kopfhörer). Bei einem OfflineAudioContext landet das Signal stattdessen in einem AudioBuffer, der beim Aufruf von startRendering() zurückgegeben wird.
Man braucht destination immer dann, wenn ein Audio-Graph tatsächlich hörbar oder renderbar werden soll: Quellen wie OscillatorNode, AudioBufferSourceNode oder MediaElementAudioSourceNode werden – oft über Effektknoten wie GainNode oder BiquadFilterNode – per connect(ctx.destination) mit dem Ziel verbunden. Ein Knoten, der nicht (direkt oder indirekt) mit destination verbunden ist, bleibt stumm.
Pro Kontext gibt es genau einen AudioDestinationNode; die Eigenschaft liefert bei jedem Zugriff dasselbe Objekt. Über destination.maxChannelCount lässt sich abfragen, wie viele Kanäle die Hardware unterstützt, und über channelCount kann man – innerhalb dieser Grenze – die Ausgabekanäle einstellen, etwa für Mehrkanal-Audio.
Rückgabewert
Beispiele
Oszillator hörbar machen
const ctx = new AudioContext();
const button = document.querySelector('#play');
button.addEventListener('click', async () => {
// Autoplay-Regeln: Kontext erst nach einer Nutzeraktion fortsetzen
await ctx.resume();
const osc = ctx.createOscillator();
osc.frequency.value = 440; // Kammerton A
osc.connect(ctx.destination);
osc.start();
osc.stop(ctx.currentTime + 1); // eine Sekunde lang
});
Lautstärkeregler vor die Ausgabe schalten
const ctx = new AudioContext();
const audioEl = document.querySelector('audio');
const slider = document.querySelector('#volume');
const source = ctx.createMediaElementSource(audioEl);
const gain = ctx.createGain();
// Quelle -> Gain -> Lautsprecher
source.connect(gain).connect(ctx.destination);
slider.addEventListener('input', () => {
gain.gain.setTargetAtTime(Number(slider.value), ctx.currentTime, 0.01);
});
Kanäle abfragen und offline rendern
const live = new AudioContext();
console.log('Max. Kanäle:', live.destination.maxChannelCount);
console.log('Aktiv:', live.destination.channelCount);
// Offline: destination schreibt in einen AudioBuffer
const offline = new OfflineAudioContext(2, 44100, 44100);
const osc = offline.createOscillator();
osc.connect(offline.destination);
osc.start();
const buffer = await offline.startRendering();
console.log(buffer.duration, buffer.numberOfChannels);
// Wichtig · Fallstricke
- Autoplay-Sperre: Ein
AudioContextstartet in vielen Browsern im Zustand"suspended". Selbst korrekt mitdestinationverbundene Knoten bleiben stumm, bis nach einer Nutzeraktionctx.resume()aufgerufen wurde. - Schreibgeschützt:
destinationkann nicht ersetzt werden. Um das Ausgabegerät zu wechseln, verwendet manAudioContext.setSinkId()(derzeit nur in Chromium-basierten Browsern) oder leitet übercreateMediaStreamDestination()in einenMediaStreamum, etwa für Aufnahme oder WebRTC. - Kanalanzahl: Wird
channelCounthöher alsmaxChannelCountgesetzt, wird einIndexSizeErrorausgelöst. BeimOfflineAudioContextist die Kanalanzahl durch den Konstruktor festgelegt. - Übersteuerung: Mehrere Quellen an
destinationwerden aufsummiert; Werte außerhalb von -1 bis 1 führen zu Clipping. EinGainNodeoderDynamicsCompressorNodedavor hilft. - Die Eigenschaft wird in allen aktuellen Browsern unterstützt; ältere Safari-Versionen brauchen
webkitAudioContext.