Microsoft DirectX 8.0 (Visual Basic)

ダイナミック ボイス管理

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

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

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

ハードウェア ミキシングと 3D エフェクトに対するリソースの割り当てをバッファが再生されるまで遅延するには、DirectSound8.CreateSoundBufferDirectSound8.CreateSoundBufferFromFile、または DirectSound8.CreateSoundBufferFromResource に渡される DSBUFFERDESC 型に DSBCAPS_LOCDEFER フラグを指定する。DSBCAPS_LOCDEFER フラグによって作成されたバッファについて DirectSoundSecondaryBuffer8.Play または DirectSoundSecondaryBuffer8.AcquireResources を呼び出す場合、DirectSound は可能であればハードウェアにバッファを配置し、それ以外の場合はソフトウェアに配置する。

Play を呼び出す場合は、次の表に示すフラグの 1 つ、または最初の 2 つのフラグのどちらかを 3 番目のフラグと組み合わせて渡すことで、バッファに対するハードウェア ボイスの解放を試みることができる。その後、DirectSound はフラグの指定する終了基準に適した再生バッファを検索する。

フラグ 基準
DSBPLAY_TERMINATEBY_TIME どの候補バッファよりも長く再生されているバッファを選択する。
DSBPLAY_TERMINATEBY_DISTANCE リスナーから最も遠い 3D の候補バッファを選択する。
DSBPLAY_TERMINATEBY_PRIORITY Play の呼び出しでの設定に基づき、候補バッファのうち最も優先度の低いバッファを選択する。このフラグをほかの 2 つのフラグのどちらかと組み合わせると、そのフラグは優先度が等しい場合だけに使われる。

適切なバッファが見つかると、DirectSound はそのバッファを停止し、使用していたボイスを新たに再生されるバッファに割り当てる。どのバッファも終了基準に適していない場合は、DSBPLAY_LOCHARDWARE フラグが指定されていなければ、新たに再生されるバッファはソフトウェアで再生される。このフラグが指定されている場合、Play に対する呼び出しは失敗する。

遅延バッファの再生時の処理についての詳細は、「DirectSoundSecondaryBuffer8.Play」を参照すること。

  バッファの作成時は、DSBCAPS_LOCDEFER フラグを DSBCAPS_STATIC フラグと組み合わせて使わないこと。いくつかの PCI カードの場合のように、オンカード メモリが利用可能なとき、DSBCAPS_STATIC バッファはこのメモリに置かれる。DSBCAPS_LOCDEFER フラグでこのようなバッファを作成する場合、バッファ メモリはバッファが最初に再生されるまでサウンド カードにコピーされず、不適切な遅れが生じる。詳細については、「ISA および PCI カードでのボイス管理」を参照すること。