ActionScript 3.0 ses mimarisi güçlü ancak karmaşıktır. Yalnızca temel ses yükleme ve çalma özelliklerine ihtiyaç duyan uygulamalar, daha basit bir yöntem çağrıları ve olayları kümesi sağlayarak karmaşıklığın bir kısmını gizleyen bir sınıfı kullanabilir. Yazılım tasarımı modelleri dünyasında bu sınıf
cephe
olarak adlandırılır.
SoundFacade sınıfı, şu görevlerin gerçekleştirilmesine yönelik tek bir arabirim sunar:
-
Sound nesnesini, SoundLoaderContext nesnesini ve SoundMixer sınıfını kullanarak ses dosyaları yükleme
-
Sound nesnesini ve SoundChannel nesnesini kullanarak ses dosyalarını çalma
-
Çalma ilerlemesi olaylarını gönderme
-
Sound nesnesini ve SoundChannel nesnesini kullanarak ses çalınmasını duraklatma ve yeniden başlatma
SoundFacade sınıfı, ActionScript ses sınıflarının en çok sayıda işlevini en az karmaşıklıkta sunmaya çalışır.
Aşağıdaki sınıf, sınıf bildirimini, sınıf özelliklerini ve
SoundFacade()
yapıcı yöntemini gösterir:
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();
}
}
SoundFacade sınıfı, kendi olaylarını gönderebilecek şekilde EventDispatcher sınıfını genişletir. Sınıf kodu ilk olarak bir Sound nesnesi ve bir SoundChannel nesnesi için özellikleri bildirir. Bu sınıf ayrıca ses dosyasının URL'sinin değerini ve ses akışa alınırken kullanılacak
bufferTime
özelliğini içerir. Üstelik yükleme ve çalma davranışını etkileyen bazı Boolean parametrelerini de kabul eder:
-
autoLoad
parametresi, ses yüklemesinin bu nesne oluşturulduğu anda başlaması gerektiğini nesneye bildirir.
-
autoPlay
parametresi, ses çalınmasının yeterli ses verisi yüklendiği anda başlaması gerektiğini belirtir. Bu akışa alınan bir ses ise,
bufferTime
özelliği tarafından belirtildiği şekilde yeterince veri yüklendiği anda çalma işlemi başlar.
-
streaming
parametresi, bu ses dosyasının yükleme tamamlanmadan önce çalınmaya başlayabildiğini belirtir.
bufferTime
parametresinin varsayılan değeri -1'dir. Yapıcı yöntemi
bufferTime
parametresinde negatif bir değer algılarsa,
bufferTime
özelliğini
SoundMixer.bufferTime
değerine ayarlar. Bu, istendiği zaman uygulamanın genel
SoundMixer.bufferTime
değerini varsayılan olarak uygulamasına olanak sağlar.
autoLoad
parametresi
true
değerine ayarlanırsa, ses dosyasının yüklemesini başlatmak için yapıcı yöntemi hemen şu
load()
yöntemini çağırır:
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()
yöntemi yeni bir Sound nesnesi oluşturur ve sonra tüm önemli ses olayları için dinleyiciler ekler. Daha sonra Sound nesnesine,
bufferTime
değerinde iletmek üzere SoundLoaderContext nesnesini kullanarak ses dosyasını yüklemesini bildirir.
url
özelliği değiştirilebildiğinden, art arda farklı ses dosyalarını çalmak için SoundFacade örneği kullanılabilir: yalnızca
url
özelliğinin değiştirilip
load()
yönteminin çağrılması sonucunda yeni ses dosyası yüklenmiş olur.
Aşağıdaki olay dinleyicisi yöntemleri, SoundFacade nesnesinin yükleme ilerlemesini nasıl izlediğini ve ses çalmasını başlatmaya nasıl karar verdiğini gösterir:
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();
}
}
Ses yüklemesi başladığında
onLoadOpen()
yöntemi çalıştırılır. Akışa alma modunda ses çalınabiliyorsa,
onLoadComplete()
yöntemi hemen
isReadyToPlay
bayrağını
true
değerine ayarlar.
isReadyToPlay
bayrağı, uygulamanın, belki de Oynat/Çal düğmesinin tıklatılması gibi bir kullanıcı eylemine yanıt olarak ses çalmasını başlatıp başlatamayacağını belirler. SoundChannel sınıfı, ses verilerinin arabelleğe alınmasını yönetir, bu nedenle
play()
yöntemi çağrılmadan önce yeterince veri yüklenmiş olup olmadığını açıkça kontrol etmeye gerek yoktur.
onLoadProgress()
yöntemi, yükleme işlemi sırasında düzenli aralıklarla çalıştırılır. Bu SoundFacade nesnesini kullanan kod tarafından kullanılmak üzere ProgressEvent nesnesinin bir klonunu gönderir.
Ses verileri tamamen yüklendiğinde
onLoadComplete()
yöntemi çalıştırılarak gerektiğinde akışa alınmayan sesler için
play()
yöntemini çağırır.
play(
) yöntemi aşağıda gösterilmiştir.
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()
yöntemi, ses çalınmaya hazır olduğunda
Sound.play()
yöntemini çağırır. Sonuçta elde edilen SoundChannel nesnesi,
sc
özelliğinde saklanır. Daha sonra
play()
yöntemi, düzenli aralıklarla çalma ilerlemesi olaylarını göndermek için kullanılacak bir Timer nesnesini oluşturur.