// 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=()=>{},endedHandler=()=>{},generation=0; const error=reason=>{ if(disposed||reason?.name==='AbortError')return; report('音效播放失败:'+(reason?.message||'请检查页面声音权限')); errorHandler({errMsg:reason?.message||'浏览器音频加载失败'}); }; player.addEventListener('error',()=>error(player.error)); player.addEventListener('ended',()=>{if(!disposed)endedHandler();}); 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;}, onEnded(callback){endedHandler=callback;}, offEnded(callback){if(endedHandler===callback)endedHandler=()=>{};}, stop(){generation++;player.pause();if(player.readyState)player.currentTime=0;}, play(){ const current=generation; player.play().then(()=>{if(!disposed&¤t===generation){playHandler();report((player.loop?'音乐':'音效')+'已播放 · '+player.src.split('/').at(-1)+' · '+(++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();} }; }