(function(){
(function(){
The audio module is in charge of loading and playing sounds in Luv.
It is a wrapper around the audio
tag, so it is relatively cross-browser.
The audio
module is attached to the game object that you receive when
you invoke the Luv
function, and you usually don't need more than one,
so you will most likely not be instantiating this class directly. Instead,
you will be instantiating Luv
and using the audio
attribute of the returned
object:
var luv = Luv();
luv.audio.isAvailable(); // luv.audio already contains the instance you need
The function that you will use the most of this module is Sound
:
var luv = Luv();
var cry = luv.audio.Sound('sfx/cry.ogg', 'sfx/cry.mp3');
Love.audio will not fail if the browser using it is not capable of playing sounds; it will
just not play sounds at all. However, audio.Sound
will fail if the game tries to
load a Sound that is not available. In the example above:
audio
support.sfx/cry.ogg
is loaded correctly.sfx/cry.mp3
could not be found.Luv.Audio = Luv.Class('Luv.Audio', {
init: function(media) {
this.media = media;
},
isAvailable
returns whether the browser is capable of reproducing sounds.
You don't have to test for this explicitly. If a browser is totally incapable of using the
audio tag, sounds will not load and the system will not try to emit any sound when
Sound.play()
gets called.
isAvailable: function() { return Luv.Audio.isAvailable(); },
Returns an array of the supported audio types that the current browser allows.
['ogg', 'mp3', 'wav', 'm4a', 'aac']
['ogg', 'mp3', 'wav', 'm4a', 'aac']
['mp3', 'wav', 'm4a', 'aac']
getSupportedTypes: function() {
return Luv.Audio.getSupportedTypes();
},
canPlayType
expects a file extension (i.e. "mp3"
), and returns whether the current
browser is capable of playing files with that extension.
canPlayType: function(type) {
return this.supportedTypes[type.toLowerCase()];
},
Sound
creates sounds. Once loaded, sounds can be played, if the browser supports them.
var luv = Luv();
var cry = luv.audio.Sound('sfx/cry.ogg', 'sfx/cry.mp3');
See audio/sound.js for more information.
Sound: function() {
if(this.isAvailable()) {
var args = [this.media].concat(Array.prototype.slice.call(arguments, 0));
return Luv.Audio.Sound.apply(Luv.Audio.Sound, args);
} else {
return Luv.Audio.NullSound();
}
}
});
The following three are class methods; they return the same as the instance methods described above.
Luv.Audio.isAvailable = function() {
return audioAvailable;
};
Luv.Audio.canPlayType = function(type) {
return !!supportedTypes[type.toLowerCase()];
};
Luv.Audio.getSupportedTypes = function() {
return Object.keys(supportedTypes);
};
These internal variables dealing with audio support detection
var el = document.createElement('audio'),
supportedTypes = {},
audioAvailable = !!el.canPlayType;
if(audioAvailable) {
supportedTypes.ogg = !!el.canPlayType('audio/ogg; codecs="vorbis"');
supportedTypes.mp3 = !!el.canPlayType('audio/mpeg;');
supportedTypes.wav = !!el.canPlayType('audio/wav; codecs="1"');
supportedTypes.m4a = !!el.canPlayType('audio/x-m4a;');
supportedTypes.aac = !!el.canPlayType('audio/aac;');
}
})();