UNPKG

phaser

Version:

A fast, free and fun HTML5 Game Framework for Desktop and Mobile web browsers.

237 lines (203 loc) 6.25 kB
/** * @author Richard Davey <rich@photonstorm.com> * @copyright 2018 Photon Storm Ltd. * @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License} */ var Class = require('../../utils/Class'); var CONST = require('../../const'); var File = require('../File'); var FileTypesManager = require('../FileTypesManager'); var GetFastValue = require('../../utils/object/GetFastValue'); var HTML5AudioFile = require('./HTML5AudioFile'); /** * @classdesc * [description] * * @class AudioFile * @extends Phaser.Loader.File * @memberOf Phaser.Loader.FileTypes * @constructor * @since 3.0.0 * * @param {string} key - [description] * @param {string} url - [description] * @param {string} path - [description] * @param {XHRSettingsObject} [xhrSettings] - [description] * @param {AudioContext} [audioContext] - [description] */ var AudioFile = new Class({ Extends: File, initialize: function AudioFile (key, url, path, xhrSettings, audioContext) { /** * [description] * * @name Phaser.Loader.FileTypes.AudioFile#context * @type {AudioContext} * @since 3.0.0 */ this.context = audioContext; var fileConfig = { type: 'audio', extension: GetFastValue(url, 'type', ''), responseType: 'arraybuffer', key: key, url: GetFastValue(url, 'uri', url), path: path, xhrSettings: xhrSettings }; File.call(this, fileConfig); }, /** * [description] * * @method Phaser.Loader.FileTypes.AudioFile#onProcess * @since 3.0.0 * * @param {FileProcessCallback} callback - [description] */ onProcess: function (callback) { this.state = CONST.FILE_PROCESSING; var _this = this; // interesting read https://github.com/WebAudio/web-audio-api/issues/1305 this.context.decodeAudioData(this.xhrLoader.response, function (audioBuffer) { _this.data = audioBuffer; _this.onComplete(); callback(_this); }, function (e) { // eslint-disable-next-line no-console console.error('Error with decoding audio data for \'' + this.key + '\':', e.message); _this.state = CONST.FILE_ERRORED; callback(_this); } ); this.context = null; } }); AudioFile.create = function (loader, key, urls, config, xhrSettings) { var game = loader.systems.game; var audioConfig = game.config.audio; var deviceAudio = game.device.audio; if ((audioConfig && audioConfig.noAudio) || (!deviceAudio.webAudio && !deviceAudio.audioData)) { // console.info('Skipping loading audio \'' + key + '\' since sounds are disabled.'); return null; } var url = AudioFile.findAudioURL(game, urls); if (!url) { // console.warn('No supported url provided for audio \'' + key + '\'!'); return null; } if (deviceAudio.webAudio && !(audioConfig && audioConfig.disableWebAudio)) { return new AudioFile(key, url, loader.path, xhrSettings, game.sound.context); } else { return new HTML5AudioFile(key, url, loader.path, config); } }; /** * Adds an Audio file to the current load queue. * * Note: This method will only be available if the Audio File type has been built into Phaser. * * The file is **not** loaded immediately after calling this method. * Instead, the file is added to a queue within the Loader, which is processed automatically when the Loader starts. * * @method Phaser.Loader.LoaderPlugin#audio * @since 3.0.0 * * @param {string} key - [description] * @param {(string|string[])} urls - [description] * @param {object} config - [description] * @param {object} [xhrSettings] - [description] * * @return {Phaser.Loader.LoaderPlugin} The Loader. */ FileTypesManager.register('audio', function (key, urls, config, xhrSettings) { var audioFile = AudioFile.create(this, key, urls, config, xhrSettings); if (audioFile) { this.addFile(audioFile); } return this; }); // this.load.audio('sound', 'assets/audio/booom.ogg', config, xhrSettings); // // this.load.audio('sound', // [ // 'assets/audio/booom.ogg', // 'assets/audio/booom.m4a', // 'assets/audio/booom.mp3' // ], // config, xhrSettings); // // this.load.audio('sound', // { // uri: 'assets/audio/boooooom', // type: 'ogg' // }, // config, xhrSettings); // // this.load.audio('sound', // [ // { // uri: 'assets/audio/booooooo', // type: 'ogg' // }, // { // uri: 'assets/audio/boooooom', // type: 'mp3' // } // ], // config, xhrSettings); // // this.load.audio('sound', // [ // { // uri: 'assets/audio/booooooo', // type: 'ogg' // }, // 'assets/audio/booom.m4a', // { // uri: 'assets/audio/boooooom', // type: 'mp3' // } // ], // config, xhrSettings); AudioFile.findAudioURL = function (game, urls) { if (urls.constructor !== Array) { urls = [ urls ]; } for (var i = 0; i < urls.length; i++) { var url = GetFastValue(urls[i], 'uri', urls[i]); if (url.indexOf('blob:') === 0 || url.indexOf('data:') === 0) { return url; } var audioType = url.match(/\.([a-zA-Z0-9]+)($|\?)/); audioType = GetFastValue(urls[i], 'type', (audioType) ? audioType[1] : '').toLowerCase(); if (game.device.audio[audioType]) { return { uri: url, type: audioType }; } } return null; }; module.exports = AudioFile;