Twitterでもつぶやいたのだけれど、下記記事がWASAPIの概要がとてもよくまとまっているので紹介。
楽しいハック講座 (4) Windows7 オーディオアーキテクチャの概要
僕は実はビットパーフェクトにはあまり興味がなくて、低レイテンシな部分にスコープしている。レイテンシのほうがリアルタイム・サウンドプロセッシングにとって重要なので。なので注目したのは下記の部分
オーディオエンジンとエンドポイントバッファの間の部分がイベント駆動に対応しました。(中略)Win7 ではエンドポイントバッファが空になったときだけデバイスドライバから割り込みがかかり、オーディオエンジンがオーディオサンプルをエンドポイントバッファに書き込むようになりました。当然ながら、この機能にはオーディオデバイス側の対応が必須です。Vista 時代ではこの部分が Vista Certified ロゴの必須要件ではなかったため、オーディオエンジン側もポーリングで実装せざるを得ませんでした。ポーリングでは、エンドポイントバッファが空でなくても割り込みが発生してしまうのと、余裕を持って書き込む必要があるためバッファを小さくできないので、消費電力が大きくレイテンシも長いという二重苦になっていました。Win7 ではこの問題を解決したので、Vista と比較して、共有モード WASAPI アプリケーションにおける消費電力が小さく、また、レイテンシも短くなっています。
あと、排他モードに関する下記の記述。
ユーザーモードのメモリ空間に存在するオーディオサンプルを、(デバイスドライバが触れる)カーネルモードのメモリ空間に直接マッピングすることによって、それらの間のコピーが不要となっている、というものです。また、今バッファ上のどの位置をハードウェアが再生しているかを示すポジションレジスタも同様にマッピングされ、アプリケーションが WASAPI を通じて直接参照できるようになっています。排他モードが低レイテンシなのはなぜ?に対する答えがようやく得られた。私がよく開発ドキュメントを読んでないだけかもしれないが。
しかし巷では「特別なデバイスドライバでなくても低レイテンシなサウンドを得られる」という触れ込みのWASAPIだけど、ドライバが下記要件を満たしていないと保証されないのね。
- UAA 準拠 (UAA: Unified Audio Architecture)
- デバイスベンダー提供のWaveRT ミニポートドライバを使用し、かつ、そのドライバが Windows7 Certified ロゴを取得している場合