Platform SDK: DirectX

協調レベル

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

[C++]

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

[Visual Basic]

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

DirectSound は、標準、優先、排他、書き込み優先の 4 つの協調レベルを定義している。これらは、DSSCL_NORMAL、DSSCL_PRIORITY、DSSCL_EXCLUSIVE、DSSCL_WRITEPRIMARY の値で表される。

ゲーム アプリケーションは、ほとんどすべての環境で DSSCL_PRIORITY を使用する。このレベルは、サンプリング レートとビット深度に対するアプリケーション制御を可能にしながら、最も強力に動作する。また、優先協調レベルでは、他のアプリケーション (IP テレフォニなど) からのオーディオをゲームからのオーディオと共に聞くこともできる。優先レベルと排他レベルは同じ性能を提供するので、DSSCL_EXCLUSIVE は他のすべてのアプリケーションを無音にするよう要求するアプリケーションに対してのみ使うべきである。たとえば、ミュージックオーサリング アプリケーションでは、再生中に他のオーディオが聞こえないことが重要である。

[C++]

次の C の例は「DirectSound オブジェクトの作成」で初期化した DirectSound デバイスの協調レベルを設定する。hwnd パラメータは、アプリケーション ウインドウへのハンドルである。

HRESULT hr = lpDirectSound->lpVtbl->SetCooperativeLevel(
        lpDirectSound, hwnd, DSSCL_PRIORITY);
 
[Visual Basic]

次のコード例は「DirectSound オブジェクトの作成」で初期化した DirectSound デバイスの協調レベルを設定する。hwnd 引数は、アプリケーション ウインドウへのハンドルである。

m_ds.SetCooperativeLevel Me.hWnd, DSSCL_PRIORITY
 

標準協調レベル

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

優先協調レベル

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

排他協調レベル

排他協調レベルでは、アプリケーションは優先レベルのすべての特権を持つほか、そのアプリケーションがフォアグラウンドで実行されている場合は、そのプライマリ サウンド バッファの音だけが聞こえる。

書き込み優先協調レベル

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

[C++]

プライマリ バッファ内のオーディオ サンプルに直接書き込みのアクセスをするには、アプリケーションを書き込み優先レベルに設定しなければならない。アプリケーションをこのレベルに設定しておかないと、プライマリ バッファに対する C++ の IDirectSoundBuffer::Lock メソッド、または Visual Basic の DirectSoundBuffer.ReadBufferDirectSoundBuffer.WriteBuffer のすべての呼び出しは失敗する。

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

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

詳細については、「プライマリ バッファへのアクセス」を参照すること。

[Visual Basic]

Visual Basic アプリケーションでは、DSSCL_WRITEPRIMARY 協調レベルを使うべきではない。