/** * GameAudioManager — менеджер аудио для проектов в плеере (GD и др.). * * Хранит один AudioContext на сессию плеера, поддерживает: * - playSfx(name) — проигрывает один из 9 SFX (jump/death/orb_tap/...) * - playMusic(trackId) — играет фоновую музыку (синтез fallback / mp3 если есть) * - stopMusic() * - muteMusic(bool) * * AudioContext создаётся лениво при первом playSfx/playMusic. Чтобы он не был * suspended из-за autoplay policy, плеер вызывает unlock() при первом клике * (см. KubikonPlayer.jsx). * * SFX и музыка — те же фабрики что в /admin-preview/gd-sfx и /admin-preview/gd-music. * Реальные mp3 (если положены в /public/music/gd/) играются вместо fallback-синтеза. */ import { SFX_CATALOG } from '../AdminPreview/gdSfx/sfxFactories'; import { TRACKS } from '../AdminPreview/gdMusic/musicCatalog'; import { SynthPlayer, trackFileExists } from '../AdminPreview/gdMusic/musicSynth'; export class GameAudioManager { constructor() { this.ctx = null; this.masterGain = null; this.sfxIndex = {}; for (const s of SFX_CATALOG) this.sfxIndex[s.id] = s; this.trackIndex = {}; for (const t of TRACKS) this.trackIndex[t.id] = t; this.currentTrackId = null; this.audioEl = null; //