7

我正在研究现有的codoCircle。降低音量。

它按预期工作。

现在我想在codepen中使用相同的代码,我得到了这个错误

TypeError:无法在“AudioBufferSourceNode”上设置“buffer”属性:提供的值不是“AudioBuffer”类型

我做了一些研究,发现第一个答案很有用。

答案说

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

这对我来说很有意义,所以我尝试做一个 setTimeout类似的事情:

setTimeout(playSound, 9000);

它没有成功。

您知道任何解决方法吗?为什么在 CodeCircle 中有效,而在 Codepen 中无效?

4

1 回答 1

6

他对我来说很有意义,所以我试着做一个 setTimeout 像..

这更像是一个快速修复,但很棘手,因为您不确定是否所有内容都已加载。

解决方案是等到每个样本都加载完毕。最好的方法是为此使用Promises,但这需要(大型)重构并且与所有当前浏览器不兼容(因此您需要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();
    }
}

编辑后的 ​​codepen 在这里

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

于 2017-04-27T15:05:08.467 回答