我假设您的代码中有一个函数可以播放AudioBufferSourceNode 并创建一个StereoPannerNode。也许它看起来像这样:
function playAudioBuffer (audioContext, audioBuffer) {
const audioBufferSourceNode = new AudioBufferSourceNode(audioContext, { buffer: audioBuffer });
const sterePannerNode = new StereoPannerNode(audioContext);
audioBufferSourceNode
.connect(sterePannerNode)
.connect(audioContext.destination);
audioBufferSourceNode.start();
}
您可以定义一个可在该函数内部访问的变量,并保存对所有活动 AudioNode 的引用。
const activeAudioNodes = [ ];
这只是一个数组。您可以使用由AudioBufferSourceNode 触发的ended 事件来管理它。您的 playAudioBuffer() 函数将如下所示:
function playAudioBuffer (audioContext, audioBuffer) {
const audioBufferSourceNode = new AudioBufferSourceNode(audioContext, { buffer: audioBuffer });
const sterePannerNode = new StereoPannerNode(audioContext);
audioBufferSourceNode
.connect(sterePannerNode)
.connect(audioContext.destination);
audioBufferSourceNode.start();
const audioNodes = { audioBufferSourceNode, sterePannerNode };
activeAudioNodes.push(audioNodes);
audioBufferSourceNode.onended = () => {
audioBufferSourceNode.disconnect();
sterePannerNode.disconnect();
activeAudioNodes.splice(activeAudioNodes.indexOf(audioNodes), 1);
};
}
activeAudioNodes 数组将保存对每个正在播放的AudioNode 的引用。