Voiceは何ができるかについてのメモ

各々のVoiceは何ができるのか、みたいなのはわかりますが、全般的にどういった機能があるのか。
というのを最近真面目に調べたのでメモ的な気分を含ませて書きます。

そういえば、

krustf:うわー書いてあった。 - 「XAudio2 グラフ内のオーディオ データは、常に、32 ビット浮動小数点 PCM 形式で保存および処理されます」 http://bit.ly/dA8PKC #xaudio2 http://twitter.com/krustf/status/27319164720

という風なことで、XAPOで処理データをもらう際は32bitFloatに変換して処理した方がいいようです。

Voiceは、自身のサンプルレート(以下Input)と出力先のサンプルレート(以下Output)が異なった場合、自動的にサンプルレートを変換する機能を持っています。
この時、注意するのは

  1. Inputは作成時に固定される
  2. Outputが複数存在した場合、それらのVoiceのInputは同じでなければならない

ということです。
題目の横においたMSDNページの末尾には、異なるサンプルレート変換でVoiceをどう挟めばいいのか、という話をしていますが、基本的にSubmixVoiceのInputをすべてMasteringVoiceと同じにしておけば、この辺を深く考える必要はなさそうです。
あと、変換には追加でオーバーヘッドが発生するので*1そこだけは一応頭に入れておきましょう。

どうもその状況にあわせて動作が変わるようですが。
IXAudio2Voice::SetOutputMatrixで出力先のチャンネルをプログラマが制御できます。
もしそれが設定されていなければ、各チャンネルを計算して、出力位置から最も近いスピーカに出力をしてくれるようです。
それ以外の動作として、

  1. 入力がモノラルであったとき、センタースピーカが設定、存在していなければ、ライト/レフトスピーカに送信される。もしそのスピーカもなければ規定の操作で出力。
  2. 入力と出力が6chで、5.1chスピーカに設定されていれば、チャンネルは1:1でマッピングされる。*2

という動作があるようです。

  • 結論のようなよくわからないまとめ

基本的に入出力が1:1の場合でしか動かしてなかったので、サンプルレート変換についての制約は理解できてなかったかも知れないです。
チャンネル数がこっちで指定もできるし、XAudio2に任せることができるのはなんとなく嬉しいかもしれない。
僕がSubmixVoiceを使う動機としてはXAPOを用いて複数の入力に大して一括でエフェクトを計算する、というのが一番大きいのですが。
今回紹介しませんでしたが、X3DAudioと組み合わせることでリスナーとエミッターを設定して3D音響もできるようです。

*1:当然だとは思いますが…

*2:設計に関して混乱したためにこういった設計になったらしい