次の方法で共有


DirectMusic での 3D サウンドの使い方

DirectSound API を使うと、空間内の DirectMusic サウンドの位置を特定し、移動するサウンドにドップラー偏移を適用できる。

3D エフェクトは、個々の DirectSound バッファに適用される。それぞれ独自のバッファを持つ複数のオーディオパスに異なるサウンドを指定できるので、異なるサウンドに異なるパラメータを容易に適用できる。

バッファに 3D エフェクトを適用するには、DMUS_APATH_DYNAMIC_3D 標準オーディオパスのように 3D 能力を備えたバッファに対する IDirectSound3DBuffer8 インターフェイスを取得する必要がある。また、バッファに対する 3D パラメータを指定する構成オブジェクトから、適切なオーディオパスを作成することもできる。

次のサンプル コードでは、標準オーディオパスを作成し、IDirectSound3DBuffer8 インターフェイスを取得している。g_pPerformance は有効な IDirectMusicPerformance8 ポインタである。

HRESULT                  hr;
IDirectMusicAudioPath8*  g_p3DAudioPath;
IDirectSound3DBuffer8*   g_pDS3DBuffer; 

if (SUCCEEDED(hr = g_pPerformance->CreateStandardAudioPath(
    DMUS_APATH_DYNAMIC_3D, 64, TRUE, &g_p3DAudioPath)))
{
  hr = g_p3DAudioPath->GetObjectInPath( 
      DMUS_PCHANNEL_ALL, DMUS_PATH_BUFFER, 0,
      GUID_NULL, 0, IID_IDirectSound3DBuffer8, 
      (LPVOID*) &g_pDS3DBuffer);
}
if (FAILED(hr))
{
  ErrorExit(hr);  // エラー処理コードを追加する。
}

グローバル 3D パラメータを調節し、リスナーの位置と向きを操作するには、dwStage パラメータに DMUS_PATH_PRIMARY_BUFFER を設定した IDirectMusicAudioPath8::GetObjectInPath または IDirectMusicSegmentState8::GetObjectInPath を使って、任意のオーディオパスのプライマリ バッファから IDirectSound3DListener8 インターフェイスを取得する必要がある。次のサンプル関数では、オーディオパスからリスナーを取得している。

HRESULT GetListener(IDirectMusicAudioPath8* pPath, IDirectSound3DListener8** ppListener)
{
  HRESULT hr = E_INVALIDARG;

  if (NULL != pPath)
  {
    hr = pPath->GetObjectInPath(0, DMUS_PATH_PRIMARY_BUFFER, 0,
                                GUID_NULL, 0, IID_IDirectSound3DListener8, 
                                (LPVOID*) ppListener);
  }
  return hr;
}}

参照