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