Start · Sprachen · JavaScript · Referenz · AudioNode.context

AudioNode.context

Eigenschaft

Schreibgeschützte Eigenschaft, die den <code>BaseAudioContext</code> zurückgibt, zu dessen Audio-Verarbeitungsgraph der Knoten gehört.

seit JavaScript Baseline: alle modernen Browser (seit 2015) Kategorie: webapi

Signatur

AudioNode.context

Beschreibung

Jeder AudioNode (z. B. GainNode, OscillatorNode, AnalyserNode) wird immer von genau einem Audio-Kontext erzeugt und bleibt fest an ihn gebunden. Die Eigenschaft context liefert diesen Kontext – entweder einen AudioContext (Echtzeit-Wiedergabe) oder einen OfflineAudioContext (Rendering in einen Puffer). Beide erben von BaseAudioContext.

Nützlich ist die Eigenschaft vor allem in wiederverwendbaren Funktionen und Bibliotheken, die nur einen Knoten übergeben bekommen: Über node.context kommt man an currentTime für präzises Timing, an sampleRate oder an Fabrikmethoden wie createGain(), um weitere Knoten im selben Graph zu erzeugen. So muss der Kontext nicht separat mitgereicht werden.

Die Eigenschaft ist schreibgeschützt; ein Knoten kann nicht in einen anderen Kontext verschoben werden. Verbindungen per connect() sind nur zwischen Knoten desselben Kontexts erlaubt – ein Vergleich a.context === b.context ist daher eine sinnvolle Vorabprüfung.

Rückgabewert

Typ
BaseAudioContext
Beschreibung
Der AudioContext oder OfflineAudioContext, der den Knoten erzeugt hat. Der Wert ist für die gesamte Lebensdauer des Knotens konstant.

Beispiele

Kontext eines Knotens auslesen

const audioCtx = new AudioContext();
const gain = audioCtx.createGain();

console.log(gain.context === audioCtx);
console.log(gain.context.constructor.name);
console.log(gain.context.sampleRate);
true AudioContext 48000 (abhängig vom Gerät, z. B. 44100)

Fade-out-Hilfsfunktion ohne separaten Kontext-Parameter

// Blendet einen GainNode über 'dauer' Sekunden aus
const fadeOut = (gainNode, dauer = 1) => {
  const now = gainNode.context.currentTime;
  gainNode.gain.cancelScheduledValues(now);
  gainNode.gain.setValueAtTime(gainNode.gain.value, now);
  gainNode.gain.linearRampToValueAtTime(0, now + dauer);
};

const ctx = new AudioContext();
const osc = ctx.createOscillator();
const gain = ctx.createGain();
osc.connect(gain).connect(ctx.destination);
osc.start();

document.querySelector('#stop').addEventListener('click', async () => {
  await ctx.resume();
  fadeOut(gain, 2);
  osc.stop(ctx.currentTime + 2);
});

Effektkette im selben Kontext erzeugen und Kontexte prüfen

// Hängt einen Tiefpass-Filter hinter einen beliebigen Quellknoten
const addLowpass = (source, frequency = 800) => {
  const ctx = source.context;
  const filter = ctx.createBiquadFilter();
  filter.type = 'lowpass';
  filter.frequency.value = frequency;
  source.connect(filter);
  return filter;
};

const safeConnect = (a, b) => {
  if (a.context !== b.context) {
    throw new Error('Knoten gehören zu unterschiedlichen Kontexten');
  }
  return a.connect(b);
};

const ctx = new AudioContext();
const offline = new OfflineAudioContext(2, 44100, 44100);
const osc = ctx.createOscillator();
const filter = addLowpass(osc, 500);
safeConnect(filter, ctx.destination);

try {
  safeConnect(osc, offline.destination);
} catch (err) {
  console.log(err.message);
}
Knoten gehören zu unterschiedlichen Kontexten

// Wichtig · Fallstricke

  • Schreibgeschützt: Eine Zuweisung an node.context wird ignoriert (im Strict Mode TypeError). Knoten lassen sich nicht zwischen Kontexten verschieben – man muss sie im Zielkontext neu erzeugen.
  • Kontextübergreifendes connect() wirft einen InvalidAccessError. Das betrifft z. B. das Mischen von Knoten aus einem AudioContext und einem OfflineAudioContext.
  • Der Rückgabetyp ist BaseAudioContext; Methoden, die nur AudioContext besitzt (z. B. createMediaElementSource(), close(), outputLatency), existieren bei einem OfflineAudioContext nicht. Bei Bedarf mit instanceof AudioContext prüfen.
  • Auch nach close() verweist context weiterhin auf den (nun geschlossenen) Kontext; node.context.state ist dann "closed".
  • Kompatibilität: In allen modernen Browsern verfügbar; sehr alte WebKit-Versionen nutzten das Präfix webkitAudioContext.