AudioElementSound class
class AudioElementSound extends Sound {
 AudioElement _audio;
 List<AudioElement> _audioPool;
 List<AudioElementSoundChannel> _soundChannels;
 AudioElementSound() {
   _soundChannels = new List<AudioElementSoundChannel>();
   _audio = new AudioElement();
   _audio.onEnded.listen(_onAudioEnded);
   _audioPool = new List<AudioElement>();
   _audioPool.add(_audio);
   html.document.body.children.add(_audio);
 }
 //-------------------------------------------------------------------------------------------------
 //-------------------------------------------------------------------------------------------------
 static Future<Sound> load(String url, [SoundLoadOptions soundLoadOptions = null]) {
   if (soundLoadOptions == null) soundLoadOptions = Sound.defaultLoadOptions;
   var sound = new AudioElementSound();
   var audio = sound._audio;
   var audioUrls = SoundMixer._getOptimalAudioUrls(url, soundLoadOptions);
   var loadCompleter = new Completer<Sound>();
   if (audioUrls.length == 0) {
     return MockSound.load(url, soundLoadOptions);
   }
   StreamSubscription onCanPlayThroughSubscription;
   StreamSubscription onErrorSubscription;
   onCanPlayThrough(event) {
     onCanPlayThroughSubscription.cancel();
     onErrorSubscription.cancel();
     loadCompleter.complete(sound);
   };
   onError(event) {
     if (audioUrls.length > 0) {
       audio.src = audioUrls.removeAt(0);
       audio.load();
     } else {
       onCanPlayThroughSubscription.cancel();
       onErrorSubscription.cancel();
       if (soundLoadOptions.ignoreErrors) {
         MockSound.load(url, soundLoadOptions).then((s) => loadCompleter.complete(s));
       } else {
         loadCompleter.completeError(new StateError("Failed to load audio."));
       }
     }
   };
   onCanPlayThroughSubscription = audio.onCanPlayThrough.listen(onCanPlayThrough);
   onErrorSubscription = audio.onError.listen(onError);
   audio.src = audioUrls.removeAt(0);
   audio.load();
   return loadCompleter.future;
 }
 //-------------------------------------------------------------------------------------------------
 //-------------------------------------------------------------------------------------------------
 num get length => _audio.duration;
 SoundChannel play([bool loop = false, SoundTransform soundTransform]) {
   if (soundTransform == null) soundTransform = new SoundTransform();
   return new AudioElementSoundChannel(this, loop, soundTransform);
 }
 //-------------------------------------------------------------------------------------------------
 //-------------------------------------------------------------------------------------------------
 AudioElement _getAudioElement(AudioElementSoundChannel soundChannel) {
   AudioElement audio;
   if (_audioPool.length == 0) {
     audio = _audio.clone(true);
     audio.onEnded.listen(_onAudioEnded);
   } else {
     audio = _audioPool.removeAt(0);
   }
   SoundMixer._audioElementMixer._addSoundChannel(soundChannel);
   _soundChannels.add(soundChannel);
   return audio;
 }
 void _releaseAudioElement(AudioElementSoundChannel soundChannel) {
   SoundMixer._audioElementMixer._removeSoundChannel(soundChannel);
   _soundChannels.remove(soundChannel);
   AudioElement audio = soundChannel._audio;
   _audioPool.add(audio);
   if (audio.currentTime > 0 && audio.ended == false) {
     audio.currentTime = 0;
   }
 }
 void _onAudioEnded(html.Event event) {
   var audio = event.target;
   for(var i = 0; i < _soundChannels.length; i++) {
     if (identical(_soundChannels[i]._audio, audio)) {
       _soundChannels[i].stop();
       break;
     }
   }
 }
}
Extends
Sound > AudioElementSound
Static Methods
Future<Sound> load(String url, [SoundLoadOptions soundLoadOptions = null]) #
static Future<Sound> load(String url, [SoundLoadOptions soundLoadOptions = null]) {
 if (soundLoadOptions == null) soundLoadOptions = Sound.defaultLoadOptions;
 var sound = new AudioElementSound();
 var audio = sound._audio;
 var audioUrls = SoundMixer._getOptimalAudioUrls(url, soundLoadOptions);
 var loadCompleter = new Completer<Sound>();
 if (audioUrls.length == 0) {
   return MockSound.load(url, soundLoadOptions);
 }
 StreamSubscription onCanPlayThroughSubscription;
 StreamSubscription onErrorSubscription;
 onCanPlayThrough(event) {
   onCanPlayThroughSubscription.cancel();
   onErrorSubscription.cancel();
   loadCompleter.complete(sound);
 };
 onError(event) {
   if (audioUrls.length > 0) {
     audio.src = audioUrls.removeAt(0);
     audio.load();
   } else {
     onCanPlayThroughSubscription.cancel();
     onErrorSubscription.cancel();
     if (soundLoadOptions.ignoreErrors) {
       MockSound.load(url, soundLoadOptions).then((s) => loadCompleter.complete(s));
     } else {
       loadCompleter.completeError(new StateError("Failed to load audio."));
     }
   }
 };
 onCanPlayThroughSubscription = audio.onCanPlayThrough.listen(onCanPlayThrough);
 onErrorSubscription = audio.onError.listen(onError);
 audio.src = audioUrls.removeAt(0);
 audio.load();
 return loadCompleter.future;
}
Constructors
new AudioElementSound() #
Creates a new Object instance.
Object instances have no meaningful state, and are only useful through their identity. An Object instance is equal to itself only.
docs inherited from Object 
AudioElementSound() {
 _soundChannels = new List<AudioElementSoundChannel>();
 _audio = new AudioElement();
 _audio.onEnded.listen(_onAudioEnded);
 _audioPool = new List<AudioElement>();
 _audioPool.add(_audio);
 html.document.body.children.add(_audio);
}
Methods
SoundChannel play([bool loop = false, SoundTransform soundTransform]) #
SoundChannel play([bool loop = false, SoundTransform soundTransform]) {
 if (soundTransform == null) soundTransform = new SoundTransform();
 return new AudioElementSoundChannel(this, loop, soundTransform);
}