如何在XAudioJS中清除缓冲区

时间:2016-01-10 18:56:24

标签: javascript audio web web-audio

我正在使用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 [];
    }
}

0 个答案:

没有答案