Генератор audioContext "застревает" через одну секунду и не останавливается - PullRequest
0 голосов
/ 05 августа 2020

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

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);

1 Ответ

0 голосов
/ 05 августа 2020

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

...