Start · Sprachen · JavaScript · Referenz · AudioNode.disconnect()

AudioNode.disconnect()

Methode

Trennt ausgehende Verbindungen eines <code>AudioNode</code>: alle Verbindungen, die zu einem bestimmten Ziel oder nur einen einzelnen Ausgang bzw. Eingang.

seit JavaScript Baseline: alle modernen Browser (Web Audio API) Kategorie: webapi

Signatur

AudioNode.prototype.disconnect(destination?, output?, input?)

Beschreibung

disconnect() ist das Gegenstück zu AudioNode.connect(). Die Methode entfernt Verbindungen im Audio-Graphen, die vom aufrufenden Knoten ausgehen. So lassen sich Effekte zur Laufzeit ein- und ausschalten, Signalwege umbauen oder nicht mehr benötigte Knoten aus dem Graphen lösen. Die Speicherbereinigung kann sie dann freigeben.

Welche Verbindungen getrennt werden, hängt von den Argumenten ab:

  • disconnect(): trennt alle ausgehenden Verbindungen.
  • disconnect(output): trennt alle Verbindungen des Ausgangs mit dem Index output.
  • disconnect(destination): trennt alle Verbindungen zum angegebenen AudioNode bzw. AudioParam.
  • disconnect(destination, output): trennt nur die Verbindung des Ausgangs output zum Ziel.
  • disconnect(destination, output, input): trennt genau eine Verbindung vom Ausgang output zum Eingang input des Ziel-Knotens. Diese Form gibt es nur bei AudioNode-Zielen.

Wenn man gezielt trennt statt alles, bleiben andere Signalwege erhalten, zum Beispiel ein Parallel-Pfad zu einem Analyser. Das ist bei komplexen Graphen wichtig, in denen ein Knoten mehrere Ziele speist.

Parameter

Name Typ Default Beschreibung
$destination AudioNode | AudioParam Ziel, zu dem die Verbindungen getrennt werden sollen. Fehlt es, werden alle Ziele getrennt (bzw. alle des angegebenen Ausgangs).
$output number Index des Ausgangs des aufrufenden Knotens. Steht er als einziges Argument, trennt er alle Verbindungen dieses Ausgangs. Ist der Index ungültig, wird ein IndexSizeError ausgelöst.
$input number Index des Eingangs am Ziel-AudioNode. Ist der Index ungültig, wird ein IndexSizeError ausgelöst. Mit einem AudioParam als Ziel ist dieser Parameter nicht erlaubt.

Rückgabewert

Typ
void
Beschreibung
Gibt undefined zurück. Anders als connect() lässt sich disconnect() nicht verketten.

Beispiele

Alle Verbindungen eines Oszillators trennen

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

osc.connect(gain).connect(ctx.destination);
osc.start();

// Nach 2 Sekunden stumm schalten, indem der Oszillator abgekoppelt wird
setTimeout(() => {
  osc.disconnect();
  osc.stop();
  console.log('Oszillator getrennt');
}, 2000);
Oszillator getrennt

Effekt gezielt ein- und ausschalten (Bypass)

const ctx = new AudioContext();
const source = ctx.createOscillator();
const filter = ctx.createBiquadFilter();
filter.type = 'lowpass';
filter.frequency.value = 800;

filter.connect(ctx.destination);
source.connect(ctx.destination); // zunächst ohne Filter
source.start();

let filterAktiv = false;
const toggleFilter = () => {
  if (filterAktiv) {
    source.disconnect(filter);          // nur die Verbindung zum Filter lösen
    source.connect(ctx.destination);
  } else {
    source.disconnect(ctx.destination); // nur den direkten Weg lösen
    source.connect(filter);
  }
  filterAktiv = !filterAktiv;
  console.log(`Filter: ${filterAktiv ? 'an' : 'aus'}`);
};

toggleFilter();
Filter: an

Einzelnen Kanal eines ChannelSplitters trennen

const ctx = new AudioContext();
const osc = ctx.createOscillator();
const splitter = ctx.createChannelSplitter(2);
const merger = ctx.createChannelMerger(2);

osc.connect(splitter);
splitter.connect(merger, 0, 0); // links -> links
splitter.connect(merger, 1, 1); // rechts -> rechts
merger.connect(ctx.destination);
osc.start();

// Nur den rechten Kanal stummschalten
splitter.disconnect(merger, 1, 1);

LFO von einem AudioParam lösen

const ctx = new AudioContext();
const osc = ctx.createOscillator();
const lfo = ctx.createOscillator();
const lfoGain = ctx.createGain();

lfo.frequency.value = 5;
lfoGain.gain.value = 20;
lfo.connect(lfoGain).connect(osc.frequency); // Vibrato
osc.connect(ctx.destination);
osc.start();
lfo.start();

// Vibrato beenden
setTimeout(() => lfoGain.disconnect(osc.frequency), 3000);

// Wichtig · Fallstricke

  • InvalidAccessError: Wenn keine passende Verbindung zum angegebenen Ziel besteht, wird eine InvalidAccessError-DOMException ausgelöst. Bei ungewissem Zustand deshalb try…catch verwenden oder den Verbindungsstatus selbst mitführen.
  • IndexSizeError: Kommt bei ungültigen Werten für output bzw. input.
  • Der Aufruf ohne Argumente trennt alle ausgehenden Verbindungen, also auch Verbindungen zu Analysern oder Aufnahme-Knoten, die man vielleicht behalten wollte.
  • Ein abruptes Trennen kann hörbare Knackgeräusche verursachen. Besser vorher mit gain.setTargetAtTime() oder linearRampToValueAtTime() ausblenden und erst danach trennen.
  • disconnect() hält Quellknoten nicht an. Ein OscillatorNode oder AudioBufferSourceNode läuft weiter und braucht Rechenzeit, bis stop() aufgerufen wird.
  • Kompatibilität: Die Form ohne Argumente funktioniert überall. Die gezielten Formen (mit destination) gibt es in allen aktuellen Browsern, in sehr alten WebKit-Versionen aber nicht.