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;
}}
参照