2012-10-10 2 views
5

Ich erstelle dynamisch eine Audiodatei und ändere die Quelle im laufenden Betrieb. Aber nachdem ich die src ändere und versuche, die currentTime zu ändern, erhalte ich immer einen ungültigen Statusfehler. Wie gehst du dazu, es zu testen? Oder feuern Sie ein Event, wenn es fertig ist, und rufen Sie currentTime auf, um seine Audio-Position zu ändern.HTML5 Audio - Testen auf ungültigen Statusfehler (oder Dom Exception 11)

this.doneLoading = function(aTime){ 

    try{ 
     this.mAudioPlayer.currentTime = aTime/1000.0; 
    }catch(err){ 
     console.log(err); 
    } 
    this.mAudioPlayer.play(); 
} 

this.playAtTime = function(aTime) { 
    Debug("play at time audio: " + aTime); 
    Debug("this.mAudioPlayer.currentTime: " + this.mAudioPlayer.currentTime); 

    this.startTime = aTime; 

    if (this.mAudioPlayer.src != this.mAudioSrc) { 
     this.mAudioPlayer = new Audio(); 
     this.mAudioPlayer.src = this.mAudioSrc; 
     this.mAudioPlayer.load(); 
     this.mAudioPlayer.play(); 
     this.mAudioPlayer.addEventListener('canplaythrough', this.doneLoading(aTime), false); 
    } 
    else if ((isChrome() || isMobileSafari()) && aTime == 0) { 
     this.mAudioPlayer.load(); 
     this.mAudioPlayer.currentTime = aTime/1000.0; 
     this.mAudioPlayer.play(); 
     Debug("Reloading audio"); 
    }else{ 

     this.mAudioPlayer.currentTime = aTime/1000.0; 
     this.mAudioPlayer.play(); 
    }  



}; 

Antwort

17

Für diejenigen, die nach, die tatsächlich benötigen einen Test diesen ungültigen Zustand Fehler zu vermeiden, können Sie dies versuchen:

if(this.readyState > 0) 
    this.currentTime = aTime; 

für mich scheint irgendwie zu arbeiten :)

+1

DIESE ARBEITEN Ich denke, das sollte die akzeptierte Antwort THX sein – Prozi

9

Sie sind keine Funktion Referenz auf Ihre addEventListener vorbei - die Funktion inline anrufen. Die doneLoading() Funktion führt sofort (bevor die Datei geladen wird), und der Browser wirft korrekt ein INVALID_STATE_ERR:

this.mAudioPlayer.addEventListener('canplaythrough', this.doneLoading(aTime), false);

statt in Abhängigkeit Referenz vorbei Versuchen. Wie folgt aus:

this.mAudioPlayer.addEventListener('loadedmetadata',function(){ 
    this.currentTime = aTime/1000.0; 
}, false); 
+0

Danke, das ist definitiv ein sehr schlechter Fehler für mich zu übersehen. – Neablis