Microsoft DirectX 8.0 (C++) |
VxD ドライバ モデルでは、DirectSound のすべてのミキシングは、仮想デバイス ドライバ Dsound.vxd で処理される。Dsound.vxd は、サウンド カードがホスト CPU からデータを受信するために使用する実際の DMA バッファへのアクセスも提供する。これは DirectSound プライマリ バッファと同じである。DirectSound アプリケーションは、サンプリング レートやビット深度など、プライマリ バッファの特定のプロパティを設定することができ、したがってハードウェア自体のプロパティも変更できる。
Windows Driver Model (WDM) では、DirectSound は、ハードウェアによってアクセラレートされたバッファの場合を除いて、サウンド バッファに直接アクセスしない。その代わりに、DirectSound はカーネル ミキサ、つまり Kmixer と通信する。Kmixer の役割は、複数のオーディオ ストリームのフォーマットを共通のフォーマットに変換し、これらをミキシングして、その結果をハードウェアに送信することである。つまり、Dsound.vxd が行っていた処理を行っている。大きな違いは、Dsound.vxd が DirectSound バッファのデータだけをミキシングするのに対して、Kmixer は、Win32 waveOut 関数を使うアプリケーションからのデータを含む、すべての Windows オーディオ データをミキシングすることである。DirectSound とウェーブフォーム オーディオ出力デバイスを同時にオープンできないという規則は、WDM ドライバを使用するシステムには当てはまらない。
Kmixer とオーディオ ハードウェアとの関係は特に重要である。Kmixer は、システム上で、ハードウェアの DMA バッファのフォームを指定できる唯一のソフトウェアである。Kmixer は、ミキシングを要求されたサウンドに基づいてフォーマットを選択する。出力フォーマットは、ミキシングを要求されたサウンドの最高品質のフォーマットか、ハードウェアでサポートされている、それに最も近いフォーマットに設定される。
これは、とても重要な意味を持っている。DirectSound では、ハードウェアの DMA バッファのフォーマットを設定できないということである。アプリケーションでは、ハードウェア フォーマットは実際に演奏されるデータに基づくことを意味する。44 kHz のファイルを再生する場合、Kmixer は最大 44 kHz のすべてのデータをミキシングし、ハードウェアが 44 kHz で実行されていることを確認する。
アプリケーション開発者は、使用されるドライバ モデルを選択しない。ドライバ モデルは、サウンド カードの種類、Windows のバージョン、ユーザーがインストールしている特定のドライバによって決まる。このような理由から、アプリケーションをテストするときに、すべての可能性を調べておくことが重要である。DirectSound は Dsound.vxd を使用する場合もあれば、Kmixer を使用する場合もあるので、アプリケーションの動作および性能がいずれの場合も許容できるものであることを確認しなければならない。