未捕获的TypeError:值不是AudioBuffer类型

时间:2013-02-12 03:42:53

标签: audio web xmlhttprequest audiobuffer

当我尝试运行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);

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

http://code.google.com/p/chromium/issues/detail?id=128826