2013-02-12 5 views
2

XHR을 실행하여 샘플을로드하려고하면이 오류가 발생합니다. Uncaught TypeError : 값의 유형이 AudioBuffer가 아닙니다. 모든 것이 옳은 것처럼 보이지만 문제가 무엇인지 확신 할 수 없습니다.잡히지 않은 TypeError : 값이 AudioBuffer 유형이 아님

Kit.prototype.load = function(){ 
    if(this.startedLoading) 
     return; 
    this.startedLoading = true; 

    // var kick = "samples/M-808Sn2.wav"; 
    var snare = "samples/M-808Sn2.wav"; 
    // var hihat = "samples/M-808Sn2.wav"; 

    // this.loadSample(0, kick, false); 
    this.loadSample(1, snare, false); 
    // this.loadSample(2, hihat, false); 
} 

은 내가 요청을 시작 :

Kit.prototype.loadSample = function(sampleID, url, mixToMono){ 
// Load Asynchronously 

var request = new XMLHttpRequest(); 
request.open("GET", url, true); 
request.responseType = "arraybuffer"; 

var kit = this; 

request.onload = function(){ 

    var buffer; 
    context.decodeAudioData(request.response, function(decodedBuffer){ 
     buffer = decodedBuffer; 
    }); 

    switch(sampleID){ 
     // case 0: kit.kickBuffer = buffer; break; 
     case 1: kit.snareBuffer = buffer; break; 
     // case 2: kit.hihatBuffer = buffer; break; 
    } 
} 

request.send(); 

}

그때 나는 그것을 실행하려고.

context = new webkitAudioContext(); 


var kit = new Kit(); 

kit.load(); 

var voice = context.createBufferSource(); 

voice.buffer = kit.snareBuffer; 
voice.loop = true; 
voice.playbackRate.value = 1; 
voice.connect(gain); 

voice.start(0); 
voice.stop(2); 

답변

2

문제는 비동기 요청 오프 kit.load() 화재로드 및 오디오 버퍼를 디코딩 할 수 있다는 것입니다 아래를 참조하십시오. 뒤 따르는 두 줄 (createBufferSource, 버퍼 할당)은 파일의로드 여부에 관계없이 즉시 비동기 요청을 따릅니다. 따라서 값을 할당하는 이유는 voice.buffer = kit.snareBuffer을 할당 할 때로드 콜백이 발생하지 않았기 때문에 kit.snareBuffer이 아직 정의되지 않았기 때문입니다.

이 아마 window.onload와 함께 작동하는 이유는 윈도우 전에 실행 할 수있는 XHR 요청이 시간에 의해 window.onload 이벤트 핸들러는 XHR 요청이 이미 돌아왔다 해고 즉,로드 및 kit.snareBufferaudioBuffer 정의되기 때문이다 .

이 답변은 조금 늦어 지지만 도움이 되길 바랍니다.

관련 문제