Microsoft DirectX 8.0 (Visual Basic) |
バッファの作成時に DSBCAPS_LOCDEFER フラグを使うことによって、バッファが再生されるときまで、ハードウェア ミキシング メモリまたはソフトウェア ミキシング メモリへのバッファの割り当てを遅延することができる。詳細については、「ダイナミック ボイス管理」を参照すること。
アプリケーションの性能に対する遅延割り当ての効果は、ユーザーのシステムでの DirectSound アクセラレータのタイプによって異なる。
PCI アクセラレータの場合を考えてみる。遅延バッファを再生するときに、DirectSound はサウンドの再生に利用できるハードウェアがあるかどうかを調べる。ハードウェアを利用できる場合、DirectSound は元の場所にあるサウンド データにアクセスできるかどうかを確認する。最後に、DirectSound は再生を開始するようにハードウェアに指示する。この処理は、効率的であり、また高速である。
注 DirectSound ボイス マネージャは、メモリではなく、ハードウェア ミキシング リソースを割り当てる。PCI カードでは、バッファはハードウェア ミキサとソフトウェア ミキサのいずれに割り当てられるかに関係なく、割り当ての前後で同じメモリを使用する。
ユーザーが ISA ベースのアクセラレータを使用する場合、状況はまったく異なる。この場合、オーディオ データをハードウェア ミキシング バッファに取り込む処理は非常に遅い。オーディオ データをミキシングするには、ISA バスを介して、サウンド カード上のメモリにデータをロードしなければならないからである。遅延バッファの場合、再生の呼び出しが行われた後、サウンドが開始される前に不適切な遅延が発生する。このような理由から、ISA ベースの DirectSound アクセラレータ カードではボイス管理の使用は推奨されていない。
ISA デバイスでアプリケーションがボイス管理を使わないようにすることは簡単である。DSBCAPS_STATIC フラグを設定しない限り、バッファはオンボード メモリに割り当てられない。したがって、DSBCAPS_STATIC と DSBCAPS_LOCDEFER を組み合わせない限り、再生時にバッファがオンボード メモリに割り当てられる危険性はない。
DSBCAPS_STATIC だけを指定すると、バッファは ISA カード上の既存のメモリを利用するが、PCI カードの場合は何の効果もない。この場合、ほかのフラグが指定されていないと、DirectSound はバッファをハードウェアの制御下に置くが、システム メモリを利用する。DSBCAPS_LOCDEFER だけを指定すると、ISA カードでは何の効果もない。バッファは常にシステム メモリに配置され、ハードウェアによって管理されないからである。
次の表に、ISA および PCI デバイス用に作成されたバッファに対する DSBCAPS_STATIC および DSBCAPS_LOCDEFER フラグの効果をまとめる。
カード | フラグ | メモリ | HW アクセラレーション |
---|---|---|---|
ISA | DSBCAPS_STATIC | 利用可能な場合はハードウェア。 | ハードウェア メモリにある場合は可。 |
PCI | DSBCAPS_STATIC | システム。 | ハードウェア ボイスが利用可能な場合は可。フラグの効果はない。 |
ISA | DSBCAPS_LOCDEFER | 利用可能で、DSBCAPS_STATIC が設定されている場合はハードウェア。 | ハードウェア メモリにある場合は可。ただし、最初の再生には待ち時間が発生する。 |
PCI | DSBCAPS_LOCDEFER | システム。 | ハードウェア ボイスが利用可能な場合は可。 |
遅延割り当てによる問題を回避しながら、ISA カードでアクセラレーションを利用するには、まずデバイスの能力をチェックする。カードに 1 つ以上のスタティック バッファがあり、ストリーミング バッファがないとレポートされる場合は、オンボード メモリを搭載した古い ISA カードである可能性が高い。この場合、DSBCAPS_STATIC フラグを使うことができるがDSBCAPS_LOCDEFER を使ってはならない。カードに 1 つ以上のストリーミング バッファがあるとレポートされる場合は、新しい PCI ベースのアクセラレータ カードである。この場合は、ハードウェア ボイスを最大限に利用するために、DSBCAPS_LOCDEFER を使用し、DSBCAPS_STATIC を使用しない。