add majority of sound definitions

This commit is contained in:
jorsi
2020-05-30 17:20:01 -04:00
parent 21267e383d
commit 71786c3671
110 changed files with 197 additions and 89 deletions
+57 -34
View File
@@ -2,6 +2,7 @@
* Module that takes care of audio playback
*/
var AudioEngine = {
canPlayAudio: false,
AUDIO_BUFFER_CACHE: {},
audioContext: null,
master: null,
@@ -9,94 +10,116 @@ var AudioEngine = {
// Tracks for playing music and sound effects
// 0 - Background music
// 1 - Background music
// 2 - Sound effects
// 2 - Event music
// 3 - Sound effects
tracks: null,
currentBackgroundChannel: 0,
currentTrack: null,
init: function(options) {
// for legacy browsers
this.audioContext = new (window.AudioContext || window.webkitAudioContext);
AudioEngine.audioContext = new (window.AudioContext || window.webkitAudioContext);
audioLog('starting audio engine');
console.log(AudioEngine.audioContext);
audioLog('state: ' + AudioEngine.audioContext.state);
if (AudioEngine.audioContext.state === 'suspended') {
AudioEngine.audioContext.resume().then(function () {
AudioEngine.createChannels();
AudioEngine.canPlayAudio = true;
});
} else {
AudioEngine.createChannels();
}
},
createChannels() {
// create master
this.master = this.audioContext.createGain();
this.master.connect(this.audioContext.destination);
AudioEngine.master = AudioEngine.audioContext.createGain();
AudioEngine.master.connect(AudioEngine.audioContext.destination);
// create 4 tracks to output to master
this.tracks = [];
AudioEngine.tracks = [];
for (var i = 0; i < 4; i++) {
this.tracks[i] = this.audioContext.createGain();
this.tracks[i].connect(this.master);
AudioEngine.tracks[i] = AudioEngine.audioContext.createGain();
AudioEngine.tracks[i].connect(AudioEngine.master);
}
},
},
options: {}, // Nothing for now
_playSound: function(buffer) {
var source = this.audioContext.createBufferSource();
if (!AudioEngine.canPlayAudio) return;
var source = AudioEngine.audioContext.createBufferSource();
source.buffer = buffer;
source.connect(this.tracks[1]);
source.start(0);
source.connect(AudioEngine.tracks[1]);
source.start(AudioEngine.audioContext.currentTime);
},
_fadeTrack: function(buffer) {
var newTrack = this.audioContext.createBufferSource();
if (!AudioEngine.canPlayAudio) return;
var newTrack = AudioEngine.audioContext.createBufferSource();
newTrack.buffer = buffer;
newTrack.loop = true;
// figure out which background track to start on
// in order to do crossfade
var nextBackgroundChannel;
if (this.currentBackgroundChannel === 0) {
if (AudioEngine.currentBackgroundChannel === 0) {
nextBackgroundChannel = 1;
} else {
nextBackgroundChannel = 0;
}
// fade in new track
var fadeTime = this.audioContext.currentTime + 2.0;
newTrack.connect(this.tracks[nextBackgroundChannel]);
var fadeTime = AudioEngine.audioContext.currentTime + 2.0;
newTrack.connect(AudioEngine.tracks[nextBackgroundChannel]);
newTrack.start(0);
this.tracks[nextBackgroundChannel].gain.setValueAtTime(0.0, this.audioContext.currentTime);
this.tracks[nextBackgroundChannel].gain.linearRampToValueAtTime(1.0, fadeTime);
AudioEngine.tracks[nextBackgroundChannel].gain.setValueAtTime(0.0, AudioEngine.audioContext.currentTime);
AudioEngine.tracks[nextBackgroundChannel].gain.linearRampToValueAtTime(.1, fadeTime);
// fade out old track
this.tracks[this.currentBackgroundChannel].gain.linearRampToValueAtTime(0.0, fadeTime);
if (this.currentTrack) {
this.currentTrack.stop(fadeTime + 0.3); // make sure fade has completed
AudioEngine.tracks[AudioEngine.currentBackgroundChannel].gain.linearRampToValueAtTime(0.0, fadeTime);
if (AudioEngine.currentTrack) {
AudioEngine.currentTrack.stop(fadeTime + 0.3); // make sure fade has completed
}
// switch background track
this.currentBackgroundChannel = nextBackgroundChannel;
this.currentTrack = newTrack;
AudioEngine.currentBackgroundChannel = nextBackgroundChannel;
AudioEngine.currentTrack = newTrack;
},
changeMusic: function(src) {
var self = this;
this.loadAudioFile(src)
AudioEngine.loadAudioFile(src)
.then(function (buffer) {
self._fadeTrack(buffer);
AudioEngine._fadeTrack(buffer);
});
audioLog('change music: ' + src);
audioLog('audio engine status: ' + AudioEngine.audioContext.state);
},
playSound: function(src) {
var self = this;
this.loadAudioFile(src)
AudioEngine.loadAudioFile(src)
.then(function (buffer) {
self._playSound(buffer);
AudioEngine._playSound(buffer);
});
audioLog('play sound: ' + src);
audioLog('audio engine status: ' + AudioEngine.audioContext.state);
},
loadAudioFile(src) {
var self = this;
if (self.AUDIO_BUFFER_CACHE[src]) {
if (AudioEngine.AUDIO_BUFFER_CACHE[src]) {
return new Promise(function (resolve, reject) {
resolve(self.AUDIO_BUFFER_CACHE[src]);
resolve(AudioEngine.AUDIO_BUFFER_CACHE[src]);
});
} else {
var request = new Request(src);
return fetch(request).then(function(response) {
return response.arrayBuffer();
}).then(function(buffer) {
return self.audioContext.decodeAudioData(buffer, function(decodedData) {
self.AUDIO_BUFFER_CACHE[src] = decodedData;
return self.AUDIO_BUFFER_CACHE[src];
return AudioEngine.audioContext.decodeAudioData(buffer, function(decodedData) {
AudioEngine.AUDIO_BUFFER_CACHE[src] = decodedData;
return AudioEngine.AUDIO_BUFFER_CACHE[src];
});
});
}
}
};
function audioLog(message) {
console.log('%c' + message, 'background: #222; color: #bada55');
}