UNPKG

playcanvas

Version:

PlayCanvas WebGL game engine

123 lines (120 loc) 3.14 kB
import { path } from '../../core/path.js'; import { Http, http } from '../../platform/net/http.js'; import { hasAudioContext } from '../../platform/audio/capabilities.js'; import { Sound } from '../../platform/sound/sound.js'; import { ResourceHandler } from './handler.js'; var ie = function() { if (typeof window === 'undefined') { return false; } var ua = window.navigator.userAgent; var msie = ua.indexOf('MSIE '); if (msie > 0) { return parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10); } var trident = ua.indexOf('Trident/'); if (trident > 0) { var rv = ua.indexOf('rv:'); return parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10); } return false; }(); var supportedExtensions = [ '.ogg', '.mp3', '.wav', '.mp4a', '.m4a', '.mp4', '.aac', '.opus' ]; class AudioHandler extends ResourceHandler { _isSupported(url) { var ext = path.getExtension(url); return supportedExtensions.indexOf(ext) > -1; } load(url, callback) { if (typeof url === 'string') { url = { load: url, original: url }; } var success = function success(resource) { callback(null, new Sound(resource)); }; var error = function error(err) { var msg = "Error loading audio url: " + url.original; if (err) { msg += ": " + (err.message || err); } console.warn(msg); callback(msg); }; if (this._createSound) { if (!this._isSupported(url.original)) { error("Audio format for " + url.original + " not supported"); return; } this._createSound(url.load, success, error); } else { error(null); } } _createSound(url, success, error) { if (hasAudioContext()) { var manager = this.manager; if (!manager.context) { error('Audio manager has no audio context'); return; } var options = { retry: this.maxRetries > 0, maxRetries: this.maxRetries }; if (url.startsWith('blob:') || url.startsWith('data:')) { options.responseType = Http.ResponseType.ARRAY_BUFFER; } http.get(url, options, (err, response)=>{ if (err) { error(err); return; } manager.context.decodeAudioData(response, success, error); }); } else { var audio = null; try { audio = new Audio(); } catch (e) { error('No support for Audio element'); return; } if (ie) { document.body.appendChild(audio); } var onReady = function onReady1() { audio.removeEventListener('canplaythrough', onReady); if (ie) { document.body.removeChild(audio); } success(audio); }; audio.onerror = function() { audio.onerror = null; if (ie) { document.body.removeChild(audio); } error(); }; audio.addEventListener('canplaythrough', onReady); audio.src = url; } } constructor(app){ super(app, 'audio'); this.manager = app.soundManager; } } export { AudioHandler };