Audio 如何使用web音频api重新触发(扼杀)声音

Audio 如何使用web音频api重新触发(扼杀)声音,audio,web-audio-api,Audio,Web Audio Api,我很好奇我怎么能在网络音频api中做一个叫做“扼杀”的事情。当我使用某个键播放声音时,如果再次按下该键,我希望它停止声音并再次播放。你知道怎么做吗 到目前为止,我的代码是: $(document).on("keydown", function(e) { console.log(e); switch (e.keyCode) { case 81: // Q playKick(BUFFERS.kick); break; } }) function play

我很好奇我怎么能在网络音频api中做一个叫做“扼杀”的事情。当我使用某个键播放声音时,如果再次按下该键,我希望它停止声音并再次播放。你知道怎么做吗

到目前为止,我的代码是:

    $(document).on("keydown", function(e) {
console.log(e);
switch (e.keyCode) {
    case 81:  // Q 
        playKick(BUFFERS.kick);
    break;
}
})

function playKick(instrument) {
    source1 = context.createBufferSource();
    source1.buffer = instrument;
    source1.loop = true;
    source1.connect(context.destination);
    if (!source1.start)
      source1.start = source1.noteOn;
    source1.start(0);
  }

您希望保留对当前播放声音的引用。因此,这需要在
playKick
的范围之外提供。然后,在
playKick
中,在创建新声音并将其分配给该全局变量之前,对旧声音调用
stop
noteOff

比如:

var current;

$(document).on('keydown', function( e ) {
  console.log(e);
  switch (e.keyCode) {
    case 81:
      playKick(BUFFERS.kick);
    break;
  }
});

function playKick( instrument ) {
  var source = context.createBufferSource();
  source.buffer = instrument;
  source.loop = true;
  source.connect(context.destination);
  if ( current ) {
    if ( !current.stop ) {
      current.stop = current.noteOff;
    }
    current.stop(0);
  }
  if ( !source.start ) {
    source.start = source.noteOn;
  }
  source.start(0);
  current = source;
}
当然,有更好的方法来组织这件事,但希望这能让你开始