phaser
Version:
A fast, free and fun HTML5 Game Framework for Desktop and Mobile web browsers.
148 lines (116 loc) • 3.63 kB
JavaScript
/**
* @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 File = require('../File');
var GetFastValue = require('../../utils/object/GetFastValue');
var GetURL = require('../GetURL');
/**
* @classdesc
* [description]
*
* @class HTML5AudioFile
* @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} [config] - [description]
*/
var HTML5AudioFile = new Class({
Extends: File,
initialize:
function HTML5AudioFile (key, url, path, config)
{
this.locked = 'ontouchstart' in window;
this.loaded = false;
var fileConfig = {
type: 'audio',
extension: GetFastValue(url, 'type', ''),
key: key,
url: GetFastValue(url, 'uri', url),
path: path,
config: config
};
File.call(this, fileConfig);
},
onLoad: function ()
{
if(this.loaded)
{
return;
}
this.loaded = true;
this.loader.nextFile(this, true);
},
onError: function ()
{
for (var i = 0; i < this.data.length; i++)
{
var audio = this.data[i];
audio.oncanplaythrough = null;
audio.onerror = null;
}
this.loader.nextFile(this, false);
},
onProgress: function (event)
{
var audio = event.target;
audio.oncanplaythrough = null;
audio.onerror = null;
this.filesLoaded++;
this.percentComplete = Math.min((this.filesLoaded / this.filesTotal), 1);
this.loader.emit('fileprogress', this, this.percentComplete);
if(this.filesLoaded === this.filesTotal)
{
this.onLoad();
}
},
// Called by the Loader, starts the actual file downloading
load: function (loader)
{
this.loader = loader;
this.data = [];
var instances = (this.config && this.config.instances) || 1;
this.filesTotal = instances;
this.filesLoaded = 0;
this.percentComplete = 0;
for(var i = 0; i < instances; i++)
{
var audio = new Audio();
audio.dataset.name = this.key + ('0' + i).slice(-2); // Useful for debugging
audio.dataset.used = 'false';
if (this.locked)
{
audio.dataset.locked = 'true';
}
else
{
audio.dataset.locked = 'false';
audio.preload = 'auto';
audio.oncanplaythrough = this.onProgress.bind(this);
audio.onerror = this.onError.bind(this);
}
this.data.push(audio);
}
for (i = 0; i < this.data.length; i++)
{
audio = this.data[i];
audio.src = GetURL(this, loader.baseURL);
if (!this.locked)
{
audio.load();
}
}
if (this.locked)
{
setTimeout(this.onLoad.bind(this));
}
}
});
module.exports = HTML5AudioFile;