Ljudarkitekturen i ActionScript 3.0 är kraftfull men komplex. Program som endast behöver grundläggande funktioner för ljudinläsning och uppspelning kan använda en klass som döljer en del av komplexiteten genom att tillhandahålla en enklare uppsättning av metodanrop och händelser. I programvaruvärlden för designmönster kallas en sådan klass för
facade
.
Klassen SoundFacade presenterar ett enda gränssnitt för att utföra följande uppgifter:
-
Läsa in ljudfiler med ett Sound-objekt, ett SoundLoaderContext-objekt och klassen SoundMixer
-
Spela upp ljudfiler med Sound-objektet och SoundChannel-objektet
-
Skicka händelser för uppspelningsförloppet
-
Pausa och återuppta uppspelning av ljudet med Sound-objektet och SoundChannel-objektet
Klassen SoundFacade försöker erbjuda de flesta funktionerna som finns i ActionScript-ljudklasserna men inte lika komplicerade.
I följande kod visas klassdeklarationen, klassegenskaperna och konstruktormetoden
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();
}
}
Klassen SoundFacade utökar klassen EventDispatcher så att den kan skicka sina egna händelser. Klasskoden deklarerar först egenskaper för ett Sound-objekt och ett SoundChannel-objekt. Klassen lagrar också URL-värdet för ljudfilen och en
bufferTime
-egenskap som används vid direktuppspelning av ljudet. Dessutom accepteras några booleska parametervärden som påverkar inläsnings- och uppspelningsbeteendena:
-
Parametern
autoLoad
anger för objektet att ljudinläsningen ska starta så fort som det här objektet har skapats.
-
Parametern
autoPlay
indikerar att ljuduppspelningen ska starta så fort som tillräckligt med ljuddata har lästs in. Om det är ett direktuppspelat ljud, börjar uppspelningen så fort som tillräcklig mängd data enligt specifikationen i
bufferTime
-egenskapen har lästs in.
-
Med
streaming
-parametern indikeras att ljudfilen kan börja spelas upp innan inläsningen har slutförts.
Parametern
bufferTime
har standardvärdet -1. Om konstruktormetoden identifierar ett negativt värde i
bufferTime
-parametern, får
bufferTime
-egenskapen värdet från
SoundMixer.bufferTime
. Det här låter programmet valfritt ange standardvärde för det globala
SoundMixer.bufferTime
-värdet.
Om
autoLoad
-parametern har värdet
true
, anropar konstruktormetoden omedelbart följande
load()
-metod för att starta inläsningen av ljudfilen:
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);
}
load()
-metoden skapar ett nytt Sound-objekt och lägger sedan till avlyssnare för alla viktiga ljudhändelser. Sedan aktiveras Sound-objektet att läsa in ljudfilen och använda SoundLoaderContext-objektet att föra över
bufferTime
-värdet.
Eftersom
url
-egenskapen kan ändras, kan en SoundFacade-instans användas för att spela upp olika ljudfiler i följd: Ändra
url
-egenskapen och anropa
load()
-metoden så läses den nya ljudfilen in.
Följande tre händelseavlyssningsmetoder visar hur SoundFacade-objekt följer inläsningsförloppet och avgör när uppspelning av ljudet ska starta:
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();
}
}
Metoden
onLoadOpen()
körs när ljudinläsningen startar. Om ljudet kan spelas upp i direktuppspelningsläge, sätter
onLoadComplete()
-metoden
isReadyToPlay
-flaggan till
true
direkt. Med
isReadyToPlay
-flaggan fastställs om programmet kan starta ljuduppspelningen kanske som svar på en användaråtgärd som att klicka på Spela upp. Klassen SoundChannel hanterar buffringen av ljuddata, så det är inte nödvändigt att särskilt kontrollera om tillräckligt med data har lästs in innan
play()
-metoden anropas.
Metoden
onLoadProgress()
körs periodvis under inläsningsförloppet. Det skickar helt enkelt en klon av sitt ProgressEvent-objekt att användas av koden som använder det här SoundFacade-objektet.
När ljuddata har lästs in fullständigt, körs
onLoadComplete()
-metoden och anropar
play()
-metoden efter ljud som inte är direktuppspelade om det behövs. Själva
play(
)-metoden visas nedan.
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();
}
}
}
play()
-metoden anropar
Sound.play()
-metoden om ljudet är klart att spelas upp. Det slutliga SoundChannel-objektet lagras i
sc
-egenskapen.
play()
-metoden skapar sedan ett Timer-objekt som används för att skicka förloppshändelser för uppspelningen med regelbundet intervall.