Signatur
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 Indexoutput.disconnect(destination): trennt alle Verbindungen zum angegebenenAudioNodebzw.AudioParam.disconnect(destination, output): trennt nur die Verbindung des Ausgangsoutputzum Ziel.disconnect(destination, output, input): trennt genau eine Verbindung vom Ausgangoutputzum Einganginputdes Ziel-Knotens. Diese Form gibt es nur beiAudioNode-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
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);
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();
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-DOMExceptionausgelöst. Bei ungewissem Zustand deshalbtry…catchverwenden oder den Verbindungsstatus selbst mitführen. - IndexSizeError: Kommt bei ungültigen Werten für
outputbzw.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()oderlinearRampToValueAtTime()ausblenden und erst danach trennen. disconnect()hält Quellknoten nicht an. EinOscillatorNodeoderAudioBufferSourceNodeläuft weiter und braucht Rechenzeit, bisstop()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.