@babylonjs/viewer
Version:
The Babylon Viewer aims to simplify a specific but common Babylon.js use case: loading, viewing, and interacting with a 3D model.
3 lines (2 loc) • 9.67 kB
JavaScript
import{A as t,_ as e}from"./abstractSoundInstance-CT5dRXOE.esm.min.js";import{_ as s,a as i,b as o,c as n}from"./spatialWebAudio-Cxs0XdBX.esm.min.js";import{a,b as r,c as h,d as u}from"./spatialWebAudioUpdaterComponent-LOlF6N8J.esm.min.js";import"./index-BPURObVq.esm.min.js";import"./abstractSoundSource-C5k4Xume.esm.min.js";import"./webAudioBaseSubGraph-Ww7puCo8.esm.min.js";class _ extends t{constructor(t,e,s){super(t,e,s)}get duration(){return this._options.duration}set duration(t){this._options.duration=t}get loopStart(){return this._options.loopStart}set loopStart(t){this._options.loopStart=t;const e=this._instances.values();for(let s=e.next();!s.done;s=e.next())s.value.loopStart=t}get loopEnd(){return this._options.loopEnd}set loopEnd(t){this._options.loopEnd=t;const e=this._instances.values();for(let s=e.next();!s.done;s=e.next())s.value.loopEnd=t}get pitch(){return this._options.pitch}set pitch(t){this._options.pitch=t;const e=this._instances.values();for(let s=e.next();!s.done;s=e.next())s.value.pitch=t}get playbackRate(){return this._options.playbackRate}set playbackRate(t){this._options.playbackRate=t;const e=this._instances.values();for(let s=e.next();!s.done;s=e.next())s.value.playbackRate=t}play(t={}){if(5===this.state)return void this.resume(t);t.duration??=this.duration,t.loop??=this.loop,t.loopStart??=this.loopStart,t.loopEnd??=this.loopEnd,t.startOffset??=this.startOffset,t.volume??=1,t.waitTime??=0;const e=this._createInstance();this._beforePlay(e),e.play(t),this._afterPlay(e),this._stopExcessInstances()}resume(t){super.resume(t)}stop(t={}){if(t.waitTime&&0<t.waitTime?this._setState(0):this._setState(1),this._instances)for(const e of Array.from(this._instances))e.stop(t)}}let d=1;class c{constructor(t){this.name="StaticSoundBuffer #"+d++,this.engine=t}}class l extends e{}class p extends _{constructor(t,e,s){super(t,e,s),this._stereo=null,this._options={autoplay:s.autoplay??!1,duration:s.duration??0,loop:s.loop??!1,loopEnd:s.loopEnd??0,loopStart:s.loopStart??0,maxInstances:s.maxInstances??1/0,pitch:s.pitch??0,playbackRate:s.playbackRate??1,startOffset:s.startOffset??0},this._subGraph=new p._SubGraph(this)}async _initAsync(t,e){this._audioContext=this.engine._audioContext,t instanceof f?this._buffer=t:("string"==typeof t||Array.isArray(t)||t instanceof ArrayBuffer||t instanceof AudioBuffer)&&(this._buffer=await this.engine.createSoundBufferAsync(t,e)),e.outBus?this.outBus=e.outBus:!1!==e.outBusAutoDefault&&(await this.engine.isReadyPromise,this.outBus=this.engine.defaultMainBus),await this._subGraph.initAsync(e),s(e)&&this._initSpatialProperty(),e.autoplay&&this.play(),this.engine._addSound(this)}get buffer(){return this._buffer}get _inNode(){return this._subGraph._inNode}get _outNode(){return this._subGraph._outNode}get stereo(){return this._stereo??(this._stereo=new i(this._subGraph))}async cloneAsync(t=null){const e=await this.engine.createSoundAsync(this.name,t?.cloneBuffer?this.buffer.clone():this.buffer,this._options);return e.outBus=t?.outBus?t.outBus:this.outBus,e}dispose(){super.dispose(),this._stereo=null,this._subGraph.dispose(),this.engine._removeSound(this)}getClassName(){return"_WebAudioStaticSound"}_createInstance(){return new m(this,this._options)}_connect(t){return!!super._connect(t)&&(t._inNode&&this._outNode?.connect(t._inNode),!0)}_disconnect(t){return!!super._disconnect(t)&&(t._inNode&&this._outNode?.disconnect(t._inNode),!0)}_createSpatialProperty(t,e){return new o(this._subGraph,t,e)}_getOptions(){return this._options}}p._SubGraph=class extends n{get _downstreamNodes(){return this._owner._downstreamNodes??null}get _upstreamNodes(){return this._owner._upstreamNodes??null}};class f extends c{constructor(t){super(t)}async _initAsync(t,e){t instanceof AudioBuffer?this._audioBuffer=t:"string"==typeof t?await this._initFromUrlAsync(t):Array.isArray(t)?await this._initFromUrlsAsync(t,e.skipCodecCheck??!1):t instanceof ArrayBuffer&&await this._initFromArrayBufferAsync(t)}get channelCount(){return this._audioBuffer.numberOfChannels}get duration(){return this._audioBuffer.duration}get length(){return this._audioBuffer.length}get sampleRate(){return this._audioBuffer.sampleRate}clone(t=null){const e=new AudioBuffer({length:this._audioBuffer.length,numberOfChannels:this._audioBuffer.numberOfChannels,sampleRate:this._audioBuffer.sampleRate});for(let t=0;t<this._audioBuffer.numberOfChannels;t++)e.copyToChannel(this._audioBuffer.getChannelData(t),t);const s=new f(this.engine);return s._audioBuffer=e,s.name=t?.name?t.name:this.name,s}async _initFromArrayBufferAsync(t){this._audioBuffer=await this.engine._audioContext.decodeAudioData(t)}async _initFromUrlAsync(t){t=a(t);const{data:e}=await r(t);await this._initFromArrayBufferAsync(e)}async _initFromUrlsAsync(t,e){for(const s of t){if(e)await this._initFromUrlAsync(s);else{const t=s.match(h),e=t?.at(1);if(e&&this.engine.isFormatValid(e))try{await this._initFromUrlAsync(s)}catch{e&&0<e.length&&this.engine.flagInvalidFormat(e)}}if(this._audioBuffer)break}}}class m extends l{constructor(t,e){super(t),this._enginePlayTime=0,this._enginePauseTime=0,this._isConnected=!1,this._pitch=null,this._playbackRate=null,this._sourceNode=null,this._onEnded=()=>{this._enginePlayTime=0,5!==this._state&&this.onEndedObservable.notifyObservers(this),this._deinitSourceNode()},this._onEngineStateChanged=()=>{"running"===this.engine.state&&(this._options.loop&&2===this.state&&this.play(),this.engine.stateChangedObservable.removeCallback(this._onEngineStateChanged))},this._options=e,this._volumeNode=new GainNode(t._audioContext),this._initSourceNode()}dispose(){super.dispose(),this._pitch?.dispose(),this._playbackRate?.dispose(),this.stop(),this._deinitSourceNode(),this.engine.stateChangedObservable.removeCallback(this._onEngineStateChanged)}get currentTime(){if(1===this._state)return 0;const t=5===this._state?0:this.engine.currentTime-this._enginePlayTime;return this._enginePauseTime+t+this._options.startOffset}set currentTime(t){const e=2===this._state||3===this._state;if(e){const t=this._sourceNode;this._deinitSourceNode(),t?.stop(),this._state=1}this._enginePauseTime=0,this._options.startOffset=t,e&&this.play()}get _outNode(){return this._volumeNode}set loop(t){this._options.loop=t,this._sourceNode&&(this._sourceNode.loop=t)}set loopStart(t){this._options.loopStart=t,this._sourceNode&&(this._sourceNode.loopStart=t)}set loopEnd(t){this._options.loopEnd=t,this._sourceNode&&(this._sourceNode.loopEnd=t)}set pitch(t){this._pitch?.setTargetValue(t)}set playbackRate(t){this._playbackRate?.setTargetValue(t)}get startTime(){return 1===this._state?0:this._enginePlayTime}getClassName(){return"_WebAudioStaticSoundInstance"}play(t={}){if(3===this._state)return;void 0!==t.duration&&(this._options.duration=t.duration),void 0!==t.loop&&(this._options.loop=t.loop),void 0!==t.loopStart&&(this._options.loopStart=t.loopStart),void 0!==t.loopEnd&&(this._options.loopEnd=t.loopEnd),void 0!==t.startOffset&&(this._options.startOffset=t.startOffset);let e=this._options.startOffset;if(5===this._state){const t=this._sound.buffer.duration,s=this._enginePauseTime;if(this._options.loop){let i=0,o=t;this._options.loopStart>=0&&this._options.loopEnd>0&&this._options.loopStart<this._options.loopEnd&&(i=this._options.loopStart,o=Math.min(this._options.loopEnd,t));const n=o-e;s<n?e+=s:e=i+(s-n)%(o-i)}else e+=s,e%=t}this._enginePlayTime=this.engine.currentTime+(t.waitTime??0),void 0!==t.volume&&(this._volumeNode.gain.value=t.volume),this._initSourceNode(),"running"===this.engine.state?(this._setState(3),this._sourceNode?.start(this._enginePlayTime,e,this._options.duration>0?this._options.duration:void 0)):this._options.loop&&(this._setState(2),this.engine.stateChangedObservable.add(this._onEngineStateChanged))}pause(){if(3!==this._state&&2!==this._state)return;const t=3===this._state;this._setState(5),this._enginePauseTime+=this.engine.currentTime-this._enginePlayTime,t?this._sourceNode?.stop():this.engine.stateChangedObservable.removeCallback(this._onEngineStateChanged),this._deinitSourceNode()}resume(t={}){5===this._state&&this.play(t)}stop(t={}){if(1!==this._state){if(3===this._state){const e=this.engine.currentTime+(t.waitTime??0);this._sourceNode?.stop(e)}(void 0===t.waitTime||t.waitTime<=0)&&(this._setState(1),this.engine.stateChangedObservable.removeCallback(this._onEngineStateChanged))}}_connect(t){return!!super._connect(t)&&(t instanceof p&&t._inNode&&(this._outNode?.connect(t._inNode),this._isConnected=!0),!0)}_disconnect(t){return!!super._disconnect(t)&&(t instanceof p&&t._inNode&&(this._outNode?.disconnect(t._inNode),this._isConnected=!1),!0)}_deinitSourceNode(){if(this._sourceNode){if(this._isConnected&&!this._disconnect(this._sound))throw new Error("Disconnect failed");this._sourceNode.disconnect(this._volumeNode),this._sourceNode.removeEventListener("ended",this._onEnded),this._sourceNode=null}}_initSourceNode(){if(!this._sourceNode){if(this._sourceNode=new AudioBufferSourceNode(this._sound._audioContext,{buffer:this._sound.buffer._audioBuffer}),this._sourceNode.addEventListener("ended",this._onEnded,{once:!0}),this._sourceNode.connect(this._volumeNode),!this._connect(this._sound))throw new Error("Connect failed");this._pitch=new u(this.engine,this._sourceNode.detune),this._playbackRate=new u(this.engine,this._sourceNode.playbackRate)}const t=this._sourceNode;t.detune.value=this._sound.pitch,t.loop=this._options.loop,t.loopEnd=this._options.loopEnd,t.loopStart=this._options.loopStart,t.playbackRate.value=this._sound.playbackRate}}export{p as _WebAudioStaticSound,f as _WebAudioStaticSoundBuffer};
//# sourceMappingURL=webAudioStaticSound-MIX2pABC.esm.min.js.map