refacto: cleanning the codebase

This commit is contained in:
2026-04-17 16:03:29 +02:00
parent 638022339e
commit f9c4495610
17 changed files with 317 additions and 76 deletions
+40 -2
View File
@@ -1,5 +1,8 @@
export class AudioManager {
private static _instance: AudioManager | null = null;
private readonly _audioPools = new Map<string, HTMLAudioElement[]>();
private static readonly MAX_POOL_SIZE_PER_SOUND = 6;
static getInstance(): AudioManager {
if (!AudioManager._instance) {
@@ -12,12 +15,47 @@ export class AudioManager {
private constructor() {}
playSound(path: string, volume = 1): void {
const audio = new Audio(path);
const audio = this._acquireAudio(path);
audio.volume = Math.max(0, Math.min(1, volume));
void audio.play();
audio.currentTime = 0;
void audio.play().catch(() => {
audio.pause();
audio.currentTime = 0;
});
}
destroy(): void {
this._audioPools.forEach((pool) => {
pool.forEach((audio) => {
audio.pause();
audio.src = "";
});
});
this._audioPools.clear();
AudioManager._instance = null;
}
private _acquireAudio(path: string): HTMLAudioElement {
const existingPool = this._audioPools.get(path);
if (existingPool) {
const availableAudio = existingPool.find(
(audio) => audio.paused || audio.ended,
);
if (availableAudio) return availableAudio;
if (existingPool.length < AudioManager.MAX_POOL_SIZE_PER_SOUND) {
const pooledAudio = new Audio(path);
existingPool.push(pooledAudio);
return pooledAudio;
}
return existingPool[0]!;
}
const initialAudio = new Audio(path);
this._audioPools.set(path, [initialAudio]);
return initialAudio;
}
}