2

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

2 回答 2

2

问题是kit.load()触发异步请求以加载和解码音频缓冲区。后面的两行(createBufferSource,分配缓冲区)立即跟随异步请求,无论文件是否已加载。所以你得到这个“值不是类型AudioBuffer”的原因是因为在你分配的时候voice.buffer = kit.snareBufferkit.snareBuffer仍然是未定义的,因为加载回调没有被触发。

这可能适用的原因window.onload是因为 XHR 请求可以在窗口加载之前运行,这意味着在window.onload触发事件处理程序时,XHR 请求已经返回并且kit.snareBuffer是一个已定义的audioBuffer.

这个答案来得有点晚,但希望它有所帮助!

于 2013-06-13T13:21:05.290 回答
0

看起来像 chrome 中的回归。即使我得到同样的错误。请参阅下面的 chrome 错误

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

于 2013-03-04T11:53:20.897 回答