我创建了一段似乎可以同时播放声音文件的代码,但是,我不确定这是否是最好的方法。
本质上,我正在尝试创建简单的网络钢琴,以后可能会在游戏中使用这种方法。结果非常完美。除了键盘组合限制外,我可以毫无问题地弹奏和弦。如果我要将var request = new XMLHttpRequest();
移到函数之外,使其成为一次调用全局变量,那么声音不会像现在一样同时播放。
document.onkeydown = function(key)
{
if(pitch[key.keyCode]!==undefined)
Voice(pitch[key.keyCode]);
}
function Voice(pitch)
{
var source = audioCtx.createBufferSource();
var request = new XMLHttpRequest();
request.open("GET","sample.wav",true);
request.responseType = "arraybuffer";
request.send();
request.onload = function()
{
var audioData = request.response;
audioCtx.decodeAudioData(audioData, function(buffer)
{
source.buffer = buffer;
source.playbackRate.value = pitch;
source.connect(audioCtx.destination);
source.start(0);
},
function(e)
{
console.log(e);
});
}
}
我唯一关心的是代码是否用新功能填充了内存。就像样本播放完毕一样,仍然有source
,request
,audioData
以及介于两者之间的所有功能会无限期地在内存中浮动。
因此,如果垃圾回收没有处理好,那么找出样本实例何时播放并从内存中手动删除该特定“对象”的最佳方法是什么?