2016-03-23 3 views
0

В соответствии с документацией вы должны вызывать AudioContext только один раз на страницу.AudioContext не создает звук, если он определен вне функции

Когда я пытаюсь использовать его правильно и вызывать его вне функции, звук не создается. Переменная контекста определена и заполнена, в консоль не попадают ошибки, она просто не создает звук.

Когда я вызываю его внутри функции, которая называется каждым событием onClick, она изначально работает, но я, неудивительно, получаю ошибку в 6-й раз, когда я ее вызываю, так как я достиг предела времени, я могу вызвать его.

var context = new AudioContext; //when defined here, no sound is produced 

function playChord() { 
    var context = new AudioContext; //when defined here, sound is produced (only 6 times) 

    var time = 0.05; 
    var frequencies = [...]; 
    frequencies.forEach(function(frequency) { 
     var oscillator = context.createOscillator(); 
     var gain = context.createGain(); 

     gain.gain.setValueAtTime(0, audioContext.currentTime); 
     gain.gain.linearRampToValueAtTime(1, time); 
     gain.gain.linearRampToValueAtTime(0, time + 60*0.25); 

     oscillator.frequency.value = frequency; 
     oscillator.connect(gain); 
     gain.connect(context.destination); 

     oscillator.start(...); 
     oscillator.stop(...); 
    }); 
}; 

Почему просто перемещение экземпляра контекстной переменной останавливает мой браузер (хром) от создания звука?

+0

Вы действительно называете do? Gain.gain.doThings() '? Это неверно. –

+0

О, и поскольку вы получаете ошибку в 6-м контексте, вы, вероятно, используете Chrome, у которого есть ограничение на 6 одновременных контекстов. Для их GC требуется некоторое время, чтобы вы столкнулись с лимитом. –

+0

Я обновил свой вопрос, чтобы уточнить вопрос, который я задаю. Я не вызывал doStuff(), я пытался упростить свой код, не включая все. И 6-я ошибка не является проблемой, я знаю, что это неправильное использование. Моя проблема в том, что правильное использование буквально бесшумно. – iquestionshard

ответ

0

Нашел свою собственную проблему. Неудивительно, что это была глупая ошибка. Проблема была с этой линией

gain.gain.linearRampToValueAtTime(1, time); 

Я не устанавливало усиление на 1 в момент времени по отношению к context.currentTime.

Причина, по которой он работал правильно, когда AudioContext был определен внутри функции, состоял в том, что «currentTime» начинает отсчет в 0 и был достаточно близок, чтобы по-прежнему влиять на осциллятор, о котором идет речь.

Когда он был перемещен из функции, время прошло далеко за пределы диапазона, в котором linearRamptoValueAtTime() повлияет на что-либо. Просто добавьте context.currentTime, и все будет нормально :)

gain.gain.linearRampToValueAtTime(1, context.currentTime + time); 
gain.gain.linearRampToValueAtTime(0, context.currentTime + time + 0.25);