2012-10-10 11 views
5

Dynamicznie tworzę plik audio i zmieniam źródło w locie. Jednak po zmianie src i próbie zmiany currentTime zawsze pojawia się błąd Invalid state. Jak radzisz sobie z testowaniem? Lub lepiej zwolnij zdarzenie, gdy jest gotowe, a następnie wywołaj currentTime, aby zmienić swoją pozycję audio.Dźwięk HTML5 - test na błąd nieprawidłowego stanu (Lub 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(); 
    }  



}; 

Odpowiedz

17

Dla tych, którzy przyjeżdżają po które faktycznie potrzebują testu aby zapobiec nieprawidłowy stan błędu, można spróbować to:

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

wydaje się działać dla mnie anyways :)

+1

TO DZIAŁA Myślę, że powinna to być zaakceptowana odpowiedź THX – Prozi

9

Nie przechodzą funkcję odniesienie do addEventListener - dzwonisz inline funkcji. doneLoading() funkcja wykonywana natychmiast (przed plik załadowany) i przeglądarka poprawnie zgłasza INVALID_STATE_ERR:

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

Spróbuj przechodzącą w funkcji odniesienia zamiast. Tak:

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

Dziękuję, To zdecydowanie bardzo zły błąd dla mnie przeoczyć. – Neablis

Powiązane problemy