Path: blob/main/projects/HexGL/bkcore/Audio.js
1834 views
var bkcore = bkcore || {};12bkcore.Audio = {};3bkcore.Audio.sounds = {};45bkcore.Audio.init = function(){6if(window.AudioContext||window.webkitAudioContext){7bkcore.Audio._ctx = new (window.AudioContext||window.webkitAudioContext)();8bkcore.Audio._panner = bkcore.Audio._ctx.createPanner();9bkcore.Audio._panner.connect(bkcore.Audio._ctx.destination);10}11else {12bkcore.Audio._ctx = null;13}1415bkcore.Audio.posMultipler = 1.5;16};1718bkcore.Audio.init();1920bkcore.Audio.addSound = function(src, id, loop, callback, usePanner){21var ctx = bkcore.Audio._ctx;22var audio = new Audio();2324if(ctx){25var audio = { src: null, gainNode: null, bufferNode: null, loop: loop };26var xhr = new XMLHttpRequest();27xhr.responseType = 'arraybuffer';2829xhr.onload = function(){30ctx.decodeAudioData(xhr.response, function(b){31// Create Gain Node32var gainNode = ctx.createGain();3334if(usePanner === true){35gainNode.connect(bkcore.Audio._panner);36}37else {38gainNode.connect(ctx.destination);39}4041// Add the audio source42audio.src = b;4344//Remember the gain node45audio.gainNode = gainNode;4647callback();48}, function(e){49console.error('Audio decode failed!', e);50});51};5253xhr.open('GET', src, true);54xhr.send(null);55}56else {57// Workaround for old Safari58audio.addEventListener('canplay', function(){59audio.pause();60audio.currentTime = 0;6162callback();63}, false);6465audio.autoplay = true;66audio.loop = loop;67audio.src = src;68}6970bkcore.Audio.sounds[id] = audio;71};7273bkcore.Audio.play = function(id){74var ctx = bkcore.Audio._ctx;7576if(ctx){77var sound = ctx.createBufferSource();78sound.connect(bkcore.Audio.sounds[id].gainNode);7980sound.buffer = bkcore.Audio.sounds[id].src;81sound.loop = bkcore.Audio.sounds[id].loop;8283bkcore.Audio.sounds[id].gainNode.gain.value = 1;84bkcore.Audio.sounds[id].bufferNode = sound;8586sound.start ? sound.start(0) : sound.noteOn(0);87}88else {89if(bkcore.Audio.sounds[id].currentTime > 0){90bkcore.Audio.sounds[id].pause();91bkcore.Audio.sounds[id].currentTime = 0;92}9394bkcore.Audio.sounds[id].play();95}96};9798bkcore.Audio.stop = function(id){99var ctx = bkcore.Audio._ctx;100101if(ctx){102if(bkcore.Audio.sounds[id].bufferNode !== null){103var bufferNode = bkcore.Audio.sounds[id].bufferNode;104bufferNode.stop ? bufferNode.stop(ctx.currentTime) : bufferNode.noteOff(ctx.currentTime);105}106}107else {108bkcore.Audio.sounds[id].pause();109bkcore.Audio.sounds[id].currentTime = 0;110}111};112113bkcore.Audio.volume = function(id, volume){114var ctx = bkcore.Audio._ctx;115116if(ctx){117bkcore.Audio.sounds[id].gainNode.gain.value = volume;118}119else {120bkcore.Audio.sounds[id].volume = volume;121}122};123124bkcore.Audio.setListenerPos = function(vec){125if(bkcore.Audio._ctx){126var panner = bkcore.Audio._panner;127var vec2 = vec.normalize();128panner.setPosition(129vec2.x * bkcore.Audio.posMultipler,130vec2.y * bkcore.Audio.posMultipler,131vec2.z * bkcore.Audio.posMultipler132);133}134};135136bkcore.Audio.setListenerVelocity = function(vec){137if(bkcore.Audio._ctx){138var panner = bkcore.Audio._panner;139//panner.setVelocity(vec.x, vec.y, vec.z);140}141};142143