2016-03-23 2 views
0

Gemäß der Dokumentation sollten Sie AudioContext nur einmal pro Seite aufrufen.AudioContext erzeugt keinen Ton, wenn er außerhalb einer Funktion definiert ist.

Wenn ich versuche, es korrekt zu verwenden und es außerhalb der Funktion aufzurufen, wird kein Ton ausgegeben. Die Kontextvariable ist definiert und gefüllt, es werden keine Fehler in der Konsole ausgegeben, es wird nur kein Sound erzeugt.

Wenn ich es innerhalb einer Funktion aufrufen, die jedes 'onClick' -Ereignis aufgerufen wird, funktioniert es zunächst, aber ich erstaunt beim 6. Mal, wenn ich es aufruft, da ich die Grenze der Zeiten erreicht habe, die ich aufrufen kann.

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(...); 
    }); 
}; 

Warum wird durch das Verschieben der Instanziierung der Kontextvariablen mein Browser (Chrome) daran gehindert, Ton zu erzeugen?

+0

Rufen Sie wirklich do 'gain.gain.doThings()'? Das ist nicht gültig. –

+0

Oh, und da Sie im 6. Kontext einen Fehler erhalten, wird wahrscheinlich Chrome ausgeführt, das auf 6 gleichzeitige Kontexte beschränkt ist. Es dauert einige Zeit, bis sie erkannt werden. –

+0

Ich habe meine Frage aktualisiert, um die Frage zu klären, die ich stelle. Ich habe doStuff() nicht aufgerufen, ich habe versucht, meinen Code zu vereinfachen, indem ich nicht alles einbezog. Und der 6. Fehler ist nicht das Problem, ich weiß, dass das die falsche Verwendung ist. Mein Problem ist, dass die korrekte Verwendung wortwörtlich fehlschlägt. – iquestionshard

Antwort

0

Ich habe mein eigenes Problem gefunden. Es war nicht überraschend, dass es ein dummer Fehler war. Das Problem war, mit dieser Linie

gain.gain.linearRampToValueAtTime(1, time); 

Ich war die Verstärkung zu 1 zu einer Zeit, in Bezug auf die context.currentTime nicht einstellen.

Der Grund, warum es korrekt funktionierte, als AudioContext in der Funktion definiert wurde, war, dass 'currentTime' bei 0 zu zählen beginnt und nahe genug war, um den fraglichen Oszillator zu beeinflussen.

Wenn es aus der Funktion verschoben wurde, war die Zeit weit hinter dem Bereich, in dem die linearRamptoValueAtTime() irgendetwas beeinflussen würde. Fügen Sie einfach context.currentTime hinzu, und alles wird in Ordnung sein.

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