How to Pause and Resume All Audio in Howler.js

Managing game audio effectively requires the ability to pause and resume all sounds simultaneously, such as when a player opens an in-game menu, pauses the game, or minimizes the browser tab. While Howler.js provides a global mute() method, it does not have a native, single-step Howler.pauseAll() function. This article outlines the two most effective ways to implement a global pause-all and resume-all feature using Howler.js.


Howler.js maintains an internal list of all active Howl instances in an array called Howler._howls. You can loop through this array to pause and resume individual sounds.

To ensure you only resume sounds that were actually playing before the game was paused (instead of accidentally starting sounds that were already stopped), you should track the playing state.

Code Implementation

// Array to keep track of sounds that were playing before the pause
let pausedSounds = [];

/**
 * Pauses all currently playing sounds.
 */
function pauseAllSounds() {
  pausedSounds = []; // Clear any previously stored states

  Howler._howls.forEach((sound) => {
    if (sound.playing()) {
      sound.pause();
      pausedSounds.push(sound); // Store the sound reference to resume later
    }
  });
}

/**
 * Resumes only the sounds that were paused by pauseAllSounds.
 */
function resumeAllSounds() {
  pausedSounds.forEach((sound) => {
    sound.play();
  });
  
  pausedSounds = []; // Reset the tracker
}

Why this method works best:


Method 2: Suspending the Web Audio Context (Fastest)

If your game relies entirely on the Web Audio API (which is Howler’s default behavior) and does not use the HTML5 Audio fallback, you can pause all audio processing directly at the browser level by suspending the Web Audio Context.

Code Implementation

/**
 * Pauses all game audio by suspending the Web Audio Context.
 */
function pauseAllAudioContext() {
  if (Howler.ctx && Howler.ctx.state === 'running') {
    Howler.ctx.suspend().then(() => {
      console.log("Audio playback suspended successfully.");
    });
  }
}

/**
 * Resumes all game audio by resuming the Web Audio Context.
 */
function resumeAllAudioContext() {
  if (Howler.ctx && Howler.ctx.state === 'suspended') {
    Howler.ctx.resume().then(() => {
      console.log("Audio playback resumed successfully.");
    });
  }
}

Why this method works best:

Note: This method will not affect any Howler instances that explicitly use { html5: true } in their configuration.