Javascript Safari—;在前几次之后无法创建振荡器
我正在尝试使用WebAudioAPI,但在使用Safari时遇到了一个问题。我的实验在Firefox和Chrome上运行正常 我编写了一个Promisified函数来播放单个音符,然后尝试使用该函数播放一系列音符 仅在Safari上,它在前四个注释后失败,并显示以下消息: 未处理的承诺拒绝:TypeError:null不是对象(正在计算“context.create振荡器”) 好的,我还没有处理这个错误,但是为什么我会得到它?它建议限制四个振荡器Javascript Safari—;在前几次之后无法创建振荡器,javascript,safari,es6-promise,web-audio-api,Javascript,Safari,Es6 Promise,Web Audio Api,我正在尝试使用WebAudioAPI,但在使用Safari时遇到了一个问题。我的实验在Firefox和Chrome上运行正常 我编写了一个Promisified函数来播放单个音符,然后尝试使用该函数播放一系列音符 仅在Safari上,它在前四个注释后失败,并显示以下消息: 未处理的承诺拒绝:TypeError:null不是对象(正在计算“context.create振荡器”) 好的,我还没有处理这个错误,但是为什么我会得到它?它建议限制四个振荡器 功能音(频率、持续时间){ 返回新承诺(功能(
功能音(频率、持续时间){
返回新承诺(功能(解决、拒绝){
var audioContext=window.audioContext | | window.webkitadiocontext;
var-context=新的音频上下文;
var振荡器=context.create振荡器();
振荡器.frequency.value=频率;
振荡器。连接(上下文。目的地);
振荡器。类型=‘锯齿’;
振荡器.start(context.currentTime);
振荡器。停止(上下文。当前时间+持续时间);
振荡器。onended=解析;
});
}
document.querySelector('button#play test')。onclick=函数(事件){
音调(130.81,1)
.然后(()=>音调(146.83,1))
.然后(()=>音调(164.81,1))
.然后(()=>音调(174.61,1))
.然后(()=>音调(196.00,1))
;
};代码>
播放
限制是您可以同时运行的音频上下文的数量
有些浏览器有这样的限制,因为AudioContext需要来自硬件(声卡)的资源,并且该硬件有限制
因此,重构代码,使其不会每次都创建新的AudioContext:
//创建单个音频上下文
var context=new(window.AudioContext | | window.webkitadiocontext)();
功能音(频率、持续时间){
返回新承诺(功能(解决、拒绝){
var振荡器=context.create振荡器();
振荡器.frequency.value=频率;
振荡器。连接(上下文。目的地);
振荡器类型='锯齿';
振荡器.start(context.currentTime);
振荡器停止(context.currentTime+持续时间);
振荡器。onended=解析;
});
}
document.querySelector('button#play test')。onclick=函数(事件){
音调(130.81,1)
.然后(()=>音调(146.83,1))
.然后(()=>音调(164.81,1))
.然后(()=>音调(174.61,1))
.然后(()=>音调(196.00,1))
.catch(控制台错误);
};代码>
播放
限制是您可以同时运行的音频上下文的数量
有些浏览器有这样的限制,因为AudioContext需要来自硬件(声卡)的资源,并且该硬件有限制
因此,重构代码,使其不会每次都创建新的AudioContext:
//创建单个音频上下文
var context=new(window.AudioContext | | window.webkitadiocontext)();
功能音(频率、持续时间){
返回新承诺(功能(解决、拒绝){
var振荡器=context.create振荡器();
振荡器.frequency.value=频率;
振荡器。连接(上下文。目的地);
振荡器类型='锯齿';
振荡器.start(context.currentTime);
振荡器停止(context.currentTime+持续时间);
振荡器。onended=解析;
});
}
document.querySelector('button#play test')。onclick=函数(事件){
音调(130.81,1)
.然后(()=>音调(146.83,1))
.然后(()=>音调(164.81,1))
.然后(()=>音调(174.61,1))
.然后(()=>音调(196.00,1))
.catch(控制台错误);
};代码>
播放
谢谢。它工作得很好。我认为上下文是自动处理的。振荡器
对象会发生什么情况?它确实应该在振荡器结束后在代码中被处理掉,但这可能只发生在垃圾收集器启动时,在正常情况下不应该经常发生。你的振荡器没有重量,也只是在它的合一事件后死亡。对于AudioContext:对于AudioNode:谢谢。它工作得很好。我认为上下文是自动处理的。振荡器
对象会发生什么情况?它确实应该在振荡器结束后在代码中被处理掉,但这可能只发生在垃圾收集器启动时,在正常情况下不应该经常发生。你的振荡器没有重量,也只是在它的合一事件后死亡。对于AudioContext:和AudioNode: