Microsoft DirectX 8.0 (C++) |
多くのサウンド カードは固有のセカンダリ バッファを維持し、3D エフェクトとそのミキシングを処理する。これらのハードウェア バッファは、呼び出しの際、通常はカード自体ではなくシステム メモリに配置される。しかし、これらはデバイスによってミキシングされるので、システム プロセッサに対する要求は、ソフトウェア バッファよりもはるかに少なくなる。したがって、ハードウェアにできる限り多くのバッファ、特に 3D バッファを割り当てることが最も効率的である。
デフォルトでは、DirectSound は可能であれば常にバッファをハードウェアに割り当てる。しかし、DirectSound はデバイスが一度に再生できるだけのハードウェア バッファしか作成できない。つまり、ハードウェア バッファ数は、利用可能なハードウェア ボイスで制限される。DirectSound は、バッファが作成されるときにハードウェア ボイスを割り当て、バッファが不要になったときだけ解放する。ボイスは、バッファが再生中でないときもフリーではない。アプリケーションが多くのバッファを作成する場合、いくつかのバッファがソフトウェアに存在する可能性がある。つまり、サウンド カードではなく CPU でバッファの管理とミキシングが行われる。
ダイナミック ボイス管理を使うと、バッファが再生されるまでボイス割り当てを遅延したり、DirectSound が優先順位の低いサウンドを早めに停止してリソースを新しいサウンドに割り当てることにより、ハードウェア リソースの利用制限を克服できる。
ハードウェア ミキシングと 3D エフェクトに対するリソースの割り当てをバッファが再生されるまで遅延するには、IDirectSound8::CreateSoundBuffer に渡される DSBUFFERDESC 構造体に DSBCAPS_LOCDEFER フラグを指定する。DSBCAPS_LOCDEFER フラグによって作成されたバッファについて IDirectSoundBuffer8::Play または IDirectSoundBuffer8::AcquireResources を呼び出す場合、DirectSound は可能であればハードウェアにバッファを配置し、それ以外の場合はソフトウェアに配置する。
Play を呼び出す場合は、次の表に示すフラグの 1 つ、または最初の 2 つのフラグのどちらかを 3 番目のフラグと組み合わせて渡すことで、バッファに対するハードウェア ボイスの解放を試みることができる。その後、DirectSound はフラグの指定する終了基準に適した再生バッファを検索する。
フラグ | 基準 |
---|---|
DSBPLAY_TERMINATEBY_TIME | どの候補バッファよりも長く再生されているバッファを選択する。 |
DSBPLAY_TERMINATEBY_DISTANCE | リスナーから最も遠い 3D の候補バッファを選択する。 |
DSBPLAY_TERMINATEBY_PRIORITY | Play の呼び出しでの設定に基づき、候補バッファのうち最も優先度の低いバッファを選択する。このフラグをほかの 2 つのフラグのどちらかと組み合わせると、そのフラグは優先度が等しい場合だけに使われる。 |
適切なバッファが見つかると、DirectSound はそのバッファを停止し、使用していたボイスを新たに再生されるバッファに割り当てる。どのバッファも終了基準に適していない場合は、DSBPLAY_LOCHARDWARE フラグが指定されていなければ、新たに再生されるバッファはソフトウェアで再生される。このフラグが指定されている場合、Play に対する呼び出しは失敗する。
遅延バッファの再生時の処理についての詳細は、「IDirectSoundBuffer8::Play」を参照すること。
注 バッファの作成時は、DSBCAPS_LOCDEFER フラグを DSBCAPS_STATIC フラグと組み合わせて使わないこと。いくつかの PCI カードの場合のように、オンカード メモリが利用可能なとき、DSBCAPS_STATIC バッファはこのメモリに置かれる。DSBCAPS_LOCDEFER フラグでこのようなバッファを作成する場合、バッファ メモリはバッファが最初に再生されるまでサウンド カードにコピーされず、不適切な遅れが生じる。詳細については、「ISA および PCI カードでのボイス管理」を参照すること。