You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
119 lines
3.7 KiB
JavaScript
119 lines
3.7 KiB
JavaScript
/*
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
*/
|
|
|
|
var sfx = {};
|
|
var sfxBuffers = {};
|
|
const AudioContext = window.AudioContext || window.webkitAudioContext;
|
|
var audioContext;
|
|
var sfxVolume = {
|
|
"alert": 100.0,
|
|
"ok": 100.0,
|
|
"error": 100.0,
|
|
"scan": 100.0
|
|
};
|
|
|
|
function initSFX() {
|
|
audioContext = new AudioContext();
|
|
if (getStorage("alertsound") == null) {
|
|
setStorage("alertsound", "sonar");
|
|
}
|
|
if (getStorage("alertvolume") == null) {
|
|
setStorage("alertvolume", 100);
|
|
}
|
|
|
|
var alertVolume = getStorage("alertvolume");
|
|
var noalertsound = false;
|
|
var alertNoiseFile = "";
|
|
if (getStorage("alertsound") == "NONE") {
|
|
noalertsound = true;
|
|
} else {
|
|
alertNoiseFile = SETTINGS.alertsounds[getStorage("alertsound")].file;
|
|
}
|
|
|
|
sfx = {
|
|
"alert": noalertsound ? false : new Audio("assets/audio/" + alertNoiseFile),
|
|
"ok": new Audio("assets/audio/ok.mp3"),
|
|
"error": new Audio("assets/audio/error.mp3"),
|
|
"scan": new Audio("assets/audio/scan.mp3")
|
|
};
|
|
if (noalertsound == false) {
|
|
window.fetch("assets/audio/" + alertNoiseFile)
|
|
.then(response => response.arrayBuffer())
|
|
.then(arrayBuffer => audioContext.decodeAudioData(arrayBuffer,
|
|
audioBuffer => {
|
|
sfxBuffers.alert = audioBuffer;
|
|
},
|
|
error =>
|
|
console.error(error)
|
|
));
|
|
} else {
|
|
sfxBuffers.alert = false;
|
|
}
|
|
window.fetch("assets/audio/ok.mp3")
|
|
.then(response => response.arrayBuffer())
|
|
.then(arrayBuffer => audioContext.decodeAudioData(arrayBuffer,
|
|
audioBuffer => {
|
|
sfxBuffers.ok = audioBuffer;
|
|
},
|
|
error =>
|
|
console.error(error)
|
|
));
|
|
window.fetch("assets/audio/error.mp3")
|
|
.then(response => response.arrayBuffer())
|
|
.then(arrayBuffer => audioContext.decodeAudioData(arrayBuffer,
|
|
audioBuffer => {
|
|
sfxBuffers.error = audioBuffer;
|
|
},
|
|
error =>
|
|
console.error(error)
|
|
));
|
|
window.fetch("assets/audio/scan.mp3")
|
|
.then(response => response.arrayBuffer())
|
|
.then(arrayBuffer => audioContext.decodeAudioData(arrayBuffer,
|
|
audioBuffer => {
|
|
sfxBuffers.scan = audioBuffer;
|
|
},
|
|
error =>
|
|
console.error(error)
|
|
));
|
|
|
|
setVolume("alert", alertVolume);
|
|
}
|
|
|
|
/**
|
|
* Play a sound.
|
|
* @param string sound Name of the sound to play (alert, ok, error)
|
|
* @returns {undefined}
|
|
*/
|
|
function playSound(sound) {
|
|
if (sfxBuffers[sound] == false) {
|
|
return;
|
|
}
|
|
if (sfxVolume[sound] == 0) {
|
|
return;
|
|
}
|
|
const source = audioContext.createBufferSource();
|
|
source.buffer = sfxBuffers[sound];
|
|
const gainNode = audioContext.createGain();
|
|
gainNode.gain.value = sfxVolume[sound] / 100.0;
|
|
source.connect(gainNode).connect(audioContext.destination);
|
|
source.start();
|
|
}
|
|
|
|
/**
|
|
* Set sound volume
|
|
* @param string sound The name of the sound to set volume of
|
|
* @param number volume Number in range 0 to 100
|
|
*/
|
|
function setVolume(sound, volume) {
|
|
if (sfx[sound] == false) {
|
|
return;
|
|
}
|
|
//sfx[sound].volume = volume / 100.0;
|
|
sfxVolume[sound] = volume;
|
|
}
|
|
|
|
initSFX(); |