Platform SDK: DirectX

ダイナミック ボイス管理

[Visual Basic]

ここでは、C++ でのアプリケーション開発について説明する。

[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::PlaydwPriority パラメータの設定に基づき、候補バッファのうち最も優先度の低いバッファを選択する。このフラグを他の 2 つのフラグのどちらかと組み合わせると、そのフラグは優先度が等しい場合だけに使われる。

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

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

 :  バッファの作成時は、DSBCAPS_LOCDEFER フラグを DSBCAPS_STATIC フラグと組み合わせて使わないこと。PCI カードのあるものの場合のように、オンカード メモリが利用可能なときには、DSBCAPS_STATIC バッファはこのメモリに置かれる。DSBCAPS_LOCDEFER フラグでこのようなバッファを作成する場合、バッファ メモリは IDirectSoundBuffer::Play に対する最初の呼び出しまでサウンド カードにコピーされず、不適切な遅れが生じる。