崩壊 - DirectSound が Direct でなくなった日

 Windows 95/98/2000 辺りまで、ゲームのサウンドと言えば DirectSound 一択でした。

 他の DirectX API と同様に、Windows の重たく低品質な仲介を経ることなくサウンドデバイスをダイレクトに扱えるようにすることで、扱いは多少面倒になりましたが、それでも高速・高品質かつ低レイテンシ(重要)なサウンドプログラミングが可能でした。

 2007年。
 Windows Vista の登場により、その状況が一変します。

 DirectSound が Direct でなくなった日。

ハードウェアからソフトウェアへ

 Windows Vista では、サウンド関連で大きな2つの変化がありました。

 1つは、Windows におけるサウンド(オーディオ)の機能が標準化されたこと。
 そしてもう1つは、標準化の際に DirectSound の主要なハードウェアアクセラレーションが禁じられたことです。これには 4gamer さんも大激怒。

【参考】
[特集]Vista買うのはまだ早い!(3)ゲームサウンド編 - 4gamer.net

 DirectSound は、あまりに Direct 過ぎました。
 カーネルモードで直接ハードウェアを操作するので、DirectSound がこけたら Windows も一緒にこけました。このような事態を防ぐために、2002 年からひっそりと策定が進められていた UAA(Universal Audio Architecture)なるものが Windows Vista に導入され、標準化の名の下に、サウンドデバイスメーカーがカーネルモードでサウンドハードウェアを好き勝手に操ることが禁止されてしまいました。具体的には、メーカーはユーザモードのドライバだけを提供し、カーネルモードのドライバには Microsoft が提供するものを使用することが強制されました。

 メーカーにとっては自前のハードウェアを自由にいじれないため他との差別化がかなり難しくなってしまうのですが、何しろ UAA に準拠しないと "Certified for Windows" ロゴがもらえないようになってしまったので、メーカーはこれに従うしかありません。

「Windows のサウンドは、専用のハードウェアではなく汎用のソフトウェアで処理する時代になった。CPU の性能は年々向上し、今やその要件を十分に満たしている」と、Microsoft 関係の誰かが言っていたような気がしました。が、ソースは見つけられませんでした。

 そしてここからが本題です。

重なるレイテンシ

 DirectSound は、Windows Vista 以降の新しいサウンドAPI である WASAPI(Windows Audio Session API)共有モードの上に乗っかる形で再編成されることになりました。

 WASAPI 共有モードでは、Windows 全体のあらゆるサウンドをソフトウェアで一括してミキシングするため、長めのレイテンシが生じます。現在では改善されているものの、当初のレイテンシはおおむね 20~50㎳ といった感じでした。

 そして、DirectSound 自身のソフトウェアミキシングのレイテンシが WASAPI の上に加わり、最終的に、DirectSound を使って音を出すと100㎳ を超えるレイテンシさえ発生するようになりました。名機 Sound Blaster の誇るハードウェアミキシングも当然封印されました。(※現在ではハードウェアミキシングを使う方法も提供されているようなのですが、Microsoft のサイトにはっきりとした説明は記述されていないようで、あまりよく分かりません。)

 DTXMania は何もコードを変えていないのに、Windows の事情で音ズレが一気に悪化したのです。

新しいサウンドAPIへ

 DTXMania では、Windows Vista 以降のパソコンのために、DirectSound 以外のサウンド API への対応を進めることになりました。具体的には、WASAPI と ASIO(Audio Stream Input Output)です。

 その上で、WASAPI は利用できないけれどもまだまだ利用者の多かった Windows XP のために、DirectSound を使う選択肢もオプションとして残すことになりました。そもそも Windows XP では DirectSound が相変わらず Direct でいられたので、無理にソフトウェアベースの新しい API に切り替える必要はなかったのです。

 そして、例によって音ズレの原則に従い、WASAPI で作成した譜面を ASIO や DirectSound に切り替えて演奏するだけで、見事なまでに音ズレが発生することになるのです。