動的な音声管理
多くのサウンド カードが、固有のセカンダリ バッファーを保持し、それらに対する 3D エフェクトとミキシングを処理しています。このようなバッファーはハードウェア バッファーと呼ばれ、通常はカード自体にではなくシステム メモリーに常駐します。ただし、これらのバッファーはデバイスによってミキシングされるため、ソフトウェア バッファーに比べシステム プロセッサに対する負荷がはるかに小さくなります。そのため、できるだけ多くのバッファー (特に 3D バッファー) をハードウェアに配置すると、効率性を最大限に高めることができます。
既定では、DirectSound は可能な場合は常にバッファーをハードウェアに割り当てます。ただし、作成できるのは、デバイスで一度に再生できる数のバッファーのみです。つまり、ハードウェア バッファーの数は、ハードウェア音声の可用性によって制限されます。DirectSound では、バッファーの作成時にハードウェア音声を割り当て、バッファーが破棄されるとそれを解放します。アプリケーションで多数のバッファーが作成されると、その一部がソフトウェアに割り当てられる可能性があります。その場合、それらのバッファーは、サウンド カードではなく CPU によって管理およびミキシングされることになります。
注 DirectSound ボイス マネージャーは、メモリーではなく、ハードウェア ミキシング リソースを割り当てます。PCI カード上では、バッファーはハードウェア ミキサーに割り当てられるか、またはソフトウェア ミキサーに割り当てられるかに関係なく、割り当てられる前後で同じメモリー量を使用します。
動的な音声管理機能は、使用できるハードウェア リソースが限られている場合に役立ちます。この機能を使用すると、バッファーが再生されるまで音声の割り当てを遅延したり、または DirectSound で優先順位の低いサウンドを途中で停止し、リソースを解放して、それらのリソースを新しいサウンドに割り当てることができます。
ハードウェア ミキシングと 3D エフェクトのためのリソースの割り当てを、バッファーが再生される時点まで遅延させるには、IDirectSound8::CreateSoundBuffer に渡される DSBUFFERDESC 構造体で、DSBCAPS_LOCDEFER フラグを指定します。このようなバッファーで IDirectSoundBuffer8::Play または IDirectSoundBuffer8::AcquireResources を呼び出すと、DirectSound は可能な場合にはハードウェアにバッファーを配置し、不可能な場合はソフトウェアに配置します。
Play を呼び出すとき、次のテーブル内のいずれかのフラグを渡すか、最初の 2 つのフラグのいずれかを 3 つ目と組み合わせて渡すことにより、バッファーに対するハードウェア音声の解放を試行できます。次に、DirectSound は、フラグによる指定に従って、終了するのに適した再生中のバッファーを検索します。
フラグ | 条件 |
---|---|
DSBPLAY_TERMINATEBY_TIME | その他の候補バッファーよりも長時間再生されているバッファーを選択します。 |
DSBPLAY_TERMINATEBY_DISTANCE | リスナーから最も離れた 3D 候補バッファーを選択します。 |
DSBPLAY_TERMINATEBY_PRIORITY | Play への呼び出しで設定されたように、候補となるバッファーで最も低い優先順位を持つバッファーを選択します。これをその他の 2 つのフラグのいずれかと組み合わせた場合、もう一方のフラグは、関連付けを解決する目的のみに使用されます。 |
適切なバッファーが見つかると、DirectSound はそれを停止して、そのバッファーが使用していた音声を新しく再生されるバッファーに割り当てます。終了に適したバッファーがない場合、新しく再生されるバッファーはソフトウェアで再生されます。ただし、DSBPLAY_LOCHARDWARE フラグが指定されている場合は、Play の呼び出しは失敗します。
遅延されたバッファーが再生時に処理される方法の詳細については、「IDirectSoundBuffer8::Play」を参照してください。
注 バッファーの作成時には、DSBCAPS_STATIC フラグを DSBCAPS_LOCDEFER フラグと組み合わせて使用しないでください。DSBCAPS_STATIC バッファーは、一部の旧式のカードと場合と同様、カード上のメモリー (使用可能な場合) に配置されます。DSBCAPS_LOCDEFER フラグでそのようなバッファーを作成すると、バッファーの初期再生時までバッファー メモリーがサウンド カードにコピーされず、許容範囲を超える遅延が発生する可能性があります。