我正在使用XAudioJS(https://github.com/taisel/XAudioJS)作为当前项目,我需要执行以下操作:
在mousedown上,应该播放正弦波。我是通过在后台生成正弦波来做到这一点的,当事件被触发时,音量相应地设置为1或0
当用户点击div时,正在播放一系列样本。其他用户输入在此期间暂停
我可以设法独立完成这两项工作,但我无法将它们放在一起。当用户点击div时,会播放音频序列,但首先会播放一些被静音的正弦波
我怀疑它与XAudioJS的缓冲区有关。它不会被清除,因此会播放仍在缓冲区中的正弦波部分。我无法找到一种方法,如何在播放序列之前清除它。
另外,我认为我并不真正理解XAudioJS的缓冲区低和缓冲区高度究竟意味着什么,或者哪些值对性能更好,哪些不是。
这是我给XAudioJS的underRunCallback函数:
var sample = []; // samples for the sample sequence
var samplePos = 0; // counter for samples
var sampleRateUsed = 8000;
var frequencyUsed = 550; //frequency for sine wave
var frequencyCounter = 0;
var counterIncrementAmount = Math.PI * 2 * frequencyUsed / sampleRateUsed;
function underRunCallback(samplesToGenerate) {
//Generate audio on the fly=>
if (samplesToGenerate == 0) {
return [];
}
var tempBuffer = []; // buffer that is returned
// create sine wave on the fly:
if(!isPlaying){
while (samplesToGenerate--) {
tempBuffer.push(Math.sin(frequencyCounter));
frequencyCounter += counterIncrementAmount;
}
return tempBuffer;
}
// NEED TO CLEAR BUFFER HERE
// play sequence of samples:
samplesToGenerate = Math.min(samplesToGenerate, sample.length - samplePos);
if(samplePos == sample.length){ // if all samples of sequence played
input_paused = false; // allow new userinput
isPlaying = false;
xaudioHandle.changeVolume(0); // mute audio
}
if (samplesToGenerate > 0) { // if new slice of samples is needed
tempBuffer = sample.slice(samplePos, samplePos + samplesToGenerate);
samplePos += samplesToGenerate;
return tempBuffer;
} else {
isPlayingB = false;
return [];
}
}