Как повторно запустить (подавить) звук с помощью API веб-аудио

Мне любопытно, как я могу сделать что-то, что называется «дросселирование» в 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);
  }

person mdaniels    schedule 23.04.2014    source источник


Ответы (1)


Вы хотите сохранить ссылку на воспроизводимый в данный момент звук. Так что это должно быть доступно за пределами 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;
}

Конечно, есть способы лучше организовать это, но, надеюсь, это поможет вам начать.

person Kevin Ennis    schedule 23.04.2014