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.
PackageHelper/www/assets/js/audio.js

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();