Może okazać się przydatne udostępnienie aplikacji informacji o chwili zatrzymania odtwarzania, tak aby mogła ona rozpocząć odtwarzanie innego dźwięku lub oczyścić zasoby używane podczas poprzedniego odtwarzania. Klasa SoundChannel dysponuje zdarzenie
Event.SOUND_COMPLETE
po zakończeniu odtwarzania dźwięku. Aplikacja może wykrywać to zdarzenie, wykonując wówczas odpowiednie czynności, zgodnie z przykładem poniżej:
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.");
}
Klasa SoundChannel nie dysponuje zdarzeń postępu podczas odtwarzania. W celu zgłoszenia postępów odtwarzania aplikacja może ustawić własny mechanizm odmierzania czasu i śledzenia położenia głowicy odtwarzania.
W celu obliczenia udziału procentowego odtworzonego dźwięku możliwe jest podzielenie wartości właściwości
SoundChannel.position
przez długość odtwarzanych danych dźwiękowych:
var playbackPercent:uint = 100 * (channel.position / snd.length);
Ten kod umożliwia jednak zaraportowanie dokładnych wartości procentowych odtwarzania wyłącznie, jeśli dane dźwiękowe został do końca załadowane, zanim odtwarzanie się rozpoczęło. Właściwość
Sound.length
wskazuje rozmiar ładowanych obecnie danych dźwiękowych nie zaś rozmiar końcowy całego pliku. Do celów śledzenia postępu odtwarzania dźwięku przesyłanego strumieniowo, który jest nadal ładowany, aplikacja szacuje końcowy rozmiar całego pliku dźwiękowego i tej wartości używa w obliczeniach. Możliwe jest oszacowanie końcowej długości danych dźwiękowych za pomocą właściwości
bytesLoaded
i
bytesTotal
obiektu Sound, zgodnie z poniższym przykładem:
var estimatedLength:int =
Math.ceil(snd.length / (snd.bytesLoaded / snd.bytesTotal));
var playbackPercent:uint = 100 * (channel.position / estimatedLength);
Poniższy kod powoduje załadowanie większego pliku dźwiękowego i używa zdarzenia
Event.ENTER_FRAME
w formie mechanizmu odmierzania czasu do celów prezentacji postępu odtwarzania. Okresowo zgłasza on wielkość procentową odtworzonego fragmentu, obliczaną jako wartość bieżącego położenia podzielona przez łączną długość danych dźwiękowych:
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);
}
Po rozpoczęciu ładowania danych dźwiękowych kod ten wywołuje metodę
snd.play()
i zapisuje wynikowy obiekt SoundChannel w zmiennej
channel
. Następnie dodaje on moduł wykrywania zdarzeń do aplikacji głównej dla zdarzenia
Event.ENTER_FRAME
oraz kolejny moduł wykrywania zdarzeń do obiektu SoundChannel dla zdarzenia
Event.SOUND_COMPLETE
mającego miejsce po ukończeniu odtwarzania.
Za każdym razem po osiągnięciu przez aplikację nowej klatki animacji wywoływana jest metoda
onEnterFrame()
. Metoda
onEnterFrame()
szacuje całkowitą długość pliku dźwiękowego w oparciu o ilość już załadowanych danych, a następnie oblicza je i wyświetla bieżącą wartość procentową dla odtwarzanego dźwięku.
Po odtworzeniu całego dźwięku wykonywana jest metoda
onPlaybackComplete()
usuwająca moduł wykrywania zdarzeń dla zdarzenia
Event.ENTER_FRAME
tak, że nie podejmuje on dalszych prób wyświetlania postępu.
Zdarzenie
Event.ENTER_FRAME
może być dysponowane wiele razy na sekundę. W niektórych przypadkach może okazać się, że wyświetlanie postępów odtwarzania tak często nie jest pożądane. W takich przypadkach aplikacja może ustawić własny mechanizm za pomocą klasy flash.util.Timer; patrz sekcja
Praca z datami i czasem
.