first commit
This commit is contained in:
287
extensions/app/assets/manager/sound/AudioEngine.ts
Normal file
287
extensions/app/assets/manager/sound/AudioEngine.ts
Normal file
@@ -0,0 +1,287 @@
|
||||
import { AudioClip } from 'cc';
|
||||
import Audio from './Audio';
|
||||
import AudioManager from './AudioManager';
|
||||
|
||||
export default class AudioEngine {
|
||||
private static _inst: AudioEngine = null;
|
||||
static get inst() {
|
||||
if (!this._inst) this._inst = new AudioEngine();
|
||||
return this._inst;
|
||||
}
|
||||
private constructor() { }
|
||||
|
||||
/**effect的id从1开始,music的id始终为0 */
|
||||
private audioID = 1;
|
||||
private endedCallbackMap: Map<number, Function> = new Map();
|
||||
private effectMap: Map<number, Audio> = new Map();
|
||||
private music: Audio = null;
|
||||
|
||||
private musicMute = false;
|
||||
private musicVolumeScale = 1;
|
||||
|
||||
private effectMute = false;
|
||||
private effectVolumeScale = 1;
|
||||
|
||||
////////////////////////////////
|
||||
// 音效 //
|
||||
////////////////////////////////
|
||||
playEffect(audioClip: AudioClip, volume = 1, loop = false, onStarted: (audioID: number) => any = null, onEnded: Function = null) {
|
||||
if (this.audioID > 100000) this.audioID = 1;
|
||||
|
||||
const audioID = this.audioID++;
|
||||
const audio = AudioManager.inst.getAudio();
|
||||
this.effectMap.set(audioID, audio);
|
||||
if (onEnded) this.endedCallbackMap.set(audioID, onEnded);
|
||||
|
||||
audio.setLoop(loop)
|
||||
.setMute(this.effectMute)
|
||||
.setVolume(volume, this.effectVolumeScale)
|
||||
.play(audioClip, () => {
|
||||
AudioManager.inst.putAudio(audio);
|
||||
this.effectMap.delete(audioID);
|
||||
const callback = this.endedCallbackMap.get(audioID);
|
||||
if (callback) {
|
||||
this.endedCallbackMap.delete(audioID);
|
||||
callback();
|
||||
}
|
||||
}, () => {
|
||||
onStarted && onStarted(audioID);
|
||||
});
|
||||
|
||||
return audioID;
|
||||
}
|
||||
|
||||
stopEffect(id: number) {
|
||||
return !!this.effectMap.get(id)?.stop();
|
||||
}
|
||||
|
||||
stopAllEffects() {
|
||||
this.effectMap.forEach((audio) => {
|
||||
audio.stop();
|
||||
});
|
||||
}
|
||||
|
||||
pauseEffect(id: number) {
|
||||
return !!this.effectMap.get(id)?.pause();
|
||||
}
|
||||
|
||||
pauseAllEffects() {
|
||||
this.effectMap.forEach((audio) => {
|
||||
audio.pause();
|
||||
});
|
||||
}
|
||||
|
||||
resumeEffect(id: number) {
|
||||
return !!this.effectMap.get(id)?.resume();
|
||||
}
|
||||
|
||||
resumeAllEffects() {
|
||||
this.effectMap.forEach((audio) => {
|
||||
audio.resume();
|
||||
});
|
||||
}
|
||||
|
||||
setEffectMute(id: number, mute: boolean) {
|
||||
return !!this.effectMap.get(id)?.setMute(mute);
|
||||
}
|
||||
|
||||
getEffectMute(id: number) {
|
||||
return !!this.effectMap.get(id)?.getMute();
|
||||
}
|
||||
|
||||
setEffectVolume(id: number, volume: number) {
|
||||
return !!this.effectMap.get(id)?.setVolume(volume);
|
||||
}
|
||||
|
||||
getEffectVolume(id: number) {
|
||||
return this.effectMap.get(id)?.getVolume() || 0;
|
||||
}
|
||||
|
||||
setAllEffectsVolume(volume: number) {
|
||||
this.effectMap.forEach((audio) => {
|
||||
audio.setVolume(volume);
|
||||
});
|
||||
}
|
||||
|
||||
setEffectVolumeScale(id: number, volume: number) {
|
||||
return !!this.effectMap.get(id)?.setVolumeScale(volume);
|
||||
}
|
||||
|
||||
getEffectVolumeScale(id: number) {
|
||||
return this.effectMap.get(id)?.getVolumeScale() || 0;
|
||||
}
|
||||
|
||||
setGlobalEffectsVolumeScale(scale: number) {
|
||||
this.effectVolumeScale = scale;
|
||||
this.effectMap.forEach((audio) => {
|
||||
audio.setVolumeScale(scale);
|
||||
});
|
||||
}
|
||||
|
||||
getGlobalEffectsVolumeScale() {
|
||||
return this.effectVolumeScale;
|
||||
}
|
||||
|
||||
setGlobalEffectsMute(mute: boolean) {
|
||||
this.effectMute = mute;
|
||||
this.effectMap.forEach((audio) => {
|
||||
audio.setMute(mute);
|
||||
});
|
||||
}
|
||||
|
||||
getGlobalEffectsMute() {
|
||||
return this.effectMute;
|
||||
}
|
||||
|
||||
////////////////////////////////
|
||||
// 音乐 //
|
||||
////////////////////////////////
|
||||
playMusic(audioClip: AudioClip, volume = 1, onStarted: Function = null) {
|
||||
this.stopMusic();
|
||||
|
||||
this.music = AudioManager.inst.getAudio();
|
||||
this.music
|
||||
.setLoop(true)
|
||||
.setMute(this.musicMute)
|
||||
.setVolume(volume, this.musicVolumeScale)
|
||||
.play(audioClip, null, onStarted);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
stopMusic() {
|
||||
if (!this.music) return false;
|
||||
this.music.destroy();
|
||||
this.music = null;
|
||||
return true;
|
||||
}
|
||||
|
||||
pauseMusic() {
|
||||
if (!this.music) return false;
|
||||
this.music.pause();
|
||||
return true;
|
||||
}
|
||||
|
||||
resumeMusic() {
|
||||
if (!this.music) return false;
|
||||
this.music.resume();
|
||||
return true;
|
||||
}
|
||||
|
||||
setMusicVolume(volume: number) {
|
||||
if (!this.music) return false;
|
||||
this.music.setVolume(volume);
|
||||
return true;
|
||||
}
|
||||
|
||||
getMusicVolume() {
|
||||
if (!this.music) return -1;
|
||||
return this.music.getVolume();
|
||||
}
|
||||
|
||||
setMusicVolumeScale(scale: number) {
|
||||
this.musicVolumeScale = scale;
|
||||
this.music?.setVolumeScale(scale);
|
||||
return true;
|
||||
}
|
||||
|
||||
getMusicVolumeScale() {
|
||||
return this.musicVolumeScale;
|
||||
}
|
||||
|
||||
setMusicMute(mute: boolean) {
|
||||
this.musicMute = mute;
|
||||
this.music?.setMute(mute);
|
||||
return true;
|
||||
}
|
||||
|
||||
getMusicMute() {
|
||||
return this.musicMute;
|
||||
}
|
||||
|
||||
////////////////////////////////
|
||||
// 通用 //
|
||||
////////////////////////////////
|
||||
setEndedCallback(audioID: number, callback: Function) {
|
||||
if (audioID === 0) {
|
||||
return !!this.music?.onEnded(callback);
|
||||
} else {
|
||||
if (this.effectMap.has(audioID)) {
|
||||
this.endedCallbackMap.set(audioID, callback);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
stop(audioID: number) {
|
||||
if (audioID === 0) {
|
||||
return this.stopMusic();
|
||||
} else {
|
||||
return this.stopEffect(audioID);
|
||||
}
|
||||
}
|
||||
|
||||
pause(audioID: number) {
|
||||
if (audioID === 0) {
|
||||
return this.pauseMusic();
|
||||
} else {
|
||||
return this.pauseEffect(audioID);
|
||||
}
|
||||
}
|
||||
|
||||
resume(audioID: number) {
|
||||
if (audioID === 0) {
|
||||
return this.resumeMusic();
|
||||
} else {
|
||||
return this.resumeEffect(audioID);
|
||||
}
|
||||
}
|
||||
|
||||
pauseAll() {
|
||||
this.pauseMusic();
|
||||
this.pauseAllEffects();
|
||||
}
|
||||
|
||||
resumeAll() {
|
||||
this.resumeMusic();
|
||||
this.resumeAllEffects();
|
||||
}
|
||||
|
||||
stopAll() {
|
||||
this.stopMusic();
|
||||
this.stopAllEffects();
|
||||
}
|
||||
|
||||
setVolume(audioID: number, volume: number) {
|
||||
if (audioID === 0) {
|
||||
return this.setMusicVolume(volume);
|
||||
} else {
|
||||
return this.setEffectVolume(audioID, volume);
|
||||
}
|
||||
}
|
||||
|
||||
getVolume(audioID: number) {
|
||||
if (audioID === 0) {
|
||||
return this.getMusicVolume();
|
||||
} else {
|
||||
return this.getEffectVolume(audioID);
|
||||
}
|
||||
}
|
||||
|
||||
setVolumeScale(audioID: number, scale: number) {
|
||||
if (audioID === 0) {
|
||||
return this.setMusicVolumeScale(scale);
|
||||
} else {
|
||||
return this.setEffectVolumeScale(audioID, scale);
|
||||
}
|
||||
}
|
||||
|
||||
getVolumeScale(audioID: number) {
|
||||
if (audioID === 0) {
|
||||
return this.getMusicVolumeScale();
|
||||
} else {
|
||||
return this.getEffectVolumeScale(audioID);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user