mySound.onLoad-Bug

Häufig verbringt man Stunden damit den Grund für einen Fehler in einer Anwendung zu finden. In der Regel gehe ich dabei von „innen“ nach „außen“ vor, d.h. ich betrachte zunächst den Codeabschnitt, bzw. die Klasse, Funktion oder Methode in welcher der Fehler auftritt. Das bedeutet dann aber nur im Idealfall, dass die Ursache in diesem Abschnitt zu finden ist.

Wenn ich mich dann weiter nach „außen“ vorgearbeitet habe, d.h. auch potenziell zusammenhängende Codeabschnitte überprüft habe und der Grund für den Fehler immernoch nicht gefunden habe, ist der letzte Hoffnungsschimmer meist die Suche über Google, LiveDocs, Flashforum, MMNG etc.. Im schlimmsten Fall ist es ein Flashbug für den dann ein Workaround gefunden werden muss.
Bis man jedoch erstmal soweit ist können Stunden vergehen …

Im Fall der Ereignisprozedur „onLoad“ des Sound-Objekts hat es nicht allzu lang gedauert. Die erste Zeile der Beschreibung in der Hilfe deutet schon auf eine gewisse Unstimmigkeit hin: „Wird automatisch aufgerufen, wenn ein Sound geladen wird.“

Das stimmt soweit auch erstmal. Unstimmig ist es, wenn der Wert der Streaming-Eigenschaft auf false gesetzt wird. Dann sollte es heißen „…wenn ein Sound vollständig geladen wurde“.

Das funktioniert auch erstmal einwandfrei, nur wenn dieser Sound bereits gecached wurde wird die Ereignisprozedur nicht aufgerufen.

Nach kurzer Suche fand ich den entsprechenden Thread dazu zum Glück in den LiveDocs.

Die Lösung ist relativ simpel: Ein Movieclip mit einer onEnterFrame Ereignisprozedur, welche über die Sound-Eigenschaften getBytesLoaded() und getBytesTotal() den Fortschritt prüft und entsprechende Anweisungen enthält. Alternativ lässt sich das ganze auch über setInterval() lösen.

Beispiel:
[as] var mySoundContainer:MovieClip = this.createEmptyMovieClip(„sndContainer“, this.getNextHighestDepth());
var mySoundController:MovieClip = this.createEmptyMovieClip(„sndController“, this.getNextHighestDepth());
var mySound:Sound = new Sound(mySoundContainer);
mySound.loadSound(„mySound.mp3“, false);
mySoundController.onEnterFrame = function() {
var loaded:Number = mySound.getBytesLoaded();
var total:Number = mySound.getBytesTotal();
var percent:Number = Math.round((loaded/total)*100);
if (percent>=100) {
// Sound is loaded
// Now, do something
delete this.onEnterFrame;
}
}; [/as]

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert