Microsoft DirectX 8.0 (C++)

協調レベル

Windows はマルチタスク環境なので、複数のアプリケーションが任意の時点で同じデバイス ドライバを使って動作することがある。DirectX は協調レベルを使って、各アプリケーションが不適切な方法または不適切なタイミングでデバイスにアクセスしないことを保証する。DirectSound の各アプリケーションは、デバイスに対して認められるアクセス範囲を決定する 1 つの協調レベルを持つ。

DirectSound オブジェクトを作成した後で、サウンドを再生する前に IDirectSound8::SetCooperativeLevel メソッドを使ってデバイスの協調レベルを設定しなければならない。

次の例では、IDirectSound8 インターフェイスによって表される DirectSound デバイスの lpDirectSound での協調レベルを設定している。hwnd パラメータは、アプリケーション ウインドウへのハンドルである。

HRESULT hr = lpDirectSound->SetCooperativeLevel(hwnd, DSSCL_PRIORITY);

DirectSound では、DSSCL_NORMAL、DSSCL_PRIORITY、および DSSCL_WRITEPRIMARY の値で表される 3 つのサウンド デバイスの協調レベルを定義している。

  DirectX 8.0 以前のバージョンで利用可能であった協調レベル DSSCL_EXCLUSIVE は廃止された。DirectX アプリケーションでほかのアプリケーションをミュートすることはできなくなった。排他的レベルを要求するアプリケーションには、代わりに優先レベルが付与される。

標準協調レベル

標準協調レベルでは、アプリケーションは、プライマリ サウンド バッファのフォーマットの設定、プライマリ バッファへの書き込み、デバイスのオンボード メモリの圧縮が行えない。この協調レベルを使うすべてのアプリケーションは、22kHz、ステレオ サウンド、8 ビット サンプリングのプライマリ バッファ フォーマットを使うので、デバイスはアプリケーション間で最も円滑に切り替えられる。

優先協調レベル

優先協調レベルで DirectSound デバイスを使うと、アプリケーションはハードウェア ミキシングなどのハードウェア リソースに対して最高の権限を確保し、プライマリ サウンド バッファのフォーマットの設定、デバイスのオンボード メモリの圧縮を行える。

ゲーム アプリケーションは、ほとんどすべての環境で優先協調レベルを使用する。このレベルは、サンプリング レートとビット深度に対するアプリケーション制御を可能にしながら、最も強力に動作する。また、優先協調レベルでは、IP テレフォニなどのほかのアプリケーションからのオーディオをゲームからのオーディオと共に聞くこともできる。

書き込み優先協調レベル

最上位の協調レベルは書き込み優先である。この協調レベルで DirectSound デバイスを使うと、アプリケーションはプライマリ サウンド バッファに直接アクセスできる。このモードでは、アプリケーションはプライマリ バッファに直接書き込みを行わなければならない。この書き込み中は、セカンダリ バッファを再生できない。

プライマリ バッファ内のオーディオ サンプルに直接書き込みのアクセスをするには、アプリケーションを書き込み優先レベルに設定しなければならない。アプリケーションがこのレベルに設定されていない場合、IDirectSoundBuffer8::Lock メソッドの呼び出しはすべて失敗する。

書き込み優先協調レベルに設定されたアプリケーションがフォアグラウンドになると、ほかのアプリケーションのすべてのセカンダリ バッファは停止され、「失われた」とマークされる。最初のアプリケーションがバックグラウンドに移ると、そのプライマリ バッファは「失われた」とマークされ、アプリケーションが再度フォアグラウンドに移るときにはこのバッファを復元しなければならない。詳細については、「バッファ管理」を参照すること。

DirectSound ドライバがユーザーのシステムに存在していない場合は、書き込み優先レベルの設定はできない。この状況に該当するかどうかを確認するには、IDirectSound8::GetCaps メソッドを呼び出して、DSCAPS 構造体の DSCAPS_EMULDRIVER フラグをチェックする。

詳細については、「プライマリ バッファへの書き込み」を参照すること。