L’architecture audio ActionScript 3.0 est puissante mais complexe. Les applications nécessitant des fonctions de lecture et de chargement de son de base uniquement peuvent utiliser une classe masquant une partie de la complexité en fournissant un ensemble d’appels et d’événements plus simple. Dans l’univers des modèles de conception de logiciel, une telle classe est appelée
façade
.
La classe SoundFacade présente une seule interface permettant d’effectuer les tâches suivantes :
-
Chargement de fichiers audio à l’aide d’un objet Sound, d’un objet SoundLoaderContext et d’une classe SoundMixer
-
Lecture de fichiers audio à l’aide des objets Sound et SoundChannel
-
Envoi d’événements de progression de la lecture
-
Interruption et reprise de la lecture du son à l’aide des objets Sound et SoundChannel
La classe SoundFacade essaie d’offrir le meilleur de la fonctionnalité des classes de son ActionScript avec moins de complexité.
Le code suivant indique la déclaration de classe, les propriétés de classe et la méthode constructeur
SoundFacade()
:
public class SoundFacade extends EventDispatcher
{
public var s:Sound;
public var sc:SoundChannel;
public var url:String;
public var bufferTime:int = 1000;
public var isLoaded:Boolean = false;
public var isReadyToPlay:Boolean = false;
public var isPlaying:Boolean = false;
public var isStreaming:Boolean = true;
public var autoLoad:Boolean = true;
public var autoPlay:Boolean = true;
public var pausePosition:int = 0;
public static const PLAY_PROGRESS:String = "playProgress";
public var progressInterval:int = 1000;
public var playTimer:Timer;
public function SoundFacade(soundUrl:String, autoLoad:Boolean = true,
autoPlay:Boolean = true, streaming:Boolean = true,
bufferTime:int = -1):void
{
this.url = soundUrl;
// Sets Boolean values that determine the behavior of this object
this.autoLoad = autoLoad;
this.autoPlay = autoPlay;
this.isStreaming = streaming;
// Defaults to the global bufferTime value
if (bufferTime < 0)
{
bufferTime = SoundMixer.bufferTime;
}
// Keeps buffer time reasonable, between 0 and 30 seconds
this.bufferTime = Math.min(Math.max(0, bufferTime), 30000);
if (autoLoad)
{
load();
}
}
La classe SoundFacade étend la classe EventDispatcher pour qu’elle puisse envoyer ses propres événements. Le code de classe déclare d’abord les propriétés pour un objet Sound et un objet SoundChannel. La classe stocke également la valeur de l’URL du fichier audio et une propriété
bufferTime
à utiliser lors de la lecture du son en continu. De plus, elle accepte des valeurs de paramètre booléennes qui affectent le comportement de lecture et de chargement :
-
Le paramètre
autoLoad
indique à l’objet que le chargement du son doit commencer dès la création de cet objet.
-
Le paramètre
autoPlay
indique que la lecture du son doit commencer dès qu’une quantité suffisante de données audio a été chargée. S’il s’agit d’un son diffusé en continu, la lecture commence dès qu’une quantité suffisante de données (comme spécifié par la propriété
bufferTime
) est chargée.
-
Le paramètre
streaming
indique que ce fichier audio peut commencer la lecture avant la fin du chargement.
Le paramètre
bufferTime
prend la valeur -1 par défaut. Si la méthode constructeur détecte une valeur négative dans le paramètre
bufferTime
, elle définit la propriété
bufferTime
sur la valeur de
SoundMixer.bufferTime
. Ceci permet à l’application de prendre la valeur
SoundMixer.bufferTime
globale, par défaut, comme souhaité.
Si le paramètre
autoLoad
est défini sur
true
, la méthode constructeur appelle immédiatement la méthode
load()
suivante pour commencer le chargement du fichier audio:
public function load():void
{
if (this.isPlaying)
{
this.stop();
this.s.close();
}
this.isLoaded = false;
this.s = new Sound();
this.s.addEventListener(ProgressEvent.PROGRESS, onLoadProgress);
this.s.addEventListener(Event.OPEN, onLoadOpen);
this.s.addEventListener(Event.COMPLETE, onLoadComplete);
this.s.addEventListener(Event.ID3, onID3);
this.s.addEventListener(IOErrorEvent.IO_ERROR, onIOError);
this.s.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onIOError);
var req:URLRequest = new URLRequest(this.url);
var context:SoundLoaderContext = new SoundLoaderContext(this.bufferTime, true);
this.s.load(req, context);
}
La méthode
load()
crée un objet Sound puis ajoute des écouteurs pour tous les événements de son importants. Elle indique ensuite à l’objet Sound de charger le fichier audio, à l’aide d’un objet LoaderContext pour transmettre la valeur
bufferTime
.
Etant donné que la propriété
url
peut être modifiée, vous pouvez utiliser une occurrence de SoundFacade pour lire différents fichiers audio à la suite : il vous suffit de modifier la propriété
url
et d’appeler la méthode
load()
afin de charger le nouveau fichier audio.
Les trois méthodes d’écouteur d’événement suivantes indiquent comment l’objet SoundFacade suit la progression du chargement et décide quand lancer la lecture du son :
public function onLoadOpen(event:Event):void
{
if (this.isStreaming)
{
this.isReadyToPlay = true;
if (autoPlay)
{
this.play();
}
}
this.dispatchEvent(event.clone());
}
public function onLoadProgress(event:ProgressEvent):void
{
this.dispatchEvent(event.clone());
}
public function onLoadComplete(event:Event):void
{
this.isReadyToPlay = true;
this.isLoaded = true;
this.dispatchEvent(evt.clone());
if (autoPlay && !isPlaying)
{
play();
}
}
La méthode
onLoadOpen()
s’exécute lorsque le chargement du son commence. Si vous pouvez lire le son en mode continu, la méthode
onLoadComplete()
définit immédiatement l’indicateur
isReadyToPlay
sur
true
. L’indicateur
isReadyToPlay
détermine si l’application peut lancer la lecture du son, peut-être en réponse à une action utilisateur (clic sur un bouton de lecture, par exemple). La classe SoundChannel gère la mise en mémoire tampon des données audio. Par conséquent, il est inutile de vérifier si suffisamment de données ont été chargées avant d’appeler la méthode
play()
.
La méthode
onLoadProgress()
s’exécute régulièrement pendant le chargement. Elle envoie simplement une copie de son objet ProgressEvent pour le code qui utilise cet objet SoundFacade.
Une fois que les données audio ont été complètement chargées, la méthode
onLoadComplete()
s’exécute en appelant la méthode
play()
pour des sons non diffusés en continu, si nécessaire. La méthode
play(
) est décrite ci-dessous.
public function play(pos:int = 0):void
{
if (!this.isPlaying)
{
if (this.isReadyToPlay)
{
this.sc = this.s.play(pos);
this.sc.addEventListener(Event.SOUND_COMPLETE, onPlayComplete);
this.isPlaying = true;
this.playTimer = new Timer(this.progressInterval);
this.playTimer.addEventListener(TimerEvent.TIMER, onPlayTimer);
this.playTimer.start();
}
}
}
La méthode
play()
appelle la méthode
Sound.play()
lorsque le son peut être lu. L’objet SoundChannel résultant est stocké dans la propriété
sc
. La méthode
play()
crée ensuite un objet Timer qui sera utilisé pour envoyer des événements de progression de la lecture à des intervalles réguliers.