Осциллятор audioContext «зависает» через одну секунду и не останавливается

Я хочу создать осциллятор, который запускается и останавливается, когда пользователь нажимает клавишу (сейчас просто пробел). Но если клавиша нажата слишком долго, где-то секунду - осциллятор застревает и не останавливается();

let signal = {}

class Beep {
    constructor() { 
        this.audioCtx = new window.AudioContext();
        this.osc =      this.audioCtx.createOscillator();
        this.gainNode = this.audioCtx.createGain();

        this.gainNode.connect(this.audioCtx.destination);
        this.osc.connect(this.gainNode);
        signal.beep = this;
    }
}

function startTransmission(e) {     
    if(e.keyCode == 32) {
        let b = new Beep();
        signal.beep.osc.start();
    }
}

function stopTransmission(e) {      
     if(e.keyCode == 32) {
          signal.beep.osc.stop();
     }
}

document.body.onkeydown = (e) => startTransmission(e);
document.body.onkeyup = (e) => stopTransmission(e);

person ADN    schedule 05.08.2020    source источник


Ответы (1)


Нашел решение, если кому-то интересно... Проблема в том, что onKeyDown запускает новый экземпляр, пока он нажат. Таким образом, функция создает новый объект «Beep» ПОВЕРХ существующего. Таким образом, когда срабатывает функция «stopTransission», она останавливает только последний осциллятор, оставляя работать остальные под ним.

Способ преодоления этого заключается в создании флага, который переключается с «ложь» на «истина», как только создается первый осциллятор, а затем не позволяет функции создавать больше осцилляторов. Затем этот флаг должен быть сброшен на «false», когда функция запускается при нажатии клавиши.

person ADN    schedule 05.08.2020