RSS Twitter Facebook

2013/01/29 (2013年01月 のアーカイブ)

Audio Data APIシミュレータ

Firefoxの AudioDataAPIのシミュレータを作ってみました。
これを入れるとIEとかOperaとかのオーディオ系APIが使えないブラウザでそれらしい動作をする、というものです。

ブラウザのオーディオ系アプリ環境は充実しつつあるのですが、とにかくIEで動かない事には誰でも使えると言える状態にはならないですね。残念ながらIE10でもまだオーディオAPIはサポートされていないので、結構先の話になってしまいそうなのがもどかしいです。という事でまだ実験的なものですけどやってみました。

Audio Data API仕様

■なぜ今更 AudioDataAPI なのか
すでにFirefoxもWebAudioAPIへの対応を表明していてAudioDataAPIは消え去る運命ですが、WebAudioAPIはかなり規模が大きいので、ちょっと作ってみるというわけには行きません。AudioDataAPIは非常にコンパクトですので、試すにはちょうど良いです。

■構造
 音を出すのはFlash経由でJavascriptのインターフェイスをかぶせてあります。サポートしているのは動的な音の合成で使う3つの関数だけです。oggなどのHTML上のリソースからデータを読むようなインターフェイスはありません。

■仕様など
 ・Flashプラグインがインストールされている必要があります。
 ・サポートしている関数
   mozSetup() 初期化
   mozWriteAudio() データ書き込み
   mozCurrentSampleOffset() 現在の再生位置取得
 ・また音関係ではFloat32Arrayを多用しますがIE9ではサポートされていないため、普通のArrayに割り当てます。さらにバッファの制御で使用するsubarray()はslice()に置き換えていますので、一般的なAudioDataAPI用のスクリプトはパフォーマンスはともかく大体そのまま動作するのではないかと思います。
 ・Flash側の仕様により最終出力は44.1KHzになりますが、リサンプリングしますのでAudioDataAPI側からは48KHzを指定しても構いません。ただし補間など一切しませんのでかなり荒れた音になります。
 ・ステレオのデータを突っ込んでも出力はモノラルになります。

■パフォーマンスなど
 無理やりやっていますので、音がぶつ切れになるなど結構問題があります。ぶつ切れを軽減するためにバッファも大きめですのでレイテンシーも大きくなっています。ActionScript<=>Javascript間のインターフェイス部分がやはりかなりつらいですね。本当はこれの上にさらにWebAudioAPIのレイヤーをかぶせてやりたい所なのですが、努力の割りに悲惨な事になるかも知れません。

■使い方
 ・adapisim.js と adapisim.swf をHTMLと同じ場所におきます。
 ・HTMLのbodyの最初に次の行を追加します。


<script type="text/javascript" src="adapisim.js"></script>

・また、ChromeなどWebAudioAPIをサポートしているブラウザではAudioDataAPIを動かしたくない場合は次の行をその前に入れます。

<script type="text/javascript">adapisim_DisableIfWAAPIAvailable=true;</script>

ファイル:
adapisim.js
adapisim.swf

Flashのソース:
adapisim.as
adapisim.mxml

■使用例
・Mozilla WikiにあるAudioDataAPIのチュートリアル(tonegen)にadapisimを追加したもの
ToneGen

・WebBeeperにadapisimを追加してみました。これはWebAudioAPIがある場合にはそちらを使います。
WebBeeper

■結果
 音を出す事に全力使って凝った事をやらなければなんとかならなくもない、という程度ですかね。
 まあ1行追加するだけで音が出るようになるという意味はあるかも知れません。
 なんとか実用レベルまで逝ければよいのですが、改善の余地があるかどうかはわかりません。

Posted by g200kg : 2013/01/29 18:27:27