当我尝试运行XHR来加载示例时,我收到此错误。未捕获的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);
答案 0 :(得分:2)
问题是kit.load()
触发了一个异步请求来加载和解码音频缓冲区。无论文件是否已加载,后面的两行(createBufferSource
,分配缓冲区)都会立即跟随异步请求。因此,您获得此“值不是AudioBuffer
类型”的原因是因为在您分配voice.buffer = kit.snareBuffer
时,kit.snareBuffer
仍未定义,因为加载回调未被触发。
这可能适用于window.onload
的原因是因为XHR请求可以在窗口加载之前运行,这意味着在window.onload
事件处理程序被触发时,XHR请求已经到来返回,kit.snareBuffer
是已定义的audioBuffer
。
这个答案有点晚了,但希望它有所帮助!
答案 1 :(得分:0)
看起来像是铬的回归。即使我得到同样的错误。见下面的chrome bug