调度Web Audio Api播放,多个播放问题

时间:2015-10-03 22:11:08

标签: javascript audio web-audio

我正在尝试安排蜂鸣声播放3x一秒钟。但是,声音只播放一次。有关为什么会这样的任何想法? (它包含在声明上下文等的更大的javascript函数中。)

var beepBuffer;

var loadBeep = function() {		
	var getSound = new XMLHttpRequest(); // Load the Sound with XMLHttpRequest
	getSound.open("GET", "/static/music/chime.wav", true); // Path to Audio File
	getSound.responseType = "arraybuffer"; // Read as Binary Data
	getSound.onload = function() {
		context.decodeAudioData(getSound.response, function(buffer){
			beepBuffer = buffer; // Decode the Audio Data and Store it in a Variable
		});
	}
	getSound.send(); // Send the Request and Load the File
}

var playBeep = function() {
	for (var j = 0;j<3;j++) {
		var beeper = context.createBufferSource(); // Declare a New Sound
		beeper.buffer = beepBuffer; // Attatch our Audio Data as it's Buffer
		beeper.connect(context.destination);  // Link the Sound to the Output
		console.log(j);
		beeper.start(j); // Play the Sound Immediately
}
};

2 个答案:

答案 0 :(得分:0)

您的代码假定beeper.start(j)是同步方法,即它等待声音完成播放。情况并非如此,因此您的循环可能几乎在同一时间播放所有3个实例。

一种解决方案是通过将时间参数传递给start()方法来延迟每个实例的播放:

var numSecondsInBeep = 3;
for (var j = 0; j < 3; j++) {
    var beeper = context.createBufferSource(); // Declare a New Sound
    beeper.buffer = beepBuffer; // Attatch our Audio Data as it's Buffer
    beeper.connect(context.destination); // Link the Sound to the Output
    console.log(j);
    beeper.start(context.currentTime + j * numSecondsInBeep);
}

See here了解有关play() API的更多信息。

答案 1 :(得分:0)

关闭 - 而另一个答案的代码将起作用 - 但这不是同步性,而是你不是在询问context.current时间到开始时间。 Start()不会从“now”获取偏移 - 它需要一个绝对时间。将context.currentTime添加到start param,你应该很好。