Start · Sprachen · JavaScript · Referenz · AudioContext.resume()

AudioContext.resume()

Methode

Setzt den Zeitverlauf eines angehaltenen oder vom Browser blockierten <code>AudioContext</code> fort und liefert ein Promise, das nach dem Fortsetzen erfüllt wird.

seit JavaScript Baseline: alle modernen Browser (seit 2015) Kategorie: webapi

Signatur

AudioContext.prototype.resume()

Beschreibung

Mit resume() wechselt ein AudioContext aus dem Zustand "suspended" zurück nach "running". Ab diesem Moment läuft currentTime wieder weiter, und alle angeschlossenen Audioknoten werden verarbeitet und an das Ausgabegerät geschickt.

Die Methode braucht man in der Praxis vor allem wegen der Autoplay-Richtlinien der Browser: Ein AudioContext, der ohne Benutzerinteraktion erzeugt wird, startet oft im Zustand "suspended". Erst wenn resume() in einem Ereignis-Handler aufgerufen wird, der durch eine echte Benutzeraktion ausgelöst wurde (z. B. click, keydown, pointerup), gibt der Browser die Audioausgabe frei.

Außerdem ist resume() das Gegenstück zu AudioContext.suspend(): So lässt sich die Audioverarbeitung vorübergehend anhalten, um CPU und Akku zu schonen, etwa wenn ein Spiel pausiert oder der Tab in den Hintergrund wechselt, und später ohne Neuaufbau des Audiographen fortsetzen.

Das zurückgegebene Promise wird erfüllt, sobald der Kontext tatsächlich läuft. Den aktuellen Zustand liest man über AudioContext.state aus. Auf Zustandswechsel reagiert man mit dem Ereignis statechange.

Rückgabewert

Typ
Promise<undefined>
Beschreibung
Ein Promise, das mit undefined erfüllt wird, sobald der Kontext wieder läuft. Es wird mit einem InvalidStateError (DOMException) abgelehnt, wenn der Kontext bereits geschlossen ist (state === "closed").

Beispiele

Audio nach Benutzerklick freischalten (Autoplay-Richtlinie)

const ctx = new AudioContext();
console.log('Startzustand:', ctx.state); // oft "suspended"

document.querySelector('#start').addEventListener('click', async () => {
  if (ctx.state === 'suspended') {
    await ctx.resume();
  }
  console.log('Zustand nach Klick:', ctx.state);

  // Kurzen Testton abspielen
  const osc = ctx.createOscillator();
  osc.frequency.value = 440;
  osc.connect(ctx.destination);
  osc.start();
  osc.stop(ctx.currentTime + 0.5);
});
Startzustand: suspended Zustand nach Klick: running

Pause/Weiter-Schalter mit suspend() und resume()

const ctx = new AudioContext();
const button = document.querySelector('#toggle');

button.addEventListener('click', async () => {
  if (ctx.state === 'running') {
    await ctx.suspend();
    button.textContent = 'Weiter';
  } else if (ctx.state === 'suspended') {
    await ctx.resume();
    button.textContent = 'Pause';
  }
  console.log(`Zustand: ${ctx.state}, Zeit: ${ctx.currentTime.toFixed(2)} s`);
});
Zustand: suspended, Zeit: 3.42 s Zustand: running, Zeit: 3.42 s

Beim Wechsel in den Hintergrund pausieren und danach fortsetzen

const ctx = new AudioContext();

ctx.addEventListener('statechange', () => {
  console.log('Neuer Zustand:', ctx.state);
});

document.addEventListener('visibilitychange', async () => {
  try {
    if (document.hidden) {
      await ctx.suspend();
    } else {
      await ctx.resume();
    }
  } catch (err) {
    // z. B. InvalidStateError, wenn der Kontext bereits geschlossen wurde
    console.error('Zustandswechsel fehlgeschlagen:', err.name);
  }
});
Neuer Zustand: suspended Neuer Zustand: running

Geschlossenen Kontext abfangen

const ctx = new AudioContext();
await ctx.close();

try {
  await ctx.resume();
} catch (err) {
  console.log(err.name);
}
InvalidStateError

// Wichtig · Fallstricke

  • Benutzeraktion nötig: Wird resume() außerhalb einer Benutzerinteraktion aufgerufen, bleibt das Promise in Chrome und Safari eventuell unerfüllt, bis eine Interaktion stattfindet. Es wird nicht zwingend abgelehnt. Den Aufruf also direkt in einen click- oder keydown-Handler legen und nicht auf ein Promise warten, das außerhalb davon entsteht.
  • Geschlossene Kontexte: Nach close() lässt sich ein Kontext nicht mehr fortsetzen. resume() lehnt dann mit InvalidStateError ab, und man muss einen neuen AudioContext erzeugen.
  • Safari/iOS: Hier kann der Zustand "interrupted" auftreten, z. B. bei einem Telefonanruf. Auch dann braucht es resume(), oft erst nach einer erneuten Benutzeraktion. Ältere Safari-Versionen brauchen das Präfix webkitAudioContext.
  • Nicht für OfflineAudioContext: OfflineAudioContext hat eine eigene resume()-Methode mit anderer Bedeutung (Fortsetzen nach einem zeitgesteuerten suspend(time)).
  • Ein Aufruf bei laufendem Kontext ist unschädlich: Das Promise wird einfach erfüllt.
  • Browser-Kompatibilität: Chrome 41+, Firefox 40+, Safari 9+, Edge 14+.