howler.js 10 KB

1
  1. (function(){var e={};var t=null,n=true,r=false;if(typeof AudioContext!=="undefined"){t=new AudioContext}else if(typeof webkitAudioContext!=="undefined"){t=new webkitAudioContext}else if(typeof Audio!=="undefined"){n=false;try{new Audio}catch(i){r=true}}else{n=false;r=true}if(n){var s=typeof t.createGain==="undefined"?t.createGainNode():t.createGain();s.gain.value=1;s.connect(t.destination)}var o=function(){this._volume=1;this._muted=false;this.usingWebAudio=n;this._howls=[]};o.prototype={volume:function(e){var t=this;e=parseFloat(e);if(e&&e>=0&&e<=1){t._volume=e;if(n){s.gain.value=e}for(var r in t._howls){if(t._howls.hasOwnProperty(r)&&t._howls[r]._webAudio===false){for(var i=0;i<t._howls[r]._audioNode.length;i++){t._howls[r]._audioNode[i].volume=t._howls[r]._volume*t._volume}}}return t}return n?s.gain.value:t._volume},mute:function(){this._setMuted(true);return this},unmute:function(){this._setMuted(false);return this},_setMuted:function(e){var t=this;t._muted=e;if(n){s.gain.value=e?0:t._volume}for(var r in t._howls){if(t._howls.hasOwnProperty(r)&&t._howls[r]._webAudio===false){for(var i=0;i<t._howls[r]._audioNode.length;i++){t._howls[r]._audioNode[i].muted=e}}}}};var u=new o;var a=null;if(!r){a=new Audio;var f={mp3:!!a.canPlayType("audio/mpeg;").replace(/^no$/,""),opus:!!a.canPlayType('audio/ogg; codecs="opus"').replace(/^no$/,""),ogg:!!a.canPlayType('audio/ogg; codecs="vorbis"').replace(/^no$/,""),wav:!!a.canPlayType('audio/wav; codecs="1"').replace(/^no$/,""),m4a:!!(a.canPlayType("audio/x-m4a;")||a.canPlayType("audio/aac;")).replace(/^no$/,""),webm:!!a.canPlayType('audio/webm; codecs="vorbis"').replace(/^no$/,"")}}var l=function(e){var t=this;t._autoplay=e.autoplay||false;t._buffer=e.buffer||false;t._duration=e.duration||0;t._format=e.format||null;t._loop=e.loop||false;t._loaded=false;t._sprite=e.sprite||{};t._src=e.src||"";t._pos3d=e.pos3d||[0,0,-.5];t._volume=e.volume||1;t._urls=e.urls||[];t._rate=e.rate||1;t._onload=[e.onload||function(){}];t._onloaderror=[e.onloaderror||function(){}];t._onend=[e.onend||function(){}];t._onpause=[e.onpause||function(){}];t._onplay=[e.onplay||function(){}];t._onendTimer=[];t._webAudio=n&&!t._buffer;t._audioNode=[];if(t._webAudio){t._setupAudioNode()}u._howls.push(t);t.load()};l.prototype={load:function(){var t=this,n=null;if(r){t.on("loaderror");return}var i={mp3:f.mp3,opus:f.opus,ogg:f.ogg,wav:f.wav,m4a:f.m4a,weba:f.webm};for(var s=0;s<t._urls.length;s++){var o;if(t._format){o=t._format}else{o=t._urls[s].toLowerCase().match(/.+\.([^?]+)(\?|$)/);o=o&&o.length>=2?o[1]:t._urls[s].toLowerCase().match(/data\:audio\/([^?]+);/)[1]}if(i[o]){n=t._urls[s];break}}if(!n){t.on("loaderror");return}t._src=n;if(t._webAudio){c(t,n)}else{var a=new Audio;t._audioNode.push(a);a.src=n;a._pos=0;a.preload="auto";a.volume=u._muted?0:t._volume*u.volume();e[n]=t;var l=function(){t._duration=a.duration;if(Object.getOwnPropertyNames(t._sprite).length===0){t._sprite={_default:[0,t._duration*1e3]}}if(!t._loaded){t._loaded=true;t.on("load")}if(t._autoplay){t.play()}a.removeEventListener("canplaythrough",l,false)};a.addEventListener("canplaythrough",l,false);a.load()}return t},urls:function(e){var t=this;if(e){t.stop();t._urls=typeof e==="string"?[e]:e;t._loaded=false;t.load();return t}else{return t._urls}},play:function(e,n){var r=this;if(typeof e==="function"){n=e}if(!e||typeof e==="function"){e="_default"}if(!r._loaded){r.on("load",function(){r.play(e,n)});return r}if(!r._sprite[e]){if(typeof n==="function")n();return r}r._inactiveNode(function(i){i._sprite=e;var s=i._pos>0?i._pos:r._sprite[e][0]/1e3,o=r._sprite[e][1]/1e3-i._pos;var a=!!(r._loop||r._sprite[e][2]);var f=typeof n==="string"?n:Math.round(Date.now()*Math.random())+"",l;(function(){var t={id:f,sprite:e,loop:a};l=setTimeout(function(){if(!r._webAudio&&a){r.stop(t.id,t.timer).play(e,t.id)}if(r._webAudio&&!a){r._nodeById(t.id).paused=true}if(!r._webAudio&&!a){r.stop(t.id,t.timer)}r.on("end",f)},o*1e3);r._onendTimer.push(l);t.timer=r._onendTimer[r._onendTimer.length-1]})();if(r._webAudio){var c=r._sprite[e][0]/1e3,h=r._sprite[e][1]/1e3;i.id=f;i.paused=false;p(r,[a,c,h],f);r._playStart=t.currentTime;i.gain.value=r._volume;if(typeof i.bufferSource.start==="undefined"){i.bufferSource.noteGrainOn(0,s,o)}else{i.bufferSource.start(0,s,o)}}else{if(i.readyState===4){i.id=f;i.currentTime=s;i.muted=u._muted;i.volume=r._volume*u.volume();setTimeout(function(){i.play()},0)}else{r._clearEndTimer(l);(function(){var t=r,s=e,o=n,u=i;var a=function(){t.play(s,o);u.removeEventListener("canplaythrough",a,false)};u.addEventListener("canplaythrough",a,false)})();return r}}r.on("play");if(typeof n==="function")n(f);return r});return r},pause:function(e,t){var n=this;if(!n._loaded){n.on("play",function(){n.pause(e)});return n}n._clearEndTimer(t||0);var r=e?n._nodeById(e):n._activeNode();if(r){r._pos=n.pos(null,e);if(n._webAudio){if(!r.bufferSource){return n}r.paused=true;if(typeof r.bufferSource.stop==="undefined"){r.bufferSource.noteOff(0)}else{r.bufferSource.stop(0)}}else{r.pause()}}n.on("pause");return n},stop:function(e,t){var n=this;if(!n._loaded){n.on("play",function(){n.stop(e)});return n}n._clearEndTimer(t||0);var r=e?n._nodeById(e):n._activeNode();if(r){r._pos=0;if(n._webAudio){if(!r.bufferSource){return n}r.paused=true;if(typeof r.bufferSource.stop==="undefined"){r.bufferSource.noteOff(0)}else{r.bufferSource.stop(0)}}else{r.pause();r.currentTime=0}}return n},mute:function(e){var t=this;if(!t._loaded){t.on("play",function(){t.mute(e)});return t}var n=e?t._nodeById(e):t._activeNode();if(n){if(t._webAudio){n.gain.value=0}else{n.volume=0}}return t},unmute:function(e){var t=this;if(!t._loaded){t.on("play",function(){t.unmute(e)});return t}var n=e?t._nodeById(e):t._activeNode();if(n){if(t._webAudio){n.gain.value=t._volume}else{n.volume=t._volume}}return t},volume:function(e,t){var n=this;e=parseFloat(e);if(e>=0&&e<=1){n._volume=e;if(!n._loaded){n.on("play",function(){n.volume(e,t)});return n}var r=t?n._nodeById(t):n._activeNode();if(r){if(n._webAudio){r.gain.value=e}else{r.volume=e*u.volume()}}return n}else{return n._volume}},loop:function(e){var t=this;if(typeof e==="boolean"){t._loop=e;return t}else{return t._loop}},sprite:function(e){var t=this;if(typeof e==="object"){t._sprite=e;return t}else{return t._sprite}},pos:function(e,n){var r=this;if(!r._loaded){r.on("load",function(){r.pos(e)});return typeof e==="number"?r:r._pos||0}e=parseFloat(e);var i=n?r._nodeById(n):r._activeNode();if(i){if(r._webAudio){if(e>=0){i._pos=e;r.pause(n).play(i._sprite,n);return r}else{return i._pos+(t.currentTime-r._playStart)}}else{if(e>=0){i.currentTime=e;return r}else{return i.currentTime}}}else if(e>=0){return r}else{for(var s=0;s<r._audioNode.length;s++){if(r._audioNode[s].paused&&r._audioNode[s].readyState===4){return r._webAudio?r._audioNode[s]._pos:r._audioNode[s].currentTime}}}},pos3d:function(e,t,n,r){var i=this;t=typeof t==="undefined"||!t?0:t;n=typeof n==="undefined"||!n?-.5:n;if(!i._loaded){i.on("play",function(){i.pos3d(e,t,n,r)});return i}if(e>=0||e<0){if(i._webAudio){var s=r?i._nodeById(r):i._activeNode();if(s){i._pos3d=[e,t,n];s.panner.setPosition(e,t,n)}}}else{return i._pos3d}return i},fade:function(e,t,n,r,i){var s=this,o=Math.abs(e-t),u=e>t?"down":"up",a=o/.01,f=n/a;if(!s._loaded){s.on("load",function(){s.fade(e,t,n,r,i)});return s}s.volume(e,i);for(var l=1;l<=a;l++){(function(){var e=s._volume+(u==="up"?.01:-.01)*l,n=Math.round(1e3*e)/1e3,o=t;setTimeout(function(){s.volume(n,i);if(n===o){if(r)r()}},f*l)})()}},fadeIn:function(e,t,n){return this.volume(0).play().fade(0,e,t,n)},fadeOut:function(e,t,n,r){var i=this;return i.fade(i._volume,e,t,function(){if(n)n();i.pause(r);i.on("end")},r)},_nodeById:function(e){var t=this,n=t._audioNode[0];for(var r=0;r<t._audioNode.length;r++){if(t._audioNode[r].id===e){n=t._audioNode[r];break}}return n},_activeNode:function(){var e=this,t=null;for(var n=0;n<e._audioNode.length;n++){if(!e._audioNode[n].paused){t=e._audioNode[n];break}}e._drainPool();return t},_inactiveNode:function(e){var t=this,n=null;for(var r=0;r<t._audioNode.length;r++){if(t._audioNode[r].paused&&t._audioNode[r].readyState===4){e(t._audioNode[r]);n=true;break}}t._drainPool();if(n){return}var i;if(t._webAudio){i=t._setupAudioNode();e(i)}else{t.load();i=t._audioNode[t._audioNode.length-1];i.addEventListener("loadedmetadata",function(){e(i)})}},_drainPool:function(){var e=this,t=0,n;for(n=0;n<e._audioNode.length;n++){if(e._audioNode[n].paused){t++}}for(n=e._audioNode.length-1;n>=0;n--){if(t<=5){break}if(e._audioNode[n].paused){if(e._webAudio){e._audioNode[n].disconnect(0)}t--;e._audioNode.splice(n,1)}}},_clearEndTimer:function(e){var t=this,n=t._onendTimer.indexOf(e);n=n>=0?n:0;if(t._onendTimer[n]){clearTimeout(t._onendTimer[n]);t._onendTimer.splice(n,1)}},_setupAudioNode:function(){var e=this,n=e._audioNode,r=e._audioNode.length;n[r]=typeof t.createGain==="undefined"?t.createGainNode():t.createGain();n[r].gain.value=e._volume;n[r].paused=true;n[r]._pos=0;n[r].readyState=4;n[r].connect(s);n[r].panner=t.createPanner();n[r].panner.setPosition(e._pos3d[0],e._pos3d[1],e._pos3d[2]);n[r].panner.connect(n[r]);return n[r]},on:function(e,t){var n=this,r=n["_on"+e];if(typeof t==="function"){r.push(t)}else{for(var i=0;i<r.length;i++){if(t){r[i].call(n,t)}else{r[i].call(n)}}}return n},off:function(e,t){var n=this,r=n["_on"+e],i=t.toString();for(var s=0;s<r.length;s++){if(i===r[s].toString()){r.splice(s,1);break}}return n},unload:function(){var t=this;var n=t._audioNode;for(var r=0;r<t._audioNode.length;r++){t.stop(n[r].id);if(!t._webAudio){n[r].src=""}else{n[r].disconnect(0)}}var i=u._howls.indexOf(t);if(i){u._howls.splice(i,1)}delete e[t._src];t=null}};if(n){var c=function(n,r){if(r in e){n._duration=e[r].duration;h(n)}else{var i=new XMLHttpRequest;i.open("GET",r,true);i.responseType="arraybuffer";i.onload=function(){t.decodeAudioData(i.response,function(t){if(t){e[r]=t;h(n,t)}})};i.onerror=function(){if(n._webAudio){n._buffer=true;n._webAudio=false;n._audioNode=[];delete n._gainNode;n.load()}};try{i.send()}catch(s){i.onerror()}}};var h=function(e,t){e._duration=t?t.duration:e._duration;if(Object.getOwnPropertyNames(e._sprite).length===0){e._sprite={_default:[0,e._duration*1e3]}}if(!e._loaded){e._loaded=true;e.on("load")}if(e._autoplay){e.play()}};var p=function(n,r,i){var s=n._nodeById(i);s.bufferSource=t.createBufferSource();s.bufferSource.buffer=e[n._src];s.bufferSource.connect(s.panner);s.bufferSource.loop=r[0];if(r[0]){s.bufferSource.loopStart=r[1];s.bufferSource.loopEnd=r[1]+r[2]}s.bufferSource.playbackRate.value=n._rate}}if(typeof define==="function"&&define.amd){define(function(){return{Howler:u,Howl:l}})}window.Howler=u;window.Howl=l})()