33 lines
1.7 KiB
JavaScript
33 lines
1.7 KiB
JavaScript
// Browser-only adapter for the packaged WeChat WAV sound effects.
|
|
export function browserAudio(report){
|
|
const players=new Set();let disposed=false,plays=0;
|
|
return {
|
|
setInnerAudioOption(){},
|
|
createInnerAudioContext(){
|
|
const player=new Audio();player.preload='auto';players.add(player);
|
|
let errorHandler=()=>{},playHandler=()=>{},generation=0;
|
|
const error=reason=>{
|
|
if(disposed||reason?.name==='AbortError')return;
|
|
report('音效播放失败:'+(reason?.message||'请检查页面声音权限'));
|
|
errorHandler({errMsg:reason?.message||'浏览器音频加载失败'});
|
|
};
|
|
player.addEventListener('error',()=>error(player.error));
|
|
return {
|
|
set src(path){player.src=new URL('../'+path,location.href).href;},
|
|
set loop(value){player.loop=value;},
|
|
set volume(value){player.volume=value;},
|
|
set obeyMuteSwitch(value){},
|
|
onError(callback){errorHandler=callback;},
|
|
onPlay(callback){playHandler=callback;},
|
|
stop(){generation++;player.pause();if(player.readyState)player.currentTime=0;},
|
|
play(){
|
|
const current=generation;
|
|
player.play().then(()=>{if(!disposed&¤t===generation){playHandler();report('音效已播放 · '+(++plays)+' 次');}})
|
|
.catch(reason=>{if(current===generation)error(reason);});
|
|
}
|
|
};
|
|
},
|
|
dispose(){disposed=true;for(const player of players){player.pause();player.removeAttribute('src');player.load();}players.clear();}
|
|
};
|
|
}
|