TypeError:无法在'AudioBufferSourceNode'上设置'buffer'属性:提供的值不是'AudioBuffer

时间:2017-04-23 14:41:18

标签: javascript jquery asynchronous xmlhttprequest codepen

我正在研究现有的codoCircle。放下音量。

按预期方式运作。

现在我想在codepen中使用相同的代码,我收到此错误

TypeError:无法在'AudioBufferSourceNode'上设置'buffer'属性:提供的值不是'AudioBuffer

类型

我做了一些研究,我发现first answer很有用。

答案是

当我在playSound player.buffer = buffer中分配时,缓冲区仍未定义,因为加载回调未被触发。

这对我有意义,所以我试图做一个 setTimeout喜欢:

setTimeout(playSound, 9000);

没有成功。

你知道对此有任何解决方法吗?为什么CodeCircle工作而不是Codepen?

1 个答案:

答案 0 :(得分:6)

  

他对我有意义,所以我试图做一个类似的setTimeout。

这更像是一个quickfix,但是因为你不确定是否所有内容都已加载而非常棘手。

解决方案是等到每个样本都加载完毕。最好的方法是使用Promises,但这需要(大)重构和isn't compatible with all the current browsers(因此您需要BabelTypescript等。)

所以我做了一个更简单的方法:对于每个样本我创建了一个boolean变量,当加载完成时(在回调函数中)将设置为true

var loadedHat = false;
var loadedSnare = false;
var loadedBd = false;

loadSample('cl_hat_3001.wav', function (buffer) {
    hat = buffer;
    loadedHat = true;
    startWhenAllLoaded();
});
loadSample('brp_snrim1.wav', function (buffer) {
    snare = buffer;
    loadedSnare = true;
    startWhenAllLoaded();

});
loadSample('bd08.wav', function (buffer) {
    bd = buffer;
    loadedBd = true;
    startWhenAllLoaded();
});

然后我将您的代码包装起来以start函数开始并创建一个startWhenAllLoaded,当所有树的布尔都是true

function startWhenAllLoaded()
{
    if(!started && loadedHat && loadedSnare && loadedBd){
        started = true;
        start();
    }
}

编辑后的代码集为here

注意:不确定现在是否一切正常,错误消失但我认为代码需要一些调整