Microsoft DirectX 8.0 (C++)

ISA および PCI カードでのボイス管理

バッファの作成時に 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 を使用しない。