Votre application a peut-être besoin de savoir lorsque la lecture d’un son s’arrête afin de lancer la lecture d’un autre son ou d’effacer des ressources utilisées pendant la lecture précédente. La classe SoundChannel envoie un événement
Event.SOUND_COMPLETE
à la fin de la lecture du son. Votre application peut écouter cet événement et effectuer l’action appropriée, comme indiqué ci-dessous :
import flash.events.Event;
import flash.media.Sound;
import flash.net.URLRequest;
var snd:Sound = new Sound();
var req:URLRequest = new URLRequest("smallSound.mp3");
snd.load(req);
var channel:SoundChannel = snd.play();
channel.addEventListener(Event.SOUND_COMPLETE, onPlaybackComplete);
public function onPlaybackComplete(event:Event)
{
trace("The sound has finished playing.");
}
La classe SoundChannel n’envoie pas d’événements progress pendant la lecture. Pour fournir des informations relatives à la progression de la lecture, votre application peut définir son propre mécanisme de synchronisation et suivre la position de la tête de lecture du son.
Pour calculer le pourcentage d’un son lu, vous pouvez diviser la valeur de la propriété
SoundChannel.position
par la longueur des données audio en cours de lecture :
var playbackPercent:uint = 100 * (channel.position / snd.length);
Néanmoins, ce code signale uniquement des pourcentages de lecture précis si les données audio ont été totalement chargées avant le début de la lecture. La propriété
Sound.length
indique la taille des données audio actuellement chargées, et non pas la taille éventuelle du fichier audio entier. Pour suivre la progression de la lecture d’un son diffusé en continu qui est toujours en cours de chargement, votre application doit estimer la taille éventuelle du fichier audio entier et utiliser cette valeur dans ses calculs. Vous pouvez estimer la longueur éventuelle des données audio à l’aide des propriétés
bytesLoaded
et
bytesTotal
de l’objet Sound, comme suit :
var estimatedLength:int =
Math.ceil(snd.length / (snd.bytesLoaded / snd.bytesTotal));
var playbackPercent:uint = 100 * (channel.position / estimatedLength);
Le code suivant charge un fichier audio plus volumineux et utilise l’événement
Event.ENTER_FRAME
comme mécanisme de synchronisation pour afficher la progression de la lecture. Il fournit régulièrement des informations sur le pourcentage de lecture, qui est calculé de la façon suivante : la valeur de position actuelle divisée par la longueur totale des données audio :
import flash.events.Event;
import flash.media.Sound;
import flash.net.URLRequest;
var snd:Sound = new Sound();
var req:URLRequest = new
URLRequest("http://av.adobe.com/podcast/csbu_dev_podcast_epi_2.mp3");
snd.load(req);
var channel:SoundChannel;
channel = snd.play();
addEventListener(Event.ENTER_FRAME, onEnterFrame);
channel.addEventListener(Event.SOUND_COMPLETE, onPlaybackComplete);
function onEnterFrame(event:Event):void
{
var estimatedLength:int =
Math.ceil(snd.length / (snd.bytesLoaded / snd.bytesTotal));
var playbackPercent:uint =
Math.round(100 * (channel.position / estimatedLength));
trace("Sound playback is " + playbackPercent + "% complete.");
}
function onPlaybackComplete(event:Event)
{
trace("The sound has finished playing.");
removeEventListener(Event.ENTER_FRAME, onEnterFrame);
}
Une fois que le chargement des données audio commence, ce code appelle la méthode
snd.play()
et stocke l’objet SoundChannel résultant dans la variable
channel
. Il ajoute ensuite un écouteur d’événement à l’application principale pour l’événement
Event.ENTER_FRAME
et un autre écouteur d’événement à l’objet SoundChannel pour l’événement
Event.SOUND_COMPLETE
qui a lieu à la fin de la lecture.
Chaque fois que l’application atteint une nouvelle image dans son animation, la méthode
onEnterFrame()
est appelée. La méthode
onEnterFrame()
estime la longueur totale du fichier audio en fonction de la quantité de données déjà chargées puis calcule et affiche le pourcentage de lecture actuel.
Une fois que tout le son a été lu, la méthode
onPlaybackComplete()
s’exécute, supprimant l’écouteur d’événement pour l’événement
Event.ENTER_FRAME
de façon à ce qu’il ne tente pas d’afficher les mises à jour de progression après la lecture.
L’événement
Event.ENTER_FRAME
peut être envoyé plusieurs fois par seconde. Dans certains cas, vous pouvez ne pas afficher la progression de la lecture aussi fréquemment. Votre application peut alors définir son propre mécanisme de synchronisation à l’aide de la classe flash.util.Timer ; voir
Utilisation des dates et des heures
.