Signatur
Beschreibung
Der Konstruktor OfflineAudioCompletionEvent() erzeugt ein Ereignisobjekt vom Typ OfflineAudioCompletionEvent. Solche Ereignisse löst ein OfflineAudioContext normalerweise selbst aus, und zwar als complete-Ereignis, sobald startRendering() fertig ist. Die Eigenschaft renderedBuffer enthält dann das Ergebnis als AudioBuffer.
Selbst ruft man den Konstruktor vor allem in Tests auf, zum Beispiel für Unit-Tests von Handlern, die auf complete reagieren. Auch in eigenen Audio-Pipelines ist er nützlich: Dort kann man das Ende eines Renderings über ein beliebiges EventTarget weitermelden und dabei dieselbe Ereignisform nutzen wie der Browser.
Für neuen Code ist der Promise-Weg meist besser: await ctx.startRendering() liefert den AudioBuffer direkt. Das complete-Ereignis und damit dieser Konstruktor sind trotzdem weiterhin Teil der Spezifikation.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $type Pflicht | string | Name des Ereignisses. Der Browser verwendet "complete", du kannst aber jeden anderen Namen übergeben. |
|
| $options Pflicht | object | Wörterbuch mit Initialwerten. Pflichtfeld ist renderedBuffer (AudioBuffer), der fertig gerenderte Puffer. Außerdem sind die üblichen EventInit-Felder bubbles, cancelable und composed (jeweils boolean, Standard false) möglich. |
Rückgabewert
renderedBuffer verweist auf den übergebenen AudioBuffer.Beispiele
Ereignis manuell erzeugen
// Puffer mit 1 Sekunde Stille in Stereo bei 44,1 kHz
const buffer = new AudioBuffer({ numberOfChannels: 2, length: 44100, sampleRate: 44100 });
const event = new OfflineAudioCompletionEvent('complete', { renderedBuffer: buffer });
console.log(event.type);
console.log(event.renderedBuffer.duration);
Handler für complete testen, ohne echtes Rendering
const ctx = new OfflineAudioContext(1, 22050, 22050);
const onComplete = (e) => {
console.log(`Fertig: ${e.renderedBuffer.length} Samples`);
};
ctx.addEventListener('complete', onComplete);
// Ereignis gezielt auslösen, um den Handler zu prüfen
const fake = new AudioBuffer({ numberOfChannels: 1, length: 22050, sampleRate: 22050 });
ctx.dispatchEvent(new OfflineAudioCompletionEvent('complete', { renderedBuffer: fake }));
Echtes Rendering: Ereignis und Promise im Vergleich
const ctx = new OfflineAudioContext(1, 44100 * 2, 44100);
const osc = new OscillatorNode(ctx, { frequency: 440 });
osc.connect(ctx.destination);
osc.start();
// Ereignis-Weg
ctx.oncomplete = (e) => console.log('Event:', e.renderedBuffer.duration, 's');
// Promise-Weg (empfohlen)
const rendered = await ctx.startRendering();
console.log('Promise:', rendered.duration, 's');
// Wichtig · Fallstricke
- Pflichtoption: Fehlt
renderedBufferinoptions, wirft der Konstruktor einenTypeError. Das gilt auch, wenn der Wert keinAudioBufferist. - Manuell ausgelöst heißt nicht echt: Ein selbst erzeugtes Ereignis hat
isTrusted === falseund rendert kein Audio. Es löst nur die registrierten Handler aus. - Reihenfolge: Nutzt man beide Wege, wird das Promise von
startRendering()je nach Browser vor oder nach demcomplete-Ereignis aufgelöst. Verlass dich nicht auf eine bestimmte Reihenfolge. - Kompatibilität: Der Konstruktor funktioniert in allen aktuellen Browsern (Chrome, Firefox, Safari, Edge). Sehr alte Safari-Versionen mit
webkitOfflineAudioContextkennen ihn nicht. In Node.js gibt es ihn nur über Polyfills wienode-web-audio-api.