This module provides a lightweight audio management layer built on the Web Audio API. It handles:
It is designed for browser environments where audio playback must be unlocked via user interaction.
Creation → Update → Destruction
createAudioState)
AudioContextGainNode for music volume controlloadAudio)AudioContext.close()musicSource, musicGain connections)createAudioState(): AudioStateInitializes and returns the audio system state.
AudioContextGainNode for music outputloadAudio(state, name, url): Promise<void>Loads an audio file and stores it in memory.
AudioBufferstate.buffers under nameplaySound(state, name): voidPlays a one-shot sound effect.
playMusic(state, name, volume?): voidPlays looping background music.
musicGain node for volume controlstate.musicSourcestopMusic(state): voidStops currently playing music.
AudioBufferSourceNodemusicSource referencesetMusicVolume(state, volume): voidAdjusts global music volume.
GainNode.gain.valueplayMusicAfterGesture(state, name, volume?): Promise<void>Ensures audio is unlocked before playing music.
AudioContext if neededModern browsers block audio until a user gesture occurs. This module handles it via:
clickkeydownAudioContext if suspendedstate.unlocked = trueMap<string, AudioBuffer>Music playback uses a dedicated signal chain:
AudioBufferSourceNode → GainNode (musicGain) → AudioContext.destination
This allows centralized volume control for music only, without affecting sound effects.
const audio = createAudioState();
await loadAudio(audio, "click", "/sounds/click.mp3");
await loadAudio(audio, "bgm", "/music/theme.mp3");
// Play sound effect
playSound(audio, "click");
// Start background music
playMusic(audio, "bgm", 0.5);
// Adjust volume later
setMusicVolume(audio, 0.2);
// Stop music
stopMusic(audio);
AudioContext, AudioBuffer, GainNode)