Microsoft DirectX 8.0 (C++) |
グローバル サウンド パラメータは、IDirectSound3DListener8 インターフェイスを使って設定および取得される。このインターフェイスは、プライマリ サウンド バッファへのインターフェイスである。アプリケーションのプライマリ バッファは 1 つだけで、リスナーも 1 人だけである。
DirectMusic のパフォーマンスとオーディオパスを使って 3D サウンドを再生する場合は、IDirectMusicAudioPath8::GetObjectInPath または IDirectMusicSegmentState8::GetObjectInPath を使い、dwStage パラメータを DMUS_PATH_PRIMARY_BUFFER に設定して、オーディオパスからリスナーを取得できる。次の例では、g_p3DAudioPath は IDirectMusicAudioPath8 インターフェイスへのポインタである。
IDirectSound3DListener8* g_pDSListener; HRESULT hr = g_p3DAudioPath->GetObjectInPath( DMUS_PCHANNEL_ALL, DMUS_PATH_PRIMARY_BUFFER, 0, GUID_NULL, 0, IID_IDirectSound3DListener8, (LPVOID*) &g_pDSListener));
アプリケーションが、DirectSound API を使って、独自のサウンド バッファを作成および管理する場合は、プライマリ バッファ オブジェクトを作成し、このオブジェクトからリスナー インターフェイスを取得する必要がある。
プライマリ バッファを作成するには、IDirectSound8::CreateSoundBuffer メソッドを使い、DSBUFFERDESC 構造体の dwFlags メンバで DSBCAPS_CTRL3D と DSBCAPS_PRIMARYBUFFER の各フラグを指定する。作成されたバッファに対して IDirectSoundBuffer::QueryInterface メソッドを呼び出し、そのバッファの IDirectSound3DListener8 インターフェイスへのポインタを取得する。
次の例では、lpds は IDirectSound8 インターフェイス ポインタである。
DSBUFFERDESC dsbd; LPDIRECTSOUNDBUFFER lpdsbPrimary; LPDIRECTSOUNDLISTENER8 lp3DListener; ZeroMemory(&dsbd, sizeof(DSBUFFERDESC)); dsbd.dwSize = sizeof(DSBUFFERDESC); dsbd.dwFlags = DSBCAPS_CTRL3D | DSBCAPS_PRIMARYBUFFER; if SUCCEEDED(lpds->CreateSoundBuffer(&dsbd, &lpdsbPrimary, NULL)) { // リスナー インターフェイスを取得する。 if FAILED(lpdsbPrimary->QueryInterface( IID_IDirectSound3DListener8, (LPVOID *)&lp3DListener)) { lpdsbPrimary->Release(); } }
リスナーが取得されたら、プライマリ バッファへの IDirectSoundBuffer インターフェイスは不要になり、解放できる。