sound-manager-ts
Version:
Lightweight TypeScript soundmanager for Web Audio API. Seamless audio control in web apps and games with full type safety and modern API
198 lines (197 loc) • 8.13 kB
TypeScript
import { PlayOptions } from './play-sound-options.interface';
import { SoundEvent } from './sound-event.interface';
import { SoundEventsEnum } from './sound-events.enum';
import { SoundGroup } from './sound-group';
import { SoundManagerConfig } from './sound-manager-config';
import { SoundManagerInterface } from './sound-manager.interface';
import { SoundPannerConfig } from './sound-panner-config';
import { SoundResetOptions } from './sound-reset-options.interface';
import { SoundStateInfo } from './sound-state-info.interface';
import { Sound } from './sound.interface';
export declare class SoundManager implements SoundManagerInterface {
private readonly config;
private readonly context;
private sounds;
private masterGainNode;
private masterStereoPanner;
private masterPannerNode;
private previousGlobalVolume;
private isMuted;
private previousGlobalPan;
private PROGRESS_UPDATE_INTERVAL;
private eventListeners;
private readonly activeSources;
private activeFadeCallbacks;
private isHandlingError;
private audioNodeConnector;
private ticker;
private lastError;
private masterSpatialPosition;
private _spatialAudioSupported;
private readonly DEFAULT_PRECISION;
private soundGroups;
private instanceCounters;
private unlockHandlers;
private VERSION;
constructor(config?: SoundManagerConfig);
private initialize;
private debugLog;
private setupVisibilityHandling;
private initializeSpatialAudio;
private setupAudioUnlock;
private removeUnlockListeners;
private isMobileLikeEnvironment;
private setupContextResumeHandlers;
private setupAudioSource;
private handleLoopIteration;
private handleSoundEnded;
private scheduleFadeOut;
private cancelScheduledFadeOut;
private cancelFadeAnimation;
private getValidatedSound;
private setValidatedVolume;
private cleanupSound;
private cleanup;
private handleError;
private cleanupExistingSource;
private getInstanceCounter;
private resetCounterForSound;
private reconnectAudioNodes;
play(id: string, options?: PlayOptions, skipDispatchEvent?: boolean): Sound | undefined;
playSprite(id: string, spriteKey: string, options: PlayOptions, skipDispatchEvent?: boolean): void;
pause(id: string, skipDispatchEvent?: boolean): void;
resume(id: string, skipDispatchEvent?: boolean): void;
stop(id: string, skipDispatchEvent?: boolean): void;
seek(id: string, time: number, skipDispatchEvent?: boolean): void;
stopAllSounds(): void;
pauseAllSounds(): void;
resumeAllSounds(): void;
fadeIn(id: string, duration: number, startVolume?: number, endVolume?: number, skipDispatchEvent?: boolean): void;
fadeOut(id: string, duration?: number, startVolume?: number, endVolume?: number, stopAfterFade?: boolean, skipDispatchEvent?: boolean): void;
private fadeSound;
fadeGlobalIn(duration?: number, startVolume?: number, endVolume?: number): void;
fadeGlobalOut(duration?: number, startVolume?: number, endVolume?: number): void;
getVolume(id: string): number;
setSoundVolume(id: string, volume: number, skipDispatchEvent?: boolean): void;
getSoundVolume(id: string): number;
setGlobalVolume(volume: number): void;
getGlobalVolume(): number;
muteAllSounds(): void;
unmuteAllSounds(): void;
mute(id: string): void;
unmute(id: string): void;
toggleMute(id: string): void;
toggleGlobalMute(): void;
setLoop(id: string, loop: boolean, maxLoops?: number): void;
getLoop(id: string): boolean;
private shouldUseProxy;
private isLocalUrl;
private getProxyUrl;
private loadWithWebAudio;
private fetchWithRetry;
private processAudioResponse;
private loadWithHtml5Audio;
loadSounds(soundsToLoad: {
id: string;
url: string;
}[], signal?: AbortSignal): Promise<void>;
private calculateAudioSize;
private createSoundNode;
loadSound(id: string, url: string, signal?: AbortSignal): Promise<void>;
updateSoundUrl(id: string, newUrl: string): Promise<void>;
unloadSound(id: string): void;
removeSound(id: string): void;
isSoundLoaded(id: string): boolean;
createSoundGroup(groupName: string, options?: {
maxInstances?: number;
playOptions?: PlayOptions;
}): void;
addToSoundGroup(groupName: string, soundId: string): void;
removeFromSoundGroup(groupName: string, soundId: string): void;
getGroup(groupName: string): SoundGroup | undefined;
removeSoundGroup(groupName: string): void;
setSoundSprite(id: string, sprite: {
[key: string]: [number, number];
}): void;
getSpriteConfig(id: string): {
[key: string]: [number, number];
} | undefined;
removeSpriteSound(spriteKey: string): void;
removeSpriteConfig(id: string): void;
suspendContext(): Promise<void>;
resumeContext(): Promise<void>;
getContext(): AudioContext;
getMasterOutput(): AudioNode;
isPlaying(id: string): boolean;
isPaused(id: string): boolean;
isStopped(id: string): boolean;
getSoundState(id: string): SoundStateInfo;
getCurrentTime(id: string): number;
getDuration(id: string): number;
getProgress(id: string): number;
getProgressPercentage(id: string): number;
startProgressTracking(id: string): void;
stopProgressTracking(id: string): void;
setProgressUpdateInterval(interval: number): void;
setPan(id: string, value: number, skipDispatchEvent?: boolean): void;
resetPan(id?: string): void;
removePan(id: string): void;
setGlobalPan(value: number): void;
getGlobalPan(): number;
resetGlobalPan(): void;
getPreviousMasterPan(): number;
cleanupGlobalPan(): void;
isStereoPanActive(id: string): boolean;
isSpatialAudioEnabled(): boolean;
isSpatialAudioSupported(): boolean;
setSpatialPosition(x: number, y: number, z: number, soundId?: string | null, soundPannerConfig?: SoundPannerConfig, skipDispatchEvent?: boolean): void;
getSpatialPosition(soundId: string): {
x: number;
y: number;
z: number;
} | null;
setMasterSpatialPosition(x: number, y: number, z: number, config?: SoundPannerConfig, skipDispatchEvent?: boolean): void;
getMasterSpatialPosition(): {
x: number;
y: number;
z: number;
};
removeSpatialEffect(id: string): void;
isSpatialAudioActive(id: string): boolean;
updatePannerConfigById(soundId: string, newConfig: Partial<SoundPannerConfig>): void;
resetSpatialPosition(id?: string): void;
resetMasterSpatialPosition(): void;
setPlaybackRate(id: string, rate: number, skipDispatchEvent?: boolean): void;
getPlaybackRate(id: string): number;
reset(options?: SoundResetOptions): void;
resetSound(id: string, options?: SoundResetOptions): void;
getSound(id: string): Sound | undefined;
getBuffer(id: string): AudioBuffer | undefined;
getSource(id: string): AudioBufferSourceNode | undefined;
getGainNode(id: string): GainNode | undefined;
hasSound(id: string): boolean;
updateSoundOptions(soundId: string, options: Partial<PlayOptions>): void;
isReady(): boolean;
getSoundCount(): number;
resetAllCounters(): void;
getSoundIds(): string[];
setDebugMode(debug: boolean): void;
getConfig(): Readonly<SoundManagerConfig>;
getLastError(): Error | null;
roundValue(value: number, decimals?: number): number;
destroy(): void;
addEventListener(type: SoundEventsEnum, callback: (event: SoundEvent) => void, filter?: {
originalId?: string;
instanceId?: string;
instancePattern?: RegExp;
}): void;
removeEventListener(type: SoundEventsEnum, callback: (event: SoundEvent) => void, filter?: {
originalId?: string;
instancePattern?: RegExp;
}): void;
removeEventListenersForInstance(instanceId: string): void;
dispatchEvent(event: SoundEvent): void;
hasEventListener(type: SoundEventsEnum): boolean;
getVersion(): string;
private showConsoleInfo;
}