何故、XAudio2なのか

「dxlibのサウンドが使いづらいので自作のXAudio2のドライバ使ってもいいですか」的なポストをしたら、
「そのドライバ使うと良い事あるの?」と訊かれたのでどちらかというとXAudio2を使うメリットの話をします。

DirectSoundを使った記憶がないのでもしかしたらそれ関連で間違えたこと言うかもしれません。
適宜読み替え、ご指摘ください。

  • ボイスという考え方

XAudio2では、サウンドを『ボイス』という概念とインターフェイスを用いて統一的に管理します。
ボイスの開始点である『ソースボイス』、エフェクトなど接続されている複数のボイスへ一斉に何らかの操作を行なえる『サブミックスボイス』、全てのボイスの終着点であり、サウンドデバイスが実際に再生するデータを作成してサウンドデバイスへ送信する『マスターボイス』、これら3つのボイスインターフェイスを用いてサウンドを操作します。
マスターボイスは複数個存在していても実際に機能するのは1つだけ、という制約があります。これはマスターボイスがサウンドカードへデータを送信して再生を実行していることから分かると思います。
ソースボイスは再生したい音声データ1つにつき1つ以上作成する必要があります。これは爆発音など、同時多発的に様々な場所で鳴らすサウンドがあるため1つ以上になっています。
サブミックスボイスは適宜幾つでも作成可能です。例えばBGM用のボイス管理に1つ、SE用のボイス管理に1つ、またその2つのサブミックスボイスを纏めて操作するために1つといったような構成が可能だったりもします。
ソースボイスとサブミックスボイスは作成時のデフォルトでマスターボイスへ直接データを流す設定になっています。これを別のサブミックスボイスへ切り替えることで複数の音へいっぺんにエフェクトなどを適用できるようになっています。

  • ソースボイスがサウンドの始まり

ソースボイスはボイスの開始点であるといいましたが、ソースボイス以外にサウンドデータを送信するインターフェイスはありません。
『開始点』となっているのは、XAudio2がデフォルトでストリーミング再生になっているからではないでしょうか。DirectSoundでは、専用のバッファを作成してそのバッファへ書き込んでから再生というちょっと面倒な仕様になっていたと思います。
しかし、XAudio2では適当にメモリ上にバッファを用意して、そこにデータを書き込み、バッファの先頭ポインタとそのサイズを渡して再生するだけという簡単なものです。
「デフォルトでストリーミング再生になっている」という説明に私も踊らされました。DirectShowの再生みたいな形でほぼ自動化してくれるのかと思っていましたが、そういうことではなく、DirectSoundのように専用のバッファへ書き込まないと再生できない欠点を解消した、というようなものです。*1
なので、私たちが普段言っているストリーミング再生は別途実装なのですが、DirectSoundに比べて非常に簡単になっています。ボイスの処理方式がキュー形式になっていて、キュー1つの処理が終わると終了通知を出したりできるように専用のインターフェイスを作って、それを継承して独自実装させる仕組みができていますからストリーミング再生の基本部分はそこまで長くなることはありません。
向こうが基本的な仕組みを用意してくれたので、それに則ってやるだけでストリーミング再生の実装はDirectSoundのそれに比べて非常に楽になります。*2

  • サブミックスボイスで複数個に行なう処理を1回で

ただサウンドを流すだけだったらソースボイスを作ってマスターボイスへデータを送信するだけです。わざわざサブミックスボイスを作成する必要もありません。
サブミックスボイスが真価を発揮するのはエフェクト利用だと思います。違うAPIになりますが、XAPOというエフェクト作成用APIが存在します。XAudio2と連携して様々なエフェクトを作れるようになっているわけです。
簡単な例で言うならば例えばフェードエフェクトなどは恐らくサウンド全体へかける必要があるでしょう。しかし、これをいちいちソースボイス全てにかけるのは非常に面倒です。ソースボイスが沢山あればあるほど非常に辛い作業になると思います。
ここで、全てのソースボイスのデータ送信先を1つのサブミックスボイスへ設定させ、そのサブミックスボイスにフェードエフェクトを適用するとどうなるでしょうか。サブミックスボイスへの操作1つで解決です。おめでとうございます。こんな感じでエフェクトを統一管理できるようにするものがサブミックスボイス、という訳です。

  • XAudio2の問題点、というか不満
    1. ハードウェアからソフトウェア処理に変わったため、CPU負荷が多少上がった
    2. MIDIが再生できなくなった*3
    3. DirectSoundでできていたパン設定やら再生速度設定が簡単にはできなくなった*4
    4. XP以降の対応になってしまった

という感じです。ちょっと面倒だったのではしょった感がありますが。
1つずつ解決すると、
CPU負荷が上がったといっても、常識の範囲内で使用する程度ならば負荷が異常にかかることはないと思います。同じ音を再生する場合であれば最適化が働くので大丈夫です。
ユーザの使用しているPC依存になるので、MIDIをそのまま再生できなくても問題ないかと。
そのうち改善してくれると信じているんですが、エフェクトを自作すればパン設定などの問題は解決できると思います。
XP以降しか対応できなくなってしまったのはちょっとした不満ですが、恐らく今時のゲームユーザならば最低限XPにはしているんじゃないでしょうか。むしろ最新の3Dゲームをやる為に7にしている人も多いかもしれない。同人ゲームをやる人だったら微妙なのですが…。DirectSoundは既に非推奨機能になっていますが、互換性を残す為、Vista以降3Dサウンド以外はエミュレーションで再生可能になっています。Vista以降で3Dサウンド使う場合はX3DAudioという3Dサウンド専用APIを用いる必要がでてきます。DirectSound3Dの代わりになるAPIですね。

  • 長くなりましたが…

XAudio2を何故使うのか、という話よりも駆け足でXAudio2とは何か、みたいな話になってしまった気がしますが、どちらかというと向こうの都合でDirectSoundが使えなくなってきた気がしますね。
こっちとしては向こうの都合など知ったことではないのですが、代わりにこれまでよりも強力なAPIを作ってもらいました。どうもMSではサウンド周りの作成に意欲的じゃない感じが出ているようで、微妙に中途半端な完成度になっている気がします。
しかし、向こうの方針通りにいくとそのうちDirectSoundは完全に使えなくなる可能性もあり*5、このままDirectSoundを使い続けるのも面白くありません。
これからサウンド周りのAPIを勉強するという方は、是非XAudio2を学ぶことをオススメします。
ちょっとネット上に資料が少ない気がするのですが、MSDNのサンプルで大体の簡単な操作はいけるはずです。これからもこのブログで簡単な操作程度は教えていきたいと思います。

※追記
2010/07/05 記述ミスがあったので更新。

*1:ボイスの再生方法自体がストリーミング再生、というのが分かりやすいかもしれない

*2:独自に作るのが楽しい、という人も居ると思いますが…

*3:たしか、DirectSoundをラップしたDirectMusic辺りで再生できていたはずです

*4:再生速度設定自体はソースボイスだけ設定可能になりました

*5:既に3DサウンドはVista以降使えません