Atom Engine

Menedżer stanu audio (Web Audio System)

Cel

Ten moduł zapewnia lekką warstwę zarządzania dźwiękiem opartą na Web Audio API. Obsługuje:

Jest przeznaczony do środowisk przeglądarkowych, w których odtwarzanie audio musi zostać odblokowane poprzez interakcję użytkownika.


Cykl życia

Tworzenie → Aktualizacja → Zniszczenie

  1. Tworzenie (createAudioState)

    • Instancjonuje AudioContext
    • Tworzy globalny GainNode do kontroli głośności muzyki
    • Rejestruje jednorazowe listenery zdarzeń do odblokowania audio przy pierwszej interakcji użytkownika
  2. Aktualizacja (użycie w czasie działania)

    • Bufory audio są ładowane do pamięci (loadAudio)
    • Dźwięki lub muzyka są odtwarzane z cache’owanych buforów
    • Muzyka może być zatrzymywana lub jej głośność może być dynamicznie zmieniana
  3. Zniszczenie

    • Niezaimplementowane jawnie
    • Wymagałoby ręcznego czyszczenia:

      • AudioContext.close()
      • aktywnych węzłów (musicSource, połączenia musicGain)

Publiczne API

createAudioState(): AudioState

Inicjalizuje i zwraca stan systemu audio.


loadAudio(state, name, url): Promise<void>

Ładuje plik audio i przechowuje go w pamięci.


playSound(state, name): void

Odtwarza jednorazowy efekt dźwiękowy.


playMusic(state, name, volume?): void

Odtwarza zapętloną muzykę tła.


stopMusic(state): void

Zatrzymuje aktualnie odtwarzaną muzykę.


setMusicVolume(state, volume): void

Dostosowuje globalną głośność muzyki.


playMusicAfterGesture(state, name, volume?): Promise<void>

Zapewnia, że audio jest odblokowane przed odtworzeniem muzyki.


Wewnętrzne działanie

System odblokowywania audio

Nowoczesne przeglądarki blokują audio do momentu wystąpienia gestu użytkownika. Ten moduł obsługuje to poprzez:


Zarządzanie buforami


Architektura routingu muzyki

Odtwarzanie muzyki używa dedykowanego łańcucha sygnału:

AudioBufferSourceNode → GainNode (musicGain) → AudioContext.destination

Pozwala to na scentralizowaną kontrolę głośności tylko muzyki, bez wpływu na efekty dźwiękowe.


Separacja dźwięków i muzyki


Przykład

const audio = createAudioState();

await loadAudio(audio, "click", "/sounds/click.mp3");
await loadAudio(audio, "bgm", "/music/theme.mp3");

// Odtwórz efekt dźwiękowy
playSound(audio, "click");

// Uruchom muzykę tła
playMusic(audio, "bgm", 0.5);

// Dostosuj głośność później
setMusicVolume(audio, 0.2);

// Zatrzymaj muzykę
stopMusic(audio);

Powiązane elementy