AudioWorkletProcessor: process()-Methode
Die process()
-Methode einer von der AudioWorkletProcessor
-Klasse abgeleiteten Klasse implementiert den Audioverarbeitungsalgorithmus für das Audio-Processor-Worklet.
Auch wenn die Methode kein Teil der AudioWorkletProcessor
-Schnittstelle ist, muss jede Implementierung von AudioWorkletProcessor
eine process()
-Methode bereitstellen.
Die Methode wird synchron vom Audio-Rendering-Thread aufgerufen, und zwar einmal für jeden Audioblock (auch als Rendering-Quantum bekannt), der durch den entsprechenden AudioWorkletNode
des Prozessors geleitet wird. Mit anderen Worten, jedes Mal, wenn ein neuer Block von Audio zur Bearbeitung durch Ihren Prozessor bereit ist, wird Ihre process()
-Funktion aufgerufen, um dies zu tun.
Hinweis: Derzeit sind Audiodatenblöcke immer 128 Frames lang—das heißt, sie enthalten 128 32-Bit-Floating-Point-Samples für jeden der Eingabekanäle. Pläne zur Überarbeitung der Spezifikation sind jedoch bereits in Arbeit, um zu ermöglichen, dass die Größe der Audioblöcke abhängig von den Umständen geändert werden kann (zum Beispiel, wenn die Audiogeräte oder die CPU-Auslastung bei größeren Blockgrößen effizienter ist). Daher müssen Sie immer die Größe des Sample-Arrays überprüfen und nicht von einer bestimmten Größe ausgehen.
Diese Größe kann sich im Laufe der Zeit sogar ändern, also sollten Sie nicht nur den ersten Block betrachten und annehmen, dass die Sample-Puffer immer die gleiche Größe haben werden.
Syntax
process(inputs, outputs, parameters)
Parameter
inputs
-
Ein Array von Eingängen, die mit dem Knoten verbunden sind, wobei jedes Element wiederum ein Array von Kanälen ist. Jeder Kanal ist ein
Float32Array
, das 128 Samples enthält. Zum Beispiel greiftinputs[n][m][i]
auf den n-ten Eingang, den m-ten Kanal dieses Eingangs und das i-te Sample dieses Kanals zu.Jeder Sample-Wert liegt im Bereich von
[-1 .. 1]
.Die Anzahl der Eingänge und somit die Länge dieses Arrays ist bei der Konstruktion des Knotens festgelegt (siehe
AudioWorkletNode
). Wenn kein aktiver Knoten mit dem n-ten Eingang des Knotens verbunden ist, wirdinputs[n]
ein leeres Array sein (keine Eingabekanäle verfügbar).Die Anzahl der Kanäle in jedem Eingang kann je nach den Eigenschaften
channelCount
undchannelCountMode
variieren. outputs
-
Ein Array von Ausgängen, das in seiner Struktur dem Parameter
inputs
ähnelt. Es soll während der Ausführung derprocess()
-Methode gefüllt werden. Jeder der Ausgabekanäle wird standardmäßig mit Nullen gefüllt—der Prozessor gibt Stille aus, es sei denn, die Ausgabearrays werden modifiziert. parameters
-
Ein Objekt, das Zeichenketten als Schlüssel und
Float32Array
als Werte enthält. Für jeden benutzerdefiniertenAudioParam
, der mit demparameterDescriptors
-Getter definiert wurde, ist der Schlüssel im Objekt einname
diesesAudioParam
, und der Wert ist einFloat32Array
. Die Werte des Arrays werden unter Berücksichtigung geplanter Automatisierungsereignisse berechnet.Wenn die Automatisierungsrate des Parameters
"a-rate"
ist, enthält das Array 128 Werte—einen für jeden Frame im aktuellen Audioblock. Wenn während der durch den aktuellen Block dargestellten Zeit keine Automatisierung stattfindet, kann das Array einen einzigen Wert enthalten, der für den gesamten Block konstant ist, anstatt 128 identische Werte.Wenn die Automatisierungsrate
"k-rate"
ist, enthält das Array einen einzigen Wert, der für jeden der 128 Frames verwendet werden soll.
Rückgabewert
Ein Boolean-Wert, der angibt, ob der AudioWorkletNode
gezwungen werden soll, aktiv zu bleiben, selbst wenn die interne Logik des Benutzeragents ansonsten entscheiden würde, dass es sicher ist, den Knoten herunterzufahren.
Der zurückgegebene Wert ermöglicht es Ihrem Prozessor, die Lebenszykluspolitik des AudioWorkletProcessor
und des ihn besitzenden Knotens zu beeinflussen. Wenn die Kombination aus Rückgabewert und Zustand des Knotens dazu führt, dass der Browser entscheidet, den Knoten zu stoppen, wird process()
nicht erneut aufgerufen.
Durch die Rückgabe von true
wird die Web Audio API gezwungen, den Knoten am Leben zu halten, während die Rückgabe von false
dem Browser ermöglicht, den Knoten zu beenden, wenn er weder neue Audiodaten erzeugt noch Daten durch seine Eingänge empfängt, die er verarbeitet.
Die 3 häufigsten Typen von Audioknoten sind:
- Eine Ausgabequelle. Ein
AudioWorkletProcessor
, der einen solchen Knoten implementiert, solltetrue
von derprocess
-Methode zurückgeben, solange er eine Ausgabe erzeugt. Die Methode solltefalse
zurückgeben, sobald bekannt ist, dass sie keine Ausgabe mehr erzeugen wird. Zum Beispiel sollte der Prozessor hinter einemAudioBufferSourceNode
true
von derprocess
-Methode zurückgeben, während der Puffer abgespielt wird, undfalse
zurückgeben, wenn das Abspielen des Puffers beendet ist (es gibt keine Möglichkeit,play
auf demselbenAudioBufferSourceNode
erneut zu rufen). - Ein Knoten, der seine Eingabe transformiert. Ein Prozessor, der einen solchen Knoten implementiert, sollte
false
von derprocess
-Methode zurückgeben, um das Vorhandensein aktiver Eingangsknoten und Verweise auf den Knoten zu erlauben, die bestimmen, ob er gesammelt werden kann. Ein Beispiel für einen Knoten mit diesem Verhalten ist derGainNode
. Sobald keine Eingänge mehr verbunden sind und Verweise beibehalten werden, kann kein Gain mehr auf irgendetwas angewendet werden, sodass er sicher gesammelt werden kann. - Ein Knoten, der seine Eingabe transformiert, aber eine sogenannte Nachlaufzeit hat—das bedeutet, dass er eine Ausgabe für einige Zeit erzeugen wird, selbst nachdem seine Eingänge getrennt oder inaktiv sind (Null-Kanäle erzeugend). Ein Prozessor, der einen solchen Knoten implementiert, sollte
true
von derprocess
-Methode für die Dauer der Nachlaufzeit zurückgeben, beginnend, sobald Eingänge gefunden werden, die Null-Kanäle enthalten. Ein Beispiel für einen solchen Knoten ist derDelayNode
—er hat eine Nachlaufzeit, die seinerdelayTime
-Eigenschaft entspricht.
Hinweis:
Das Fehlen der return
-Anweisung bedeutet, dass die Methode undefined
zurückgibt, und da dies ein falsy-Wert ist, ist es wie die Rückgabe von false
.
Das Weglassen einer expliziten return
-Anweisung kann schwer zu erkennende Probleme für Ihre Knoten verursachen.
Ausnahmen
Da die process()
-Methode vom Benutzer implementiert wird, kann sie alles werfen.
Wenn ein nicht abgefangener Fehler geworfen wird, wird der Knoten ein processorerror
-Ereignis emittieren und für den Rest seines Lebens Stille ausgeben.
Beispiele
In diesem Beispiel erstellen wir einen AudioWorkletProcessor
, der weißes Rauschen an seinen ersten Ausgang ausgibt. Der Gain kann durch den Parameter customGain
gesteuert werden.
class WhiteNoiseProcessor extends AudioWorkletProcessor {
process(inputs, outputs, parameters) {
// take the first output
const output = outputs[0];
// fill each channel with random values multiplied by gain
output.forEach((channel) => {
for (let i = 0; i < channel.length; i++) {
// generate random value for each sample
// Math.random range is [0; 1); we need [-1; 1]
// this won't include exact 1 but is fine for now for simplicity
channel[i] =
(Math.random() * 2 - 1) *
// the array can contain 1 or 128 values
// depending on if the automation is present
// and if the automation rate is k-rate or a-rate
(parameters["customGain"].length > 1
? parameters["customGain"][i]
: parameters["customGain"][0]);
}
});
// as this is a source node which generates its own output,
// we return true so it won't accidentally get garbage-collected
// if we don't have any references to it in the main thread
return true;
}
// define the customGain parameter used in process method
static get parameterDescriptors() {
return [
{
name: "customGain",
defaultValue: 1,
minValue: 0,
maxValue: 1,
automationRate: "a-rate",
},
];
}
}
Spezifikationen
Specification |
---|
Web Audio API # process |
Browser-Kompatibilität
Dies ist keine Methode, die von Browsern bereitgestellt wird, sondern eine Callback-Methode, die im Client-Code geschrieben werden muss.