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

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

它按预期工作.

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

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(所以你需要BabelTypescript等).

所以我做了一个更简单的方法:对于每个样本我创建了一个布尔变量,在加载完成后将设置为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

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

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...