Jede Instanz der Sound-Klasse dient dazu, eine bestimmte Soundressource zu laden und deren Wiedergabe auszulösen. Ein Sound-Objekt kann nicht von einer Anwendung wiederverwendet werden, um mehrere Sounds zu laden. Wenn die Anwendung eine neue Soundressource laden möchte, muss sie ein neues Sound-Objekt erstellen.
Wenn Sie eine kleine Sounddatei laden (beispielsweise einen Klick-Sound, der an eine Schaltfläche angehängt werden soll), kann Ihre Anwendung ein neues Sound-Objekt erstellen und dieses die Sounddatei automatisch laden lassen. Dies wird im folgenden Code gezeigt:
var req:URLRequest = new URLRequest("click.mp3");
var s:Sound = new Sound(req);
Der
Sound()
-Konstruktor benötigt als ersten Parameter ein URLRequest-Objekt. Wenn ein Wert für den URLRequest-Parameter angegeben wird, lädt das neue Sound-Objekt automatisch die angegebene Soundressource.
In allen außer in den einfachsten Fällen sollte Ihre Anwendung den Ladevorgang des Sounds überwachen und auf Fehler während des Ladens achten. Angenommen, der Klick-Sound ist relativ groß, so ist er eventuell noch nicht vollständig geladen, wenn der Benutzer auf die Schaltfläche klickt, die den Sound auslöst. Der Versuch, einen nicht geladenen Sound wiederzugeben, führt zu einem Laufzeitfehler. Bevor also Benutzer eine Aktion ausführen, die eine Soundwiedergabe auslöst, sollte gewartet werden, bis der Sound vollständig geladen ist.
Ein Sound-Objekt löst während des Ladens eines Sounds verschiedener Ereignisse aus. Ihre Anwendung kann auf diese Ereignisse überwachen, um den Ladevorgang zu verfolgen und so sicherzustellen, dass der Sound vollständig geladen ist, bevor die Wiedergabe gestartet wird. In der folgenden Tabelle sind die Ereignisse aufgeführt, die von einem Sound-Objekt ausgelöst werden können:
Ereignis
|
Beschreibung
|
open (
Event.OPEN
)
|
Wird direkt vor dem Beginn des Sound-Ladevorgangs ausgelöst.
|
progress (
ProgressEvent.PROGRESS
)
|
Wird regelmäßig während des Sound-Ladevorgangs ausgelöst, wenn die Daten aus einer Datei oder einem Stream empfangen werden.
|
id3 (
Event.ID3
)
|
Wird ausgelöst, wenn für einen MP3-Sound ID3-Daten zur Verfügung stehen.
|
complete (
Event.COMPLETE
)
|
Wird ausgelöst, wenn alle Daten der Soundressource geladen wurden.
|
ioError (
IOErrorEvent.IO_ERROR
)
|
Wird ausgelöst, wenn eine Sounddatei nicht gefunden werden kann oder der Ladeprozess unterbrochen wird, bevor alle Sounddaten empfangen wurden.
|
Im folgenden Code wird gezeigt, wie ein Sound wiedergegeben wird, nachdem er vollständig geladen wurde:
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();
}
Zunächst wird in diesem Codebeispiel ein neues Sound-Objekt erstellt, ohne dass ein Anfangswert für den URLRequest-Parameter übergeben wird. Dann überwacht es auf das
Event.COMPLETE
-Ereignis vom Sound-Objekt, das die
onSoundLoaded()
-Methode ausführt, nachdem alle Sounddaten geladen wurden. Als Nächstes ruft es die
Sound.load()
-Methode mit einem neuen URLRequest-Wert für die Sounddatei auf.
Die
onSoundLoaded()
-Methode wird ausgeführt, nachdem der Sound vollständig geladen wurde. Die
target
-Eigenschaft des Event-Objekts ist ein Verweis auf das Sound-Objekt. Das Aufrufen der
play()
-Methode des Sound-Objekts startet dann die Soundwiedergabe.
Überwachen des Ladevorgangs eines Sounds
Sounddateien können sehr groß sein und benötigen dann viel Zeit, bis sie vollständig geladen sind. Da Flash Player und AIR die Möglichkeit bieten, dass eine Anwendung Sounds wiedergibt, noch bevor diese vollständig geladen sind, möchten Sie den Benutzer eventuell informieren, wie viele der Sounddaten geladen wurden und wie viel des Sounds bereits wiedergegeben wurde.
Die Sound-Klasse löst zwei Ereignisse aus, mit denen es relativ einfach ist, den Ladefortschritt eines Sounds anzuzeigen:
ProgressEvent.PROGRESS
und
Event.COMPLETE
. Im folgenden Beispiel wird gezeigt, wie Sie diese Ereignisse zum Anzeigen des Ladefortschritts eines Sounds verwenden können:
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);
}
Dieser Code erstellt zunächst ein Sound-Objekt und fügt diesem dann Listener für die Ereignisse
ProgressEvent.PROGRESS
und
Event.COMPLETE
hinzu. Nachdem die
Sound.load()
-Methode aufgerufen wurde und die ersten Daten der Sounddatei empfangen wurden, tritt ein
ProgressEvent.PROGRESS
-Ereignis ein und die
onSoundLoadProgress()
-Methode wird ausgelöst.
Der Prozentsatz an geladenen Sounddaten entspricht dem Wert der
bytesLoaded
-Eigenschaft des ProgressEvent-Objekts geteilt durch den Wert der
bytesTotal
-Eigenschaft. Die gleichen
bytesLoaded
- und
bytesTotal
-Eigenschaften stehen auch für das Sound-Objekt zur Verfügung. Im vorangegangenen Beispiel werden lediglich Meldungen über den Ladefortschritt der Sounddatei angezeigt. Sie können jedoch die Werte
bytesLoaded
und
bytesTotal
auf einfache Weise integrieren, um Komponenten der Fortschrittsleiste (beispielsweise aus dem Adobe Flex-Framework oder dem Adobe Flash-Authoring-Tool) zu aktualisieren.
Dieses Beispiel zeigt auch, wie eine Anwendung einen Fehler beim Laden von Sounddateien erkennen und darauf reagieren kann. Angenommen, eine Sounddatei mit einem bestimmten Namen kann nicht geladen werden. In diesem Fall wird vom Sound-Objekt ein
Event.IO_ERROR
-Ereignis ausgelöst. Im vorangegangenen Code wird die
onIOError()
-Methode ausgeführt, die eine kurze Fehlermeldung anzeigt, wenn ein Fehler auftritt.