我正在研究现有的
codoCircle.放下音量.
它按预期工作.
TypeError:无法在’AudioBufferSourceNode’上设置’buffer’属性:提供的值不是’AudioBuffer’类型
我做了一些研究,我发现first answer很有用.
答案说
当我在playSound player.buffer = buffer中分配时,缓冲区仍未定义,因为加载回调未被触发.
这对我来说很有意义,所以我试着去做
setTimeout如:
setTimeout(playSound,9000);
它没有成功.
你知道任何解决方法吗?为什么CodeCircle工作而不是Codepen?
解决方法
his makes sense to me,so then i have tried to do a setTimeout like ..
这更像是一个quickfix,但是因为你不确定是否所有内容都已加载而很棘手.
解决方案是等到每个样本都加载完毕.最好的方法是使用Promises,但这需要一个(大)重构和isn’t compatible with all the current browsers(所以你需要Babel或Typescript等).
所以我做了一个更简单的方法:对于每个样本我创建了一个布尔变量,在加载完成后将设置为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(); });
然后我将你的代码包装起来以启动函数启动并创建一个startWhenAllLoaded,它在所有树的布尔都为真时启动
function startWhenAllLoaded() { if(!started && loadedHat && loadedSnare && loadedBd){ started = true; start(); } }
编辑过的codepen是here