Każda instancja klasy Sound odpowiada za ładowanie i wyzwalanie odtwarzania konkretnego zasobu dźwiękowego. Aplikacja nie może użyć obiektu Sound ponownie w celu załadowania więcej niż jednego dźwięku. W przypadku chęci załadowania do nowego zasobu dźwiękowego powinien zostać utworzony nowy obiekt Sound.
W przypadku ładowania niewielkiego pliku dźwiękowego, takiego jak dźwięk kliknięcia podpinany pod przycisk, aplikacja może utworzyć nowy obiekt Sound i załadować za jego pośrednictwem plik dźwiękowy, zgodnie z poniższym przykładem:
var req:URLRequest = new URLRequest("click.mp3");
var s:Sound = new Sound(req);
Konstruktor
Sound()
przyjmuje jako swój pierwszy parametr obiekt URLRequest. W przypadku dostarczenia wartości dla parametru URLRequest nowy obiekt Sound rozpoczyna ładowanie określonego zasobu dźwiękowego automatycznie.
Niemal we wszystkich, poza najprostszymi, przypadkach aplikacja powinna kontrolować postęp ładowania dźwięku oraz ewentualne występowanie błędów. Na przykład, jeśli dźwięk kliknięcia jest dość duży, może on nie zostać całkowicie załadowany do chwili kliknięcia przycisku przez użytkownika aplikacji, co z kolei powoduje wyzwolenie dźwięku. Próba odtworzenia niezaładowanego dźwięku może skończyć się błędem wykonywania. Bezpieczniej jest odczekać na całkowite załadowanie dźwięku przed umożliwieniem użytkownikom podejmowania działań, które mogłyby spowodować odtwarzanie dźwięku.
Obiekt Sound dysponuje pewną liczbę różnych zdarzeń w procesie ładowania dźwięku. Aplikacja może wykrywać te zdarzenia w celu śledzenia postępu ładowania oraz stwierdzenia, czy dźwięk został całkowicie załadowany, przed jego odtworzeniem. W poniższej tabeli wymieniono zdarzenia, które mogą być dysponowane przez obiekt Sound.
Zdarzenie
|
Opis
|
open (
Event.OPEN
)
|
Dysponowane tuż przed rozpoczęciem operacji ładowania.
|
progress (
ProgressEvent.PROGRESS
)
|
Dysponowane okresowo w trakcie procesu ładowania dźwięku podczas odbierania danych z pliku lub strumienia.
|
id3 (
Event.ID3
)
|
Dysponowane, gdy dane ID3 stają się dostępne dla dźwięku mp3.
|
complete (
Event.COMPLETE
)
|
Dysponowane po załadowaniu wszystkich danych zasobów dźwiękowych.
|
ioError (
IOErrorEvent.IO_ERROR
)
|
Dysponowane, jeśli nie można zlokalizować pliku dźwiękowego lub w przypadku przerwania procesu ładowania przed odebraniem wszystkich danych dźwiękowych.
|
Poniższy kod ilustruje sposób odtwarzania dźwięku po zakończeniu jego ładowania:
import flash.events.Event;
import flash.media.Sound;
import flash.net.URLRequest;
var s:Sound = new Sound();
s.addEventListener(Event.COMPLETE, onSoundLoaded);
var req:URLRequest = new URLRequest("bigSound.mp3");
s.load(req);
function onSoundLoaded(event:Event):void
{
var localSound:Sound = event.target as Sound;
localSound.play();
}
Po pierwsze próbka kodu tworzy nowy obiekt Sound bez przekazywania do niego początkowej wartości dla parametru URLRequest. Następnie wykrywa ona zdarzenie
Event.COMPLETE
z obiektu Sound, co powoduje wykonanie metody
onSoundLoaded()
po załadowaniu wszystkich danych dźwiękowych. Następnie wywołuje ona metodę
Sound.load()
z użyciem nowej wartości URLRequest dla pliku dźwiękowego.
Metoda
onSoundLoaded()
wykonywana jest po ukończeniu ładowania dźwięku. Właściwość
target
obiektu Event stanowi odwołanie do obiektu Sound. Wywołanie metody
play()
obiektu Sound uruchamia wówczas odtwarzanie dźwięku.
Monitorowanie procesu ładowania dźwięku
Pliki dźwiękowe mogą być bardzo duże, a ich załadowanie może zająć sporo czasu. Ponieważ gdy aplikacja Flash Player oraz AIR umożliwiają odtwarzanie dźwięków przez aplikację jeszcze przed ich pełnym załadowaniem, może być wskazane informowanie użytkownika o ilości załadowanych danych dźwiękowych oraz ilości dźwięku, który już został odtworzony.
Klasa Sound dysponuje dwa zdarzenia relatywnie ułatwiające wyświetlanie postępów ładowania dźwięku:
ProgressEvent.PROGRESS
i
Event.COMPLETE
. Poniższy przykład ilustruje sposób, w jaki te zdarzenia wyświetlają informacje o postępie dotyczącym ładowanych dźwięków:
import flash.events.Event;
import flash.events.ProgressEvent;
import flash.media.Sound;
import flash.net.URLRequest;
var s:Sound = new Sound();
s.addEventListener(ProgressEvent.PROGRESS, onLoadProgress);
s.addEventListener(Event.COMPLETE, onLoadComplete);
s.addEventListener(IOErrorEvent.IO_ERROR, onIOError);
var req:URLRequest = new URLRequest("bigSound.mp3");
s.load(req);
function onLoadProgress(event:ProgressEvent):void
{
var loadedPct:uint = Math.round(100 * (event.bytesLoaded / event.bytesTotal));
trace("The sound is " + loadedPct + "% loaded.");
}
function onLoadComplete(event:Event):void
{
var localSound:Sound = event.target as Sound;
localSound.play();
}
function onIOError(event:IOErrorEvent)
{
trace("The sound could not be loaded: " + event.text);
}
Niniejszy kod przede wszystkim tworzy obiekt Sound, a następnie dodaje do niego moduły wykrywania zdarzeń dla zdarzeń
ProgressEvent.PROGRESS
i
Event.COMPLETE
. Po wywołaniu metody
Sound.load()
i odebraniu pierwszych danych z pliku dźwiękowego występuje zdarzenie
ProgressEvent.PROGRESS
wyzwalające metodę
onSoundLoadProgress()
.
Wartość procentowa załadowanych danych dźwiękowych jest równa wartości właściwości
bytesLoaded
obiektu ProgressEvent podzielonej przez wartość właściwości
bytesTotal
. Te same właściwości
bytesLoaded
oraz
bytesTotal
są również dostępne w obiekcie Sound. Przykład powyżej stanowi prostą ilustrację komunikatu dotyczącego postępu ładowania dźwięku, lecz jego wartości
bytesLoaded
oraz
bytesTotal
można też w prosty sposób użyć do aktualizacji składników paska postępu, takich jak te dołączane do struktury Adobe Flex lub narzędzia do tworzenia treści Adobe Flash.
Ponadto przykład ten ilustruje sposób rozpoznawania przez aplikację i reagowania na błędy podczas ładowania plików dźwiękowych. Na przykład, jeśli nie można zlokalizować pliku dźwiękowego o danej nazwie pliku, dysponowane jest przez obiekt Sound zdarzenie
Event.IO_ERROR
. W poprzednim kodzie metoda
onIOError()
wykonuje i wyświetla krótki komunikat o błędzie podczas jego wystąpienia.