SlimDX と C# で学ぶ DirectX

トップ 一覧 ソース 検索 ヘルプ RSS ログイン

最終更新時間:2009年04月26日 18時07分22秒

DirectSound と XAudio の違い

DirectX でサウンドを扱うには、(1) DirectSound を使う方法と、(2) XAudio(XAudio2, X3DAudio, XPO)を使う方法の2種類があります。DirectSound は古くから存在するサウンドモデルであり、XAudio は最近登場した新しいサウンドモデルです。

Microsoft では、Windows Vista 以降は DirectSound ではなく XAudio を使用するように推奨しています。

その理由を簡単に言えば、各サウンドカードメーカーの作る DirectSound 用ドライバと Windows との相性が悪かった場合に、Windows まで巻き込んでシステムエラーを出してしまうことが多かったためです。

また、DirectSound が登場した Windows95 の時代に比べてパソコンのCPU性能も飛躍的に向上したため、多数のサウンドのミキシング(合成)や3D加工処理、エフェクト処理などの比較的重たい処理でもサウンドカードに頼らずすべて CPU で行えるようになったことも影響しています。

DirectSound と XAudio の主な違いを以下に示します。

DirectSound XAudio
1. 処理方法 主にハードウェアで処理 主にソフトウェアで処理
2. ストリーム再生 アプリ開発者が自分で作り込む 標準で利用可能
3. サウンドフォーマット PCM PCM / ADPCM / XMA / xWMA
4. 3Dサウンド DirectsSound3D を使用(Vista では機能しない) X3DAudio を使用
5. 再生遅延 少ない(数ミリ〜100ミリ秒) 多い(100ミリ秒〜)

 1. 処理方式

DirectSound では、サウンドカードのハードウェアアクセラレータ(HAL)を使用することができ、サウンドの合成やエフェクトにかかる CPU の処理負荷を低減することができます。ただし、サウンドカードが対応していない機能は HAL を使用することができず、先述したように、Windows ごと巻き込んでシステムエラーを出したり何らかの障害を及ぼすサウンドドライバもまだ存在しているようです。

XAudio では、基本的にソフトウェア(CPU)でサウンド処理を行い、サウンドカードのハードウェアアクセラレータ(HAL)は使用しません。CPU の負荷は上がりますが、XAudio で提供されるすべての機能をサウンドカードに依存せず使用することができます。

 2. ストリーム再生

ここでは、サウンドデータをすべてメモリ上に読み込んでから再生する方式をオンメモリ再生、サウンドデータを小さい単位に分割してサウンドを再生しながら少しずつサウンドデータをメモリに転送する方式をストリーム再生と称しています。

DirectSound では、オンメモリ再生の利用が中心となり、ストリーム再生を自動的に実現する方法は提供されません。従って、ストリーム再生を使用したい場合には、アプリ開発者が自分でメモリ上に小さいバッファを確保し、再生しながら適切なタイミングで随時内容を書き換えていく作業が必要になります。

XAudio ではストリーム再生が自動的に行われるため、ストリーム再生の利用が中心となります。ただし、XAudio が対応しているサウンドフォーマットのみ利用可能です。

 3. サウンドフォーマット

DirectSound では、PCM のみ扱うことができます。mp3 や OggVorbis などのその他のサウンドフォーマットは、Windows ACM(C++用のサウンド変換API)などを用いて、アプリ開発者が自分で PCM に変換する必要があります。

XAudio では、PCM, ADPCM, XMA, xWMA のみ扱うことができます。その他のサウンドフォーマットは使用できません。(DirectSound と同様にアプリ開発者が自分で PCM に変換すれば使うことができますが、その場合は XAudio の提供するストリーム再生機能の恩恵を受けることができず、再生可能なサウンドサイズに厳しい制限が発生します。)

※XAudio でも自力デコードでストリーム再生が可能、という情報もあります。未調査ですんません。(2009.4.26追記)

 4. 3Dサウンド

DirectSound では、DirectSound3D を用いて 3D サウンドを利用可能です。DirectSound3D はサウンドカードのハードウェアアクセラレータ(HAL)の利用を前提としているため、DirectSound HAL の利用が禁止されている Windows Vista 以降では、これをソフトウェアでエミュレートし、2D サウンドに変換して再生しています。よって、Windows Vista 以降では、DirectSound3D を 3D サウンドの再生のために使用することはできません。

XAudio では、X3DAudio を用いて 3D サウンドを利用可能です。HAL を使用していないためサウンドカードの 3D 機能には依存しませんが、3D エフェクトの量に応じてCPU パワーを消費します。

 5. 再生遅延

DirectSound では、サウンドカードのハードウェアアクセラレータ(HAL)を利用可能な場合には、サウンドの再生遅延(レイテンシ)は比較的低く抑えられます。

XAudio では、ソフトウェアで複数のサウンドの周波数変換やミキシング(合成)、3Dエフェクト処理などを行うため、処理量に応じて再生遅延が大きくなります。

いずれの場合も、再生準備の整ったサウンドは順次先読みして加工しておくなどの最適化が行われているため、短いサウンドをシンプルに再生する場合には、DirectSound と XAudio での違いはあまりないようです(?)。


 (補足) 結局どっち?

先に結論を言うと、私もその答えを現在も模索中です。
これから以降は私個人の所感です。

XAudio は新しいモデルであるため機能も豊富であり、DirectSound よりも簡単に複雑な処理を実現できますが、Xbox の影響をうけて再生可能なサウンドフォーマットが限定されていることや、リアルタイム入力による演奏などで比較的大きい再生遅延が発生するなどの欠点は、目的によってはまだまだ許容できる範囲にはありません。

一方 DirectSound は、PCM への変換やストリーム再生をすべて自分で実現しなければならないという欠点がりますが、逆に言えば、PCM に変換可能なすべてのサウンドフォーマットを利用可能です。また、ハードウェアアクセラレータ(HAL)を用いることで比較的低い再生遅延を実現でき、リアルタイム入力に基づく演奏などでは有利となります。

また、DirectSound であってもハードウェアアクセラレータ(HAL)を使用しないサウンドカードがあったり、Windows XP の XAudio では内部的に DirectSound を使ってたりするなどの事情も見られ、あまり両者の違いにこだわっても仕方がないのではないかとも思ったりします。

さらに別の視点として、サウンドに関しては DirectX を使わず、OpenAL や ASIO といった別の標準規格APIを使用することも提言されています。(Windows Vista の XAudio では、内部的に OpenAL が使われています。)

しかし、そこで気を利かせて自分のアプリケーションで複数のサウンド規格を選択できるようにすると、規格の数だけプログラムを組み分ける必要があったり、ドライバの規格の実装方法やCPUパワーの大きさによって再生遅延度合いが変化することでパソコンごとに全く異なる音ズレが生じたりすることもあり、これまた面倒です。

音楽ゲームを作っていると、その辺りは死活問題です。
Microsoft が主導権を握りたいのであれば、その辺りをぜひとも何とかしてほしいと思います。