From 342ab3e6e5c495a2128aaf587cfd90fa180cc83d Mon Sep 17 00:00:00 2001 From: Licson Lee Date: Sun, 11 Jan 2015 13:10:58 +0800 Subject: [PATCH] Added license files and improved audio engine --- audio/LICENSE | 26 ++++++ bkcore/Audio.js | 135 ++++++++++++++++++++++++------- bkcore/hexgl/HexGL.js | 4 +- bkcore/hexgl/ShipControls.js | 1 - bkcore/hexgl/tracks/Cityscape.js | 15 ++-- bkcore/threejs/Loader.js | 2 +- 6 files changed, 147 insertions(+), 36 deletions(-) create mode 100644 audio/LICENSE diff --git a/audio/LICENSE b/audio/LICENSE new file mode 100644 index 0000000..022f989 --- /dev/null +++ b/audio/LICENSE @@ -0,0 +1,26 @@ +Licenses for the sound files +============================= + +*boost.mp3* + +Created by IFartInUrGeneralDirection and distributed under +Creative Commons 3.0 Attribution 3.0 Unported license. + +*crash.mp3* +Created by qubodup and is published into Public Domain. + +*wind.mp3* +Created by kangaroovindaloo and distributed under +Creative Commons 3.0 Attribution 3.0 Unported license. + +This SFX is further cutted and adjusted by Licson. + +*bg.mp3* +Created by mu6k and is released into Public Domain. + +Further adjusted by Licson. + +*destroyed.mp3* +Created by beman87 and is distributed under Creative Commons Attribution 3.0 Unported license. + +This SFX is further adjusted by Licson. \ No newline at end of file diff --git a/bkcore/Audio.js b/bkcore/Audio.js index 7358fe1..29b2052 100644 --- a/bkcore/Audio.js +++ b/bkcore/Audio.js @@ -4,58 +4,139 @@ bkcore.Audio = {}; bkcore.Audio.sounds = {}; bkcore.Audio.init = function(){ - bkcore.Audio._ctx = new (window.AudioContext||window.webkitAudioContext); - bkcore.Audio._panner = bkcore.Audio._ctx.createPanner(); - bkcore.Audio._panner.connect(bkcore.Audio._ctx.destination); + if(window.AudioContext||window.webkitAudioContext){ + bkcore.Audio._ctx = new (window.AudioContext||window.webkitAudioContext)(); + bkcore.Audio._panner = bkcore.Audio._ctx.createPanner(); + bkcore.Audio._panner.connect(bkcore.Audio._ctx.destination); + } + else { + bkcore.Audio._ctx = null; + } + bkcore.Audio.posMultipler = 1.5; }; bkcore.Audio.init(); -bkcore.Audio.addSound = function(src, id, loop, callback){ +bkcore.Audio.addSound = function(src, id, loop, callback, usePanner){ var ctx = bkcore.Audio._ctx; var audio = new Audio(); - audio.src = src; - audio.addEventListener('canplay', callback, false); - audio.loop = loop; - audio.load(); if(ctx){ - var mediasrc = ctx.createMediaElementSource(audio); - mediasrc.connect(bkcore.Audio._panner); + var audio = { src: null, gainNode: null, bufferNode: null, loop: loop }; + var xhr = new XMLHttpRequest(); + xhr.responseType = 'arraybuffer'; + + xhr.onload = function(){ + ctx.decodeAudioData(xhr.response, function(b){ + // Create Gain Node + var gainNode = ctx.createGain(); + + if(usePanner === true){ + gainNode.connect(bkcore.Audio._panner); + } + else { + gainNode.connect(ctx.destination); + } + + // Add the audio source + audio.src = b; + + //Remember the gain node + audio.gainNode = gainNode; + + callback(); + }, function(e){ + console.error('Audio decode failed!', e); + }); + }; + + xhr.open('GET', src, true); + xhr.send(null); + } + else { + // Workaround for old Safari + audio.addEventListener('canplay', function(){ + audio.pause(); + audio.currentTime = 0; + + callback(); + }, false); + + audio.autoplay = true; + audio.loop = loop; + audio.src = src; } bkcore.Audio.sounds[id] = audio; }; bkcore.Audio.play = function(id){ - if(bkcore.Audio.sounds[id].currentTime > 0){ - bkcore.Audio.sounds[id].pause(); - bkcore.Audio.sounds[id].currentTime = 0; + var ctx = bkcore.Audio._ctx; + + if(ctx){ + var sound = ctx.createBufferSource(); + sound.connect(bkcore.Audio.sounds[id].gainNode); + + sound.buffer = bkcore.Audio.sounds[id].src; + sound.loop = bkcore.Audio.sounds[id].loop; + + bkcore.Audio.sounds[id].gainNode.gain.value = 1; + bkcore.Audio.sounds[id].bufferNode = sound; + + sound.start ? sound.start(0) : sound.noteOn(0); + } + else { + if(bkcore.Audio.sounds[id].currentTime > 0){ + bkcore.Audio.sounds[id].pause(); + bkcore.Audio.sounds[id].currentTime = 0; + } + + bkcore.Audio.sounds[id].play(); } - bkcore.Audio.sounds[id].play(); }; bkcore.Audio.stop = function(id){ - bkcore.Audio.sounds[id].pause(); - bkcore.Audio.sounds[id].currentTime = 0; + var ctx = bkcore.Audio._ctx; + + if(ctx){ + if(bkcore.Audio.sounds[id].bufferNode !== null){ + bkcore.Audio.sounds[id].bufferNode.disconnect(); + bkcore.Audio.sounds[id].bufferNode = null; + } + } + else { + bkcore.Audio.sounds[id].pause(); + bkcore.Audio.sounds[id].currentTime = 0; + } }; -bkcore.Audio.volume = function(id,volume){ - bkcore.Audio.sounds[id].volume = volume; +bkcore.Audio.volume = function(id, volume){ + var ctx = bkcore.Audio._ctx; + + if(ctx){ + bkcore.Audio.sounds[id].gainNode.gain.value = volume; + } + else { + bkcore.Audio.sounds[id].volume = volume; + } }; bkcore.Audio.setListenerPos = function(vec){ - var panner = bkcore.Audio._panner; - var vec2 = vec.normalize(); - panner.setPosition( - vec2.x * bkcore.Audio.posMultipler, - vec2.y * bkcore.Audio.posMultipler, - vec2.z * bkcore.Audio.posMultipler - ); + if(bkcore.Audio._ctx){ + var panner = bkcore.Audio._panner; + var vec2 = vec.normalize(); + panner.setPosition( + vec2.x * bkcore.Audio.posMultipler, + vec2.y * bkcore.Audio.posMultipler, + vec2.z * bkcore.Audio.posMultipler + ); + } }; bkcore.Audio.setListenerVelocity = function(vec){ - var panner = bkcore.Audio._panner; - panner.setVelocity(vec.x, vec.y, vec.z); + if(bkcore.Audio._ctx){ + var panner = bkcore.Audio._panner; + panner.setVelocity(vec.x, vec.y, vec.z); + } }; \ No newline at end of file diff --git a/bkcore/hexgl/HexGL.js b/bkcore/hexgl/HexGL.js index 8da4fd7..cd627e7 100644 --- a/bkcore/hexgl/HexGL.js +++ b/bkcore/hexgl/HexGL.js @@ -114,8 +114,8 @@ bkcore.hexgl.HexGL.prototype.reset = function() this.gameplay.start(); bkcore.Audio.play('bg'); - bkcore.Audio.volume('wind', 0.05); bkcore.Audio.play('wind'); + bkcore.Audio.volume('wind', 0.35); } bkcore.hexgl.HexGL.prototype.restart = function() @@ -173,7 +173,7 @@ bkcore.hexgl.HexGL.prototype.initGameplay = function() bkcore.Audio.play('bg'); bkcore.Audio.play('wind'); - bkcore.Audio.volume('wind',0.05); + bkcore.Audio.volume('wind', 0.35); } bkcore.hexgl.HexGL.prototype.displayScore = function(f, l) diff --git a/bkcore/hexgl/ShipControls.js b/bkcore/hexgl/ShipControls.js index 94a97c0..6854751 100644 --- a/bkcore/hexgl/ShipControls.js +++ b/bkcore/hexgl/ShipControls.js @@ -628,7 +628,6 @@ bkcore.hexgl.ShipControls.prototype.collisionCheck = function(dt) if(collision.r < 255) { - if(this.boost > 0) bkcore.Audio.stop('boost'); bkcore.Audio.play('crash'); // Shield diff --git a/bkcore/hexgl/tracks/Cityscape.js b/bkcore/hexgl/tracks/Cityscape.js index 801c289..ae7095a 100644 --- a/bkcore/hexgl/tracks/Cityscape.js +++ b/bkcore/hexgl/tracks/Cityscape.js @@ -87,23 +87,28 @@ bkcore.hexgl.tracks.Cityscape = { sounds: { bg: { src: 'audio/bg.mp3', - loop: true + loop: true, + usePanner: false }, crash: { src: 'audio/crash.mp3', - loop: false + loop: false, + usePanner: true }, destroyed: { src: 'audio/destroyed.mp3', - loop: false + loop: false, + usePanner: false }, boost: { src: 'audio/boost.mp3', - loop: false + loop: false, + usePanner: true }, wind: { src: 'audio/wind.mp3', - loop: true + loop: true, + usePanner: true } } }); diff --git a/bkcore/threejs/Loader.js b/bkcore/threejs/Loader.js index 2c4c413..9744d66 100644 --- a/bkcore/threejs/Loader.js +++ b/bkcore/threejs/Loader.js @@ -91,7 +91,7 @@ bkcore.threejs.Loader.prototype.load = function(data) this.loadImage(i, data.images[i]); for(var s in data.sounds) - this.loadSound(data.sounds[s].src, s, data.sounds[s].loop); + this.loadSound(data.sounds[s].src, s, data.sounds[s].loop, data.sounds[s].usePanner); this.progressCallback.call(this, this.progress); }