/**
* Generic WebAudio Node based player.
*
* version 1.3
* caution: this version is NOT compatible with older backends.
*
* Copyright (C) 2023 Juergen Wothke
*
* Terms of Use: This software is licensed under a CC BY-NC-SA
* (http://creativecommons.org/licenses/by-nc-sa/4.0/).
*/
var fetchSamples=function(e){let t=ScriptNodePlayer.getInstance();t&&t._backendAdapter._transformer.genSamples(e)},calcTick=function(e){let t=ScriptNodePlayer.getInstance();t&&!t.isPaused()&&t._backendAdapter._transformer.tick(e)},DbgUtil={_traceSwitch:!1,setTraceMode:function(e){this._traceSwitch=e},trace:function(e){this._traceSwitch&&console.log(e)}},BufferUtil={remapToFloat:function(e,t,i,r){for(let a=0;a<t;a++)r[a]=i(e,a);return t},resampleToFloat:function(e,t,i,r,a,s,n){let o,l=0,d=0,c=n-0,u=r-0,h=Math.abs(c-l),_=l<c?1:-1,p=-Math.abs(u-d),f=d<u?1:-1,m=h+p;for(;s[l*e+t]=a(i,d*e+t),!(l>=c&&d>=u);)o=2*m,o>p&&(m+=p,l+=_),o<h&&(m+=h,d+=f)}};const setGlobalWebAudioCtx=-1,AbstractTicker=-1;class AbstractTicker2{constructor(){}init(e,t,i){}startAudioBuffer(){}resampleTickerData(e,t,i,r,a){}copyTickerData(e,t,i){}}const SAMPLES_PER_BUFFER=-1;class BaseFileMapper{constructor(){}init(e){}mapToVirtualFilename(e){return e}mapFromVirtualFilename(e){return e}registerFileData(e,t){}mapBackendFilename(e){return e}}class SimpleFileMapper extends BaseFileMapper{constructor(e){super(),this.Module=e}mapFromVirtualFilename(e){let t=this._mapFs2Uri(e);return decodeURI(t)}mapToVirtualFilename(e){return e=this._mapUri2Fs(e)}mapBackendFilename(e){return e}normalizePathFilename(e){let t=e[0],i=e[1],r=new Array(2),a=i.lastIndexOf("/");return a>0?(r[0]=t+i.substring(0,a),r[1]=i.substring(a+1)):(r[0]=t,r[1]=i),r}registerFileData(e,t){let i=this.normalizePathFilename(e);return this._registerEmscriptenFileData(i,t)}_registerEmscriptenFileData(e,t){try{this.Module.FS_createPath("/",e[0],!0,!0)}catch(e){}let i;try{void 0===this.Module.FS_createDataFile?i=!0:(i=this.Module.FS_createDataFile(e[0],e[1],t,!0,!0),DbgUtil.trace("_registerEmscriptenFileData: ["+e[0]+"]["+e[1]+"] size: "+t.length))}catch(e){"File exists"==e.message&&(i=!0)}return i}_mapUri2Fs(e){var t=e.replace("//","{1]");return t=(t=(t=(t=(t=(t=(t=t.replace("?","{2]")).replace(":","{3]")).replace("*","{4]")).replace('"',"{5]")).replace("<","{6]")).replace(">","{7]")).replace("|","{8]")}_mapFs2Uri(e){var t=e.replace("{1]","//");return t=(t=(t=(t=(t=(t=(t=t.replace("{2]","?")).replace("{3]",":")).replace("{4]","*")).replace("{5]",'"')).replace("{6]","<")).replace("{7]",">")).replace("{8]","|")}}class ScopeDataProvider{constructor(){}getNumberTraceStreams(){return 0}getTraceStreams(){return[]}readFloatTrace(e,t){return 0}_setAdapter(e){this._adapter=e}}class HEAPF32ScopeProvider extends ScopeDataProvider{constructor(e){super(),this.Module=e}getNumberTraceStreams(){return this._adapter.isAdapterReady()?this.Module.ccall("emu_number_trace_streams","number"):0}getTraceStreams(){let e=[],t=this.getNumberTraceStreams();if(!t)return e;let i=this.Module.ccall("emu_get_trace_streams","number"),r=this.Module.HEAP32.subarray(i>>2,(i>>2)+t);for(let i=0;i<t;i++)e.push(r[i]>>2);return e}readFloatTrace(e,t){return this.Module.HEAPF32[e+t]}}class HEAP32ScopeProvider extends HEAPF32ScopeProvider{constructor(e,t){super(e),this._scale=t}readFloatTrace(e,t){return this.Module.HEAP32[e+t]/this._scale}}class HEAP16ScopeProvider extends HEAPF32ScopeProvider{constructor(e,t){super(e),this._scale=t}getTraceStreams(){let e=[],t=this.getNumberTraceStreams();if(!t)return e;let i=this.Module.ccall("emu_get_trace_streams","number"),r=this.Module.HEAP32.subarray(i>>2,(i>>2)+t);for(let i=0;i<t;i++)e.push(r[i]>>1);return e}readFloatTrace(e,t){return this.Module.HEAP16[e+t]/this._scale}}class AudioBackendAdapterBase{constructor(e,t){this._externalTicker,this._observer,this._onTrackEnd=null,this._fileMapper=void 0===e?new BaseFileMapper:e,this._scopeProvider=void 0===t?new ScopeDataProvider:t,this._scopeProvider._setAdapter(this),this._songInfo={}}_createProducerNode(e){this.error("_createProducerNode")}_assertSyncNodeReadiness(e){e()}_connectTickerNode(e,t){}isAdapterReady(){return!0}_resetBuffers(){}init(e){this._fileMapper.init(e)}loadMusicData(e,t,i,r,a){this.error("loadMusicData")}evalTrackOptions(e){return ScriptNodePlayer.getInstance().setPlaybackTimeout(void 0!==e.timeout?1e3*e.timeout:-1),0}teardown(){this._songInfo={}}getSongInfoMeta(){}updateSongInfo(e){}getSongInfo(){return this._songInfo}handleBackendSongAttributes(e){this.error("handleBackendSongAttributes")}resetSampleRate(e,t){}getChannels(){return 2}getBufNum(){this.error("getBufNum")}setSilenceTimeout(e){}setPlaybackTimeout(e){}getPlaybackTimeout(){return-1}getCurrentPlaytime(){return-1}enableScope(e){}getNumberTraceStreams(){return this._scopeProvider.getNumberTraceStreams()}getTraceStreams(){return this._scopeProvider.getTraceStreams()}readFloatTrace(e,t){return this._scopeProvider.readFloatTrace(e,t)}setTicker(e){this._externalTicker=e}initTicker(){}getMaxTicks(){return 1}getCurrentTick(){return 0}getPlaybackPosition(){return 0}getMaxPlaybackPosition(){return 0}seekPlaybackPosition(e){}mapToVirtualFilename(e){return this._fileMapper.mapToVirtualFilename(e)}mapFromVirtualFilename(e){return this._fileMapper.mapFromVirtualFilename(e)}registerFileData(e,t){return this._fileMapper.registerFileData(e,t)}mapBackendFilename(e){return this._fileMapper.mapBackendFilename(e)}setObserver(e){this._observer=e,this.isAdapterReady()&&this.notifyAdapterReady()}notifyAdapterReady(){void 0!==this._observer&&this._observer.notify()}initPlayback(e){this.setSilenceTimeout(e)}prepareToPlay(e,t){this.initPlayback(e),this.initTicker(),this.updateSongInfo(t)}skipFileLoad(){return!1}play(){}pause(){}setOnTrackEnd(e){this._onTrackEnd=e}doOnTrackEnd(){this._onTrackEnd&&this._onTrackEnd()}error(e){alert("fatal error: abstract method '"+e+"' must be defined")}_getFilename(e,t){return e&&e.length&&(t=e+(e.endsWith("/")?"":"/")+t),t}_makeTitleFromPath(e){return decodeURI(e).replace(/^.*[\\\/]/,"").split(".").slice(0,-1).join(".")}remapToFloat(e,t,i,r){alert("error: AudioBackendAdapterBase.remapToFloat - use BufferUtil.remapToFloat() instead")}resampleToFloat(e,t,i,r,a,s,n){alert("error: AudioBackendAdapterBase.resampleToFloat - use BufferUtil.resampleToFloat() instead")}}class OutputTransformer{constructor(e){this._backend=e,this._silenceStarttime=-1,this._silenceTimeout,this._currentPlaytime=0,this._numberOfSamplesRendered=0,this._numberOfSamplesToRender=0,this._sourceBuffer,this._sourceBufferLen,this._sourceBufferIdx=0,this._resampleBuffer=new Float32Array,this._sampleRate=44100,this._inputSampleRate=44100,this._tickerStepWidth=256}setSilenceTimeout(e){this._silenceTimeout=e,this._silenceStarttime=-1}initPlayback(e){this.setSilenceTimeout(e),this._currentPlaytime=0}resetBuffers(){this._numberOfSamplesRendered=0,this._numberOfSamplesToRender=0,this._sourceBufferIdx=0,this.resetTick()}resetSampleRate(e,t){e>0&&(this._sampleRate=e),t>0&&(this._inputSampleRate=t);let i=this._backend.getProcessorBufSize(),r=Math.round(i*this._sampleRate/this._inputSampleRate)*this._getChannels();r>this._resampleBuffer.length&&(this._resampleBuffer=this._allocResampleBuffer(r)),this.resetBuffers()}getPlaytime(){return this._currentPlaytime}genSamples(e){let t=ScriptNodePlayer.getInstance(),i=this._getTimeout(),r=e.outputBuffer.numberOfChannels>1,a=2==this._getChannels(),s=e.outputBuffer.getChannelData(0),n=r?e.outputBuffer.getChannelData(1):null;if(t._isNotPlaying())s.fill(0),n&&n.fill(0),this._resampleBuffer.fill(0);else{this.beginTicker();let e=s.length;for(this._numberOfSamplesRendered=0;this._numberOfSamplesRendered<e;){if(0===this._numberOfSamplesToRender){let r;if(i>0&&this._currentPlaytime>i?(DbgUtil.trace("'song end' forced after "+i/ScriptNodePlayer.getWebAudioSampleRate()+" secs"),r=1):r=this._backend.computeAudioSamples(),0!==r)return this._fillEmpty(e,s,n),this._resampleBuffer.fill(0),r<0?void t._signalFileNotReady():t._isWaitingForFile()?void 0:(r>1&&DbgUtil.trace("playback aborted with an error"),t._setPaused(),void this._doOnTrackEnd());this._sourceBuffer=this._backend.getAudioBuffer(),this._sourceBufferLen=this._backend.getAudioBufferLength(),this._numberOfSamplesToRender=this._updateResampleBuffer(this._sourceBuffer,this._sourceBufferLen,this._sampleRate,this._inputSampleRate),this._resampleTickerData(),this._sourceBufferIdx=0}if(r){a?this._copyStereo2Stereo(this._resampleBuffer,s,n,e):this._copyMono2Stereo(this._resampleBuffer,s,n,e);let i=t.getPanning();null!=i&&this.applyPanning(s,n,i+1)}else a?this._copyStereo2Mono(this._resampleBuffer,s,e):this._copyMono2Mono(this._resampleBuffer,s,e)}this._increaseCurrentPlaytime(e),this._detectSongEndSilence()}}applyPanning(e,t,i){let r,a,s,n=e.length;i=256*i/2;for(let o=0;o<n;o++)r=e[o],a=t[o],s=(a-r)*i,e[o]=(256*r+s)/256,t[o]=(256*a-s)/256}_increaseCurrentPlaytime(e){this._currentPlaytime+=e}_detectSongEndSilence(){if(this._silenceTimeout>0&&this._silenceStarttime>0){this._currentPlaytime-this._silenceStarttime>=this._silenceTimeout*ScriptNodePlayer.getWebAudioSampleRate()&&(player._setPaused(),this._doOnTrackEnd())}}_doOnTrackEnd(){this._backend.doOnTrackEnd()}_getTicker(){return this._backend._externalTicker}_getTimeout(){return this._backend._currentTimeout}_getChannels(){return this._backend.getChannels()}_allocResampleBuffer(e){return new Float32Array(e)}_updateResampleBuffer(e,t,i,r){let a,s=this._backend.readFloatSample.bind(this._backend),n=this._getChannels();if(i==r)BufferUtil.remapToFloat(e,t*n,s,this._resampleBuffer),a=t;else{a=Math.round(t*i/r);let o=a*n;o>this._resampleBuffer.length&&(this._resampleBuffer=this._allocResampleBuffer(o)),BufferUtil.resampleToFloat(n,0,e,t,s,this._resampleBuffer,a),2==n&&BufferUtil.resampleToFloat(n,1,e,t,s,this._resampleBuffer,a)}return a}_resampleTickerData(){let e=this._getTicker();void 0!==e&&e.resampleTickerData(this._sampleRate,this._inputSampleRate,this._sourceBufferLen,this._backend.getNumberTraceStreams(),this._backend.getTraceStreams())}_fillEmpty(e,t,i){let r=e-this._numberOfSamplesRendered;for(let e=0;e<r;e++)t[e+this._numberOfSamplesRendered]=0,i&&(i[e+this._numberOfSamplesRendered]=0);this._numberOfSamplesToRender=0,this._numberOfSamplesRendered=e}_trackSilenceStart(e){this.lastVuLevel!=e&&(this.lastVuLevel=e,this._silenceStarttime=this._currentPlaytime)}_copyStereo2Stereo(e,t,i,r){let a=this._getTicker(),s=ScriptNodePlayer.getInstance(),n=void 0!==a&&!s.isPaused(),o=0,l=0,d=0;if(this._numberOfSamplesRendered+this._numberOfSamplesToRender>r){let s=r-this._numberOfSamplesRendered,c=this._sourceBufferIdx>>1;for(let r=0;r<s;r++){let a=r+this._numberOfSamplesRendered;l=e[this._sourceBufferIdx++],d=e[this._sourceBufferIdx++],t[a]=l,i[a]=d,o+=l+d}o/=s,n&&a.copyTickerData(this._numberOfSamplesRendered,c,s),this._numberOfSamplesToRender-=s,this._numberOfSamplesRendered=r}else{let r=this._sourceBufferIdx>>1;for(let r=0;r<this._numberOfSamplesToRender;r++){let a=r+this._numberOfSamplesRendered;l=e[this._sourceBufferIdx++],d=e[this._sourceBufferIdx++],t[a]=l,i[a]=d,o+=l+d}o/=this._numberOfSamplesToRender,n&&a.copyTickerData(this._numberOfSamplesRendered,r,this._numberOfSamplesToRender),this._numberOfSamplesRendered+=this._numberOfSamplesToRender,this._numberOfSamplesToRender=0}this._trackSilenceStart(o)}_copyMono2Stereo(e,t,i,r){let a=this._getTicker(),s=ScriptNodePlayer.getInstance(),n=void 0!==a&&!s.isPaused(),o=0,l=0;if(this._numberOfSamplesRendered+this._numberOfSamplesToRender>r){let s=r-this._numberOfSamplesRendered,d=this._sourceBufferIdx>>1;for(let r=0;r<s;r++){let a=r+this._numberOfSamplesRendered;l=e[this._sourceBufferIdx++],t[a]=i[a]=l,o+=l}o/=s,n&&a.copyTickerData(this._numberOfSamplesRendered,d,s),this._numberOfSamplesToRender-=s,this._numberOfSamplesRendered=r}else{let r=this._sourceBufferIdx>>1;for(let r=0;r<this._numberOfSamplesToRender;r++){let a=r+this._numberOfSamplesRendered;l=e[this._sourceBufferIdx++],t[a]=i[a]=l,o+=l}o/=this._numberOfSamplesToRender,n&&a.copyTickerData(this._numberOfSamplesRendered,r,this._numberOfSamplesToRender),this._numberOfSamplesRendered+=this._numberOfSamplesToRender,this._numberOfSamplesToRender=0}this._trackSilenceStart(o)}_copyMono2Mono(e,t,i){let r=this._getTicker(),a=ScriptNodePlayer.getInstance(),s=void 0!==r&&!a.isPaused(),n=0,o=0;if(this._numberOfSamplesRendered+this._numberOfSamplesToRender>i){let a=i-this._numberOfSamplesRendered,l=this._sourceBufferIdx;for(let i=0;i<a;i++){let r=i+this._numberOfSamplesRendered;o=e[this._sourceBufferIdx++],t[r]=o,n+=o}n/=a,s&&r.copyTickerData(this._numberOfSamplesRendered,l,a),this._numberOfSamplesToRender-=a,this._numberOfSamplesRendered=i}else{let i=this._sourceBufferIdx;for(let i=0;i<this._numberOfSamplesToRender;i++){let r=i+this._numberOfSamplesRendered;o=e[this._sourceBufferIdx++],t[r]=o,n+=o}n/=this._numberOfSamplesToRender,s&&r.copyTickerData(this._numberOfSamplesRendered,i,this._numberOfSamplesToRender),this._numberOfSamplesRendered+=this._numberOfSamplesToRender,this._numberOfSamplesToRender=0}this._trackSilenceStart(n)}_copyStereo2Mono(e,t,i){let r=this._getTicker(),a=ScriptNodePlayer.getInstance(),s=void 0!==r&&!a.isPaused(),n=0,o=0;if(this._numberOfSamplesRendered+this._numberOfSamplesToRender>i){let a=i-this._numberOfSamplesRendered,l=this._sourceBufferIdx;for(let i=0;i<a;i++){let r=i+this._numberOfSamplesRendered;o=.5*(e[this._sourceBufferIdx++]+e[this._sourceBufferIdx++]),t[r]=o,n+=o}n/=a,s&&r.copyTickerData(this._numberOfSamplesRendered,l,a),this._numberOfSamplesToRender-=a,this._numberOfSamplesRendered=i}else{let i=this._sourceBufferIdx;for(let i=0;i<this._numberOfSamplesToRender;i++){let r=i+this._numberOfSamplesRendered;o=.5*(e[this._sourceBufferIdx++]+e[this._sourceBufferIdx++]),t[r]=o,n+=o}n/=this._numberOfSamplesToRender,s&&r.copyTickerData(this._numberOfSamplesRendered,i,this._numberOfSamplesToRender),this._numberOfSamplesRendered+=this._numberOfSamplesToRender,this._numberOfSamplesToRender=0}this._trackSilenceStart(n)}resetTick(){this._cntTick=0,this._baseTick=null}tick(){null!=this._baseTick&&this._cntTick++}initTicker(){let e=this._getTicker(),t=this._backend.getProcessorBufSize();void 0!==e&&e.init(t,this._tickerStepWidth,this._backend.readFloatTrace.bind(this._backend)),this._maxTicks=t/this._tickerStepWidth,this._cntTick=0,this._baseTick=null}getMaxTicks(){return this._maxTicks}beginTicker(){let e=this._getTicker();this._baseTick=null==this._baseTick?0:this._baseTick+this._maxTicks,this._cntTick=this._baseTick,void 0!==e&&e.startAudioBuffer()}getCurrentTick(){return this._cntTick%this._maxTicks}getBufNum(){return Math.floor(this._cntTick/this._maxTicks)}}class ScriptNodeBackendAdapter extends AudioBackendAdapterBase{constructor(e,t,i,r){super(i,r),this._transformer=new OutputTransformer(this),this._channels=e,this._bytesPerSample=t,this._processorBufSize=2048,this.setPlaybackTimeout(-1)}setProcessorBufSize(e){this._processorBufSize=e}getProcessorBufSize(){return this._processorBufSize}_createProducerNode(e){let t=this.getProcessorBufSize(),i=e.createScriptProcessor(t,0,this.getChannels());return i.onaudioprocess=fetchSamples,i}_connectTickerNode(e,t){let i;return void 0!==this._externalTicker&&(i=e.createScriptProcessor(256,0,1),i.onaudioprocess=calcTick,i.connect(t)),i}_resetBuffers(){this._transformer.resetBuffers()}setPlaybackTimeout(e){let t=ScriptNodePlayer.getWebAudioSampleRate();this._currentTimeout=e<0?-1:e/1e3*t}getPlaybackTimeout(){let e=ScriptNodePlayer.getWebAudioSampleRate();return this._currentTimeout<0?-1:Math.round(this._currentTimeout/e*1e3)}getCurrentPlaytime(){return this._transformer.getPlaytime()/ScriptNodePlayer.getWebAudioSampleRate()}setSilenceTimeout(e){this._transformer.setSilenceTimeout(e)}getBytesPerSample(){return this._bytesPerSample}getChannels(){return this._channels}resetSampleRate(e,t){this._transformer.resetSampleRate(e,t)}initPlayback(e){this._transformer.initPlayback(e)}getBufNum(){return this._transformer.getBufNum()}setTicker(e){this._externalTicker=e,this.initTicker()}initTicker(){this._transformer.initTicker()}getMaxTicks(){return this._transformer.getMaxTicks()}getCurrentTick(){return this._transformer.getCurrentTick()}computeAudioSamples(){this.error("computeAudioSamples")}getAudioBuffer(){this.error("getAudioBuffer")}getAudioBufferLength(){this.error("getAudioBufferLength")}readFloatSample(e,t){this.error("readFloatSample")}}class EmsHEAP16BackendAdapter extends ScriptNodeBackendAdapter{constructor(e,t,i,r){super(t,2,i,r),this.Module=e}ensureReadyNotification(){this.Module.notReady?this.Module.adapterCallback=function(){this.notifyAdapterReady()}.bind(this):this.notifyAdapterReady()}isAdapterReady(){return void 0===this.Module.notReady||!this.Module.notReady}teardown(){super.teardown(),this.Module.ccall("emu_teardown","number")}computeAudioSamples(){return this.Module.ccall("emu_compute_audio_samples","number")}getAudioBuffer(){return this.Module.ccall("emu_get_audio_buffer","number")>>1}getAudioBufferLength(){return this.Module.ccall("emu_get_audio_buffer_length","number")}readFloatSample(e,t){return this.Module.HEAP16[e+t]/32768}getMaxPlaybackPosition(){return this.isAdapterReady()?this.Module.ccall("emu_get_max_position","number"):-1}getPlaybackPosition(){return this.isAdapterReady()?this.Module.ccall("emu_get_current_position","number"):-1}seekPlaybackPosition(e){if(!this.isAdapterReady())return;let t=ScriptNodePlayer.getInstance();if(t){let i=t.getVolume();t.setVolume(0),this.Module.ccall("emu_seek_position","number",["number"],[e]),t.setVolume(i)}else this.Module.ccall("emu_seek_position","number",["number"],[e])}_decodeBinaryToText(e,t,i){let r=[];for(let t=0;t<i;t++){let i=this.Module.HEAPU8[e+t>>0];if(0==i)break;r.push(i)}return new TextDecoder(t).decode(new Uint8Array(r))}_loadMusicDataBuffer(e,t,i,r,a){let s=this.Module._malloc(t.length);this.Module.HEAPU8.set(t,s);let n=this.Module.ccall("emu_load_file","number",["string","number","number","number","number","number"],[e,s,t.length,i,r,a]);return this.Module._free(s),n}_setupOutputResampling(e){let t=this.Module.ccall("emu_get_sample_rate","number");this.resetSampleRate(e,t)}}class EmsHEAPF32BackendAdapter extends EmsHEAP16BackendAdapter{constructor(e,t,i,r){super(e,t,i,r),this._bytesPerSample=4}getAudioBuffer(){return super.getAudioBuffer()>>1}readFloatSample(e,t){return this.Module.HEAPF32[e+t]}}class EmsHEAP32BackendAdapter extends EmsHEAPF32BackendAdapter{constructor(e,t,i,r){super(e,t,i,r)}readFloatSample(e,t){return this.Module.HEAP32[e+t]}}class FileCache{constructor(){this._binaryFileMap={},this._pendingFileMap={},this._isWaitingForFile=!1}getFileMap(){return this._binaryFileMap}getPendingMap(){return this._pendingFileMap}setWaitingForFile(e){this._isWaitingForFile=e}isWaitingForFile(){return this._isWaitingForFile}getFile(e){let t;return e in this._binaryFileMap&&(t=this._binaryFileMap[e]),t}setFile(e,t){this._binaryFileMap[e]=t,this._isWaitingForFile=!1}}var ScriptNodePlayer=(PlayerImpl=function(e,t,i,r,a,s,n){void 0===e&&alert("fatal error: backendAdapter not specified"),void 0===r&&alert("fatal error: onPlayerReady not specified"),void 0===a&&(a=function(){}),void 0===s&&(s=function(){}),this._isPlayerReady=!1,this._producerNode=null,e._assertSyncNodeReadiness(function(){this._ctor(e,void 0,t,i,r,a,s,void 0,n)}.bind(this))},PlayerImpl.prototype={_ctor:function(e,t,i,r,a,s,n,o,l){e.getChannels()>2&&alert("fatal error: only 1 or 2 output channels supported"),this._backendAdapter=e,this._spectrumEnabled=void 0!==r&&r,this._onTrackReadyToPlay=s,this._backendAdapter.setOnTrackEnd(n),this._onPlayerReady=a,this._onProgress=null,this._externalTicker=l,this._backendAdapter.setTicker(this._externalTicker),this._isAutoPlayCripple()||(ScriptNodePlayer._setGlobalWebAudioCtx(),this._sampleRate=window._gPlayerAudioCtx.sampleRate,this._backendAdapter.resetSampleRate(this._sampleRate,-1)),this._bufferSource,this._gainNode,this._analyzerNode,this._producerNode,this._freqByteData=0,this._pan=null,this._isPaused=!1,this._silenceTimeout=5,this._initInProgress=!1,this._isSongReady=!1,this._preLoadReady=!1,this._preloadFiles.bind(this)(i,function(){this._preLoadReady=!0,this._preLoadReady&&this._backendAdapter.isAdapterReady()&&(this._isPlayerReady=!0,window.player=this,this._onPlayerReady())}.bind(this)),this._backendAdapter.setObserver(this)},isReady:function(){return this._isPlayerReady},notify:function(){if(void 0!==this.deferredPreload&&this._backendAdapter.isAdapterReady()){let e=this.deferredPreload[0],t=this.deferredPreload[1];delete this.deferredPreload,this._preload(e,e.length,t)}!this._isPlayerReady&&this._preLoadReady&&this._backendAdapter.isAdapterReady()&&(this._isPlayerReady=!0,window.player=this,this._onPlayerReady())},notifySongEnd:function(){this._isPaused=!0,this._backendAdapter.doOnTrackEnd()},notifyError:function(e){this.lastOnFail&&this.lastOnFail(e)},_isAppleShit:function(){return!!navigator.platform&&/iPad|iPhone|iPod/.test(navigator.platform)},_isAutoPlayCripple:function(){return window.chrome||this._isAppleShit()},_initByUserGesture:function(){if(void 0===this._sampleRate&&(this._sampleRate=window._gPlayerAudioCtx.sampleRate,this._backendAdapter.resetSampleRate(this._sampleRate,-1)),void 0!==this._bufferSource)try{this._bufferSource.stop(0)}catch(e){}else{let e=window._gPlayerAudioCtx;this._isAppleShit()&&this._iOSHack(e),this._analyzerNode=e.createAnalyser(),this._producerNode=this._backendAdapter._createProducerNode(e),this._gainNode=e.createGain(),this._producerNode.connect(this._gainNode),this._tickerNode=this._backendAdapter._connectTickerNode(e,this._gainNode),this._spectrumEnabled?(this._gainNode.connect(this._analyzerNode),this._analyzerNode.connect(e.destination)):this._gainNode.connect(e.destination),this._bufferSource=this._createBufferSource(e)}},_createBufferSource:function(e){let t=e.createBufferSource();return t.start||(t.start=t.noteOn,t.stop=t.noteOff),t},resetSampleRate:function(e){e>0&&(this._sampleRate=e),this._backendAdapter.resetSampleRate(e,-1)},setSilenceTimeout:function(e){this._silenceTimeout=e,void 0!==this._backendAdapter&&this._backendAdapter.isAdapterReady()&&this._backendAdapter.setSilenceTimeout(e)},play:function(){this._isPaused=!1;try{this._bufferSource.start(0)}catch(e){}this._backendAdapter.play()},pause:function(){this._isWaitingForFile()||this._initInProgress||!this._isSongReady||(this._isPaused=!0),this._backendAdapter.pause()},resume:function(){this._isWaitingForFile()||this._initInProgress||!this._isSongReady||this.play()},_setPaused:function(){this._isPaused=!0},isPaused:function(){return this._isPaused},getBufNum:function(){return this._backendAdapter.getBufNum()},setVolume:function(e){void 0!==this._gainNode&&(this._gainNode.gain.value=e)},getVolume:function(){return void 0!==this._gainNode?this._gainNode.gain.value:-1},setPanning:function(e){this._pan=e},getPanning:function(){return this._pan},setPlaybackTimeout:function(e){this._backendAdapter.setPlaybackTimeout(e)},getPlaybackTimeout:function(){return this._backendAdapter.getPlaybackTimeout()},getCurrentTick:function(){return this._backendAdapter.getCurrentTick()},getMaxTicks:function(){return this._backendAdapter.getMaxTicks()},getSongInfo:function(){return this._backendAdapter.getSongInfo()},getSongInfoMeta:function(){return this._backendAdapter.getSongInfoMeta()},getFreqByteData:function(){return this._analyzerNode&&(0===this._freqByteData&&(this._freqByteData=new Uint8Array(this._analyzerNode.frequencyBinCount)),this._analyzerNode.getByteFrequencyData(this._freqByteData)),this._freqByteData},getMaxPlaybackPosition:function(){return this._backendAdapter.getMaxPlaybackPosition()},getPlaybackPosition:function(){return this._backendAdapter.getPlaybackPosition()},getCurrentPlaytime:function(){return this._backendAdapter.getCurrentPlaytime()},seekPlaybackPosition:function(e){return this._backendAdapter.seekPlaybackPosition(e)},getCached:function(e){let t=this._getCache().getFile(e);return void 0===t?null:t},setFileData:function(e,t){let i=this._backendAdapter.mapBackendFilename(e),r=this._getPathAndFilename(i);return void 0!==this._backendAdapter.registerFileData(r,t)&&(this._getCache().setFile(i,t),!0)},_getPathAndFilename:function(e){let t=e.split("/"),i=t[t.length-1];return[e.substring(0,e.lastIndexOf("/")),i]},asyncSetFileData:function(e,t){this._fileReadyNotify=e,this.setFileData(e,t),this._isSongReady=!1,this._setWaitingForFile(!1),this._initIfNeeded(this.lastUsedFilename,this.lastUsedData,this.lastUsedOptions),this.lastOnCompletion(e)},_isFileNotFound:function(e,t){if(4==t.readyState&&t.status>=400)return!0;try{if("<html>"==(new TextDecoder).decode(new Int8Array(t.response).subarray(0,6)).toLowerCase())return console.log("GET "+e+" (Not found)"),!0}catch(e){}return!1},loadMusicFromURL:function(e,t,i,r,a,s){void 0===t&&(t={}),void 0===i&&(i=function(){}),void 0===r&&(r=function(){}),void 0===a&&(a=function(){}),this._onProgress=a,void 0!==s&&(this._onTrackReadyToPlay=s),this._isPaused=!0,this._initByUserGesture(),this._backendAdapter.init(e);let n=this._backendAdapter.mapToVirtualFilename(e);if(this._fileReadyNotify="",this._backendAdapter.skipFileLoad())this._prepareTrackForPlayback(n,null,t,i,r)?i(n):r();else{if(this._loadMusicDataFromCache(n,t,i,r))return;let a=this.getVolume();a||delete a,this.setVolume(0);let s=new XMLHttpRequest;s.open("GET",e,!0),s.responseType="arraybuffer",s.onload=function(o){this._isFileNotFound(e,s)?(DbgUtil.trace("_isFileNotFound: "+n),this._getCache().setFile(n,0),void 0!==a&&this.setVolume(a),r()):(DbgUtil.trace("loadMusicFromURL successfully loaded: "+n),this._prepareTrackForPlayback(n,s.response,t,i,r)?i(n):this._isWaitingForFile()||r()),this.setVolume(a)}.bind(this),s.onprogress=function(e){this._onProgress(e.total,e.loaded,e)}.bind(this),s.onerror=function(e){r(e),this.setVolume(a)}.bind(this),s.send(null)}},_readFile:function(e){let t=void 0!==e.xname?e.xname:e.name,i=this._backendAdapter.mapToVirtualFilename(t),r=function(e,t){let i=this._getPathAndFilename(e),r=new Uint8Array(t);return this._getCache().setFile(e,r),this._backendAdapter.registerFileData(i,r)}.bind(this);return new Promise(((a,s)=>{if(void 0===e.fileBuffer){let n=new FileReader;n.onload=()=>{void 0===r(i,n.result)?s():a(t)},n.onerror=s,n.readAsArrayBuffer(e)}else void 0===r(i,e.fileBuffer)?s():a(t)}))},_loadFileData:function(e){return new Promise(((t,i)=>{let r=[];e.forEach((e=>{r.push(this._readFile(e))})),Promise.all(r).then((e=>{t(e)}))}))},_prepareTrackForPlayback:function(e,t,i,r,a){return this.lastUsedFilename=e,this.lastUsedData=t,this.lastUsedOptions=i,this.lastOnCompletion=r,this.lastOnFail=a,this._isSongReady=!1,this._setWaitingForFile(!1),this._initIfNeeded(e,t,i)},setWait:function(e){this._setWaitingForFile(e)},getDefaultSampleRate:function(){alert("error: getDefaultSampleRate() must be replaced with ScriptNodePlayer.getWebAudioSampleRate()")},getAudioContext:function(){alert("error: getAudioContext() must be replaced with ScriptNodePlayer.getWebAudioContext()")},_initIfNeeded:function(e,t,i){let r=this._loadMusicData(e,t,i);if(r<0)this._isSongReady=!1,this._setWaitingForFile(!0),this._initInProgress=!1;else{if(0===r)return this._setWaitingForFile(!1),this._isSongReady=!0,this._initInProgress=!1,DbgUtil.trace("successfully completed init"),0!==this._backendAdapter.evalTrackOptions(i)?(DbgUtil.trace("error preparing track options"),!1):(this._backendAdapter.prepareToPlay(this._silenceTimeout,e),this.lastUsedFilename==e&&(this._fileReadyNotify==e?this.play():this._onTrackReadyToPlay(e),this._fileReadyNotify=e),this._isPaused=!1,!0);this._initInProgress=!1,DbgUtil.trace("_initIfNeeded - fatal error")}return!1},_loadMusicDataFromCache:function(e,t,i,r){var a=this._getCache().getFile(e);return void 0!==a?(DbgUtil.trace("_loadMusicDataFromCache found cached file using name: "+e),0==a?(r(),!0):(this._prepareTrackForPlayback(e,a,t,i,r)||this._isWaitingForFile()||r(),!0)):(DbgUtil.trace("_loadMusicDataFromCache FAILED to find cached file using name: "+e),!1)},_iOSHack:function(e){try{let t=this._createBufferSource(e);t.buffer=e.createBuffer(1,1,22050),t.connect(e.destination),t.start(0)}catch(e){}},_loadMusicData:function(e,t,i){this._backendAdapter.teardown();let r=null,a=this._getPathAndFilename(e);t&&(r=new Uint8Array(t),this._backendAdapter.registerFileData(a,r),this._getCache().setFile(e,r));let s=this._backendAdapter.loadMusicData(this._sampleRate,a[0],a[1],r,i);return 0===s&&this._backendAdapter._resetBuffers(),s},_preload:function(e,t,i){if(0===t)i();else{t--;let r=function(){this._preload(e,t,i)}.bind(this),a=this._backendAdapter.mapToVirtualFilename(e[t]);this._preloadFile(a,r,!0)}},_preloadFile:function(e,t,i){let r=this._getCache().getFile(e);if(void 0!==r){let a=0;if(0==r)a=1,DbgUtil.trace("error: _preloadFile could not get cached: "+e);else{DbgUtil.trace("_preloadFile found cached file using name: "+e);let t=this._getPathAndFilename(e);this._backendAdapter.registerFileData(t,r)}return i&&t(),a}if(DbgUtil.trace("_preloadFile FAILED to find cached file using name: "+e),this._isPaused=!0,this._setWaitingForFile(!0),this._isSongReady=!1,!(e in this._getCache().getPendingMap())){this._getCache().getPendingMap()[e]=1;let i=this._backendAdapter.mapFromVirtualFilename(e),r=new XMLHttpRequest;r.open("GET",i,!0),r.responseType="arraybuffer",r.onload=function(a){if(this._isFileNotFound(i,r))this._getCache().setFile(e,0);else{let t=r.response;if(t){DbgUtil.trace("_preloadFile successfully loaded: "+e);let i=this._getPathAndFilename(e),r=new Uint8Array(t);this._backendAdapter.registerFileData(i,r),DbgUtil.trace("_preloadFile cached file using name: "+e),this._getCache().setFile(e,r)}}delete this._getCache().getPendingMap()[e]||DbgUtil.trace("remove file from pending failed: "+e),t()}.bind(this),r.onreadystatechange=function(t){4==r.readyState&&r.status>=400&&(DbgUtil.trace("_preloadFile failed to load: "+e),this._getCache().setFile(e,0))}.bind(this),r.onprogress=function(e){this._onProgress&&this._onProgress(e.total,e.loaded)}.bind(this),r.onerror=function(i){this._getCache().setFile(e,0),delete this._getCache().getPendingMap()[e]||DbgUtil.trace("remove file from pending failed: "+e),t()}.bind(this),r.send(null)}return-1},_preloadFiles:function(e,t){void 0===e&&(e=[]),this._isPaused=!0,this._backendAdapter.isAdapterReady()?this._preload(e,e.length,t):this.deferredPreload=[e,t]},_signalFileNotReady:function(){this._isPaused=!0,this._isSongReady=!1,this._setWaitingForFile(!0)},_isNotPlaying:function(){return!this._isSongReady||this._isWaitingForFile()||this._isPaused},_setWaitingForFile:function(e){this._getCache().setWaitingForFile(e)},_isWaitingForFile:function(){return this._getCache().isWaitingForFile()},_getCache:function(){return void 0===window._fileCache&&(window._fileCache=new FileCache),window._fileCache},_fileRequestCallback:function(e){let t=this._backendAdapter.Module.UTF8ToString(e),i=this._backendAdapter.mapBackendFilename(t);return DbgUtil.trace("_fileRequestCallback backend name: "+i+" > FS name: "+i),this._preloadFile(i,function(){this._initIfNeeded(this.lastUsedFilename,this.lastUsedData,this.lastUsedOptions)}.bind(this),!1)},_fileSizeRequestCallback:function(e){let t=this._backendAdapter.Module.UTF8ToString(e),i=this._backendAdapter.mapBackendFilename(t);return this._getCache().getFile(i).length},_songUpdateCallback:function(e){this._backendAdapter.handleBackendSongAttributes(e)}},{_setGlobalWebAudioCtx:function(){if(void 0===window._gPlayerAudioCtx){let t="Web Audio API is not supported in this browser";try{"AudioContext"in window?window._gPlayerAudioCtx=new AudioContext({latencyHint:"playback"}):"webkitAudioContext"in window?window._gPlayerAudioCtx=new webkitAudioContext:alert(t+e)}catch(e){alert(t+e)}}if("suspended"==window._gPlayerAudioCtx.state)try{window._gPlayerAudioCtx.resume()}catch(e){}},createInstance:function(e,t,i,r,a,s,n,o,l,d){if(void 0!==o&&console.log("warning: createInstance() no longer uses the 'doOnUpdate' param - backend now has to provide this if necessary!"),void 0!==d&&console.log("warning: createInstance() no longer uses the 'bufferSize' param - backend now has to provide this if necessary!"),void 0!==window.player){let e=window.player;if(e._isPaused=!0,void 0!==e._bufferSource)try{e._bufferSource.stop(0)}catch(e){}e._producerNode&&e._producerNode.disconnect(0),e._analyzerNode&&e._analyzerNode.disconnect(0),e._gainNode&&e._gainNode.disconnect(0),e._tickerNode&&e._tickerNode.disconnect(0),window.player=void 0}new PlayerImpl(e,i,r,a,s,n,l,d)},getInstance:function(){return void 0===window.player?(void 0===this.warnedOnce&&(console.log("warning: ScriptNodePlayer.getInstance() called while player instance not ready. Check your initialization code."),this.warnedOnce=!0),null):window.player},getWebAudioContext:function(){return this._setGlobalWebAudioCtx(),window._gPlayerAudioCtx},getWebAudioSampleRate:function(){return this.getWebAudioContext().sampleRate},initialize:function(e,t,i,r,a){return new Promise(((s,n)=>{let o=function(){s("playerIsReady")}.bind(this);ScriptNodePlayer.createInstance(e,void 0,i,r,o,void 0,t,void 0,a,void 0)}))},loadMusicFromURL:function(e,t,i,r){return new Promise(((a,s)=>{let n=function(e){a({status:"trackReadyToPlay",file:e})}.bind(this);ScriptNodePlayer.getInstance().loadMusicFromURL(e,t,(function(){}),i,r,n)}))},loadFileData:e=>ScriptNodePlayer.getInstance()._loadFileData(e)});
|