Microsoft DirectX 8.0 (C++)

3D リスナーの取得

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

DirectMusic のパフォーマンスとオーディオパスを使って 3D サウンドを再生する場合は、IDirectMusicAudioPath8::GetObjectInPath または IDirectMusicSegmentState8::GetObjectInPath を使い、dwStage パラメータを DMUS_PATH_PRIMARY_BUFFER に設定して、オーディオパスからリスナーを取得できる。次の例では、g_p3DAudioPathIDirectMusicAudioPath8 インターフェイスへのポインタである。

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 インターフェイスへのポインタを取得する。

次の例では、lpdsIDirectSound8 インターフェイス ポインタである。

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 インターフェイスは不要になり、解放できる。