AudioContext をたくさん作る会
やりかた間違っているんだけど、100個のオシレーターを100個の AudioContext で作りたいとき。webkit系(ChromeとOperaで確認した)では上限があって怒られる。
_.range(100).map(function(i) { var ctx = new AudioContext(); var osc = ctx.createOscillator(); osc.frequency.value = i * 20 + 200; osc.start(0); osc.connect(ctx.destination); return osc; }); // SyntaxError: Failed to construct 'AudioContext': // number of hardware contexts reached maximum (6).
なんでシンタックスエラーなのかは分からないけどとにかく上限がある。 Firefoxだと怒られなかったけど音が全然違う。プルルルとダサい音が鳴ってしまう。大丈夫か?Firefox。
_.range(100).map(function() { return new AudioContext(); }); // AudioContext[100]
おっ、これは大丈夫・・
_.range(100).map(function() { return new AudioContext(); }).map(function(ctx, i) { var osc = ctx.createOscillator(); osc.frequency.value = i * 20 + 200; osc.start(0); osc.connect(ctx.destination); return osc; }); // OscillatorNode[100]
これだと動く。なんなんだ...
webkit のソースを確認したところ、new AudioContext() をしたときに、ここ で上限をチェックしているのだけど、実際に初期化されるのは ちょっと遅れる みたいで、とりあえず最初に AudioContext だけを大量に生成するとチェックをすり抜けてしまう。