Signatur
Beschreibung
Die Eigenschaft numberOfOutputs gibt als ganze Zahl (unsigned long) an, wie viele Ausgänge ein Audioknoten hat. Über jeden Ausgang kann der Knoten mit connect() an andere Knoten oder an einen AudioParam angeschlossen werden. Die Eigenschaft ist schreibgeschützt. Der Wert wird beim Erzeugen des Knotens festgelegt und ändert sich danach nicht mehr.
Welcher Wert herauskommt, hängt vom Knotentyp ab:
- 0 Ausgänge:
AudioDestinationNode(Endpunkt des Graphen, alsocontext.destination). - 1 Ausgang: fast alle anderen Knoten, z. B.
OscillatorNode,GainNode,BiquadFilterNode,AnalyserNode,ChannelMergerNodeundMediaElementAudioSourceNode. - Frei wählbar:
ChannelSplitterNode(OptionnumberOfOutputs, Standard 6) undAudioWorkletNode(OptionnumberOfOutputs, Standard 1).
Nützlich ist die Eigenschaft vor allem, wenn man Audiographen generisch aufbaut oder prüft, etwa in Hilfsfunktionen, Visualisierungen des Graphen oder Bibliotheken. Damit lässt sich vor einem Aufruf von connect(ziel, outputIndex) prüfen, ob der gewünschte Ausgangsindex überhaupt existiert. Bei Knoten mit mehreren Ausgängen wie dem ChannelSplitterNode kann man so alle Ausgänge in einer Schleife ansprechen.
Rückgabewert
AudioDestinationNode ist der Wert 0.Beispiele
Anzahl der Ausgänge verschiedener Knoten auslesen
const ctx = new AudioContext();
const osc = ctx.createOscillator();
const gain = ctx.createGain();
const splitter = ctx.createChannelSplitter(4);
console.log('Oscillator:', osc.numberOfOutputs);
console.log('Gain:', gain.numberOfOutputs);
console.log('Splitter:', splitter.numberOfOutputs);
console.log('Destination:', ctx.destination.numberOfOutputs);
Alle Ausgänge eines ChannelSplitterNode einzeln verarbeiten
const ctx = new AudioContext();
const osc = new OscillatorNode(ctx, { frequency: 440 });
const splitter = new ChannelSplitterNode(ctx, { numberOfOutputs: 2 });
const merger = new ChannelMergerNode(ctx, { numberOfInputs: 2 });
osc.connect(splitter);
// Jeden Ausgang des Splitters mit eigener Lautstärke an den Merger führen
const gains = [];
for (let i = 0; i < splitter.numberOfOutputs; i++) {
const g = new GainNode(ctx, { gain: i === 0 ? 1 : 0.3 });
splitter.connect(g, i); // Ausgang i des Splitters
g.connect(merger, 0, i); // an Eingang i des Mergers
gains.push(g);
}
merger.connect(ctx.destination);
console.log(`${gains.length} Kanäle verdrahtet`);
Sicheres Verbinden mit Prüfung des Ausgangsindex
const safeConnect = (source, target, outputIndex = 0, inputIndex = 0) => {
if (source.numberOfOutputs === 0) {
throw new Error(`${source.constructor.name} hat keine Ausgänge`);
}
if (outputIndex >= source.numberOfOutputs) {
throw new RangeError(
`Ausgang ${outputIndex} existiert nicht (max. ${source.numberOfOutputs - 1})`
);
}
return source.connect(target, outputIndex, inputIndex);
};
const ctx = new AudioContext();
const gain = ctx.createGain();
safeConnect(gain, ctx.destination);
try {
safeConnect(gain, ctx.destination, 1);
} catch (err) {
console.log(err.message);
}
AudioWorkletNode mit mehreren Ausgängen
// processor.js muss per addModule geladen werden und 'multi-out' registrieren
const ctx = new AudioContext();
await ctx.audioWorklet.addModule('processor.js');
const node = new AudioWorkletNode(ctx, 'multi-out', {
numberOfInputs: 1,
numberOfOutputs: 3,
outputChannelCount: [2, 1, 1]
});
console.log(node.numberOfOutputs);
// Wichtig · Fallstricke
- Schreibgeschützt: Eine Zuweisung wie
node.numberOfOutputs = 2wird im nicht-strikten Modus stillschweigend ignoriert und löst im Strict Mode einenTypeErroraus. Die Anzahl lässt sich nur beim Erzeugen festlegen, und das auch nur beiChannelSplitterNodeundAudioWorkletNode. - Ungültiger Index: Ist bei
connect(ziel, outputIndex)deroutputIndexgrößer oder gleichnumberOfOutputs, wirft der Browser eineIndexSizeError-DOMException. - Ausgänge und Kanäle sind verschieden: Ein einzelner Ausgang kann mehrere Kanäle führen, zum Beispiel stereo. Die Kanalzahl steuern
channelCountundchannelCountMode, nichtnumberOfOutputs. - Ein
ChannelSplitterNodekann höchstens so viele Ausgänge haben, wieAudioContextKanäle unterstützt (mindestens 32). Bei 0 oder einem zu großen Wert wirft der Konstruktor eineIndexSizeError. - Browserunterstützung: Die Eigenschaft funktioniert in allen modernen Browsern. Ältere WebKit-Versionen brauchen unter Umständen
webkitAudioContext. Außerdem startetAudioContextohne Benutzerinteraktion im Zustandsuspended. Das Auslesen der Eigenschaft klappt trotzdem.