Web Audio API: 停止播放所有预定的声音

Web Audio API: Stop all scheduled sounds from playing

所以我有一堆加载的音频样本,我在下面的代码中调用调度函数:

let audio;

function playChannel() {
    let audioStart = context.currentTime;
    let next = 0;

    for(let i = 0; i < 8; i++) {
        scheduler(audioStart, next);
        next++;
    }
}

下面是音频调度函数:

function scheduler(audioStart, index) {
    audio = context.createBufferSource(); 
    audio.buffer = audioSamples[index];  //array with all the loaded audio
    audio.connect(context.destination);  
    audio.start(audioStart + (audio.buffer.duration * index));
}

它工作正常,可以正常播放预定的声音。

我应该如何 stop/cancel 播放所有预定的声音?

因为现在当我尝试调用 stop() 方法时,它只会停止播放最后安排的声音。

您需要跟踪您在调度程序中创建的 BufferSource 节点,通过索引引用,然后 运行 通过所有这些节点。例如:

var sources = [];

function scheduler(audioStart, index) {
    audio = context.createBufferSource();
    sources[index] = audio; 
    audio.buffer = audioSamples[index];  //array with all the loaded audio
    audio.connect(context.destination);  
    audio.start(audioStart + (audio.buffer.duration * index));
}

function stopAll() {
    for(let i = 0; i < 8; i++)
        if (sources[i])
          sources[i].stop(0);
}