次の方法で共有


動的ボイス管理

多くのサウンド カードは固有のセカンダリ バッファを維持し、3D エフェクトとそのミキシングを処理する。これらのハードウェア バッファは、その名前のとおり、通常はカード自体ではなくシステム メモリに配置される。しかし、これらはデバイスによってミキシングされるので、システム プロセッサに対する要求は、ソフトウェア バッファよりもはるかに少なくなる。したがって、ハードウェアにできる限り多くのバッファ、特に 3D バッファを割り当てることが最も効率的である。

デフォルトでは、DirectSound は可能であれば常にバッファをハードウェアに割り当てる。ただし、DirectSound はデバイスが一度に再生できるだけのハードウェア バッファしか作成できない。すなわち、ハードウェア バッファの数は、利用可能なハードウェア ボイスによって制限される。DirectSound は、バッファが作成されるときにハードウェア ボイスを割り当て、バッファが破棄されたときにだけ解放する。アプリケーションが多くのバッファを作成する場合、一部のバッファはソフトウェアに存在する可能性がある。つまり、サウンド カードではなく CPU でバッファの管理とミキシングが行われる。

DirectSound ボイス マネージャは、メモリではなく、ハードウェア ミキシング リソースを割り当てる。PCI カードでは、バッファは、ハードウェア ミキサとソフトウェア ミキサのどちらに割り当てられるかに関係なく、割り当ての前後で同じメモリを使う。

動的ボイス管理を使うと、バッファが再生されるまでボイスの割り当てが遅延されたり、DirectSound が優先順位の低いサウンドを早めに停止してそのリソースを解放し、新しいサウンドにそのリソースを割り当てることが可能になったりすることで、ハードウェア リソースの利用制限を克服できる。

ハードウェア ミキシングと 3D エフェクトに対するリソースの割り当てをバッファが再生されるまで遅延するには、IDirectSound8::CreateSoundBuffer に渡す DSBUFFERDESC 構造体で 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 フラグと組み合わせて使わないこと。一部の古いカードの場合と同じように、オンカード メモリが利用可能なときは、DSBCAPS_STATIC バッファはこのメモリに置かれる。DSBCAPS_LOCDEFER フラグを指定してこのようなバッファを作成した場合、バッファ メモリはバッファが最初に再生されるまでサウンド カードにコピーされず、不適切な遅れが生じる。