import { AudioClip, AudioSource, Pool } from 'cc'; import Utilities from '../Utilities'; export class SoundSource { private _pool: Pool; public volume = 1; public mute = false; public clip: AudioClip; private _currentAudioSource: AudioSource; constructor() { this._pool = new Pool( () => { const source = new AudioSource(); source.playOnAwake = false; return source; }, 10, (obj) => obj.destroy(), ); } public async play() { this._currentAudioSource = this._pool.alloc(); this._currentAudioSource.volume = this.mute ? 0 : this.volume; _currentAudioSource.clip = this.clip; _currentAudioSource.play(); await Utilities.waitUntil(() => !source.playing); this._pool.free(source); } public stop() { this._currentAudioSource.stop(); } }