FlashPlayer10 beta2で音まわりのAPIが変わったみたいです。
FlashPlayer10 beta2を入れてから、ここで公開しているサンプルの音が出なくなっていた。
#というわけで以前のサンプルはbeta2以降では再生不能ですすみません…。
調べてみたら、FlashPlayer10 beta2では音まわりのAPIがちょっと変わってるみたい。
以前は
sound = new Sound(); sound.addEventListener(Event.SAMPLES_CALLBACK, onSamplesCallback); sound.play(); private function onSamplesCallback(e:Event):void { for (var i:int=0; i < 4096; ++i) { sound.samplesCallbackData.writeFloat(Math.random()); sound.samplesCallbackData.writeFloat(Math.random()); } }
みたいな感じだったと思いますが、beta2ではイベント名が「Event.SAMPLE_DATA」に変更され、またイベントも「SampleDataEvent」に変わってました。
「SampleDataEvent」には「data」と「position」というプロパティがあり、この「data」に音のデータを書き込む形に変更になってて、ちょっとコードが見やすくなったような気が。
sound = new Sound(); sound.addEventListener(Event.SAMPLE_DATA, onSamplesCallback); soundChannelObject = sound.play(); private function onSamplesCallback(e:SampleDataEvent):void { //レイテンシを計測 var latency:Number = e.position/44.1 - SoundChannelObject.position for (var i:int=0; i < 4096; ++i) { e.data.writeFloat(Math.random()); e.data.writeFloat(Math.random()); } }
あと、変更になった点として、一度に書き込む波形データの数が、以前は「512〜8192」サンプルまで、くらいだったように思うのですが、これが「2048〜8192」サンプルに変更になった模様。
それと、今回特筆すべきは「SampleDataEvent.position」で、こいつをSoundChannel.positionと比較することで、レイテンシ(音データを書き込んでから実際に音が出るまでの遅延時間)の値をリアルタイムに計測できるようになった。これで音とアニメーション等との同期が少しやりやすくなりそうです! ※計算式は上記コードに。
#あとはネイティブ超速FFTでもつけてくれれば言う事ないんだけど(以下略