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