Uygulamanız, başka bir ses çalmaya başlayabilmek veya önceki çalma işlemi sırasında kullanılan bazı kaynakları temizlemek için sesin ne zaman çalmayı durduracağını bilmek isteyebilir. SoundChannel sınıfı, ses çalması bitince bir
Event.SOUND_COMPLETE
olayı gönderir. Uygulamanız, aşağıda gösterildiği gibi bu olayı dinleyip uygun eylemi gerçekleştirebilir:
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.");
}
SoundChannel sınıfı, çalma sırasında ilerleme olayları göndermez. Çalma ilerlemesiyle ilgili bildirim göndermek için, uygulamanız kendi zamanlama mekanizmasını oluşturup ses oynatma kafasının konumunu izleyebilir.
Sesin yüzde kaçının çalındığını hesaplamak için,
SoundChannel.position
özelliğinin değerini, çalınan ses verisinin uzunluğuna bölebilirsiniz:
var playbackPercent:uint = 100 * (channel.position / snd.length);
Ancak bu kod, yalnızca çalma işlemi başlamadan önce ses verisi tamamen yüklenmişse, tam olarak doğru çalma yüzdelerini bildirir.
Sound.length
özelliği, ses dosyasının tamamının son boyutunu değil, geçerli olarak yüklenen ses verisinin boyutunu gösterir. Halen yüklenmekte olan akışa alınan sesin çalma ilerlemesini izlemek için uygulamanızın tam ses dosyasının son boyutunu tahmin edip hesaplamalarında bu değeri kullanması gerekir. Aşağıdaki gibi, Sound nesnesinin
bytesLoaded
ve
bytesTotal
özelliklerini kullanarak ses verisinin son uzunluğunu tahmin edebilirsiniz:
var estimatedLength:int =
Math.ceil(snd.length / (snd.bytesLoaded / snd.bytesTotal));
var playbackPercent:uint = 100 * (channel.position / estimatedLength);
Aşağıdaki kod, daha büyük bir ses dosyasını yükler ve çalma ilerlemesini göstermek için zamanlama mekanizması olarak
Event.ENTER_FRAME
olayını kullanır. Geçerli konum değerinin toplam ses verisi uzunluğuna bölünmesiyle elde edilen çalma yüzdesiyle ilgili olarak düzenli aralıklarla bildirim gönderir:
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);
}
Ses verisi yüklenmeye başladıktan sonra, bu kod
snd.play()
yöntemini çağırır ve sonuçta elde edilen SoundChannel nesnesini
channel
değişkeninde saklar. Bu daha sonra
Event.ENTER_FRAME
olayı için ana uygulamaya bir olay dinleyicisi eklerken, çalma tamamlandığında gerçekleşen
Event.SOUND_COMPLETE
olayı için de SoundChannel nesnesine başka bir olay dinleyicisi ekler.
Uygulama, animasyonunda yeni bir kareye her ulaştığında,
onEnterFrame()
yöntemi çağrılır.
onEnterFrame()
yöntemi, yüklenmiş olan veri miktarını esas alarak ses dosyasının toplam uzunluğunu tahmin eder, daha sonra da geçerli oynatma yüzdesini hesaplayıp görüntüler.
Sesin tamamı çalındığında,
onPlaybackComplete()
yöntemi çalıştırılarak çalma bittikten sonra ilerleme güncellemelerini görüntülememesi için
Event.ENTER_FRAME
olayının olay dinleyicisi kaldırılır.
Event.ENTER_FRAME
olayı, saniyede birkaç defa gönderilebilir. Bazı durumlarda, çalma ilerlemesini bu kadar sıkça görüntülemek istemezsiniz. Bu durumlarda, uygulamanız flash.util.Timer sınıfını kullanarak kendi zamanlama mekanizmasını ayarlayabilir; bkz.
Tarih ve saatlerle çalışma
.