AudioContext Oscillator не будет воспроизводиться более одного раза

Я знаю, что вы не можете использовать осциллятор более одного раза, поэтому я написал функцию, которая каждый раз создает новый:

function playFrequency(f, t0, t1){
    console.log(f, t0, t1);
    var oscillator = self.audioContext.createOscillator();
    oscillator.type = "square";
    oscillator.frequency.value = f;
    oscillator.connect(self.audioContext.destination);
    oscillator.start(t0);
    oscillator.stop(t1);
}

Но странно то, что функция на самом деле воспроизведет звук только один раз. Я не могу понять, почему это происходит. Разве я не создаю новый осциллятор каждый раз, когда вызываю функцию?

Когда я создаю функцию "playFrequency2(f, t0, t1)" с точно таким же кодом, она будет воспроизводить звук даже после того, как первая функция воспроизвела звук. Но он не будет воспроизводить звук, когда я вызываю его во второй раз.


person 3jfx    schedule 24.06.2015    source источник


Ответы (1)


Ваша проблема в том, что start раз вы переходите к своей функции. Время начала рассчитывается из audioContext currentTime, которое начинается, когда создается audioContext, и с этого момента продолжается движение вперед. Поэтому, когда вы начинаете свой первый звук, например, с 0, а затем заканчиваете его с 3, ваш audioContext будет продолжать работать после этого. Поэтому, если вы вызываете новый звук с одинаковыми аргументами времени, он не будет воспроизводиться, потому что ваше start время раньше currentTime. Вы можете изменить это следующим образом:

function playFrequency(f, t1){
    console.log(f, t0, t1);
    var oscillator = self.audioContext.createOscillator();
    oscillator.type = "square";
    oscillator.frequency.value = f;
    oscillator.connect(self.audioContext.destination);
    oscillator.start();
    oscillator.stop(self.audioContext.currentTime+t1);
}
person Julien Grégoire    schedule 24.06.2015