Microsoft DirectX 8.0 (Visual Basic)

3D リスナーの取得

グローバル サウンド パラメータは、DirectSound3DListener8 オブジェクトを使って設定および取得される。このオブジェクトは、プライマリ サウンド バッファから取得される。アプリケーションのプライマリ バッファは 1 つだけで、リスナーも 1 人だけである。

DirectMusic のパフォーマンスとオーディオパスを使って 3D サウンドを再生する場合は、DirectMusicAudioPath8.GetObjectInPath を使い、lStage パラメータを DMUS_PATH_PRIMARY_BUFFER に設定して、オーディオパスからリスナーを取得できる。次の例では、AudioPathDirectMusicAudioPath8 オブジェクトである。

Dim dx As New DirectX8

Dim perf As DirectMusicPerformance8
Dim audparams As DMUS_AUDIOPARAMS
Dim audiopath As DirectMusicAudioPath8
Dim listener As DirectSound3dListener8

Private Sub Form_Load()
  Set perf = dx.DirectMusicPerformanceCreate
  perf.InitAudio Me.hWnd, DMUS_AUDIOF_ALL, audparams, _
      Nothing, Nothing, DMUS_APATH_DYNAMIC_3D, 16
  Set audiopath = perf.GetDefaultAudioPath
  Set listener = audiopath.GetObjectinPath(DMUS_PCHANNEL_ALL, _
      DMUS_PATH_PRIMARY_BUFFER, 0, vbNullString, 0, _
      IID_DirectSound3DListener)
End Sub

アプリケーションが、DirectSound API を使って、独自のサウンド バッファを作成および管理する場合は、プライマリ バッファ オブジェクトを作成し、このオブジェクトからリスナー インターフェイスを取得する必要がある。

プライマリ バッファ オブジェクトを作成するには、DirectSound8.CreatePrimarySoundBuffer メソッドを使い、関連する DSBUFFERDESC 型の lFlags メンバで DSBCAPS_CTRL3D と DSBCAPS_PRIMARYBUFFER の各フラグを指定する。そして作成されたバッファに対して DirectSoundPrimaryBuffer8.GetDirectSound3DListener メソッドを呼び出し、DirectSound3DListener8 オブジェクトを取得する。次の例でこのステップを示す。ds はグローバルな DirectSound8 オブジェクトである。

Dim dsbd As DSBUFFERDESC
Dim dsbPrimary As DirectSoundPrimaryBuffer8
Dim waveFormat As WAVEFORMATEX
Dim ds3dListener As DirectSound3DListener8
 
' プライマリ バッファを作成する。プライマリ バッファについては waveFormat パラメータは無視されるので、
' 初期化する必要はない。
 
dsbd.lFlags = DSBCAPS_CTRL3D Or DSBCAPS_PRIMARYBUFFER
Set dsbPrimary = ds.CreatePrimarySoundBuffer(dsbd, waveFormat)
 
' DirectSound3DListener8 オブジェクトを作成する。
 
Set ds3DListener = dsbPrimary.GetDirectSound3DListener
 

リスナーを取得した後は、プライマリ バッファ オブジェクトは必要なくなり、スコープ外に出せる。