UNPKG

@animech-public/playcanvas

Version:
2 lines (1 loc) 3.85 kB
import{Asset as s}from"../../asset/asset.js";import{Channel3d as t}from"../../../platform/audio/channel3d.js";import{Component as e}from"../component.js";class n extends e{constructor(s,t){super(s,t),this.on("set_assets",this.onSetAssets,this),this.on("set_loop",this.onSetLoop,this),this.on("set_volume",this.onSetVolume,this),this.on("set_pitch",this.onSetPitch,this),this.on("set_minDistance",this.onSetMinDistance,this),this.on("set_maxDistance",this.onSetMaxDistance,this),this.on("set_rollOffFactor",this.onSetRollOffFactor,this),this.on("set_distanceModel",this.onSetDistanceModel,this),this.on("set_3d",this.onSet3d,this)}play(s){if(!this.enabled||!this.entity.enabled)return;let t;this.channel&&this.stop();const e=this.data;if(e.sources[s])if(e["3d"]){const n=this.entity.getPosition();t=this.system.manager.playSound3d(e.sources[s],n,e),e.currentSource=s,e.channel=t}else t=this.system.manager.playSound(e.sources[s],e),e.currentSource=s,e.channel=t}pause(){this.channel&&this.channel.pause()}unpause(){this.channel&&this.channel.paused&&this.channel.unpause()}stop(){this.channel&&(this.channel.stop(),this.channel=null)}onSetAssets(t,e,n){const i=[],h=n.length;if(e&&e.length)for(let s=0;s<e.length;s++)if(e[s]){const t=this.system.app.assets.get(e[s]);t&&(t.off("change",this.onAssetChanged,this),t.off("remove",this.onAssetRemoved,this),this.currentSource===t.name&&this.stop())}if(h)for(let t=0;t<h;t++)e.indexOf(n[t])<0&&(n[t]instanceof s?i.push(n[t].id):i.push(n[t]));!this.system._inTools&&i.length&&this.loadAudioSourceAssets(i)}onAssetChanged(s,t,e,n){if("resource"===t){this.data.sources&&(this.data.sources[s.name]=e,this.data.currentSource===s.name&&this.channel&&(this.channel.paused?(this.play(s.name),this.pause()):this.play(s.name)))}}onAssetRemoved(s){s.off("remove",this.onAssetRemoved,this),this.data.sources[s.name]&&(delete this.data.sources[s.name],this.data.currentSource===s.name&&(this.stop(),this.data.currentSource=null))}onSetLoop(s,t,e){t!==e&&this.channel&&this.channel.setLoop(e)}onSetVolume(s,t,e){t!==e&&this.channel&&this.channel.setVolume(e)}onSetPitch(s,t,e){t!==e&&this.channel&&this.channel.setPitch(e)}onSetMaxDistance(s,e,n){e!==n&&this.channel instanceof t&&this.channel.setMaxDistance(n)}onSetMinDistance(s,e,n){e!==n&&this.channel instanceof t&&this.channel.setMinDistance(n)}onSetRollOffFactor(s,e,n){e!==n&&this.channel instanceof t&&this.channel.setRollOffFactor(n)}onSetDistanceModel(s,e,n){e!==n&&this.channel instanceof t&&this.channel.setDistanceModel(n)}onSet3d(s,t,e){if(t!==e&&this.system.initialized&&this.currentSource){let s=!1,t=!1;this.channel&&(s=this.channel.paused,t=this.channel.suspended),this.play(this.currentSource),this.channel&&(this.channel.paused=s,this.channel.suspended=t)}}onEnable(){const t=this.data.assets;if(t){const e=this.system.app.assets;for(let n=0,i=t.length;n<i;n++){let i=t[n];i instanceof s||(i=e.get(i)),i&&!i.resource&&e.load(i)}}this.system.initialized&&(this.data.activate&&!this.channel?this.play(this.currentSource):this.unpause())}onDisable(){this.pause()}loadAudioSourceAssets(s){const t=s.map((s=>this.system.app.assets.get(s))),e={};let n=null,i=t.length;const h=s=>{i--},a=()=>{this.data.sources=e,this.data.currentSource=n,this.enabled&&this.activate&&n&&this.onEnable()};t.forEach(((t,o)=>{t?(n=n||t.name,t.off("change",this.onAssetChanged,this),t.on("change",this.onAssetChanged,this),t.off("remove",this.onAssetRemoved,this),t.on("remove",this.onAssetRemoved,this),t.off("error",h,this),t.on("error",h,this),t.ready((s=>{e[s.name]=s.resource,i--,0===i&&a()})),!t.resource&&this.enabled&&this.entity.enabled&&this.system.app.assets.load(t)):(i--,0===i&&a(),this.system.app.assets.on(`add:${s[o]}`,(s=>{s.ready((s=>{this.data.sources[s.name]=s.resource})),s.resource||this.system.app.assets.load(s)})))}))}}export{n as AudioSourceComponent};