1 /**
  2  * Hilo
  3  * Copyright 2015 alibaba.com
  4  * Licensed under the MIT License
  5  */
  6 
  7 /**
  8  * <iframe src='../../../examples/WebSound.html?noHeader' width = '320' height = '310' scrolling='no'></iframe>
  9  * <br/>
 10  * demo:
 11  * <pre>
 12  * var audio = WebSound.getAudio({
 13  *     src: 'test.mp3',
 14  *     loop: false,
 15  *     volume: 1
 16  * }).on('load', function(e){
 17  *     console.log('load');
 18  * }).on('end', function(e){
 19  *     console.log('end');
 20  * }).play();
 21  * </pre>
 22  * @class Audio playing manager.
 23  * @static
 24  * @module hilo/media/WebSound
 25  * @requires hilo/media/HTMLAudio
 26  * @requires hilo/media/WebAudio
 27  * @requires hilo/util/util
 28  */
 29 var WebSound = {
 30     _audios: {},
 31 
 32     /**
 33      * Activate audio function. Note: Require user action events to activate. Currently support WebAudio.
 34      */
 35     enableAudio: function(){
 36         if(WebAudio.isSupported){
 37             WebAudio.enable();
 38         }
 39     },
 40 
 41     /**
 42      * Get audio element. Default use WebAudio if supported.
 43      * @param {String|Object} source If String, it's the source of the audio; If Object, it should contains a src property.
 44      * @param {Boolean} [preferWebAudio=true] Whether or not to use WebAudio first, default is true.
 45      * @returns {WebAudio|HTMLAudio} Audio playing instance.
 46      */
 47     getAudio: function(source, preferWebAudio){
 48         if(preferWebAudio === undefined){
 49             preferWebAudio = true;
 50         }
 51 
 52         source = this._normalizeSource(source);
 53         var audio = this._audios[source.src];
 54         if(!audio){
 55             if(preferWebAudio && WebAudio.isSupported){
 56                 audio = new WebAudio(source);
 57             }else if(HTMLAudio.isSupported){
 58                 audio = new HTMLAudio(source);
 59             }
 60             this._audios[source.src] = audio;
 61         }
 62 
 63         return audio;
 64     },
 65 
 66     /**
 67      * Remove audio element.
 68      * @param {String|Object} source If String, it's the source of the audio; If Object, it should contains a src property.
 69      */
 70     removeAudio: function(source){
 71         var src = typeof source === 'string' ? source : source.src;
 72         var audio = this._audios[src];
 73         if(audio){
 74             audio.stop();
 75             audio.off();
 76             this._audios[src] = null;
 77             delete this._audios[src];
 78         }
 79     },
 80 
 81     /**
 82      * @private
 83      */
 84     _normalizeSource: function(source){
 85         var result = {};
 86         if(typeof source === 'string') result = {src:source};
 87         else util.copy(result, source);
 88         return result;
 89     }
 90 
 91 };