Source: audio.js

const PhSim = require(".");

/**
 * @namespace
 * @memberof PhSim
 */

var Audio = {}

/**
 * @constructor
 * @param {Object} p_audio - Static Audio Object
 * @param {Function} onload 
 */

Audio.AudioArray = function(p_audio,onload) {

	// force load function if audio list is empty
	
	this.array = [];
	this.loaded_n = 0;
	this.loaded = false;
	this.onload = onload;

	var self = this;

	
	if(p_audio.length === 0) {
		self.loaded = true;
		self.onload();
	}

	for(var i = 0; i < p_audio.length; i++) {

		var audio = document.createElement("audio");

		var f = function() {
			self.loaded_n++;

			if(self.array.length === self.loaded_n) {
				self.loaded = true;
				self.onload();
				audio.removeEventListener("canplaythrough",f);
			}

		}

		audio.addEventListener("canplaythrough",f)

		audio.src = p_audio[i].src;
		audio.loop = p_audio[i].loop

		this.array.push(audio);

	}

}

/**
 * Play audio by index.
 * Alternative function: {@link PhSim#playAudioByIndex}
 * 
 * @function 
 * @param {PhSim} phsim - PhSim instance.
 * @param {Number} i - Index in audio array.
 * @returns {Promise} - Promise that is fulfilled when the audio is played. 
 */

Audio.playAudioByIndex = function(phsim,i) {
	return phsim.audioArray.array[i].play();
}

/**
 * Play audio by index
 * Alternative function: {@link PhSim.Audio#playAudioByIndex}
 * 
 * @function 
 * @param {PhSim} phsim - PhSim instance.
 * @param {Number} i - Index in audio array.
 * @returns {Promise} - Promise that is fulfilled when the audio is played.  
 */

PhSim.prototype.playAudioByIndex = function(i) {
	Audio.playAudioByIndex(this,i);
};

/**
 * Pause audio by index.
 * Alternative function: {@link PhSim#pauseAudioByIndex}
 * @function
 * @param {PhSim} phsim - PhSim instance.
 * @param {Number} i 
 */

Audio.pauseAudioByIndex = function(phsim,i) {
	return phsim.audioArray.array[i].pause();
}

/**
 * Pause audio by index.
 * Alternative function: {@link PhSim.Audio#pauseAudioByIndex}
 * @function
 * @param {Number} i 
 */

PhSim.prototype.pauseAudioByIndex = function(i) {
	return Audio.pauseAudioByIndex(this,i);
}

/**
 * Set volume by index
 * Alternative function: {@link PhSim#setAudioVolByIndex}
 * @function
 * @param {PhSim} phsim - PhSim instance
 * @param {Number} i - Index
 * @param {Number} v - Volume
 */

Audio.setAudioVolByIndex = function(phsim,i,v) {
	return phsim.audioArray.array[i].volume = v;
}

/**
 * Set volume by index
 * Alternative function: {@link PhSim.Audio#setAudioVolByIndex}
 * @function
 * @param {Number} i - Index
 * @param {Number} v - Volume
 */

PhSim.prototype.setAudioVolByIndex = function(i,v) {
	return Audio.setAudioVolByIndex(this,i,v);
}


/**
 * 
 * Mute the `i`th element of the audio array.
 * 
 * Alternative function: {@link PhSim#setAudioMuteByIndex}
 * 
 * @function
 * @param {Number} i
 * @param {PhSim} phsim - PhSim instance 
 */

Audio.setAudioMuteByIndex = function(phsim,i) {
	return phsim.audioArray.array[i].muted = true;
}

/**
 * 
 * Mute the `i`th element of the audio array.
 * 
 * Alternative function: {@link PhSim.Audio#setAudioMuteByIndex}
 * 
 * @function
 * @param {PhSim} phsim - PhSim instance 
 */

PhSim.prototype.setAudioMuteByIndex = function(i) {
	return Audio.setAudioMuteByIndex(this,i);
}

/**
 * @function
 * @param {PhSIm} phsim - PhSim instance
 * @param {Number} i - Index number
 * @returns {Boolean} - True if paused, false otherwise.
 */


Audio.toggleAudioByIndex = function(phsim,i) {
	return phsim.audioArray.array[i].muted = !phsim.audioArray.array[i].muted;
}

/**
 * @function
 * @param {Number} i
 * @returns {Boolean} - True if paused, false otherwise.
 */

PhSim.prototype.toggleAudioByIndex = function(i) {
	return Audio.toggleAudioByIndex(this,i);
}

module.exports = Audio;