Microsoft DirectX 8.0 (Visual Basic)

セカンダリ バッファの作成

セカンダリ サウンド バッファを作成するには、DirectSound8.CreateSoundBufferDirectSound8.CreateSoundBufferFromFile、または DirectSound8.CreateSoundBufferFromResource メソッドを呼び出す。これらのメソッドは DirectSoundSecondaryBuffer8 オブジェクトを作成する。このオブジェクトを使って、バッファを操作および演奏できる。

CreateSoundBufferFromFileCreateSoundBufferFromResource は、サウンドがそれほど長くない場合に使うのに適したメソッドである。DirectSound は、サウンド全体を保持するのに十分なバッファを作成し、ウェーブ フォーマットをデータのフォーマットに適合させ、バッファにデータを書き込む。CreateSoundBufferストリーム バッファに適しているが、開発者がウェーブ ファイルやリソースを解析し、バッファに対するデータのストリーミング処理を行わなければならない。

ストリーム バッファを作成する場合は、常に DSBUFFERDESC 型に DSBCAPS_GETCURRENTPOSITION2 フラグを指定する。

次の例では、2 秒間のデータを保持できるストリーム バッファを作成する方法を示している。m_ds 変数は DirectSound8 オブジェクトに設定されていると仮定する。

Dim m_dsb As DirectSoundSecondaryBuffer8

Public Sub CreateSoundBuffer()
 
  Dim buffdesc As DSBUFFERDESC
 
  ' 作成するサウンド バッファを記述する。
 
  With buffdesc
    lFlags = DSBCAPS_CTRLPAN Or DSBCAPS_CTRLVOLUME _
          Or DSBCAPS_CTRLFREQUENCY
 
    With .fxFormat
      .nFormatTag = WAVE_FORMAT_PCM
      .nChannels = 2
      .lSamplesPerSec = 22050
      .nBitsPerSample = 16
      .nBlockAlign = (.nChannels * .nBitsPerSample) / 8
      .lAvgBytesPerSec = .lSamplesPerSec * .nBlockAlign
      .nSize = 0    ' WAVE_FORMAT_PCM の場合は無視される。
    End With
    
    lBufferBytes = .fxFormat.lAvgBytesPerSec * 2
  
  End With
 
  Set m_dsb = ds.CreateSoundBuffer(buffdesc)
 
End Sub

次の例に示すように、ファイルやリソースからバッファを作成する方法はより簡単である。

Dim m_dsb As DirectSoundSecondaryBuffer8
Dim buffdesc As DSBUFFERDESC
 
buffdesc.lFlags = DSBCAPS_CTRLPAN Or DSBCAPS_CTRLVOLUME _
  Or DSBCAPS_CTRLFREQUENCY
Set dsbuffer = ds.CreateSoundBufferFromFile( _
  "c:\media\ding.wav", dsbdesc)

この場合、バッファのフォーマットはデータのフォーマットに基づき、メソッドはこの情報を dsbdesc.fxFormat に配置する。

DirectSound はハードウェア リソースを最初のバッファに割り当て、その利点を生かす。ハードウェア バッファはサウンド カード プロセッサでミキシングされるので、アプリケーション性能にほとんど影響を及ぼさない。

バッファの位置を DirectSound に決めさせずに自分で指定したい場合は、DSBUFFERDESC 型に DSBCAPS_LOCHARDWARE または DSBCAPS_LOCSOFTWARE のどちらかのフラグを設定する。DSBCAPS_LOCHARDWARE フラグを設定し、ハードウェア リソースが不足している場合、バッファの作成要求は失敗する。

DirectSound のボイス管理機能を利用するには、バッファの作成時に DSBCAPS_LOCDEFER フラグを指定する。このフラグは、バッファに対するリソースの割り当てを、バッファが再生されるまで遅延する。詳細については、「ダイナミック ボイス管理」を参照すること。

既存のバッファの位置を確認するには、DirectSoundSecondaryBuffer8.GetCaps メソッドを使い、DSBCAPS 型の lFlags メンバをチェックして、DSBCAPS_LOCHARDWARE と DSBCAPS_LOCSOFTWARE のどちらのフラグになっているかを調べる。どちらかが必ず指定されている。

DSBCAPS_STATIC フラグを設定すると、可能な場合はバッファをオンボードのハードウェア メモリに作成すべきであることが DirectSound に通知される。ハードウェア バッファが利用できない場合でも、バッファ作成メソッドは失敗しない。このフラグは、バッファ用にシステム メモリを使う最近のサウンド カードの多くには影響しない。ハードウェア スタティック バッファは、繰り返し再生される短いサウンドに対してだけ使うべきである。詳細については、「ISA および PCI カードでのボイス管理」を参照すること。