UNPKG

seed-engine

Version:

A Lightweight 2D game engine using WebGL2. The engine is designed on the focus of creating a bridge between creating and publishing games to the Seed Network as modules.

99 lines (81 loc) 2.81 kB
import Manager from './Manager'; export class _AudioManager extends Manager { constructor() { super(); this.masterVolume = 1; this.audioCtx = null; this.sounds = {}; } setMasterVolume(volume) { this.masterVolume = Math.max(0, Math.min(1, volume)); } addSound(soundName, soundAssetPath) { return this._createSoundBufferFromAsset(soundAssetPath).then((soundInfo) => { this.sounds[soundName] = soundInfo; return this.sounds[soundName]; }); } _createSoundBufferFromAsset(assetPath) { let soundInfo = { buffer: null, }; return new Promise((res, rej) => { let request = new XMLHttpRequest(); request.open('GET', assetPath, true); request.responseType = 'arraybuffer'; request.addEventListener('load', () => { this.audioCtx.decodeAudioData(request.response, (buffer) => { soundInfo.buffer = buffer; return res(soundInfo); }, (err) => { console.error(err); }); }); request.send(); }); } playSound(soundName, volume = 1) { // Find the sound to play. let sound = this.sounds[soundName]; if (sound == null) return false; if (!this.audioCtx.createGain) // For older browser support this.audioCtx.createGain = this.audioCtx.createGainNode; // Create the gain preference and set the volume let gainNode = this.audioCtx.createGain(); gainNode.gain.value = volume * this.masterVolume; // Set the audio buffer source. let source = this.audioCtx.createBufferSource(); source.buffer = sound.buffer; // Connect gain node to buffer. source.connect(gainNode); // Set default audio output. gainNode.connect(this.audioCtx.destination); if (!source.start) // For older browser support source.start = source.noteOn; // Start the buffer playback. source.start(0); } start() { try { // Fix up for prefixing window.AudioContext = window.AudioContext||window.webkitAudioContext; this.audioCtx = new AudioContext(); } catch(e) { console.info('Web Audio API is not supported in this browser'); } } removeSound(soundName) { delete this.sounds[soundName]; } end() { let soundNames = {}; //remove all loaded sounds } } /** * Singleton reference to the Audio Manager. */ const AudioManager = new _AudioManager(); export default AudioManager;