Sound-Steuerung in Flash AS3

In Flash kann man relativ einfach Musik-Dateien (mp3) laden und abspielen. Ein Anleitung gibt es z.B. bei Republic of Code – Playing sounds with AS3. Nun wollte ich die Datei aber nicht von Anfang an abspielen, sondern ab einem Punkt, den ich mir vorher gemerkt habe. Die Seite, auf der das eingesetzt wird, verwendet Hintergrund-Sound mit ungefähr 2 Minuten langen Loops. Nun dachte ich mir, es sei ein wenig nervig, wenn beim Umherklicken auf der Seite die Hintergrund-Datei immer von vorne anfangen würde zu spielen. Daher wird beim Abspielen der Datei die aktuelle Position des Abspielknopfes gemerkt und beim nächsten Aufruf spielt die Musik von der Stelle weiter. Und daher musste ich die Musik nicht von vorn, sondern von einem bestimmten Zeitpunkt abspielen. Wenn der Loop fertig gespielt worden ist, sollte das Musikstück wieder von vorn beginnen. Nun gab es allerdings zwei Kleinigkeiten, die mir die Lösung nicht besonders einfach gemacht haben.

In der Flash-AS3-Referenz zum Sound-Objekt steht als Beschreibung der Funktion play()

public function play(startTime:Number = 0, loops:int = 0, sndTransform:SoundTransform = null):SoundChannel

loops:int (default = 0) — Defines the number of times a sound loops back to the startTime value before the sound channel stops playback.

Wenn die Datei also zu Ende abgespielt wurde, dann spring der Abspielknopf nicht an den Anfang, sondern an die Position, mir der das Abspielen begann. D.h. soundClip.play(position, 10000) funktioniert in meinem Fall nicht, weil da der Sound immer nur von position bis Ende abgespielt wurde.

Dann entschloss ich mich auf die Angabe von Loops zu verzichten und stattdessen einen Event Listener zu nehmen, der auf das Event SOUND_COMPLETE hört. Dieser Event Listener wird dem Sound Channel-Objekt zugewiesen. Leider wurde das Event nicht ausgelöst, was der folgende Artikel SOUND_COMPLETE event is not firing beschreibt und löst. Bei jedem Aufruf der Funktion play wird ein neues Sound Channel-Objekt zurück gegeben, so dass der Event Listener gelöscht wird. Damit es also wie gewünscht funktioniert, muss auf jeden Aufruf von play() der Aufruf addEventListener() folgen.

1 Kommentar