import { type Vec3 } from '@quake2ts/shared'; import { AudioContextController, type AudioBufferSourceNodeLike, type BiquadFilterNodeLike, type GainNodeLike, type PannerNodeLike } from './context.js'; import { SoundRegistry } from './registry.js'; import { type ChannelState } from './channels.js'; import { ReverbSystem, type ReverbPreset } from './reverb.js'; export interface SoundRequest { entity: number; channel: number; soundIndex: number; volume: number; attenuation: number; origin?: Vec3; timeOffsetMs?: number; looping?: boolean; } export interface AudioSystemOptions { context: AudioContextController; registry: SoundRegistry; playerEntity?: number; listener?: ListenerState; sfxVolume?: number; masterVolume?: number; resolveOcclusion?: OcclusionResolver; } export interface ActiveSound { channelIndex: number; entnum: number; entchannel: number; endTimeMs: number; source: AudioBufferSourceNodeLike; panner: PannerNodeLike; gain: GainNodeLike; baseGain: number; origin: Vec3; attenuation: number; occlusion?: OcclusionState; } interface OcclusionState { scale: number; lowpassHz?: number; filter?: BiquadFilterNodeLike; } export interface OcclusionResult { gainScale?: number; lowpassHz?: number; } export interface ListenerState { origin: Vec3; right: Vec3; mono?: boolean; playerEntity?: number; } export type OcclusionResolver = (listener: ListenerState, source: Vec3, attenuation: number) => OcclusionResult | undefined; export interface AudioDiagnostics { activeChannels: number; masterVolume: number; sfxVolume: number; channels: ChannelState[]; activeSounds: Array<{ entnum: number; entchannel: number; channelIndex: number; origin: Vec3; gain: number; baseGain: number; attenuation: number; maxDistance?: number; distanceModel?: string; occlusion?: { scale: number; lowpassHz?: number; }; }>; } export declare class AudioSystem { private readonly channels; private readonly registry; private readonly contextController; private readonly graph; private readonly playerEntity?; private readonly activeSources; private readonly resolveOcclusion?; private listener; private sfxVolume; private masterVolume; private playbackRate; readonly reverb: ReverbSystem | undefined; constructor(options: AudioSystemOptions); setListener(listener: ListenerState): void; setMasterVolume(volume: number): void; setSfxVolume(volume: number): void; setPlaybackRate(rate: number): void; ensureRunning(): Promise; setReverbPreset(preset: ReverbPreset | null): void; play(request: SoundRequest): ActiveSound | undefined; stop(channelIndex: number): void; stopEntitySounds(entnum: number): void; updateEntityPosition(entnum: number, origin: Vec3): void; positionedSound(origin: Vec3, soundIndex: number, volume: number, attenuation: number): ActiveSound | undefined; ambientSound(origin: Vec3, soundIndex: number, volume: number): ActiveSound | undefined; getChannelState(index: number): ChannelState | undefined; getDiagnostics(): AudioDiagnostics; setUnderwater(enabled: boolean, cutoffHz?: number): void; private createPanner; private configurePanner; private applyOriginToPanner; private createOcclusionFilter; private updateSourceGain; private applyOcclusion; } export {}; //# sourceMappingURL=system.d.ts.map