2016-03-23 4 views
0

ドキュメントによると、AudioContextはページごとに1回だけ呼び出す必要があります。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

本当に 'gain.gain.doThings()'を呼びますか?それは有効ではありません。 –

+0

ああ、6番目のコンテキストでエラーが発生するため、6つの同時コンテキストがあるChromeを実行している可能性があります。 GCを実行するには時間がかかります。 –

+0

私は質問している質問を明確にするために質問を更新しました。私はdoStuff()を呼び出さなかったので、私はすべてを含まないことでコードを単純化しようとしていました。そして6番目のエラーは問題ではない、私は誤った使い方であることを知っている。私の問題は、文字通り黙って失敗しているということです。 – iquestionshard

答えて

0

私自身の問題が見つかりました。それは間違いなく愚かな間違いでした。この行に問題がありました

gain.gain.linearRampToValueAtTime(1, time); 

context.currentTimeを基準にして一度にゲインを1に設定していませんでした。

AudioContextが関数内で定義されたときに正しく動作していたのは、 'currentTime'が0でカウントを開始し、問題のオシレータにまだ影響を及ぼしていたからです。

関数から移動されたとき、linearRamptoValueAtTime()が何らかの影響を及ぼす時間をはるかに超えていました。 context.currentTimeを追加するだけでOKです。

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